在GCC编译中隐藏函数名称

时间:2016-06-15 08:13:43

标签: c gcc ld

我正在编写一个c“hello world”程序,其中包括一个简单的函数和一个main函数。

我在Linux下使用GCC。

当我在二进制文件上运行readelf命令时,我可以看到符号表,我可以清楚地看到函数名称。

  • 有没有办法告诉GCC(或链接器)不生成这个符号表?

  • 是否可以告诉GCC只存储函数地址,而不用清楚地存储函数名?

2 个答案:

答案 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