entries in PT_DYNAMIC section refer to the correct address at runtime?

2017-09-13 Thread Yubin Ruan
Hi,

I read the ELF spec and note that, a segment designated by a program
header of type PT_DYNAMIC have several entries, many of which contain
addresses of other things. For example, an entry of type DT_SYMTAB was
described (in the ELF) spec to "holds the address of the symbol
table". I wonder whether this address is true at runtime?

Normally a program header would have the following structure:

typedef struct {
Elf32_Word  p_type;
Elf32_Off   p_offset;
Elf32_Addr  p_vaddr;
Elf32_Addr  p_paddr;
Elf32_Word  p_filesz;
Elf32_Word  p_memsz;
Elf32_Word  p_flags;
Elf32_Word  p_align;
} Elf32_Phdr;

The `p_vaddr` hold the virtual address (runtime address) for a shared
object file and a executable file. But, as stated in the ELF spec,
`p_vaddr` might not be correct for a shared object (because it is
required to be PIC). So, if that `p_vaddr` is not correct, will those
entries in PT_DYNAMIC be correct?

Yubin


Re: entries in PT_DYNAMIC section refer to the correct address at runtime?

2017-09-14 Thread Yubin Ruan
2017-09-14 18:25 GMT+08:00 Alan Modra :
> On Thu, Sep 14, 2017 at 12:09:51PM +0800, Yubin Ruan wrote:
>> Hi,
>>
>> I read the ELF spec and note that, a segment designated by a program
>> header of type PT_DYNAMIC have several entries, many of which contain
>> addresses of other things. For example, an entry of type DT_SYMTAB was
>> described (in the ELF) spec to "holds the address of the symbol
>> table". I wonder whether this address is true at runtime?
>>
>> Normally a program header would have the following structure:
>>
>> typedef struct {
>> Elf32_Word  p_type;
>> Elf32_Off   p_offset;
>> Elf32_Addr  p_vaddr;
>> Elf32_Addr  p_paddr;
>> Elf32_Word  p_filesz;
>> Elf32_Word  p_memsz;
>> Elf32_Word  p_flags;
>> Elf32_Word  p_align;
>> } Elf32_Phdr;
>>
>> The `p_vaddr` hold the virtual address (runtime address) for a shared
>> object file and a executable file. But, as stated in the ELF spec,
>> `p_vaddr` might not be correct for a shared object (because it is
>> required to be PIC). So, if that `p_vaddr` is not correct, will those
>> entries in PT_DYNAMIC be correct?
>
> DT_ entries that specify addresses will need to be offset by the base
> address.

Will base address be automatically adjusted by the dynamic linker if
it tries to loaded it at a different base address than that specified
in the `p_vaddr'?

Thanks,
Yubin