程序的加载链接和库-静态链接



《深入理解计算机系统》中的例子

hello.h

#ifndef HELLO_H  
#define HELLO_H  
  
void hello(const char *name);  
  
#endif //HELLO_H 

hello.c

#include   
   
void hello(const char *name) {  
    printf("Hello %s!\n", name);  
}  


main.c

include "hello.h"  
int main() {  
    hello("everyone");  
    return 0;  
}  


mian.c中引用了hello函数,这里先对hello.c生成 .o 文件,然后再将hello.o 和 main一起加载,合并成一个可执行文件

静态链接

gcc -c hello.c


将hello.o打包成一个静态库,再编译main.c,跟静态库文件一起合并成一个可执行文件,最后运行

通过gdb反汇编hello文件,静态链接是将main函数和hello函数都打进这个hello程序里面了

ar cr libmyhello.a hello.o  
gcc -o hello main.c -L. -lmyhello  
./hello  
Hello everyone! 

gdb反汇编hello程序

(gdb) disas 
_DYNAMIC                                __do_global_dtors_aux_fini_array_entry  __libc_start_main                       deregister_tm_clones
_GLOBAL_OFFSET_TABLE_                   __dso_handle                            [email protected]               frame_dummy
_IO_stdin_used                          __frame_dummy_init_array_entry          __libc_start_main@plt                   hello
__FRAME_END__                           __gmon_start__                          _edata                                  main
__JCR_END__                             [email protected]                  _end                                    printf
__JCR_LIST__                            __gmon_start__@plt                      _fini                                   [email protected]
__TMC_END__                             __init_array_end                        _init                                   printf@plt
__bss_start                             __init_array_start                      _start                                  register_tm_clones
__data_start                            __libc_csu_fini                         completed.6354                          
__do_global_dtors_aux                   __libc_csu_init                         data_start                              
(gdb) disas main






《程序员的自我修养--链接,加载和库》中的例子

a.c文件内容

extern int shared;  
int main() {  
    int a = 100;  
    swap(&a, &shared);  
}  

 b.c文件内容

int shared = 1;  
void swap(int *a, int *b) {  
    *a ^= *b ^= *a ^= *b;  
}  

将a.o和b.o链接起来,生成 ab 可执行文件

ld a.o b.o -e main -o ab


空间分配策略,简单合并,a.o,b.o,c.o将各自的段依次叠加起来输出到一个目标文件中

程序的加载链接和库-静态链接_第1张图片


更好的实现方案,将a.o,b.o,c.o中相同的段合并到一起

程序的加载链接和库-静态链接_第2张图片




a.o文件 objdump -d 结果

 这里的   mov $0x0,%esi  还有 callq 25  这两个指令对应的地址都是假地址

只是一个占位符,后面到真正链接的时候才会确定最终地址

a.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 
: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp 8: c7 45 fc 64 00 00 00 movl $0x64,-0x4(%rbp) f: 48 8d 45 fc lea -0x4(%rbp),%rax 13: be 00 00 00 00 mov $0x0,%esi 18: 48 89 c7 mov %rax,%rdi 1b: b8 00 00 00 00 mov $0x0,%eax 20: e8 00 00 00 00 callq 25 25: c9 leaveq 26: c3 retq

objdump -r a.o的结果

a.o:     file format elf64-x86-64

RELOCATION RECORDS FOR [.text]:
OFFSET           TYPE              VALUE 
0000000000000014 R_X86_64_32       shared
0000000000000021 R_X86_64_PC32     swap-0x0000000000000004


RELOCATION RECORDS FOR [.eh_frame]:
OFFSET           TYPE              VALUE 
0000000000000020 R_X86_64_PC32     .text

这里的R_X86_64_32是绝对寻址修正,之后连接器会将这两个地址修改成真正可以加载的地址



gdb反汇编ab的main函数

蓝色标注的两行就是重新定位地址,第一个是赋值语言重新定位了地址,第二个的函数调用也重新赋值了地址

