Hi Sukadev,
On Tue, 2014-05-06 at 16:32 -0700, Sukadev Bhattiprolu wrote:
But I am not sure how to extend the code to work with PC value that
points
to, say __random(), in glibc.
I have these installed:
glibc-common-2.18-11.fc20.ppc64p7
glibc-2.18-11.fc20.ppc64p7
glibc-headers-2.18-11.fc20.ppc64p7
glibc-debuginfo-common-2.18-11.fc20.ppc64p7
glibc-devel-2.18-11.fc20.ppc64p7
glibc-debuginfo-2.18-11.fc20.ppc64p7
$ objdump -D /usr/lib64/libc-2.18.so
....
00000080a7be3bf0 <.__random>:
80a7be3bf0: 7c 08 02 a6 mflr r0
80a7be3bf4: fb e1 ff f8 std r31,-8(r1)
80a7be3bf8: 60 00 00 00 nop
80a7be3bfc: 39 00 00 01 li r8,1
80a7be3c00: 3b e2 9a f0 addi r31,r2,-25872
80a7be3c04: 39 40 00 00 li r10,0
80a7be3c08: f8 01 00 10 std r0,16(r1)
80a7be3c0c: f8 21 ff 71 stdu r1,-144(r1)
80a7be3c10: 7d 20 f8 29 lwarx r9,0,r31,1
80a7be3c14: 7c 09 50 00 cmpw r9,r10
80a7be3c18: 40 82 00 0c bne 80a7be3c24 <.__random+0x34>
80a7be3c1c: 7d 00 f9 2d stwcx. r8,0,r31
>>>> 80a7be3c20: 40 c2 ff f0 bne- 80a7be3c10
<.__random+0x20>
....
$ ./crc5 80a7be3c20 80a7be3c20 /usr/lib64/libc-2.18.so
Error dwarf_cfi_addrframe(): : no matching address range
Error with addr 0x80a7be3c20
$ ./crc5 80a7be3c20 80a7be3c20 /usr/lib/debug/lib64/libc.so.6.debug
Error dwfl_addrmodule: no error
Error with addr 0x80a7be3c20
Pls find the code attached. Appreciate any comments on how to extend it
to work with split debug info files.
The first invocation should work (it will find the separate debug info
file that matches itself through dwfl_standard_find_debuginfo).
You find the .debug_frame CFI through dwfl_module_dwarf_cfi and then
lookup the address using dwarf_cfi_addrframe. The .debug_frame
apparently exists but doesn't contain the requested address. You should
then try to find it through the .eh_frame CFI using dwfl_module_eh_cfi
(or just swap the dwfl_module_dwarf_cfi and dwfl_module_eh_cfi calls
since on fedora the .eh_frame should always be complete because GCC uses
-fasynchronous-unwind-tables by default).
Cheers,
Mark