I'm trying to understand dynamic linking process...the call to a library function (let's call it `func`) passes through the `plt` table. I know when the symbol is not yet relocated the call of the function passes from `plt` table which contains an istruction (say `i1`) like `jmp *function_in_GOT` which points to the next instruction after `i1` that appears like `push $offset`: after the control is passed to the dynamic linker that fixes up the relative `GOT` entry with the address of the function. `offset` should be the index of the entry in the relocation table but i don't understand...how this value can be find by reading the elf of the executable. Is possible with 

```
objdump --dynamic-reloc prog

```

to find something? For example i wrote a very simple program that uses only `printf` and `strcpy` and output of the previous command is: 

```
DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049ff0 R_386_GLOB_DAT    __gmon_start__
0804a000 R_386_JUMP_SLOT   __gmon_start__
0804a004 R_386_JUMP_SLOT   __libc_start_main
0804a008 R_386_JUMP_SLOT   strcpy
0804a00c R_386_JUMP_SLOT   printf

```

For example by reading with `gdb` the instructions starting at `printf@plt`:

```
0x8048324 <printf@plt>: jmp    *0x804a00c
0x804832a <printf@plt+6>:   push   $0x18
0x804832f <printf@plt+11>:  jmp    0x80482e4

```

we can see that the value for the `offset` is `0x18` (24 in decimal) but reading the output of `objdump` seems that offset of `printf` from the first reloc entry is `0x1c`.

Some ideas?