title: ELF dynamic symbol table
body: <p>I have a question about ELF dynamic symbol table. For symbols of type FUNC, I have noticed a value of 0 in some binaries. But in other binaries, it has some non-zero value. Both these binaries were generated by gcc, I want to know why is this difference?. Is there any compiler options to control this?</p>
  
  <p>EDIT: This is the output of readelf --dyn-syms prog1</p>
  
  <pre><code>Symbol table '.dynsym' contains 5 entries:
  Num:    Value  Size Type    Bind   Vis      Ndx Name
   0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
   1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
   2: 000082f0     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.4 (2)
   3: 00008314     0 FUNC    GLOBAL DEFAULT  UND abort@GLIBC_2.4 (2)
   4: 000082fc     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.4 
  </code></pre>
  
  <p>Here value of "printf" symbol is 82f0 which happens to be the address of plt table entry for printf.</p>
  
  <p>Output of readelf --dyn-syms prog2</p>
  
  <pre><code>Symbol table '.dynsym' contains 6 entries:
  Num:    Value  Size Type    Bind   Vis      Ndx Name
   0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
   1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
   2: 00000000     0 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.4 (2)
   3: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.4 (2)
   4: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort@GLIBC_2.4 (2)
   5: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.4 
  </code></pre>
  
  <p>Here the values for all the symbols are zero.</p>