title: How to find the offset of the section header string table of an elf file?
body: <p>I have to write a C program that prints an ELF file. I'm having trouble figuring out where the section header string table is.</p>
  
  <p>Let's say I have a file that gave me the following output with:</p>
  
  <p>readelf -h</p>
  
  <pre><code>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:                              REL (Relocatable file)  
    Machine:                           Intel 80386
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          0 (bytes into file)
    Start of section headers:          17636 (bytes into file)
    Flags:                             0x0
    Size of this header:               52 (bytes)
    Size of program headers:           0 (bytes)
    Number of program headers:         0
    Size of section headers:           40 (bytes)
    Number of section headers:         23
    Section header string table index: 20
  </code></pre>
  
  <p>and with: </p>
  
  <p>readelf -S:</p>
  
  <pre><code>There are 23 section headers, starting at offset 0x44e4:
  Section Headers:
    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
    [ 0]                   NULL            00000000 000000 000000 00      0   0  0
    [ 1] .text             PROGBITS        00000000 000034 000028 00  AX  0   0  4
    [ 2] .rel.text         REL             00000000 0049d0 000018 08     21   1  4
    [ 3] .data             PROGBITS        00000000 00005c 000000 00  WA  0   0  4
    [ 4] .bss              NOBITS          00000000 00005c 000000 00  WA  0   0  4
    [ 5] .rodata           PROGBITS        00000000 00005c 00000a 00   A  0   0  1
    [ 6] .debug_info       PROGBITS        00000000 000066 00008f 00      0   0  1
    [ 7] .rel.debug_info   REL             00000000 0049e8 0000b0 08     21   6  4
    [ 8] .debug_abbrev     PROGBITS        00000000 0000f5 000041 00      0   0  1
    [ 9] .debug_loc        PROGBITS        00000000 000136 000038 00      0   0  1
    [10] .debug_aranges    PROGBITS        00000000 00016e 000020 00      0   0  1
    [11] .rel.debug_arange REL             00000000 004a98 000010 08     21  10  4
    [12] .debug_line       PROGBITS        00000000 00018e 0001b3 00      0   0  1
    [13] .rel.debug_line   REL             00000000 004aa8 000008 08     21  12  4
    [14] .debug_macinfo    PROGBITS        00000000 000341 003fb9 00      0   0  1
    [15] .debug_str        PROGBITS        00000000 0042fa 0000bf 01  MS  0   0  1
    [16] .comment          PROGBITS        00000000 0043b9 00002b 01  MS  0   0  1
    [17] .note.GNU-stack   PROGBITS        00000000 0043e4 000000 00      0   0  1
    [18] .eh_frame         PROGBITS        00000000 0043e4 000038 00   A  0   0  4
    [19] .rel.eh_frame     REL             00000000 004ab0 000008 08     21  18  4
    [20] .shstrtab         STRTAB          00000000 00441c 0000c5 00      0   0  1
    [21] .symtab           SYMTAB          00000000 00487c 000130 10     22  16  4
    [22] .strtab           STRTAB          00000000 0049ac 000021 00      0   0  1
  Key to Flags:
    W (write), A (alloc), X (execute), M (merge), S (strings)
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
    O (extra OS processing required) o (OS specific), p (processor specific)
  </code></pre>
  
  <p>How would I be able to calculate the location of the section header string table?</p>