(g++)剥离函数名称

(g++) Striping the function names

本文关键字:函数 剥离 g++      更新时间:2023-10-16

我对g++有问题,它没有剥离我的函数名称,我可以在(例如)ida中打开我的程序,查看所有函数的名称、全局变量等。我想对所有函数进行strp(所以这就像sub_xxxxxxx)

这是我的编译文件。

g++ -O3 -s -Wall -fPIC -Wl,-E -masm=intel -I/usr/local/include -L/usr/local/lib -shared -o preload_new.so hook_tools.cpp SCHAR.cpp ITEM.cpp ITEM_MANAGER.cpp SCHAR_MANAGER.cpp SECTREE_MANAGER.cpp main.cpp ip_secure_main.cpp commands.cpp character_hooks.cpp costumes.cpp

命令行显示您正在编译一个共享库。它导出所有函数和变量,而不是按设计声明为"静态"的,这就是共享对象生成所需要的。您无法在不破坏共享对象功能的情况下隐藏所有这些名称,因为加载它的另一个对象找不到这些符号。

OTOH您可以使用gcc可见性选项(-fvisibility=)和相同的名称函数属性来控制大多数名称的可见性。它们通常足以控制库导出中的内容。你可以阅读这本书进行详细的解释。(顺便问一句,除非是Windows,否则为什么要使用-masm=intel?)

更新〔2013-12-27〕:示例:


$ cat t1.c
int t11(void)
{ return 11; }
int t12(void) __attribute__((visibility("hidden")));
int t12(void)
{ return 12; }
$ cat t2.c
int t21(void)
{ return t11()+10; }
int t22(void)
{ return t12()+10; }
$ cat t.c
int main() {
printf("%d %d %dn", t11(), t21(), t22());
return 0;
}
$ cat Makefile
all: t
t: libtt.so
gcc -o t t.c libtt.so -Wl,-rpath=`pwd`
libtt.so: t1.c t2.c
gcc -o libtt.so -shared t1.c t2.c -fPIC
$ nm -D libtt.so | fgrep -w T
0000000000000598 T _fini
0000000000000438 T _init
0000000000000500 T t11
0000000000000520 T t21
0000000000000540 T t22
$ ./t
12 22 23

您可以看到这个库是在没有未解析的系统警告和二进制运行的情况下构建的,但t12并没有导出。如果注释掉t12()的主体,则共享库构建将成功,但可执行文件链接将失败。如果将打印t12()结果添加到可执行文件中,则链接也将失败。