Change the readelf and objdump programs so that they will automatically follow links to separate debug info files.

* configure.ac (follow-debug-links): Add option to enable or
	disable the following of debug links by default.  Set the
	default for the option to be 'follow'.
	* dwarf.c (do_follow_links): Initialise with DEFAULT_FOR_FOLLOW_LINKS.
	(dwarf_select_sections_by_names): Add no-follow-links option.
	(dwarf_select_sections_by_letter): Add 'N' option.
	* objdump.c (usage): Add conditional text describing the
	follow links option.
	(slurp_symtab): Ensure that there is a NULL entry at the end
	of the symbol table.
	(slurp_dynamic_symtab): Likewise.
	(dump_bfd): When extending the symbol table, ensure that there
	is still a NULL entry at the end.
	* readelf.c (usage): Add conditional text describing the
	follow links option.
	* doc/binutils.texi: Update documentation for objcopy and
	readelf.
	* doc/debug.options.texi: Update documentation of the
	follow-links option.
	* config.in: Regenerate.
	* configure: Regenerate.
	* testsuite/binutils-all/compress.exp: Add the -WN option to
	objdump command lines that are not expecting to follow links.
	* testsuite/binutils-all/readelf.exp: Add the
	--debug-dump=no-follow-links option to tests that are not
	expecting to follow debug links.

gas	* testsuite/gas/mach-o/sections-1.d: Stop automatic debug link
        following.
	* testsuite/gas/xgate/insns-dwarf2.d: Likewise.

ld	* testsuite/ld-elf/sec64k.exp: Stop readelf from automatically
	following debug links.
This commit is contained in:
Nick Clifton 2021-02-12 14:52:22 +00:00
parent 96df3e28b8
commit c46b706620
18 changed files with 183 additions and 47 deletions

View File

@ -1,3 +1,33 @@
2021-02-12 Nick Clifton <nickc@redhat.com>
* configure.ac (follow-debug-links): Add option to enable or
disable the following of debug links by default. Set the
default for the option to be 'follow'.
* dwarf.c (do_follow_links): Initialise with DEFAULT_FOR_FOLLOW_LINKS.
(dwarf_select_sections_by_names): Add no-follow-links option.
(dwarf_select_sections_by_letter): Add 'N' option.
* objdump.c (usage): Add conditional text describing the
follow links option.
(slurp_symtab): Ensure that there is a NULL entry at the end
of the symbol table.
(slurp_dynamic_symtab): Likewise.
(dump_bfd): When extending the symbol table, ensure that there
is still a NULL entry at the end.
* readelf.c (usage): Add conditional text describing the
follow links option.
* doc/binutils.texi: Update documentation for objcopy and
readelf.
* doc/debug.options.texi: Update documentation of the
follow-links option.
* config.in: Regenerate.
* configure: Regenerate.
* testsuite/binutils-all/compress.exp: Add the -WN option to
objdump command lines that are not expecting to follow links.
* testsuite/binutils-all/readelf.exp: Add the
--debug-dump=no-follow-links option to tests that are not
expecting to follow debug links.
* NEWS: Mention the new behaviour.
2021-02-12 Alan Modra <amodra@gmail.com>
* testsuite/binutils-all/objcopy.exp: Report "unsupported" when

View File

@ -1,5 +1,12 @@
-*- text -*-
* Readelf and objdump will now follow links to separate debug info files by
default. This behaviour can be stopped via the use of the new -wN or
--debug-dump=no-follow-links options for readelf and the -WN or
--dwarf=no-follow-links options for objdump. Also the old behaviour can be
restored by the use of the --enable-follow-debug-links=no configure time
option.
Changes in 2.36:
* Update elfedit and readelf with LAM_U48 and LAM_U57 support.

View File

@ -18,6 +18,9 @@
/* Should ar and ranlib use -D behavior by default? */
#undef DEFAULT_AR_DETERMINISTIC
/* Have readelf and objdump follow debug links by default */
#undef DEFAULT_FOR_FOLLOW_LINKS
/* Have nm use F and f for global and local ifunc symbols */
#undef DEFAULT_F_FOR_IFUNC_SYMBOLS

29
binutils/configure vendored
View File

