我有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
答案 0 :(得分:2)
命令行显示您正在编译共享库。它按设计导出所有未声明为“静态”的函数和变量,这就是共享对象生成所需要的。在不破坏共享对象功能的情况下,您无法隐藏所有这些名称,因为加载它的另一个对象无法找到这些符号。
OTOH您可以使用字面上的gcc可见性选项(-fvisibility=
)和相同的名称函数属性来控制大多数名称的可见性。它们通常足以控制图书馆出口中的内容。您可以阅读this book了解详细说明。 (顺便说一句,为什么你使用-masm=intel
,除非它是Windows?)
更新[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 %d\n", 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()结果添加到可执行文件,链接也将失败。