From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1540 invoked by alias); 19 Jun 2009 16:03:50 -0000 Received: (qmail 1275 invoked by uid 22791); 19 Jun 2009 16:03:48 -0000 X-SWARE-Spam-Status: No, hits=-3.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from main.gmane.org (HELO ciao.gmane.org) (80.91.229.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 19 Jun 2009 16:03:41 +0000 Received: from list by ciao.gmane.org with local (Exim 4.43) id 1MHgZ1-0004Fc-54 for gdb-patches@sources.redhat.com; Fri, 19 Jun 2009 16:03:39 +0000 Received: from enigma.qnx.com ([209.226.137.106]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 19 Jun 2009 16:03:39 +0000 Received: from aristovski by enigma.qnx.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 19 Jun 2009 16:03:39 +0000 To: gdb-patches@sources.redhat.com From: Aleksandar Ristovski Subject: Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable Date: Fri, 19 Jun 2009 16:03:00 -0000 Message-ID: References: <200906191442.n5JEg4QW029005@brahms.sibelius.xs4all.nl> <200906191600.43923.pedro@codesourcery.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit User-Agent: Thunderbird 2.0.0.21 (Windows/20090302) In-Reply-To: <200906191600.43923.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-06/txt/msg00510.txt.bz2 Pedro Alves wrote: > On Friday 19 June 2009 15:42:04, Mark Kettenis wrote: >>> From: Aleksandar Ristovski >>> Date: Fri, 19 Jun 2009 10:16:26 -0400 >>> >>> Pedro Alves wrote: >>>> I was thinking on pushing the elf check a bit down instead, >>>> like the below. However, having now tested this, I see that >>>> this doesn't work in most of the cores I have here (x86_64-linux). >>>> In most cases I see, the segment that would contain the program >>>> headers, as indicated by auxv info, isn't included in the >>>> core... >>>> >>>> (objdump -h) >>>> Idx Name Size VMA LMA File off Algn >>>> : >>>> 6 load1 00000000 0000000000400000 0000000000000000 000008f8 2**0 >>>> ALLOC, READONLY, CODE >>>> : >>>> >> I'm somewhat amazed that the Linux kernel doesn't dump the auxv stuff. >> Without the auxv data, debugging core dumps of PIE executables will be >> impossible. >> >> Perhaps the kernel does include the information in the does, but bfd >> doesn't have the necessary code to turn it into an .auxv section? > > Nope, let me explain a bit better: the auxv data is there, but the > program headers aren't. > > Idx Name Size VMA LMA File off Algn > 0 note0 00000538 0000000000000000 0000000000000000 000003c0 2**0 > CONTENTS, READONLY > 1 .reg/30270 000000d8 0000000000000000 0000000000000000 000004e0 2**2 > CONTENTS > 2 .reg 000000d8 0000000000000000 0000000000000000 000004e0 2**2 > CONTENTS > 3 .reg2/30270 00000200 0000000000000000 0000000000000000 000005d4 2**2 > CONTENTS > 4 .reg2 00000200 0000000000000000 0000000000000000 000005d4 2**2 > CONTENTS > 5 .auxv 00000110 0000000000000000 0000000000000000 000007e8 2**3 > CONTENTS > 6 load1 00000000 0000000000400000 0000000000000000 000008f8 2**0 > ^^^^^^^^ > ALLOC, READONLY, CODE > ^^^^^^^^^^^^^^^^^^^^^ > 7 load2 00001000 0000000000600000 0000000000000000 000008f8 2**0 > CONTENTS, ALLOC, LOAD > : > > In this case, AT_PHDR points at 0x400040, but the data is just not there > in the core, because it is read-only data, and the kernel decided it > isn't worth to dump it (gdb's gcore does the same): > >> cat /proc/18439/maps > 00400000-00401000 r-xp 00000000 08:07 2819992 /home/pedro/gdb/mainline/build/gdb/testsuite/gdb.base/annota1 > ^^^^ > 00600000-00601000 rw-p 00000000 08:07 2819992 /home/pedro/gdb/mainline/build/gdb/testsuite/gdb.base/annota1 > > Aleksandar, did you try the version of the patch I posted? > Yes, it works: $ ./gdb --nx --core testsuite/gdb.base/bigcore.corefile GNU gdb (GDB) 6.8.50.20090619-cvs Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: . (no debugging symbols found) Core was generated by `/space/src/gdbcvs2/qnx/srcclean/linux-native/gdb/testsuite/gdb.base/bigcore'. Program terminated with signal 6, Aborted. #0 0x08048b8f in ?? () (gdb) info shared From To Syms Read Shared Object Library 0x4cb3e470 0x4cb58844 No /lib/libm.so.6 0x4ca18dd0 0x4cafe490 No /lib/libc.so.6 0x4c9e5880 0x4c9fa8ef No /lib/ld-linux.so.2 (gdb) q With: $ cvs-diff gdb/solib-svr4.c Index: gdb/solib-svr4.c =================================================================== RCS file: /cvs/src/src/gdb/solib-svr4.c,v retrieving revision 1.100 diff -u -p -r1.100 solib-svr4.c --- gdb/solib-svr4.c 22 May 2009 23:49:13 -0000 1.100 +++ gdb/solib-svr4.c 19 Jun 2009 15:34:40 -0000 @@ -266,7 +266,7 @@ IGNORE_FIRST_LINK_MAP_ENTRY (struct so_l /* Assume that everything is a library if the dynamic loader was loaded late by a static executable. */ - if (bfd_get_section_by_name (exec_bfd, ".dynamic") == NULL) + if (exec_bfd && bfd_get_section_by_name (exec_bfd, ".dynamic") == NULL) return 0; return extract_typed_address (so->lm_info->lm + lmo->l_prev_offset, @@ -600,9 +600,13 @@ scan_dyntag (int dyntag, bfd *abfd, CORE if (abfd == NULL) return 0; + + if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) + return 0; + arch_size = bfd_get_arch_size (abfd); if (arch_size == -1) - return 0; + return 0; /* Find the start address of the .dynamic section. */ sect = bfd_get_section_by_name (abfd, ".dynamic"); @@ -825,11 +829,7 @@ locate_base (struct svr4_info *info) though if we don't have some link map offsets to work with. */ if (info->debug_base == 0 && svr4_have_link_map_offsets ()) - { - if (exec_bfd != NULL - && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour) - info->debug_base = elf_locate_base (); - } + info->debug_base = elf_locate_base (); return info->debug_base; } -- Aleksandar Ristovski QNX Software Systems