@ -822,6 +822,7 @@ enable_targets
enable_deterministic_archives
enable_default_strings_all
enable_f_for_ifunc_symbols
enable_follow_debug_links
with_debuginfod
enable_libctf
enable_werror
@ -1489,6 +1490,9 @@ Optional Features:
--enable-f-for-ifunc-symbols
Have nm use F and f for global and local ifunc
symbols
--enable-follow-debug-links
Have readelf and objdump follow debug links by
default
--enable-libctf Handle .ctf type-info sections [default=yes]
--enable-werror treat compile warnings as errors
--enable-build-warnings enable build-time compiler warnings
@ -11577,7 +11581,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 11580 "configure"
#line 11584 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -11683,7 +11687,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 11686 "configure"
#line 11690 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -12359,6 +12363,27 @@ _ACEOF
# Check whether --enable-follow-debug-links was given.
if test "${enable_follow_debug_links+set}" = set; then :
enableval=$enable_follow_debug_links;
if test "${enableval}" = no; then
default_for_follow_links=0
else
default_for_follow_links=1
fi
else
default_for_follow_links=1
fi
cat >>confdefs.h <<_ACEOF
#define DEFAULT_FOR_FOLLOW_LINKS $default_for_follow_links
_ACEOF

View File

@ -82,6 +82,20 @@ fi], [default_f_for_ifunc=0])
AC_DEFINE_UNQUOTED(DEFAULT_F_FOR_IFUNC_SYMBOLS, $default_f_for_ifunc,
[Have nm use F and f for global and local ifunc symbols])
AC_ARG_ENABLE(follow-debug-links,
[AS_HELP_STRING([--enable-follow-debug-links],
[Have readelf and objdump follow debug links by default])], [
if test "${enableval}" = no; then
default_for_follow_links=0
else
default_for_follow_links=1
fi], [default_for_follow_links=1])
AC_DEFINE_UNQUOTED(DEFAULT_FOR_FOLLOW_LINKS, $default_for_follow_links,
[Have readelf and objdump follow debug links by default])
AC_DEBUGINFOD
GCC_ENABLE([libctf], [yes], [], [Handle .ctf type-info sections])

View File

@ -2187,8 +2187,10 @@ objdump [@option{-a}|@option{--archive-headers}]
[@option{-r}|@option{--reloc}]
[@option{-R}|@option{--dynamic-reloc}]
[@option{-s}|@option{--full-contents}]
[@option{-W[lLiaprmfFsoORtUuTgAckK]}|
@option{--dwarf}[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links,=follow-links]]
[@option{-W[lLiaprmfFsoORtUuTgAck]}|
@option{--dwarf}[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links]]
[@option{-WK}|@option{--dwarf=follow-links}]
[@option{-WN}|@option{--dwarf=no-follow-links}]
[@option{--ctf=}@var{section}]
[@option{-G}|@option{--stabs}]
[@option{-t}|@option{--syms}]
@ -2325,7 +2327,7 @@ will stop at the end of the function, otherwise it will stop when the
next symbol is encountered. If there are no matches for @var{symbol}
then nothing will be displayed.
Note if the @option{--dwarf=follow-links} option has also been enabled
Note if the @option{--dwarf=follow-links} option is enabled
then any symbol tables in linked debug info files will be read in and
used when disassembling.
@ -2347,7 +2349,7 @@ If the target is an ARM architecture this switch also has the effect
of forcing the disassembler to decode pieces of data found in code
sections as if they were instructions.
Note if the @option{--dwarf=follow-links} option has also been enabled
Note if the @option{--dwarf=follow-links} option is enabled
then any symbol tables in linked debug info files will be read in and
used when disassembling.
@ -4753,8 +4755,10 @@ readelf [@option{-a}|@option{--all}]
[@option{-R} <number or name>|@option{--relocated-dump=}<number or name>]
[@option{-z}|@option{--decompress}]
[@option{-c}|@option{--archive-index}]
[@option{-w[lLiaprmfFsoORtUuTgAckK]}|
@option{--debug-dump}[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links,=follow-links]]
[@option{-w[lLiaprmfFsoORtUuTgAck]}|
@option{--debug-dump}[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links]]
[@option{-wK}|@option{--debug-dump=follow-links}]
[@option{-wN}|@option{--debug-dump=no-follow-links}]
[@option{--dwarf-depth=@var{n}}]
[@option{--dwarf-start=@var{n}}]
[@option{--ctf=}@var{section}]

