2016-12-10 5 views
1

これらの2つのソースファイルを変更せずに、コンパイルによって生成されたオブジェクトファイルを取得して、link.cをmain_v1.cのfooにリンクさせてbar.cのbarにリンクさせる方法がありますか?オブジェクトの変更特定のリンクシンボルの手動再マッピングを指定する

main_v1.c

void foo(void); 

int main(void) 
{ 
    foo(); 
} 

bar.cに

#include <stdio.h> 

void bar(void) 
{ 
    puts("bar()!"); 
} 

は、ファイル自体の公正なゲームですが、私たちも、ソースコードが入手できていない可能性があることを前提としています。プラットフォームはLinuxです。 main_v1.cへのささやかな変更を主張し、追加の「マッピング」オブジェクト・ファイルにリンクすることで


は、ここではほとんどちょうど標準C.

main_v2で望ましい結果を得るための方法です。 C

extern void (*const foo)(void); 

int main(void) 
{ 
    foo(); 
} 

bar.cには変更されません。

map.c

void bar(void); 
void (*const foo)(void) = bar; 

オブジェクトファイルは、LTOでコンパイルされた場合は、関数ポインタ参照をしても(最近のgccを使用して)省略されています。これはかなり良い結果ですが、がbar()への直接呼び出しを持つように変更された場合、リンク後にbar()自体がインライン展開されるため、改善の余地があります。

答えて

1

これはあなたが持っているGNU ld --wrap option

ための仕事だろう、我々はmain_v1.oがコンパイルされ、あなたの main_v1.cとあなたのbar.cからコンパイル同様bar.oから多分不変、想定しています。その後

$ gcc -c wrap.c 
$ gcc -o prog -Wl,--wrap=foo main_v1.o bar.o wrap.o 

extern void bar(void); 

void __wrap_foo(void) 
{ 
    bar(); 
} 

wrap.oにそれをコンパイルし、そのように前のオブジェクトファイルとリンク

wrap.c:

今、別のソースファイルを記述します。

$ ./prog 
bar()! 
関連する問題