如何从共享库中删除符号?

罗斯·罗杰斯(Ross Rogers):

使用GCC,如何在创建共享库后从共享库中删除符号?如果我在C中使用三个文件来处理符号,foo()例如:

// a.c
int foo() { return 0xdead; }
int baz() { return 1; }

// b.c
int foo() { return 0xbeef; }
int bar() { return 0; }

// c.c
#include "stdio.h"
extern int foo();
extern int bar();
extern int baz();
int main() { printf("0x%x, 0x%x, 0x%x\n",foo(),bar(),baz()); return 0; }

然后我像这样编译并运行:

% gcc a.c --shared -fPIC -o a.so
% gcc b.c --shared -fPIC -o b.so
% setenv LD_LIBRARY_PATH . # export LD_LIBRARY_PATH=. for bash systems
% gcc c.c a.so b.so -o c
% ./c
0xdead, 0x0, 0x1

我怎样才能让这个a.so不再具有象征foo()我已经创建后a.so我希望使用中foo()定义b.so而不是从中a.so 删除foo()符号a.so之后foo()从删除a.so,再运行c应该产生的打印输出:

0xbeef, 0x0, 0x1

在这个玩具示例中,我知道在c.c使用a.soand进行编译时,我可以简单地对库名称进行重新排序b.so,但是实际上如何从中删除符号a.so呢?我想象在foo()从中删除a.sonm输出的这个grep 将不会产生任何结果:

nm -a a.so | grep foo

而现在它返回:

000000000000063c T foo
弗雷德里克·哈米迪(FrédéricHamidi):

您应该可以使用objcopy-N--strip-symbol)选项来实现所需的功能:

$ objcopy -N foo a.so

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使dlopen加载的共享库中的gdb打印符号?

如何控制从 Bazel 中的共享库导出哪些符号?

如何从Linux共享库的符号依赖表中剥离符号版本信息?

ctype 加载的共享库符号也在 glibc 中定义;如何选择符号?

如何从MySQL数据库中删除£符号

跟踪共享库中符号的来源

提供库的地址时,如何获取共享库中符号的地址?

我如何使用find,nm和grep在许多共享库中查找符号?

从进程中卸载/删除共享库

如何从str中删除'符号?

如何知道给定的共享库是否使用调试符号构建?

如何检测是否需要共享库符号链接?

如何检查LLDB是否从共享库中加载了调试符号?

如何符号化已剥离共享库的堆栈跟踪

共享so库中的nm符号输出t vs T

Fortran共享库中的符号命名是intel还是gcc?

在共享库中隐藏符号是否有技术原因?

Cython:共享库中未定义的符号

如何构建共享库(.so),以便也包括来自其他共享库的符号?

如何删除名称中带有西里尔符号的数据库?

如何从R中的列中删除符号?

如何从Oracle中的句子中删除符号?

Python:如何删除文本语料库中的标点符号,但不删除特殊单词(例如 c++、c#、.net 等)中的标点符号

即使nm指示共享库中存在该符号,也未定义对符号的引用

如何访问共享库中的文件?

如何在React中全局共享库?

如何包含共享库中的头文件?

如何从rsync共享中完全删除目录

如何删除VSTS中的共享步骤