View File

@ -61,6 +61,17 @@ In addition, when displaying DWARF attributes, if a form is found that
references the separate debug info file, then the referenced contents
will also be displayed.
Note - in some distributions this option is enabled by default. It
can be disabled via the @option{N} debug option. The default can be
chosen when configuring the binutils via the
@option{--enable-follow-debug-links=yes} or
@option{--enable-follow-debug-links=no} options. If these are not
used then the default is to enable the following of debug links.
@item N
@itemx =no-follow-links
Disables the following of links to separate debug info files.
@item l
@itemx =rawline
Displays the contents of the @samp{.debug_line} section in a raw

View File

@ -99,7 +99,7 @@ int do_debug_addr;
int do_debug_cu_index;
int do_wide;
int do_debug_links;
int do_follow_links;
int do_follow_links = DEFAULT_FOR_FOLLOW_LINKS;
bfd_boolean do_checks;
int dwarf_cutoff_level = -1;
@ -11373,6 +11373,7 @@ dwarf_select_sections_by_names (const char *names)
{ "links", & do_debug_links, 1 },
{ "loc", & do_debug_loc, 1 },
{ "macro", & do_debug_macinfo, 1 },
{ "no-follow-links", & do_follow_links, 0 },
{ "pubnames", & do_debug_pubnames, 1 },
{ "pubtypes", & do_debug_pubtypes, 1 },
/* This entry is for compatibility
@ -11402,7 +11403,7 @@ dwarf_select_sections_by_names (const char *names)
if (strncmp (p, entry->option, len) == 0
&& (p[len] == ',' || p[len] == '\0'))
{
* entry->variable |= entry->val;
* entry->variable = entry->val;
/* The --debug-dump=frames-interp option also
enables the --debug-dump=frames option. */
@ -11443,6 +11444,7 @@ dwarf_select_sections_by_letters (const char *letters)
case 'g': do_gdb_index = 1; break;
case 'i': do_debug_info = 1; break;
case 'K': do_follow_links = 1; break;
case 'N': do_follow_links = 0; break;
case 'k': do_debug_links = 1; break;
case 'l': do_debug_lines |= FLAG_DEBUG_LINES_RAW; break;
case 'L': do_debug_lines |= FLAG_DEBUG_LINES_DECODED; break;

View File

