Skip to content

Latest commit

 

History

History
112 lines (103 loc) · 6.19 KB

README.md

File metadata and controls

112 lines (103 loc) · 6.19 KB

How to generate hello.so file

With 64-bit gcc:

% gcc -o hello.so helloworld.c -Wl,--as-needed -shared -fPIC
% readelf --dyn-syms hello.so

Symbol table '.dynsym' contains 13 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)
     3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
     5: 0000000000000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.2.5 (2)
     6: 0000000000201030     0 NOTYPE  GLOBAL DEFAULT   22 _edata
     7: 000000000000065a    33 FUNC    GLOBAL DEFAULT   12 helloWorld
     8: 0000000000201038     0 NOTYPE  GLOBAL DEFAULT   23 _end
     9: 0000000000201030     0 NOTYPE  GLOBAL DEFAULT   23 __bss_start
    10: 000000000000067b    43 FUNC    GLOBAL DEFAULT   12 main
    11: 0000000000000520     0 FUNC    GLOBAL DEFAULT    9 _init
    12: 00000000000006a8     0 FUNC    GLOBAL DEFAULT   13 _fini

% readelf --section-headers hello.so
There are 26 section headers, starting at offset 0x1140:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .note.gnu.build-i NOTE             00000000000001c8  000001c8
       0000000000000024  0000000000000000   A       0     0     4
  [ 2] .gnu.hash         GNU_HASH         00000000000001f0  000001f0
       0000000000000040  0000000000000000   A       3     0     8
  [ 3] .dynsym           DYNSYM           0000000000000230  00000230
       0000000000000138  0000000000000018   A       4     1     8
  [ 4] .dynstr           STRTAB           0000000000000368  00000368
       00000000000000a6  0000000000000000   A       0     0     1
  [ 5] .gnu.version      VERSYM           000000000000040e  0000040e
       000000000000001a  0000000000000002   A       3     0     2
  [ 6] .gnu.version_r    VERNEED          0000000000000428  00000428
       0000000000000020  0000000000000000   A       4     1     8
  [ 7] .rela.dyn         RELA             0000000000000448  00000448
       00000000000000a8  0000000000000018   A       3     0     8
  [ 8] .rela.plt         RELA             00000000000004f0  000004f0
       0000000000000030  0000000000000018  AI       3    21     8
  [ 9] .init             PROGBITS         0000000000000520  00000520
       0000000000000017  0000000000000000  AX       0     0     4
  [10] .plt              PROGBITS         0000000000000540  00000540
       0000000000000030  0000000000000010  AX       0     0     16
  [11] .plt.got          PROGBITS         0000000000000570  00000570
       0000000000000008  0000000000000008  AX       0     0     8
  [12] .text             PROGBITS         0000000000000580  00000580
       0000000000000126  0000000000000000  AX       0     0     16
  [13] .fini             PROGBITS         00000000000006a8  000006a8
       0000000000000009  0000000000000000  AX       0     0     4
  [14] .rodata           PROGBITS         00000000000006b1  000006b1
       0000000000000010  0000000000000000   A       0     0     1
  [15] .eh_frame_hdr     PROGBITS         00000000000006c4  000006c4
       000000000000002c  0000000000000000   A       0     0     4
  [16] .eh_frame         PROGBITS         00000000000006f0  000006f0
       000000000000009c  0000000000000000   A       0     0     8
  [17] .init_array       INIT_ARRAY       0000000000200e10  00000e10
       0000000000000008  0000000000000008  WA       0     0     8
  [18] .fini_array       FINI_ARRAY       0000000000200e18  00000e18
       0000000000000008  0000000000000008  WA       0     0     8
  [19] .dynamic          DYNAMIC          0000000000200e20  00000e20
       00000000000001c0  0000000000000010  WA       4     0     8
  [20] .got              PROGBITS         0000000000200fe0  00000fe0
       0000000000000020  0000000000000008  WA       0     0     8
  [21] .got.plt          PROGBITS         0000000000201000  00001000
       0000000000000028  0000000000000008  WA       0     0     8
  [22] .data             PROGBITS         0000000000201028  00001028
       0000000000000008  0000000000000000  WA       0     0     8
  [23] .bss              NOBITS           0000000000201030  00001030
       0000000000000008  0000000000000000  WA       0     0     1
  [24] .comment          PROGBITS         0000000000000000  00001030
       000000000000002a  0000000000000001  MS       0     0     1
  [25] .shstrtab         STRTAB           0000000000000000  0000105a
       00000000000000e1  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)

Or in 32-bit mode (one might need to install gcc-multilib on Ubuntu):

% gcc -o hello.so helloworld.c -Wl,--as-needed -shared -fPIC
% readelf --dyn-syms hello32.so

Symbol table '.dynsym' contains 13 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.0 (2)
     3: 00000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.1.3 (3)
     4: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     5: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
     6: 00002018     0 NOTYPE  GLOBAL DEFAULT   22 _edata
     7: 000004ed    49 FUNC    GLOBAL DEFAULT   12 helloWorld
     8: 0000201c     0 NOTYPE  GLOBAL DEFAULT   23 _end
     9: 00002018     0 NOTYPE  GLOBAL DEFAULT   23 __bss_start
    10: 0000051e    66 FUNC    GLOBAL DEFAULT   12 main
    11: 0000038c     0 FUNC    GLOBAL DEFAULT    9 _init
    12: 00000564     0 FUNC    GLOBAL DEFAULT   13 _fini