Saturday, March 8, 2014

#3 Linkers, Loaders and Libraries

I'm recently reading the book "Linkers, Loaders and Libraries". It really opens my mind. The process of the generation of a program always confuses me a lot. To understand and put my learning into practice, this paper is to record my study on Chapter 3 of the book.

My programming environment is Fedora 20, 64bit.

1. gcc -c SimpleSection.c
2. objdump -h SimpleSection.o
SimpleSection.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000054  0000000000000000  0000000000000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000008  0000000000000000  0000000000000000  00000094  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000004  0000000000000000  0000000000000000  0000009c  2**2
                  ALLOC
  3 .rodata       00000004  0000000000000000  0000000000000000  0000009c  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      0000002d  0000000000000000  0000000000000000  000000a0  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  000000cd  2**0
                  CONTENTS, READONLY
  6 .eh_frame     00000058  0000000000000000  0000000000000000  000000d0  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

3. size SimpleSection.o
   text   data    bss    dec    hex filename
    176      8      4    188     bc SimpleSection.o
4. objdump -x -s -d SimpleSection.o
SimpleSection.o:     file format elf64-x86-64
SimpleSection.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000054  0000000000000000  0000000000000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000008  0000000000000000  0000000000000000  00000094  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000004  0000000000000000  0000000000000000  0000009c  2**2
                  ALLOC
  3 .rodata       00000004  0000000000000000  0000000000000000  0000009c  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      0000002d  0000000000000000  0000000000000000  000000a0  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  000000cd  2**0
                  CONTENTS, READONLY
  6 .eh_frame     00000058  0000000000000000  0000000000000000  000000d0  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
SYMBOL TABLE:
0000000000000000 l    df *ABS* 0000000000000000 SimpleSection.c
0000000000000000 l    d  .text 0000000000000000 .text
0000000000000000 l    d  .data 0000000000000000 .data
0000000000000000 l    d  .bss 0000000000000000 .bss
0000000000000000 l    d  .rodata 0000000000000000 .rodata
0000000000000004 l     O .data 0000000000000004 static_var.1728
0000000000000000 l     O .bss 0000000000000004 static_var2.1729
0000000000000000 l    d  .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame 0000000000000000 .eh_frame
0000000000000000 l    d  .comment 0000000000000000 .comment
0000000000000000 g     O .data 0000000000000004 global_init_var
0000000000000004       O *COM* 0000000000000004 global_uninit_var
0000000000000000 g     F .text 0000000000000021 func1
0000000000000000         *UND* 0000000000000000 printf
0000000000000021 g     F .text 0000000000000033 main


Contents of section .text:
 0000 554889e5 4883ec10 897dfc8b 45fc89c6  UH..H....}..E...
 0010 bf000000 00b80000 0000e800 000000c9  ................
 0020 c3554889 e54883ec 10c745fc 01000000  .UH..H....E.....
 0030 8b150000 00008b05 00000000 01c28b45  ...............E
 0040 fc01c28b 45f801d0 89c7e800 0000008b  ....E...........
 0050 45fcc9c3                             E...          
Contents of section .data:
 0000 54000000 55000000                    T...U...      
Contents of section .rodata:
 0000 25640a00                             %d..          
Contents of section .comment:
 0000 00474343 3a202847 4e552920 342e382e  .GCC: (GNU) 4.8.
 0010 32203230 31333132 31322028 52656420  2 20131212 (Red
 0020 48617420 342e382e 322d3729 00        Hat 4.8.2-7).
Contents of section .eh_frame:
 0000 14000000 00000000 017a5200 01781001  .........zR..x..
 0010 1b0c0708 90010000 1c000000 1c000000  ................
 0020 00000000 21000000 00410e10 8602430d  ....!....A....C.
 0030 065c0c07 08000000 1c000000 3c000000  .\..........<...
 0040 00000000 33000000 00410e10 8602430d  ....3....A....C.
 0050 066e0c07 08000000                    .n......      

Disassembly of section .text:

0000000000000000 <func1>:
   0: 55                   push   %rbp
   1: 48 89 e5             mov    %rsp,%rbp
   4: 48 83 ec 10           sub    $0x10,%rsp
   8: 89 7d fc             mov    %edi,-0x4(%rbp)
   b: 8b 45 fc             mov    -0x4(%rbp),%eax
   e: 89 c6                 mov    %eax,%esi
  10: bf 00 00 00 00       mov    $0x0,%edi
11: R_X86_64_32 .rodata
  15: b8 00 00 00 00       mov    $0x0,%eax
  1a: e8 00 00 00 00       callq  1f <func1+0x1f>
1b: R_X86_64_PC32 printf-0x4
  1f: c9                   leaveq
  20: c3                   retq

0000000000000021 <main>:
  21: 55                   push   %rbp
  22: 48 89 e5             mov    %rsp,%rbp
  25: 48 83 ec 10           sub    $0x10,%rsp
  29: c7 45 fc 01 00 00 00 movl   $0x1,-0x4(%rbp)
  30: 8b 15 00 00 00 00     mov    0x0(%rip),%edx        # 36 <main+0x15>
32: R_X86_64_PC32 .data
  36: 8b 05 00 00 00 00     mov    0x0(%rip),%eax        # 3c <main+0x1b>
38: R_X86_64_PC32 .bss-0x4
  3c: 01 c2                 add    %eax,%edx
  3e: 8b 45 fc             mov    -0x4(%rbp),%eax
  41: 01 c2                 add    %eax,%edx
  43: 8b 45 f8             mov    -0x8(%rbp),%eax
  46: 01 d0                 add    %edx,%eax
  48: 89 c7                 mov    %eax,%edi
  4a: e8 00 00 00 00       callq  4f <main+0x2e>
4b: R_X86_64_PC32 func1-0x4
  4f: 8b 45 fc             mov    -0x4(%rbp),%eax
  52: c9                   leaveq
  53: c3                   retq

6. readelf -h SimpleSection.o
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          400 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           64 (bytes)
  Number of section headers:         13
  Section header string table index: 10

7. readelf -s SimpleSection.o
Symbol table '.symtab' contains 16 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS SimpleSection.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4
     5: 0000000000000000     0 SECTION LOCAL  DEFAULT    5
     6: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    3 static_var.1728
     7: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    4 static_var2.1729
     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    7
     9: 0000000000000000     0 SECTION LOCAL  DEFAULT    8
    10: 0000000000000000     0 SECTION LOCAL  DEFAULT    6
    11: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 global_init_var
    12: 0000000000000004     4 OBJECT  GLOBAL DEFAULT  COM global_uninit_var
    13: 0000000000000000    33 FUNC    GLOBAL DEFAULT    1 func1
    14: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
    15: 0000000000000021    51 FUNC    GLOBAL DEFAULT    1 main
8. nm SimpleSection.o
0000000000000000 T func1
0000000000000000 D global_init_var
0000000000000004 C global_uninit_var
0000000000000021 T main
                 U printf
0000000000000004 d static_var.1728
0000000000000000 b static_var2.1729

No comments:

Post a Comment