c++ - (g++) 剥离函数名

标签 c++ gcc g++ strip ida

我在使用 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=) 和相同的名称函数属性来控制大多数名称的可见性。它们通常足以控制在库导出中看到的内容。你可以阅读this book详细解释。 (顺便说一句,除非是 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 %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

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

关于c++ - (g++) 剥离函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20720791/

相关文章:

c++ - Linux 堆栈跟踪转储

c++ - 为什么 g++ 提示?

c++ - 如何避免一组值(在 .so 回调调用中收集)指向同一地址?

c++ - 编译标志 -static 对于 gcc 真正意味着什么

gcc:错误:无法识别的选项 --wrap

c - 我可以使用什么替代方法来代替 gets() 和 puts()?

c++ - Eigen Sparse LU 求解器返回值

C++如何正确使用#include?

c++ - 将 C++ 函数包装成 block

c++ - g++ 编译器如何包含 boost::regex