在GCC编译中隐藏函数名称

Bob*_*421 5 c gcc ld

我正在编译一个包含一个简单功能和一个主要功能的ac“ hello world”程序。

我在Linux下使用GCC。

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

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

  • 是否可以告诉GCC仅存储函数地址,而不以明文形式存储函数名称?

Pic*_*dev 5

实用程序丢弃目标文件中的符号。

考虑 :

 #include <stdio.h>

 static void static_func(void)
 {
   puts(__FUNCTION__);
 }

 void func(void)
 {
   puts(__FUNCTION__);
 }

 int main(void)
 {
   static_func();
   func();

   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

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
....
Run Code Online (Sandbox Code Playgroud)

剥离二进制文件后,整个输出是:

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__
Run Code Online (Sandbox Code Playgroud)


Jen*_*ens 5

使用-s选项剥离符号表:

gcc -s -o hello hello.c
Run Code Online (Sandbox Code Playgroud)