This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [Commit]: Add debuglink support to objdump and readelf
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: Binutils <binutils at sourceware dot org>
- Date: Sun, 26 Nov 2017 10:16:59 -0800
- Subject: Re: [Commit]: Add debuglink support to objdump and readelf
- Authentication-results: sourceware.org; auth=none
- References: <877eurvksg.fsf@redhat.com>
On Wed, Nov 15, 2017 at 3:33 AM, Nick Clifton <nickc@redhat.com> wrote:
> Hi Guys,
>
> I am applying the rather large patch attached to this email to enhance
> the readelf and objdump programs so that they now have the ability to
> follow links to separate debug info files. (As requested by PR
> 15152). So for example whereas before we had this output:
>
> $ readelf -wi main.exe
>
> Contents of the .debug_info section:
> [...]
> <15> DW_AT_comp_dir : (alt indirect string, offset: 0x30c)
> [...]
>
> With the new option enabled we get:
>
> $ readelf -wiK main.exe
>
> main.exe: Found separate debug info file: dwz.debug
> Contents of the .debug_info section (loaded from main.exe):
> [...]
> <15> DW_AT_comp_dir : (alt indirect string, offset: 0x30c) /home/nickc/Downloads/dwzm
> [...]
>
> The link following feature also means that we can get two lots of
> output if the same section exists in both the main file and the
> separate debug info file:
>
> $ readelf -wiK main.exe
> main.exe: Found separate debug info file: dwz.debug
> Contents of the .debug_info section (loaded from main.exe):
> [...]
> Contents of the .debug_info section (loaded from dwz.debug):
> [...]
>
> The patch also adds the ability to display the contents of debuglink
> sections:
>
> $ readelf -wk main.exe
> Contents of the .gnu_debugaltlink section:
>
> Separate debug info file: dwz.debug
> Build-ID (0x14 bytes):
> c4 a8 89 8d 64 cf 70 8a 35 68 21 f2 ed 24 45 3e 18 7a 7a 93
>
> Naturally there are long versions of these options (=follow-links and
> =links). The documentation has been updated as well, and since both
> readelf and objdump use the same set of debug display options, I have
> moved the text into a separate file. There are also a couple of new
> binutils tests to exercise the new behaviour.
>
> There are a couple of missing features in the current patch however,
> although I do intend to address them in follow up submissions:
>
> Firstly the code does not check the build-id inside separate debug
> info files when it is searching for a file specified by a
> .gnu_debugaltlink section. It just assumes that if the file is there,
> then it contains the information being sought.
>
> Secondly I have not checked the DWARF-5 version of these link
> features, so there will probably be code to add there.
>
> Thirdly I have only implemented link following for the
> DW_FORM_GNU_strp_alt format. Other alternate formats (eg
> DW_FORM_GNU_ref_alt) have yet to be implemented.
>
> Lastly, whilst implementing this feature I found it necessary to move
> some of the global variables used by readelf (eg section_headers) into
> a structure that can be passed around. I have moved all of the global
> variables that were necessary to get the patch working, but I need to
> complete the operation and move the remaining, file-specific variables
> (eg dynamic_strings).
>
> Cheers
> Nick
>
> binutils/ChangeLog
> 2017-11-15 Nick Clifton <nickc@redhat.com>
>
> PR 15152
> * dwarf.h (enum dwarf_section_display_enum): Add gnu_debuglink,
> gnu_debugaltlink and separate_debug_str.
> (struct dwarf_section): Add filename field.
> Add prototypes for load_separate_debug_file, close_debug_file and
> open_debug_file.
> * dwarf.c (do_debug_links): New.
> (do_follow_links): New.
> (separate_debug_file, separate_debug_filename): New.
> (fetch_alt_indirect_string): New function. Retrieves a string
> from the debug string table in the separate debug info file.
> (read_and_display_attr_value): Use it with DW_FORM_GNU_strp_alt.
> (load_debug_section_with_follow): New function. Like
> load_debug_section, but if the first attempt fails, then tries
> again in the separate debug info file.
> (introduce): New function.
> (process_debug_info): Use load_debug_section_with_follow and
> introduce.
> (load_debug_info): Likewise.
> (display_debug_lines_raw): Likewise.
> (display_debug_lines_decoded): Likewise.
> (display_debug_macinfo): Likewise.
> (display_debug_macro): Likewise.
> (display_debug_abbrev): Likewise.
> (display_debug_loc): Likewise.
> (display_debug_str): Likewise.
> (display_debug_aranges): Likewise.
> (display_debug_addr); Likewise.
> (display_debug_frames): Likewise.
> (display_gdb_index): Likewise.
> (process_cu_tu_index): Likewise.
> (load_cu_tu_indexes): Likewise.
> (display_debug_links): New function. Displays the contents of a
> .gnu_debuglink or .gnu_debugaltlink section.
> (calc_gnu_debuglink_ctc32):New function. Calculates a CRC32
> value.
> (check_gnu_debuglink): New function. Checks the CRC of a
> potential separate debug info file.
> (parse_gnu_debuglink): New function. Reads a CRC value out of a
> .gnu_debuglink section.
> (check_gnu_debugaltlink): New function.
> (parse_gnu_debugaltlink): New function. Reads the build-id value
> out of a .gnu_debugaltlink section.
> (load_separate_debug_info): New function. Finds and loads a
> separate debug info file.
> (load_separate_debug_file): New function. Attempts to find and
> follow a link to a separate debug info file.
> (free_debug_memory): Free the separate debug info file
> information.
> (opts_table): Add "follow-links" and "links".
> (dwarf_select_sections_by_letters): Add "k" and "K".
> (debug_displays): Reformat. Add .gnu-debuglink and
> .gnu_debugaltlink.
> Add an extra entry for .debug_str in a separate debug info file.
> * doc/binutils.texi: Move description of debug dump features
> common to both readelf and objdump into...
> * objdump.c (usage): Add -Wk and -WK.
> (load_specific_debug_section): Initialise the filename field in
> the dwarf_section structure.
> (close_debug_file): New function.
> (open_debug_file): New function.
> (dump_dwarf): Load and dump the separate debug info sections.
> * readelf.c (struct filedata): New structure. Contains various
> variables that used to be global:
> (current_file_size, string_table, string_table_length, elf_header)
> (section_headers, program_headers, dump_sects, num_dump_sects):
> Move into filedata structure.
> (cmdline): New global variable. Contains list of sections to dump
> by number, as specified on the command line.
> Add filedata parameter to most functions.
> (load_debug_section): Load the string table if it has not already
> been retrieved.
> (close_file): New function.
> (close_debug_file): New function.
> (open_file): New function.
> (open_debug_file): New function.
> (process_object): Process sections in any separate debug info files.
> * doc/debug.options.texi: New file. Add description of =links and
> =follow-links options.
> * NEWS: Mention the new feature.
> * elfcomm.c: Have the byte gte functions take a const pointer.
> * elfcomm.h: Update prototypes.
> * testsuite/binutils-all/dw5.W: Update expected output.
> * testsuite/binutils-all/objdump.WL: Update expected output.
> * testsuite/binutils-all/objdump.exp: Add test of -WK and -Wk.
> * testsuite/binutils-all/readelf.exp: Add test of -wK and -wk.
> * testsuite/binutils-all/readelf.k: New file.
> * testsuite/binutils-all/objdump.Wk: New file.
> * testsuite/binutils-all/objdump.WK2: New file.
> * testsuite/binutils-all/linkdebug.s: New file.
> * testsuite/binutils-all/debuglink.s: New file.
>
I am checking this to fix the build with GCC 4.2:
cc1: warnings being treated as errors
binutils-gdb/binutils/dwarf.c: In function \u2018load_separate_debug_info\u2019:
binutils-gdb/binutils/dwarf.c:9650: warning: declaration of
\u2018link\u2019 shadows a global declaration
/usr/include/unistd.h:757: warning: shadowed declaration is here
* dwarf.c (load_separate_debug_info): Rename argument name from
link to xlink.
---
binutils/ChangeLog | 5 +++++
binutils/dwarf.c | 6 +++---
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index eab683047e..75ef5cd032 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2017-11-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * dwarf.c (load_separate_debug_info): Rename argument name from
+ link to xlink.
+
2017-11-24 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/22444
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 8b968797af..a92e7b1fc6 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -9647,7 +9647,7 @@ parse_gnu_debugaltlink (struct dwarf_section *
section, void * data)
static void *
load_separate_debug_info (const char * main_filename,
- struct dwarf_section * link,
+ struct dwarf_section * xlink,
parse_func_type parse_func,
check_func_type check_func,
void * func_data)
@@ -9658,10 +9658,10 @@ load_separate_debug_info (const char *
main_filename,
size_t canon_dirlen;
size_t dirlen;
- if ((separate_filename = parse_func (link, func_data)) == NULL)
+ if ((separate_filename = parse_func (xlink, func_data)) == NULL)
{
warn (_("Corrupt debuglink section: %s\n"),
- link->name ? link->name : link->uncompressed_name);
+ xlink->name ? xlink->name : xlink->uncompressed_name);
return FALSE;
}
--
2.14.3