Dump of assembler code for function main:
   0x00000000004004ed <+0>:     push   %rbp
   0x00000000004004ee <+1>:     mov    %rsp,%rbp
   0x00000000004004f1 <+4>:     sub    $0x10,%rsp
   0x00000000004004f5 <+8>:     movl   $0x64,-0x4(%rbp)
   0x00000000004004fc <+15>:    lea    -0x4(%rbp),%rax
   0x0000000000400500 <+19>:    mov    $0x60102c,%esi
   0x0000000000400505 <+24>:    mov    %rax,%rdi
   0x0000000000400508 <+27>:    mov    $0x0,%eax
   0x000000000040050d <+32>:    callq  0x400514 
   0x0000000000400512 <+37>:    leaveq 
   0x0000000000400513 <+38>:    retq   
End of assembler dump.



一个简单的hello.c程序,用 gcc --verbose编译出来的内容如下

gcc -static --verbose -fno-builtin hello.c

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v hello.c -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase hello -version -o /tmp/cczX7TMQ.s
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-16) (x86_64-redhat-linux)
        compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-16), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=97 --param ggc-min-heapsize=127051
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
 /usr/local/include
 /usr/include
End of search list.
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-16) (x86_64-redhat-linux)
        compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-16), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=97 --param ggc-min-heapsize=127051
Compiler executable checksum: 25c276d835072ed72bab97eea8b3b665
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/ccoPro2p.o /tmp/cczX7TMQ.s
GNU assembler version 2.25.1 (x86_64-redhat-linux) using BFD version version 2.25.1-32.base.el7_4.2 
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/ccoPro2p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o


查看静态链接库里面的 .o文件

ar -t [xxx.a]

假设有一个hello.c文件,用了io库中的printf函数,单独将这个printf.o从libc.a 中拷贝出来,再链接是不行的

printf.o 又引用了其他 .o文件,而那些 .o文件又引用其他的,这些就没完了

程序的加载链接和库-静态链接_第3张图片




一个没有main函数的程序,利用汇编和中断实现 hello world

char* str = "Hello World!\n";  
  
void print() {  
    //write函数原型 write(int filedesc, char* buffer, int size);
    //write的系统调用为4,即rax=4,
    //第一个参数是fd终端的fd是0 即bx=0,第二个参数是写缓冲地址也就是str字符串,传递给rbx
    //第三个参数是是字符串长度,这里是13传递给rdx,最后通过0x80中断实现
    asm("movq $13,%%rdx \n\t"  
        "movq %0,%%rcx \n\t"  
        "movq $0,%%rbx\n\t"  
        "movq $4,%%rax \n\t"  
        "int $0x80  \n\t"  
        ::"r"(str):"rdx","rcx","rbx");  
}  
  
void exit() {  
    //rbx表示退出的状态码为42,exit的系统调用为1即rax=1,这里也使用0x80中断调用
    asm("movq $42,%rbx \n\t"  
    "movq $1,%rax \n\t"  
    "int $0x80  \n\t"  
    );  
}  
  
void nomain() {  
    print();  
    exit();  
}  

 编译并生成ELF文件,-fno-builtin 是禁止编译器优化,gcc会将一个参数的printf() 优化成puts

gcc -c -fno-builtin TinyHelloWorld.c

ld -static -e nomain -o TinyHelloWorld TinyHelloWorld.o

./TinyHelloWorld 

最终会产生的TinyHelloWorld会有如下sectioin

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         00000000004000e8  000000e8
       0000000000000059  0000000000000000  AX       0     0     1
  [ 2] .rodata           PROGBITS         0000000000400141  00000141
       000000000000000e  0000000000000000   A       0     0     1
  [ 3] .eh_frame         PROGBITS         0000000000400150  00000150
       0000000000000078  0000000000000000   A       0     0     8
  [ 4] .data             PROGBITS         0000000000601000  00001000
       0000000000000008  0000000000000000  WA       0     0     8
  [ 5] .comment          PROGBITS         0000000000000000  00001008
       000000000000002d  0000000000000001  MS       0     0     1
  [ 6] .shstrtab         STRTAB           0000000000000000  00001035
       0000000000000042  0000000000000000           0     0     1
  [ 7] .symtab           SYMTAB           0000000000000000  00001078
       0000000000000150  0000000000000018           8     7     8
  [ 8] .strtab           STRTAB           0000000000000000  000011c8
       0000000000000040  0000000000000000           0     0     1


编写自定义的脚本链接文件,去掉多余的section

这里的意思是程序的入口函数是 nomain

