I am trying to find the base address of ELF files. I know that you can use readelf to find the entry point to the program and various section details (base address, size, flags, etc.).
For example, programs for the x86 architecture are based on the 0x8048000 linker. using readelf I can see the entry point to the program, but no specific output field reports the base address.
$ readelf -e test ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2 complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x8048390 Start of program headers: 52 (bytes into file) Start of section headers: 4436 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 30 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 08048154 000154 000013 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 08048168 000168 000020 00 A 0 0 4 [ 3] .note.gnu.build-i NOTE 08048188 000188 000024 00 A 0 0 4 [ 4] .gnu.hash GNU_HASH 080481ac 0001ac 000024 04 A 5 0 4 [ 5] .dynsym DYNSYM 080481d0 0001d0 000070 10 A 6 1 4
In the details of the section, I see that the offset is calculated relative to the ELF base address.
So, the .dynsym section starts with the address, 0x080481d0 and the offset 0x1d0. This means that the base address is 0x08048000. Is it correct?
Similarly, for programs compiled on different architectures, such as PPC, ARM, MIPS, I do not see their base address, but only OEP, Section Headers.
source share