使用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()
?我希望使用b.so
中定义的foo()
代替a.so
中的通过从a.so
中删除foo()
符号。删除a.so
中的foo()
后,重新运行c
应该生成以下输出:
0xbeef, 0x0, 0x1
在这个玩具示例中,我知道当我使用
a.so
和b.so
编译c.c
时,可以简单地重新排列库名称,但是我如何实际从a.so
中删除符号?我想象一旦从a.so
中删除了foo()
,这个nm输出的grep将不会产生任何结果:nm -a a.so | grep foo
而现在它返回:
000000000000063c T foo
LD_LIBRARY_PATH
的作用。 - Eregrithobjcopy
有你需要的一些功能? - Kerrek SBstrip
吗?我认为你可以通过-R
来定位文件中的特定符号... - timlukins