ELF decoder for symbols
Harish Babu
harish.b310 at gmail.com
Tue Aug 5 07:19:31 UTC 2014
Hi Zhengyu,
Thanks very much for the confirmation. Will file a bug.
Here is my current idea for the fix
FWIK, the first PT_LOAD.p_vaddr in the program header holds the base
address for the library which hints the loader and all the other addresses
in the file are based on this address. So for each .so file we can remember
this in a class variable of ElfFile. And change the call in ElfFile::decode
to:
symbol_table->lookup(addr+(First_PT_LOAD.p_vaddr), &string_table_index,
&pos_in_string_table, &off)
Should probably fix the issue for all the cases.
Thanks,
Harish
On Tue, Aug 5, 2014 at 12:29 AM, Zhengyu Gu <zhengyu.gu at oracle.com> wrote:
> 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