Some GCC Linker Search Issues

I have some questions about gcc link. The GCC man says links to search links from left to right without re-searching by default. Here is my test:

main.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
        printf("HELLO WROLD\n");
        return 0;
}

printf.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

From the result we can see that the order of .o and .o, .o and .so does not matter, only the order of .o and .a is valid. But this is incompatible with the gcc man page. So why?

+5
source share
1 answer

gcc really handles object files from left to right. When you

gcc -o test libprintf.a main.o

gcc libprintf.a. , libprintf.a. main.o, , printf , , printf, in main.o.

, :

gcc -o test main.o libprintf.a 

, , main.o, printf, - libprintf.a, printf. libc , printf , printf libc .

.o :

gcc -o test main.o printf.o

libc , , printf (-) , .

libprintf.so libc , . , , - *.so . libprintf.so libc.so, printf libprintf.so.

gcc -o test libprintf.so  main.o
gcc -o test main.o libprintf.so

:

gcc -o test main.o -lc libprintf.so

, printf libc.so libprintf.so, -lc libprintf.so .

+8

All Articles