Reputation: 2667
readelf -S
of a particular binary gives the following output
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
0000000000000a7c 0000000000000004 A 4 0 8
[ 4] .dynsym DYNSYM 0000000000400cf8 00000cf8
.
.
.
Difference between virtual address and offset of first section .interp
is 0x400000
. I am curious as to:
Upvotes: 0
Views: 702
Reputation: 213386
how is this calculated?
You just calculated it yourself: 0x400238 - 0x238 == 0x400000
. Your question is probably "why is this particular address selected?".
This is the default link-at address for Linux x86_64
position dependent binaries. You can change that address with -Ttext=...
linker flag. The default is different for ix86
(32-bit) binaries: it's 0x8048000
.
I am not sure why these particular defaults were chosen.
Is there a programmatic way of determining this?
Sure: read the Elf64_Ehdr
from the start of the file. It will tell you offset to the start of program headers (.e_phoff
). Seek to that offset, and read Elf64_Phdr
s. Now iterate over them, and their .p_vaddr
and .p_offset
will have the same values.
P.S. You are looking at program sections which are not used and are not guaranteed to be present in a fully-linked binary. You should be looking at program segments instead. Use readelf -Wl a.out
to examine them.
Upvotes: 1