(g++)剥离函数名称
(g++) Striping the function names
我对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()结果添加到可执行文件中,则链接也将失败。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 通过剥离可变宏/模板/函数对来测试成员函数
- (g++)剥离函数名称
- 从C#调用C++函数,传递类型剥离的void指针