起始地址是  0x08048000 + SIZEOF_HEADERS

然后将  .text, .data, .rodata合并成 tinytext段

最后丢弃 .comment等段

ENTRY(nomain)  
  
SECTIONS  
{  
  . = 0x08048000 + SIZEOF_HEADERS;  
  tinytext : { *(.text) *(.data) *(.rodata)}  
  /DISCARD/ :{ *(.comment) *(.eh_frame) *(.shstrtab) *(.symtab) *(.strtab)}  
}  

 链接命令

ld -static -T tiny.lds -o TinyHello -s TinyHelloWorld.o

最后生成的TinyHello的section如下,但奇怪的是最后生存的TinyHello却有 295424字节,比没去掉多余段的时候还大很多,用hexdump看了结果,貌似里面的内容没有TinyHelloWorld(就是那个没去掉多余段的文件)多,显示这么多字节可能是系统的问题

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] tinytext          PROGBITS         00000000080480b0  000480b0
       0000000000000076  0000000000000000 WAX       0     0     8
  [ 2] .shstrtab         STRTAB           0000000000000000  00048126
       0000000000000014  0000000000000000           0     0     1




参考

Linux下C程序的链接过程

一个没有main函数的的helloworld

《程序员的自我修养-链接,装载与库》



附录

ab ELF文件 执行 readelf -a 后的结果

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:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x400400
  Start of program headers:          64 (bytes into file)
  Start of section headers:          6632 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         30
  Section header string table index: 27

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000400238  00000238
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
       0000000000000020  0000000000000000   A       0     0     4
  [ 3] .note.gnu.build-i NOTE             0000000000400274  00000274
       0000000000000024  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         0000000000400298  00000298
       000000000000001c  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000004002b8  000002b8
       0000000000000048  0000000000000018   A       6     1     8
  [ 6] .dynstr           STRTAB           0000000000400300  00000300
       0000000000000038  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           0000000000400338  00000338
       0000000000000006  0000000000000002   A       5     0     2
  [ 8] .gnu.version_r    VERNEED          0000000000400340  00000340
       0000000000000020  0000000000000000   A       6     1     8
  [ 9] .rela.dyn         RELA             0000000000400360  00000360
       0000000000000018  0000000000000018   A       5     0     8
  [10] .rela.plt         RELA             0000000000400378  00000378
       0000000000000030  0000000000000018  AI       5    12     8
  [11] .init             PROGBITS         00000000004003a8  000003a8
       000000000000001a  0000000000000000  AX       0     0     4
  [12] .plt              PROGBITS         00000000004003d0  000003d0
       0000000000000030  0000000000000010  AX       0     0     16
  [13] .text             PROGBITS         0000000000400400  00000400
       00000000000001d2  0000000000000000  AX       0     0     16
  [14] .fini             PROGBITS         00000000004005d4  000005d4
       0000000000000009  0000000000000000  AX       0     0     4
  [15] .rodata           PROGBITS         00000000004005e0  000005e0
       0000000000000010  0000000000000000   A       0     0     8
  [16] .eh_frame_hdr     PROGBITS         00000000004005f0  000005f0
       000000000000003c  0000000000000000   A       0     0     4
  [17] .eh_frame         PROGBITS         0000000000400630  00000630
       0000000000000114  0000000000000000   A       0     0     8
  [18] .init_array       INIT_ARRAY       0000000000600e10  00000e10
       0000000000000008  0000000000000000  WA       0     0     8
  [19] .fini_array       FINI_ARRAY       0000000000600e18  00000e18
       0000000000000008  0000000000000000  WA       0     0     8
  [20] .jcr              PROGBITS         0000000000600e20  00000e20
       0000000000000008  0000000000000000  WA       0     0     8
  [21] .dynamic          DYNAMIC          0000000000600e28  00000e28
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000600ff8  00000ff8
       0000000000000008  0000000000000008  WA       0     0     8
  [23] .got.plt          PROGBITS         0000000000601000  00001000
       0000000000000028  0000000000000008  WA       0     0     8
  [24] .data             PROGBITS         0000000000601028  00001028
       0000000000000008  0000000000000000  WA       0     0     4
  [25] .bss              NOBITS           0000000000601030  00001030
       0000000000000008  0000000000000000  WA       0     0     1
  [26] .comment          PROGBITS         0000000000000000  00001030
       000000000000002d  0000000000000001  MS       0     0     1
  [27] .shstrtab         STRTAB           0000000000000000  0000105d
       0000000000000108  0000000000000000           0     0     1
  [28] .symtab           SYMTAB           0000000000000000  00001168
       0000000000000648  0000000000000018          29    46     8
  [29] .strtab           STRTAB           0000000000000000  000017b0
       0000000000000231  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8  R E    8
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000744 0x0000000000000744  R E    200000
  LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                 0x0000000000000220 0x0000000000000228  RW     200000
  DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e28
                 0x00000000000001d0 0x00000000000001d0  RW     8
  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
                 0x0000000000000044 0x0000000000000044  R      4
  GNU_EH_FRAME   0x00000000000005f0 0x00000000004005f0 0x00000000004005f0
                 0x000000000000003c 0x000000000000003c  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                 0x00000000000001f0 0x00000000000001f0  R      1

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 
   03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
   04     .dynamic 
   05     .note.ABI-tag .note.gnu.build-id 
   06     .eh_frame_hdr 
   07     
   08     .init_array .fini_array .jcr .dynamic .got 

