我正在编写一个c“hello world”程序,其中包括一个简单的函数和一个main函数。
我在Linux下使用GCC。
当我在二进制文件上运行readelf
命令时,我可以看到符号表,我可以清楚地看到函数名称。
有没有办法告诉GCC(或链接器)不生成这个符号表?
是否可以告诉GCC只存储函数地址,而不用清楚地存储函数名?
答案 0 :(得分:3)
实用程序 strip 会丢弃目标文件中的符号。
考虑一下:
#include <stdio.h>
static void static_func(void)
{
puts(__FUNCTION__);
}
void func(void)
{
puts(__FUNCTION__);
}
int main(void)
{
static_func();
func();
return 0;
}
readelf在新编译的二进制文件上生成:
Symbol table '.symtab' contains 71 entries:
Num: Value Size Type Bind Vis Ndx Name
....
37: 0000000000000000 0 FILE LOCAL DEFAULT ABS hide.c
38: 0000000000400526 17 FUNC LOCAL DEFAULT 14 static_func
....
61: 0000000000400537 17 FUNC GLOBAL DEFAULT 14 func
....
66: 0000000000400548 21 FUNC GLOBAL DEFAULT 14 main
....
剥离二进制文件后,整个输出是:
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
答案 1 :(得分:3)
使用-s
选项删除符号表:
gcc -s -o hello hello.c