関数シンボルの競合の問題をデバッグすると、理解できない gcc の奇妙な動作が見つかりました。次のサンプル コードで説明します。
main.c
#include <stdio.h>
int main()
{
b();
a();
}
交流
#include <stdio.h>
void a(void)
{
printf("func a in a\n");
}
紀元前
#include <stdio.h>
void a()
{
printf("func a in b\n");
}
void b()
{
printf( "func b try to call a \n");
a();
}
コンパイル:
gcc -c a.c
gcc -c b.c
ar -cr liba.a a.o
ar -cr libb.a b.o
gcc main.c liba.a libb.a
実行する:
./a.out
func b try to call a
func a in b
func a in b
私の質問は:
a
関数内でmain
関数をa in b.c
呼び出すのはなぜa in a.c
ですか?- ライブラリの順序を変更した後:
gcc main.c libb.a liba.a
、結果は同じです。なんで? - この状況でリンカーがシンボルの競合を報告しないのはなぜですか?