On Fri, 2013-11-15 at 14:35 +0100, Mark Wielaard wrote:
On Thu, 2013-11-14 at 16:00 -0800, Josh Stone wrote:
> > $ /usr/sbin/prelink -u testfilebazmin
> > $ /usr/sbin/prelink -r 0x70000000 testfilebazmin
> > $ ./dwflsyms -e testfilebazmin | grep -w FUNC | grep -wE
'main|foo|bar'
> > 8: FUNC LOCAL foo (20) 0x75c
> > 47: FUNC GLOBAL bar (40) 0x770
> > 51: FUNC GLOBAL main (35) 0x738
>
> Normal prelink is better here, but now prelink -r didn't actually appear
> to move any of foo, bar, or main!?!
$ eu-readelf -l testfilebazmin | grep LOAD | head -1 LOAD 0x000000
0x0000000070000000 0x0000000070000000 0x000a5c 0x000a5c R E 0x200000
$ eu-readelf -s testfilebazmin | grep -w FUNC | grep -wE 'main|foo|bar'
12: 00000000700007f0 35 FUNC GLOBAL DEFAULT 13 main
$ eu-readelf --elf-section -s testfilebazmin | grep -w FUNC | grep -wE
'main|foo|bar'
7: 0000000000000814 20 FUNC LOCAL DEFAULT 13 foo
36: 0000000000000828 44 FUNC GLOBAL DEFAULT 13 bar
$ ./dwflsyms -e testfilebazmin | grep -w FUNC | grep -wE 'main|foo|bar'
8: FUNC LOCAL foo (20) 0x814, rel: 0xffffffff90000814
47: FUNC GLOBAL main (35) 0x700007f0, rel: 0x7f0
49: FUNC GLOBAL bar (44) 0x828, rel: 0xffffffff90000828
OK, that is definitely a bug. But I cannot immediately explain why it
worked fine in the -N case and not in the -r case. Except for the
specific load address there should be no difference.
Except that prelink -r doesn't actually do a prelink. In particular it
doesn't add a .gnu.prelink_undo section which we look for to create the
synchronization address between the main and debug files. See
find_prelink_address_sync() in libdwfl/dwfl_module_getdwarf.c.
This is a somewhat strange case. We separate the main and debug/aux
files first and then run prelink -r to adjust the base address of the
main file. How important is this case?
Thanks,
Mark