これらの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()
自体がインライン展開されるため、改善の余地があります。