Dynamic section at offset 0xe28 contains 24 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x4003a8
 0x000000000000000d (FINI)               0x4005d4
 0x0000000000000019 (INIT_ARRAY)         0x600e10
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x600e18
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x400300
 0x0000000000000006 (SYMTAB)             0x4002b8
 0x000000000000000a (STRSZ)              56 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x601000
 0x0000000000000002 (PLTRELSZ)           48 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x400378
 0x0000000000000007 (RELA)               0x400360
 0x0000000000000008 (RELASZ)             24 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400340
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x400338
 0x0000000000000000 (NULL)               0x0

Relocation section '.rela.dyn' at offset 0x360 contains 1 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000600ff8  000200000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x378 contains 2 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000601018  000100000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0
000000601020  000200000007 R_X86_64_JUMP_SLO 0000000000000000 __gmon_start__ + 0

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.

Symbol table '.dynsym' contains 3 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__

Symbol table '.symtab' contains 67 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000400238     0 SECTION LOCAL  DEFAULT    1 
     2: 0000000000400254     0 SECTION LOCAL  DEFAULT    2 
     3: 0000000000400274     0 SECTION LOCAL  DEFAULT    3 
     4: 0000000000400298     0 SECTION LOCAL  DEFAULT    4 
     5: 00000000004002b8     0 SECTION LOCAL  DEFAULT    5 
     6: 0000000000400300     0 SECTION LOCAL  DEFAULT    6 
     7: 0000000000400338     0 SECTION LOCAL  DEFAULT    7 
     8: 0000000000400340     0 SECTION LOCAL  DEFAULT    8 
     9: 0000000000400360     0 SECTION LOCAL  DEFAULT    9 
    10: 0000000000400378     0 SECTION LOCAL  DEFAULT   10 
    11: 00000000004003a8     0 SECTION LOCAL  DEFAULT   11 
    12: 00000000004003d0     0 SECTION LOCAL  DEFAULT   12 
    13: 0000000000400400     0 SECTION LOCAL  DEFAULT   13 
    14: 00000000004005d4     0 SECTION LOCAL  DEFAULT   14 
    15: 00000000004005e0     0 SECTION LOCAL  DEFAULT   15 
    16: 00000000004005f0     0 SECTION LOCAL  DEFAULT   16 
    17: 0000000000400630     0 SECTION LOCAL  DEFAULT   17 
    18: 0000000000600e10     0 SECTION LOCAL  DEFAULT   18 
    19: 0000000000600e18     0 SECTION LOCAL  DEFAULT   19 
    20: 0000000000600e20     0 SECTION LOCAL  DEFAULT   20 
    21: 0000000000600e28     0 SECTION LOCAL  DEFAULT   21 
    22: 0000000000600ff8     0 SECTION LOCAL  DEFAULT   22 
    23: 0000000000601000     0 SECTION LOCAL  DEFAULT   23 
    24: 0000000000601028     0 SECTION LOCAL  DEFAULT   24 
    25: 0000000000601030     0 SECTION LOCAL  DEFAULT   25 
    26: 0000000000000000     0 SECTION LOCAL  DEFAULT   26 
    27: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    28: 0000000000600e20     0 OBJECT  LOCAL  DEFAULT   20 __JCR_LIST__
    29: 0000000000400430     0 FUNC    LOCAL  DEFAULT   13 deregister_tm_clones
    30: 0000000000400460     0 FUNC    LOCAL  DEFAULT   13 register_tm_clones
    31: 00000000004004a0     0 FUNC    LOCAL  DEFAULT   13 __do_global_dtors_aux
    32: 0000000000601030     1 OBJECT  LOCAL  DEFAULT   25 completed.6354
    33: 0000000000600e18     0 OBJECT  LOCAL  DEFAULT   19 __do_global_dtors_aux_fin
    34: 00000000004004c0     0 FUNC    LOCAL  DEFAULT   13 frame_dummy
    35: 0000000000600e10     0 OBJECT  LOCAL  DEFAULT   18 __frame_dummy_init_array_
    36: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS a.c
    37: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS b.c
    38: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    39: 0000000000400740     0 OBJECT  LOCAL  DEFAULT   17 __FRAME_END__
    40: 0000000000600e20     0 OBJECT  LOCAL  DEFAULT   20 __JCR_END__
    41: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
    42: 0000000000600e18     0 NOTYPE  LOCAL  DEFAULT   18 __init_array_end
    43: 0000000000600e28     0 OBJECT  LOCAL  DEFAULT   21 _DYNAMIC
    44: 0000000000600e10     0 NOTYPE  LOCAL  DEFAULT   18 __init_array_start
    45: 0000000000601000     0 OBJECT  LOCAL  DEFAULT   23 _GLOBAL_OFFSET_TABLE_
    46: 00000000004005d0     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini
    47: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
    48: 0000000000601028     0 NOTYPE  WEAK   DEFAULT   24 data_start
    49: 0000000000601030     0 NOTYPE  GLOBAL DEFAULT   24 _edata
    50: 00000000004005d4     0 FUNC    GLOBAL DEFAULT   14 _fini
    51: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    52: 0000000000601028     0 NOTYPE  GLOBAL DEFAULT   24 __data_start
    53: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    54: 00000000004005e8     0 OBJECT  GLOBAL HIDDEN    15 __dso_handle
    55: 00000000004005e0     4 OBJECT  GLOBAL DEFAULT   15 _IO_stdin_used
    56: 0000000000400560   101 FUNC    GLOBAL DEFAULT   13 __libc_csu_init
    57: 0000000000601038     0 NOTYPE  GLOBAL DEFAULT   25 _end
    58: 0000000000400400     0 FUNC    GLOBAL DEFAULT   13 _start
    59: 0000000000601030     0 NOTYPE  GLOBAL DEFAULT   25 __bss_start
    60: 00000000004004ed    39 FUNC    GLOBAL DEFAULT   13 main
    61: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    62: 0000000000601030     0 OBJECT  GLOBAL HIDDEN    24 __TMC_END__
    63: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
    64: 0000000000400514    74 FUNC    GLOBAL DEFAULT   13 swap
    65: 00000000004003a8     0 FUNC    GLOBAL DEFAULT   11 _init
    66: 000000000060102c     4 OBJECT  GLOBAL DEFAULT   24 shared

Version symbols section '.gnu.version' contains 3 entries:
 Addr: 0000000000400338  Offset: 0x000338  Link: 5 (.dynsym)
  000:   0 (*local*)       2 (GLIBC_2.2.5)   0 (*local*)    

Version needs section '.gnu.version_r' contains 1 entries:
 Addr: 0x0000000000400340  Offset: 0x000340  Link: 6 (.dynstr)
  000000: Version: 1  File: libc.so.6  Cnt: 1
  0x0010:   Name: GLIBC_2.2.5  Flags: none  Version: 2

Displaying notes found at file offset 0x00000254 with length 0x00000020:
  Owner                 Data size       Description
  GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)
    OS: Linux, ABI: 2.6.32

Displaying notes found at file offset 0x00000274 with length 0x00000024:
  Owner                 Data size       Description
  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: a7c7f8327b46ef5d307fcbc17fb0ebf062d3cf97




你可能感兴趣的:(系统)