gcc リンクの順序についていくつか質問があります。GCC man は、リンカがデフォルトで繰り返し検索せずにシンボルを左から右に検索すると言います。これが私のテストです:
main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("HELLO WROLD\n");
return 0;
}
printfc.c
#include <stdio.h>
#include <stdlib.h>
int printf(const char *fmt, ...)
{
write(1, "AAA\n", 4);
}
[root@lenovo testcode]# gcc -c -fno-builtin-printf *.c
[root@lenovo testcode]# gcc -o test main.o printf.o
[root@lenovo testcode]# ./test
AAA
[root@lenovo testcode]# gcc -o test printf.o main.o
[root@lenovo testcode]# ./test
AAA
[root@lenovo testcode]# ar rcs libprintf.a printf.o
[root@lenovo testcode]# gcc -o test libprintf.a main.o
[root@lenovo testcode]# ./test
HELLO WROLD
[root@lenovo testcode]# gcc -o test main.o libprintf.a
[root@lenovo testcode]# ./test
AAA
[root@lenovo testcode]# gcc -shared -o libprintf.so printf.o
[root@lenovo testcode]# gcc -o test libprintf.so main.o
[root@lenovo testcode]# export LD_LIBRARY_PATH=.
[root@lenovo testcode]# ./test
AAA
[root@lenovo testcode]# gcc -o test main.o libprintf.so
[root@lenovo testcode]# ./test
AAA
結果から、.o と .o の順序、.o と .so は違いがなく、.o と .a の順序のみが効果があることがわかります。しかし、それは gcc の man ページと矛盾しています。なぜ?