GCCを使用して、共有オブジェクトを作成した後に共有オブジェクトからシンボルを削除するにはどうすればよいですか?私はのようなシンボルfoo()
を操作Cに3つのファイルがある場合:次に共有オブジェクトからシンボルを削除するにはどうしたらいいですか?
// 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
を作成した後に、a.so
のシンボルはfoo()
になりましたか? a.so
の代わりにb.so
に定義されているfoo()
をa.so
から削除するといいでしょう。 foo()
がa.so
から削除された後、c
を再実行することのプリントアウトを生成する必要があります。このおもちゃの例では
0xbeef, 0x0, 0x1
を、私はa.so
とb.so
でc.c
をコンパイルするときの順序再libary名前を私は単にすることができます知っているが、どのようにすることができます私は実際にa.so
からシンボルを削除しますか?
nm -a a.so | grep foo
今のに対し、それが返されます:私はa.so
からfoo()
を削除した後、nm出力のこのgrepのは何も得られないだろうと想像
000000000000063c T foo
なぜGCCにあなたのc.cでa.soとb.soをコンパイルするように指示しますか?共有ライブラリはあなたのバイナリにリンクされているとは思われません。これは 'LD_LIBRARY_PATH'のためのものです。 – Eregrith
おそらく 'objcopy'には必要な機能がいくつかありますか? –
'strip'をもっと見たことがありますか? '-R'でファイル内の特定のシンボルをターゲットにできると信じています... – timlukins