ELF decoder for symbols
Zhengyu Gu
zhengyu.gu at oracle.com
Mon Aug 4 18:59:11 UTC 2014
Hi Harish,
Yes, apparently we do not handle prelinked case. Could you please file a
bug, so we can work on it.
Thanks,
-Zhengyu
On 8/4/2014 8:13 AM, Harish Babu wrote:
> Hi,
>
> I have a question regarding the code for ELF files parsing(Linux).
>
> Looking at the code below it appears the relative offset address is sent
> like the below code:
>
> os::dll_address_to_function_name() {
> ....
> Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
> buf, buflen, offset, dlinfo.dli_fname))
> ....
> }
>
> This works well for most of the libraries which are not prelinked at
> particular address where the symbol tables are relative offsets.
>
> But when the libraries are prelinked at an address this does not work well.
> Like libc,
> readelf -l /lib64/libc.so.6
> Program Headers:
> Type Offset VirtAddr PhysAddr
> FileSiz MemSiz Flags Align
> PHDR 0x0000000000000040 0x00000038e7400040 0x00000038e7400040
> 0x0000000000000230 0x0000000000000230 R E 8
> INTERP 0x000000000013ff60 0x00000038e753ff60 0x00000038e753ff60
> 0x000000000000001c 0x000000000000001c R 10
> [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
> LOAD 0x0000000000000000 0x00000038e7400000 0x00000038e7400000
> 0x000000000016f150 0x000000000016f150 R E 200000
> LOAD 0x000000000016f720 0x00000038e776f720 0x00000038e776f720
> 0x0000000000004678 0x0000000000009188 RW 200000
>
>
> Where libc may(or may not) be loaded at a base address 0x38e7400000, and
> the addresses are the absolute address rather than relative offsets.
>
> 131: 00000038e74274b0 192 FUNC LOCAL DEFAULT 12 open_translit
> 132: 00000038e7773f78 4 OBJECT LOCAL DEFAULT 34 lock
> 133: 00000038e7427c82 31 FUNC LOCAL DEFAULT 12 _L_lock_107
> 134: 00000038e7427810 11 FUNC LOCAL DEFAULT 12 trans_compare
> 135: 00000038e7773f70 8 OBJECT LOCAL DEFAULT 34 search_tree
> 136: 00000038e7427ca1 31 FUNC LOCAL DEFAULT 12 _L_unlock_135
>
>
>
>
> For pthread(which is not prelinked to an address) which the current code
> deals with correctly there is only relative addresses in the ELF file:
>
> 121: 000000000000da48 19 FUNC LOCAL DEFAULT 14 sem_wait_cleanup
> 122: 000000000000dc15 19 FUNC LOCAL DEFAULT 14
> sem_timedwait_cleanup
> 123: 000000000000dc28 31 FUNC LOCAL DEFAULT 14
> sem_timedwait_cleanup2
> 124: 000000000000df50 33 FUNC LOCAL DEFAULT 14 unwind_cleanup
> 125: 000000000000df80 287 FUNC LOCAL DEFAULT 14 unwind_stop
> 126: 000000000000e800 237 FUNC LOCAL DEFAULT 14 do_fcntl
>
>
> So like I mentioned earlier, the code os::dll_address_to_function_name
> subtracts the base address where the library was loaded from the current
> pc. This results in relative offset which may not work well for the
> libraries which are prelinked to an address.
>
> Please let me know if I got it completely wrong.
>
> Thanks,
> Harish
More information about the hotspot-runtime-dev
mailing list