下面谈一下Unix系统里的两种重要的格式:a.out和elf(Executable and Linking
Format)。这两种格式中都有符号表(symbol
table),其中包括所有的符号(程序的入口点还有变量的地址等等)。在elf格式中符号表的内容会比a.out格式的丰富的多。但是这些符号表可以用
strip工具去除,这样的话这个文件就无法让debug程序跟踪了,但是会生成比较小的可执行文件。a.out文件中的符号表可以被完全去除,但是
elf中的在加载运行是起着重要的作用,所以用strip永远不可能完全去除elf格式文件中的符号表。但是用strip命令不是完全安全的,比如对未连
接的目标文件来说如果用strip去掉符号表的话,会导致连接器无法连接。例如:
代码:
$:gcc -c hello.c $:ls hello.c hello.o
用gcc把hello.c编译成目标文件hello.o
代码:
$:strip hello.o
用strip去掉hello.o中的符号信息。
代码:
$:gcc hello.o /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/../../../crt1.o: In
function `_start': init.c: (.text+0x18) : undefined reference to `main'
collect2: ld returned 1 exit status
struct exec { unsigned long a_info; /*Use macros N_MAGIC, etc for
access */ unsigned a_text; /* length of text, in bytes */ unsigned
a_data; /* length of data, in bytes */ unsigned a_bss; /* length of
uninitialized data area for file, in bytes*/ unsigned a_syms; /* length
of symbol table data in file, in bytes */ unsigned a_entry; /* start
address */ unsigned a_trsize; /*length of relocation info for text, in
bytes */ unsigned a_drsize; /*length of relocation info for data, in
bytes */ };