如何从共享库中删除符号?
使用GCC,如何在创建共享库后从共享库中删除符号?如果我在C中使用三个文件来处理符号,foo()
例如:
// a.cint foo() { return 0xdead; }
int baz() { return 1; }
和
// b.cint 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.so
and
编译时可以简单地对库名称进行重新排序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