This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Commit]: Add debuglink support to objdump and readelf


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]