@ -229,13 +229,24 @@ usage (FILE *stream, int status)
-g, --debugging Display debug information in object file\n\
-e, --debugging-tags Display debug information using ctags style\n\
-G, --stabs Display (in raw form) any STABS info in the file\n\
-W[lLiaprmfFsoORtUuTgAckK] or\n\
-W[lLiaprmfFsoORtUuTgAck] or\n\
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
=frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,\n\
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
=addr,=cu_index,=links,=follow-links]\n\
=addr,=cu_index,=links]\n\
Display DWARF info in the file\n\
"));
#if DEFAULT_FOR_FOLLOW_LINKS
fprintf (stream, _("\
-WK,--dwarf=follow-links Follow links to separate debug info files (default)\n\
-WN,--dwarf=no-follow-links Do not follow links to separate debug info files\n\
"));
#else
fprintf (stream, _("\
-WK,--dwarf=follow-links Follow links to separate debug info files\n\
-WN,--dwarf=no-follow-links Do not follow links to separate debug info files (default)\n\
"));
#endif
#ifdef ENABLE_LIBCTF
fprintf (stream, _("\
--ctf=SECTION Display CTF info from SECTION\n\
@ -737,31 +748,32 @@ slurp_symtab (bfd *abfd)
non_fatal (_("failed to read symbol table from: %s"), bfd_get_filename (abfd));
bfd_fatal (_("error message was"));
}
if (storage)
/* Add an extra entry (at the end) with a NULL pointer. */
storage += sizeof (asymbol *);
off_t filesize = bfd_get_file_size (abfd);
/* qv PR 24707. */
if (filesize > 0
&& filesize < storage
/* The MMO file format supports its own special compression
technique, so its sections can be larger than the file size. */
&& bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
{
off_t filesize = bfd_get_file_size (abfd);
/* qv PR 24707. */
if (filesize > 0
&& filesize < storage
/* The MMO file format supports its own special compression
technique, so its sections can be larger than the file size. */
&& bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
{
bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
_("error: symbol table size (%#lx) is larger than filesize (%#lx)"),
storage, (long) filesize);
exit_status = 1;
symcount = 0;
return NULL;
}
sy = (asymbol **) xmalloc (storage);
bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
_("error: symbol table size (%#lx) is larger than filesize (%#lx)"),
storage, (long) filesize);
exit_status = 1;
symcount = 0;
return NULL;
}
sy = (asymbol **) xmalloc (storage);
symcount = bfd_canonicalize_symtab (abfd, sy);
if (symcount < 0)
bfd_fatal (bfd_get_filename (abfd));
/* assert (symcount < (storage / sizeof (asymbol *))) */
sy[symcount] = NULL;
return sy;
}
@ -774,6 +786,7 @@ slurp_dynamic_symtab (bfd *abfd)
long storage;
storage = bfd_get_dynamic_symtab_upper_bound (abfd);
/* Add an extra entry (at the end) with a NULL pointer. */
if (storage < 0)
{
if (!(bfd_get_file_flags (abfd) & DYNAMIC))
@ -786,12 +799,15 @@ slurp_dynamic_symtab (bfd *abfd)
bfd_fatal (bfd_get_filename (abfd));
}
if (storage)
sy = (asymbol **) xmalloc (storage);
storage += sizeof (asymbol *);
sy = (asymbol **) xmalloc (storage);
dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
if (dynsymcount < 0)
bfd_fatal (bfd_get_filename (abfd));
/* assert (symcount < (storage / sizeof (asymbol *))) */
sy[dynsymcount] = NULL;
return sy;
}
@ -4899,10 +4915,12 @@ dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
}
else
{
syms = xrealloc (syms, (symcount + old_symcount) * sizeof (asymbol *));
syms = xrealloc (syms, (symcount + old_symcount + 1) * sizeof (asymbol *));
memcpy (syms + old_symcount,
extra_syms,
symcount * sizeof (asymbol *));
/* Preserve the NULL entry at the end of the symbol table. */
syms[symcount + old_symcount] = NULL;
}
}

View File

