澄清定義被叫符號的電話,我的問題是指包裝/攔截從一個函數/符號調用另一個函數/符號當主叫用戶和被調用者在與GCC編譯器和鏈接器相同的編譯單元中定義。GNU GCC/LD - 包裝與主叫方和同一個目標文件
我有一個情況類似如下:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
我想換到這些函數的調用,我可以用ld's --wrap
option做到這一點(一個點)(然後我實現__wrap_foo和__wrap_bar這然後依據ld的--wrap
選項的結果調用__real_foo和__real_bar)。
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
我遇到的問題是,這只是生效的引用foo和從超出這個編譯單元的酒吧(和鏈接時解析)。也就是說,調用foo和foo.c的內的其它功能酒吧沒有得到包裹。
我試着用objcopy --redefine-sym,但僅重命名符號及其引用。
我想調用替換到foo
和bar
(foo.o的內)__wrap_foo
和__wrap_bar
(就像他們獲得其他目標文件鏈接程序的--wrap
選項解決)我之前的* .o文件傳遞到鏈接器的--wrap
選項,而不必修改foo.c的源代碼。
這樣,所有對foo
和bar
的調用都會進行包裝/攔截,而不僅僅發生在foo.o以外的調用。
這可能嗎?
你也許可以與find解決您的問題,您編輯/替換,或使用SED ... –
你是在暗示簡單地用一個編輯器破解OBJ:單元測試/嘲弄非常有用嗎? –
我建議你批量修改源代碼以將這些調用替換爲包裝器的調用,或者將其定義爲真實函數或包裝器。 –