title: Base Address of ELF
body: <p>I am trying to find the base address of ELF files. I know that you can use readelf to find the Program Entry Point and different section details (base address, size, flags and so on).</p>
  
  <p>For example, programs for x86 architecture are based at 0x8048000 by linker. using readelf I can see the program entry point but no specific field in the output tells the base address.</p>
  
  <pre><code>$ 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's 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
  </code></pre>
  
  <p>In the section details, I can see that the Offset is calculated with respect to the base address of the ELF.</p>
  
  <p>So, <code>.dynsym</code> section starts at address, 0x080481d0 and offset is 0x1d0. This would mean the base address is, 0x08048000. Is this correct?</p>
  
  <p>similarly, for programs compiled on different architectures like PPC, ARM, MIPS, I cannot see their base address but only the OEP, Section Headers.</p>