リンク中にシンボルを別のシンボルでラップしようとしています。私が理解するように、これは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を削除するにはどうすればよいですか?
ありがとう、私は私の質問を更新しました。 – okutane
binutilsまたはcrosstool-ng(homebrew)を試してみてください。どちらもobjcopyを含んでいます。 objcopyを使用すると、シンボルを取り除くことができます。 –
ところで、あなたが持っている.oの他の場所で実際に参照される場合に備えて、シンボルの名前を変更するだけでよいでしょう。 –