* [patch] solib-svr4.c - allow reading linkmap info from core without executable
@ 2009-05-29 20:42 Aleksandar Ristovski
2009-06-10 22:07 ` Pedro Alves
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-05-29 20:42 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 820 bytes --]
Hello,
This small patch allows solib-svr4.c to attempt to read
linkmap info from core file when executable binary is not given.
e.g.:
$ gdb --core testsuite/gdb.base/bigcore.corefile
...
(gdb) info sharedlibrary
No shared libraries loaded at this time.
(gdb)
after patch:
$ ./gdb --nx --core testsuite/gdb.base/bigcore.corefile
GNU gdb (GDB) 6.8.50.20090529-cvs
...
(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)
Thanks,
--
Aleksandar Ristovski
QNX Software Systems
ChangeLog:
* solib-svr4.c (IGNORE_FIRST_LINK_MAP_ENTRY): Avoid
dereferencing NULL
pointer.
(locate_base): If exec_bfd is NULL, use core_bfd if.
[-- Attachment #2: solib-svr4-bettercore-20090529.patch --]
[-- Type: text/plain, Size: 1112 bytes --]
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 29 May 2009 20:34:49 -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,
@@ -826,8 +826,10 @@ locate_base (struct svr4_info *info)
if (info->debug_base == 0 && svr4_have_link_map_offsets ())
{
- if (exec_bfd != NULL
+ if ((exec_bfd != NULL
&& bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
+ || (core_bfd != NULL
+ && bfd_get_flavour (core_bfd) == bfd_target_elf_flavour))
info->debug_base = elf_locate_base ();
}
return info->debug_base;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-05-29 20:42 [patch] solib-svr4.c - allow reading linkmap info from core without executable Aleksandar Ristovski
@ 2009-06-10 22:07 ` Pedro Alves
2009-06-11 13:39 ` Aleksandar Ristovski
0 siblings, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2009-06-10 22:07 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski
On Friday 29 May 2009 21:41:52, Aleksandar Ristovski wrote:
> Hello,
>
> This small patch allows solib-svr4.c to attempt to read
> linkmap info from core file when executable binary is not given.
>
> e.g.:
> $ gdb --core testsuite/gdb.base/bigcore.corefile
> ...
> (gdb) info sharedlibrary
> No shared libraries loaded at this time.
> (gdb)
>
> after patch:
>
> $ ./gdb --nx --core testsuite/gdb.base/bigcore.corefile
> GNU gdb (GDB) 6.8.50.20090529-cvs
> ...
> (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)
Cool.
> if (info->debug_base == 0 && svr4_have_link_map_offsets ())
> {
> - if (exec_bfd != NULL
> + if ((exec_bfd != NULL
> && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
> + || (core_bfd != NULL
> + && bfd_get_flavour (core_bfd) == bfd_target_elf_flavour))
> info->debug_base = elf_locate_base ();
> }
Are there live debugging cases (archs?, PIE?) (e.g., "target remote"
without specifying an executable) where letting elf_locate_base
try to read the debug base from the target's auxv (scan_dyntag_auxv)
will work? It would mean that removing the exec_bfd checks instead
of adding core_bfd checks, would still improve your case, while
letting other cases benefit as well.
--
Pedro Alves
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-10 22:07 ` Pedro Alves
@ 2009-06-11 13:39 ` Aleksandar Ristovski
2009-06-18 14:04 ` Aleksandar Ristovski
2009-06-18 23:03 ` Pedro Alves
0 siblings, 2 replies; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-06-11 13:39 UTC (permalink / raw)
To: gdb-patches; +Cc: Pedro Alves
Pedro Alves wrote:
>> if (info->debug_base == 0 && svr4_have_link_map_offsets ())
>> {
>> - if (exec_bfd != NULL
>> + if ((exec_bfd != NULL
>> && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
>> + || (core_bfd != NULL
>> + && bfd_get_flavour (core_bfd) == bfd_target_elf_flavour))
>> info->debug_base = elf_locate_base ();
>> }
>
> Are there live debugging cases (archs?, PIE?) (e.g., "target remote"
> without specifying an executable) where letting elf_locate_base
> try to read the debug base from the target's auxv (scan_dyntag_auxv)
> will work? It would mean that removing the exec_bfd checks instead
> of adding core_bfd checks, would still improve your case, while
> letting other cases benefit as well.
>
Yes, in theory it should work as long as target_ops in
question know how to read auxv (that is, as long as
to_xfer_partial(ops, TARGET_OBJECT_AUXV,...) knows how to do
it.)
I had internally made this change:
{
- if (exec_bfd != NULL
+ if ((exec_bfd != NULL
&& bfd_get_flavour (exec_bfd) ==
bfd_target_elf_flavour)
+ || exec_bfd == NULL)
debug_base = elf_locate_base ();
}
return (debug_base);
But wanted to be more conservative for FSF, since I do not
quite understand under which circumstances could we end up
in solib-svr4, and not have "bfd_target_elf_flavour".
Thanks,
--
Aleksandar Ristovski
QNX Software Systems
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-11 13:39 ` Aleksandar Ristovski
@ 2009-06-18 14:04 ` Aleksandar Ristovski
2009-06-18 23:03 ` Pedro Alves
1 sibling, 0 replies; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-06-18 14:04 UTC (permalink / raw)
To: gdb-patches; +Cc: Pedro Alves
Is this ok to commit?
Aleksandar Ristovski wrote:
> Pedro Alves wrote:
>>> if (info->debug_base == 0 && svr4_have_link_map_offsets ())
>>> {
>>> - if (exec_bfd != NULL
>>> + if ((exec_bfd != NULL
>>> && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
>>> + || (core_bfd != NULL
>>> + && bfd_get_flavour (core_bfd) == bfd_target_elf_flavour))
>>> info->debug_base = elf_locate_base ();
>>> }
>>
>> Are there live debugging cases (archs?, PIE?) (e.g., "target remote"
>> without specifying an executable) where letting elf_locate_base
>> try to read the debug base from the target's auxv (scan_dyntag_auxv)
>> will work? It would mean that removing the exec_bfd checks instead
>> of adding core_bfd checks, would still improve your case, while
>> letting other cases benefit as well.
>>
>
> Yes, in theory it should work as long as target_ops in question know how
> to read auxv (that is, as long as to_xfer_partial(ops,
> TARGET_OBJECT_AUXV,...) knows how to do it.)
>
> I had internally made this change:
>
> {
> - if (exec_bfd != NULL
> + if ((exec_bfd != NULL
> && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
> + || exec_bfd == NULL)
> debug_base = elf_locate_base ();
> }
> return (debug_base);
>
>
> But wanted to be more conservative for FSF, since I do not quite
> understand under which circumstances could we end up in solib-svr4, and
> not have "bfd_target_elf_flavour".
>
>
> Thanks,
>
--
Aleksandar Ristovski
QNX Software Systems
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-11 13:39 ` Aleksandar Ristovski
2009-06-18 14:04 ` Aleksandar Ristovski
@ 2009-06-18 23:03 ` Pedro Alves
2009-06-19 14:16 ` Aleksandar Ristovski
1 sibling, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2009-06-18 23:03 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski
On Thursday 11 June 2009 14:39:18, Aleksandar Ristovski wrote:
> Pedro Alves wrote:
> >> if (info->debug_base == 0 && svr4_have_link_map_offsets ())
> >> {
> >> - if (exec_bfd != NULL
> >> + if ((exec_bfd != NULL
> >> && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
> >> + || (core_bfd != NULL
> >> + && bfd_get_flavour (core_bfd) == bfd_target_elf_flavour))
> >> info->debug_base = elf_locate_base ();
> >> }
> >
> > Are there live debugging cases (archs?, PIE?) (e.g., "target remote"
> > without specifying an executable) where letting elf_locate_base
> > try to read the debug base from the target's auxv (scan_dyntag_auxv)
> > will work? It would mean that removing the exec_bfd checks instead
> > of adding core_bfd checks, would still improve your case, while
> > letting other cases benefit as well.
> >
>
> Yes, in theory it should work as long as target_ops in
> question know how to read auxv (that is, as long as
> to_xfer_partial(ops, TARGET_OBJECT_AUXV,...) knows how to do
> it.)
>
> I had internally made this change:
>
> {
> - if (exec_bfd != NULL
> + if ((exec_bfd != NULL
> && bfd_get_flavour (exec_bfd) ==
> bfd_target_elf_flavour)
> + || exec_bfd == NULL)
> debug_base = elf_locate_base ();
> }
> return (debug_base);
>
>
> But wanted to be more conservative for FSF, since I do not
> quite understand under which circumstances could we end up
> in solib-svr4, and not have "bfd_target_elf_flavour".
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
:
--
Pedro Alves
---
gdb/solib-svr4.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
Index: src/gdb/solib-svr4.c
===================================================================
--- src.orig/gdb/solib-svr4.c 2009-06-18 20:55:50.000000000 +0100
+++ src/gdb/solib-svr4.c 2009-06-18 22:25:11.000000000 +0100
@@ -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;
}
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-18 23:03 ` Pedro Alves
@ 2009-06-19 14:16 ` Aleksandar Ristovski
2009-06-19 14:42 ` Mark Kettenis
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-06-19 14:16 UTC (permalink / raw)
To: gdb-patches
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
> :
>
It is probably not dumped separately in a note, but if it
is a full core, then it should be retrievable.
This is the case I have with Neutrino core files.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-19 14:16 ` Aleksandar Ristovski
@ 2009-06-19 14:42 ` Mark Kettenis
2009-06-19 14:56 ` Daniel Jacobowitz
2009-06-19 15:00 ` Pedro Alves
0 siblings, 2 replies; 11+ messages in thread
From: Mark Kettenis @ 2009-06-19 14:42 UTC (permalink / raw)
To: aristovski; +Cc: gdb-patches
> From: Aleksandar Ristovski <aristovski@qnx.com>
> 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?
> It is probably not dumped separately in a note, but if it
> is a full core, then it should be retrievable.
How do you figure out where to look? Especially for PIE executables
this will be very hard.
> This is the case I have with Neutrino core files.
I suppose Neutrino doesn't support PIE executables?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-19 14:42 ` Mark Kettenis
@ 2009-06-19 14:56 ` Daniel Jacobowitz
2009-06-19 15:00 ` Pedro Alves
1 sibling, 0 replies; 11+ messages in thread
From: Daniel Jacobowitz @ 2009-06-19 14:56 UTC (permalink / raw)
To: Mark Kettenis; +Cc: aristovski, gdb-patches
On Fri, Jun 19, 2009 at 04:42:04PM +0200, Mark Kettenis wrote:
> > From: Aleksandar Ristovski <aristovski@qnx.com>
> > 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?
That works fine:
drow@caradoc:~% readelf -n core
Notes at offset 0x00000430 with length 0x00000344:
Owner Data size Description
CORE 0x00000150 NT_PRSTATUS (prstatus structure)
CORE 0x00000088 NT_PRPSINFO (prpsinfo structure)
CORE 0x00000130 NT_AUXV (auxiliary vector)
drow@caradoc:~% objdump -h core
core: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 note0 00000344 0000000000000000 0000000000000000 00000430 2**0
CONTENTS, READONLY
1 .reg/14342 000000d8 0000000000000000 0000000000000000 000004b4 2**2
CONTENTS
2 .reg 000000d8 0000000000000000 0000000000000000 000004b4 2**2
CONTENTS
3 .auxv 00000130 0000000000000000 0000000000000000 00000644 2**3
CONTENTS
But reading it again, Pedro said "the segment that would contain the
program headers, as indicated by auxv info". That's probably not
dumped by default, as it's read-only.
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-19 14:42 ` Mark Kettenis
2009-06-19 14:56 ` Daniel Jacobowitz
@ 2009-06-19 15:00 ` Pedro Alves
2009-06-19 16:03 ` Aleksandar Ristovski
1 sibling, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2009-06-19 15:00 UTC (permalink / raw)
To: gdb-patches; +Cc: Mark Kettenis, aristovski
On Friday 19 June 2009 15:42:04, Mark Kettenis wrote:
> > From: Aleksandar Ristovski <aristovski@qnx.com>
> > 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?
--
Pedro Alves
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-19 15:00 ` Pedro Alves
@ 2009-06-19 16:03 ` Aleksandar Ristovski
2009-06-20 0:17 ` Pedro Alves
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-06-19 16:03 UTC (permalink / raw)
To: gdb-patches
Pedro Alves wrote:
> On Friday 19 June 2009 15:42:04, Mark Kettenis wrote:
>>> From: Aleksandar Ristovski <aristovski@qnx.com>
>>> 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
<http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>.
(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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] solib-svr4.c - allow reading linkmap info from core without executable
2009-06-19 16:03 ` Aleksandar Ristovski
@ 2009-06-20 0:17 ` Pedro Alves
0 siblings, 0 replies; 11+ messages in thread
From: Pedro Alves @ 2009-06-20 0:17 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski
On Friday 19 June 2009 17:03:24, Aleksandar Ristovski wrote:
>
> Yes, it works:
Okay, I've applied it, as below.
> (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
^^
^^
IIRC, this is due to only pulling in symbols from shared
libraries automatically if there's an exec_bfd (post_create_inferior).
I think that if we audit all solib-*.c implementations to make sure
they won't crash or do something wild without an exec_bfd, we
could remove that restriction.
--
Pedro Alves
2009-06-20 Aleksandar Ristovski <aristovski@qnx.com>
Pedro Alves <pedro@codesourcery.com>
* solib-svr4.c (IGNORE_FIRST_LINK_MAP_ENTRY): Avoid dereferencing
NULL pointer.
(scan_dyntag): Skip if input bfd isn't elf flavoured.
(locate_base): Call elf_locate_base even without an exec_bfd.
---
gdb/solib-svr4.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
Index: src/gdb/solib-svr4.c
===================================================================
--- src.orig/gdb/solib-svr4.c 2009-06-18 20:55:50.000000000 +0100
+++ src/gdb/solib-svr4.c 2009-06-18 22:25:11.000000000 +0100
@@ -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;
}
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2009-06-20 0:17 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-29 20:42 [patch] solib-svr4.c - allow reading linkmap info from core without executable Aleksandar Ristovski
2009-06-10 22:07 ` Pedro Alves
2009-06-11 13:39 ` Aleksandar Ristovski
2009-06-18 14:04 ` Aleksandar Ristovski
2009-06-18 23:03 ` Pedro Alves
2009-06-19 14:16 ` Aleksandar Ristovski
2009-06-19 14:42 ` Mark Kettenis
2009-06-19 14:56 ` Daniel Jacobowitz
2009-06-19 15:00 ` Pedro Alves
2009-06-19 16:03 ` Aleksandar Ristovski
2009-06-20 0:17 ` Pedro Alves
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox