ELF decoder for symbols
Harish Babu
harish.b310 at gmail.com
Mon Aug 11 19:15:01 UTC 2014
Hi,
There appears to be another bug in the symbol resolution code.
In ElfSymbolTable::lookup()
While iterating through the symbols the "if" condition is
if (sym_addr < addr && (addr - sym_addr) < *offset)
But shouldn't it be:
if (sym_addr <= addr && (addr - sym_addr) < *offset)
Otherwise what happens if the address(pc) is the beginning of the function
call itself?
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