From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28807 invoked by alias); 11 Jun 2003 09:43:34 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 28602 invoked from network); 11 Jun 2003 09:43:30 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 11 Jun 2003 09:43:30 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h5B9hUH29788; Wed, 11 Jun 2003 05:43:30 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h5B9hUI01412; Wed, 11 Jun 2003 05:43:30 -0400 Received: from localhost.localdomain.redhat.com (vpn50-14.rdu.redhat.com [172.16.50.14]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h5B9hKE05852; Wed, 11 Jun 2003 05:43:27 -0400 To: gdb-patches@sources.redhat.com, binutils@sources.redhat.com Subject: RFC: Support for separate debug info files From: Nick Clifton Date: Wed, 11 Jun 2003 09:43:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-SW-Source: 2003-06/txt/msg00357.txt.bz2 --=-=-= Content-length: 4137 Hi Guys, OK, here is a heavily revised patch to implement support for generating separate debuginfo files in binutils. The highlights of this version are: * Adds a new switch to objcopy "--add-gnu-debuglink=", which creates a .gnu_debuglink section in the output file which points to the specified . * It no longer adds a "--strip-nondebug" or "--only-keep-debug" switch to strip and objcopy - it is not needed. (Although this is open to debate, see below). * Exports the CRC32 computing function that was already in BFD so that it can be used by other tools. This would allow the version in GDB to be made obsolete... Here is an example of the patch in action: % cat hello.c int main (void) { return printf ("hello world\n"); } % gcc hello.c -g -o hello % strip --strip-all hello hello.stripped.all % strip --strip-debug hello hello.stripped.debug % objcopy --add-gnu-debuglink=hello hello.stripped.all hello.stripped.all.with-link % ls -l -rwxrwx--- 12031 Jun 11 10:09 hello* -rw-rw---- 54 Jun 11 10:09 hello.c -rwxrwx--- 2804 Jun 11 10:10 hello.stripped.all* -rwxrwx--- 4382 Jun 11 10:10 hello.stripped.debug* -rwxrwx--- 2872 Jun 11 10:11 hello.stripped.all.with-link* % gdb hello.stripped.all.with-link GNU gdb 2003-06-09-cvs Copyright 2003 Free Software Foundation, Inc. (gdb) break main Breakpoint 1 at 0x8048364: file hello.c, line 1. (gdb) run Starting program: /builds/FSF/native/tests/debug-info-test/hello.stripped.with-link Breakpoint 1, main () at hello.c:1 1 int main (void) { return printf ("hello world\n"); } So the fully stripped executable "hello.stripped.all.with-link" is only 2872 bytes long, but it can be fully debugged when accompanied by the original, unstripped executable "hello". (Which at 12031 bytes is 4 times the size of the stripped version). This leads me to my main point. Do we need the ability to create stripped debuginfo files ? The original patch did this, but it turns out to be problematical since the debuginfo files need to contain dummy versions of the .text, .data, etc sections. Doing this, rather than just stripping them out, looked non-trivial, so I decided to skip it for this version. My theory is that the only benefit gained by being able to ship a stripped debuginfo file as opposed to an unstripped one is that it reduces the shipping size, making a distribution smaller. I am assuming that hard disk space is not really an issue, just the size of the shipped binaries. Any comments ? Cheers Nick bfd/ChangeLog 2003-06-11 Nick Clifton * opncls.c (calc_crc32): Rename to bfd_calc_gnu_debuglink_crc32 and export. (GNU_DEBUGLINK): Define and use to replace occurrences of hard-coded ".gnu_debuglink" in the code. (get_debug_link_info): Prevent aborts by replacing call to xmalloc with a call to malloc. (find_separate_debug_file): Prevent aborts by replacing calls to xmalloc and xstrdup with calls to malloc and strdup. (bfd_add_gnu_debuglink): New function. Add a .gnu_debuglink section to a bfd. * bfd-in2.h: Regenerate. binutils/ChangeLog 2003-06-11 Nick Clifton * objcopy.c (gnu_debuglink_filename): New variable. (OPTION_ADD_GNU_DEBUGLINK): New switch (copy_options): Describe --add-gnu-debuglink switch. Mention that --strip-debug removes sections as well. (is_strip_section): Process the sections removed and kept lists before checking for debugging sections. (add_redefine_syms_file): Make function static. (copy_object): Use is_strip_section. Check to see if a .gnu_debuglink section should be added. If so, call bfd_add_gnu_debuglink. (setup_section): Use is_strip_section. (copy_section): Use is_strip_section. (copy_main): Handle OPTION_ADD_GNU_DEBUGLINK. * NEWS: Mention new objcopy switch. * doc/binutils.texi: Document new switch. --=-=-= Content-Type: application/x-bzip2 Content-Disposition: attachment; filename=gnu-debuglink.patch.2.bz2 Content-Transfer-Encoding: base64 Content-Description: Patch to add support for --add-gnu-debuglink switch to objcopy Content-length: 8410 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 J7YibPUk7YfHOuu6R4qcJLHBOLENmVmi0kHsLNDRuZ+uebGJpLKqvW9Npo2r VVgGMF0WquJCJyurWtAqQuslAM7rCnq6wvNQplkDPNBeMzk0SEjwC2k3GdBs xJJQ2xSTSzVxuUAqLA3KUUojuGjIGB2JURG8Knw4FxJnhMqKqqpmsMyZNmBh hEqyHzSYmFbyyxjQ0TjHCJ2ax6LVTOgG83i5stCIEsAt0m6BsGkT0GWheAow kY6BzK2oNpQhbTCBsC863CGsO8hEl/AO49SdpU6o7JJerEMOJZobRvHYsqjs dGOb8GGr7sbNcH03oMZljQqKVVT5co5Za7GIKR7UGGYlRkqmJV9zx9z2N7Cs mWWzvaponxe5oyds1QbU1C38JWFiS4gSyqVUlEiYFLCYw9lxFeDhQNoua3cw tluq2JFLIECsMzosyLBjFbmrNutkZNZGuYzFDKonBjc3BdYGuBmIkCVGlb0b LTAJEIJmEBCVdsBaks2KiK2EB6EZSCybYSSDvaXJoEY+7FS9rdJHFDt0MZ6R JbbrjBS4YXEkwSIkBYtLSCCQAqJQsksJCKjGkdLItLyw3R3O3dHAjgZk38zE ayRBC0heYS/FKTeGXXaREaLgS+K4k9h9sIb7BP/xiTj7Y/zk7k3uqO96MT0e 8gleg8TqmpIxkkhb2ibNpu7gmrP2h0QNb4WIjhXrQuSP+p48jVwPP6xe185E HAM09YqO1Uz7DgNDTzhyNe9zO0y2bF0hkr1uXjnP7jc7jfh9DqwWyTdK4nY8 J410emamXhowZWeq6xWaK0YLMFwmZY7SJPKLmHMkc3xO/3L6jSY000TRpphi c4kR7DnNKid1SROT/E0kon5yYlWlq0tWlq0WrFFJN/IzDBxBP8YidC8MZXsV JlvMl9R8R3nyhBBuOZvLjPO4UNIoZgcE3DbO8UNkqNoxrscLRKuzhocc2ygL 1mOH9/v/JVsuGeIz7EgXgMYyYSORBxDUNSmGpDqpDBkolNLMqPf/qamx2TU2 iL6RzZIadBlBnrDgQJWAymreGg5n5DIJrhv4u5IpwoSByr+7iA== --=-=-=--