2016-09-11 5 views
0

リンク中にシンボルを別のシンボルでラップしようとしています。私が理解するように、これはld - wrapオプションで簡単に行えますが、OS Xでは利用できません。 '-idefinitionは:間接' があり、私はそれが42を出力しますので、メインカンニングしようとしている方法をここでは、:OS Xでのリンク中にシンボルを折り返す

a.cpp:

int foo() { 
    return 1; 
} 

b.cpp:

int wrap_foo() { 
    return 42; 
} 

main.cppに:私は構築し、それらをリンクする方法

#include <cstdio> 

int foo(); 
int wrap_foo(); 

int main() { 
    printf("%d\n", foo()); 
} 

$ gcc -c *.o 
$ gcc -Wl,-i__Z3foov:__Z8wrap_foov *.o 
duplicate symbol __Z3foov in: 
    a.o 
    b.o 
ld: 1 duplicate symbol for architecture x86_64 

私が望むものを達成することさえ可能ですか?


EDIT: 私の仕事では、私は(彼らのためにのみオブジェクトを持つ)a.cppとmain.cppにを制御することはできませんが、私は任意のコードを書くと、私は前にオブジェクトを必要とするものは何でも行うことができますリンク。

私は、次のquistionがどの前に同様のタスクに関連する(そして、より良い、それを説明)私はケースが既に存在している記号、同じであると私は衝突を持っているだろうことがわかり答えを読み直す GNU gcc/ld - wrapping a call to symbol with caller and callee defined in the same object file を見つけました。

ソースコードに触れずにa.oからfooを削除するにはどうすればよいですか?

答えて

2

これはリンクと実行時に行う必要がありますか?あなたがやろうとしていることを完全に確認しているので、尋ねるだけです。

このリンカーコマンドを使用する際の問題は、新しいシンボルを作成することです。そのため、重複するシンボルが表示されます。

-alias symbol_name alternate_symbol_name 
       Create an alias named alternate_symbol_name for the symbol 
       symbol_name. By default the alias symbol has global visibil- 
       ity. This option was previous the -idef:indir option. 

あなたは(つまり、あなたがfooを省略している。)のfooを定義a.cppを持っていない場合、あなたはこのような何かを行うことができますが:

tmp$ gcc -Wl,-alias,__Z8wrap_foov,__Z3foov b.o main.o 
tmp$ ./a.out 
42 

あなたは常に行う可能性は持っています.cppにはのような別のfooがあります。この方法で実装したい場合は、エイリアスを使用してfooにマッピングできます。完璧ではありませんが、おおよそあなたが望むものを達成するでしょう。あなたは既にリンク時にそれを調整しようとしているので、それは潜在的に受け入れられるようです。

+0

ありがとう、私は私の質問を更新しました。 – okutane

+1

binutilsまたはcrosstool-ng(homebrew)を試してみてください。どちらもobjcopyを含んでいます。 objcopyを使用すると、シンボルを取り除くことができます。 –

+0

ところで、あなたが持っている.oの他の場所で実際に参照される場合に備えて、シンボルの名前を変更するだけでよいでしょう。 –

関連する問題