@ -4624,12 +4624,23 @@ usage (FILE * stream)
-R --relocated-dump=<number|name>\n\
Dump the contents of section <number|name> as relocated bytes\n\
-z --decompress Decompress section before dumping it\n\
-w[lLiaprmfFsoORtUuTgAckK] or\n\
-w[lLiaprmfFsoORtUuTgAck] or\n\
--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
=frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,\n\
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
=addr,=cu_index,=links,=follow-links]\n\
=addr,=cu_index,=links]\n\
Display the contents of DWARF debug sections\n"));
#if DEFAULT_FOR_FOLLOW_LINKS
fprintf (stream, _("\
-wK,--debug-dump=follow-links Follow links to separate debug info files (default)\n\
-wN,--debug-dump=no-follow-links Do not follow links to separate debug info files\n\
"));
#else
fprintf (stream, _("\
-wK,--debug-dump=follow-links Follow links to separate debug info files\n\
-wN,--debug-dump=no-follow-links Do not follow links to separate debug info files (default)\n\
"));
#endif
fprintf (stream, _("\
--dwarf-depth=N Do not display DIEs at depth N or greater\n\
--dwarf-start=N Display DIEs starting with N, at the same depth\n\

View File

@ -717,7 +717,7 @@ proc test_gnu_debuglink {} {
fail "$test (objcopy link decompress)"
return
}
set got [remote_exec host "$OBJDUMP -S tmpdir/testprog" "" "/dev/null" "tmpdir/testprog.decompress.dump"]
set got [remote_exec host "$OBJDUMP -S -WN tmpdir/testprog" "" "/dev/null" "tmpdir/testprog.decompress.dump"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$test (objcopy dump decompress)"
return
@ -726,7 +726,7 @@ proc test_gnu_debuglink {} {
fail "$test (objcopy link compress)"
return
}
set got [remote_exec host "$OBJDUMP -S tmpdir/testprog" "" "/dev/null" "tmpdir/testprog.compress.dump"]
set got [remote_exec host "$OBJDUMP -S -WN tmpdir/testprog" "" "/dev/null" "tmpdir/testprog.compress.dump"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$test (objcopy dump compress)"
return

View File

@ -606,7 +606,7 @@ if { [is_elf_format] } then {
set testfile tmpdir/debuglink.${obj}
}
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wk $testfile" "" "/dev/null" "objdump.out"]
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wk -WN $testfile" "" "/dev/null" "objdump.out"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "objdump -Wk (reason: unexpected output)"
@ -615,7 +615,7 @@ if { [is_elf_format] } then {
}
if { [regexp_diff objdump.out $srcdir/$subdir/objdump.Wk] } then {
fail "objdump -Wk"
fail "objdump -Wk (reason: output does not match expectations)"
} else {
pass "objdump -Wk"
}

View File

@ -507,7 +507,7 @@ if {![binutils_assemble $srcdir/$subdir/debuglink.s tmpdir/debuglink.o]} then {
set tempfile [remote_download host tmpdir/debuglink.o]
}
readelf_test {--debug-dump=links} $tempfile readelf.k {}
readelf_test {--debug-dump=links -wN} $tempfile readelf.k {}
# Check that debug link sections can be followed.
if {![binutils_assemble $srcdir/$subdir/linkdebug.s tmpdir/linkdebug.debug]} then {
@ -530,7 +530,7 @@ if {![binutils_assemble $srcdir/$subdir/dwo.s tmpdir/dwo.o]} then {
set tempfile [remote_download host tmpdir/dwo.o]
}
readelf_test {--debug-dump=links} $tempfile readelf.k2 {}
readelf_test {--debug-dump=links --debug-dump=no-follow-links} $tempfile readelf.k2 {}
}
if {![binutils_assemble $srcdir/$subdir/zero-sec.s tmpdir/zero-sec.o]} then {
@ -555,6 +555,6 @@ if ![is_remote host] {
if {[catch "system \"bzip2 -dc $test > $tempfile\""] != 0} {
untested "bzip2 -dc ($testname)"
} else {
readelf_test {--debug-dump=macro} $tempfile pr26112.r {}
readelf_test {--debug-dump=macro -wN} $tempfile pr26112.r {}
}
}

View File

@ -1,3 +1,9 @@
2021-02-12 Nick Clifton <nickc@redhat.com>
* testsuite/gas/mach-o/sections-1.d: Stop automatic debug link
following.
* testsuite/gas/xgate/insns-dwarf2.d: Likewise.
2021-02-12 Alan Modra <amodra@gmail.com>
* testsuite/gas/all/pr27381.err: Don't match source file name.

View File

@ -1,4 +1,4 @@
#objdump: -P section
#objdump: -P section -WN
.*: +file format mach-o.*
#...
Section: __text __TEXT \(bfdname: .text\)

View File

@ -1,4 +1,4 @@
#objdump: -S
#objdump: -S -WN
#as: -gdwarf2
#name: Dwarf2 test on insns.s
#source: insns.s

View File

@ -1,3 +1,8 @@
2021-02-12 Nick Clifton <nickc@redhat.com>
* testsuite/ld-elf/sec64k.exp: Stop readelf from automatically
following debug links.
2021-02-11 Alan Modra <amodra@gmail.com>
* NEWS: Mention arm-symbianelf removal.

View File

@ -135,7 +135,7 @@ if { ![istarget "m32r-*-*"] } then {
puts $ofd "#as: -ez80-adl"
}
puts $ofd "#ld: -r"
puts $ofd "#readelf: -W -Ss"
puts $ofd "#readelf: -W -wN -Ss"
puts $ofd "There are 680.. section headers.*:"
puts $ofd "#..."
puts $ofd " \\\[ 0\\\] .* 680\[0-9\]\[0-9\]\[ \]+0\[ \]+0"
@ -190,7 +190,7 @@ if { ![istarget "d10v-*-*"]
if { [istarget "z80-*-*"] } then {
puts $ofd "#as: -ez80-adl"
}
puts $ofd "#readelf: -W -Ss"
puts $ofd "#readelf: -W -wN -Ss"
puts $ofd "There are 660.. section headers.*:"
puts $ofd "#..."
puts $ofd " \\\[ 0\\\] .* 660..\[ \]+0\[ \]+0"