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

使用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.ca.soand

编译时可以简单地对库名称进行重新排序b.so,但是实际上如何从中删除符号a.so呢?我想象在foo()从中删除后a.so,nm输出的这个grep

将不会产生任何结果:

nm -a a.so | grep foo

而现在它返回:

000000000000063c T foo

回答:

您应该可以使用objcopy的-N--strip-

symbol)选项来实现所需的功能:

$ objcopy -N foo a.so

以上是 如何从共享库中删除符号? 的全部内容, 来源链接: utcz.com/qa/404235.html

回到顶部