Jak połączyć dwa skompilowane przez GCC pliki obiektowe .o w trzeci plik .o?
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Jeśli masz dostęp do plików źródłowych, -combine
flaga GCC połączy pliki źródłowe przed kompilacją:
$ gcc -c -combine a.c b.c -o c.o
Jednak działa to tylko dla plików źródłowych, a GCC nie akceptuje .o
plików jako danych wejściowych dla tego polecenia.
Zwykle łączenie .o
plików nie działa poprawnie, ponieważ nie można użyć danych wyjściowych konsolidatora jako danych wejściowych. Rezultatem jest biblioteka współdzielona, która nie jest statycznie połączona z wynikowym plikiem wykonywalnym.
$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
-combine
opcji. Istnieje w gcc 4.1.2 i nie istnieje w gcc 6.3.0 (ktoś inny może dowiedzieć się, kiedy zostało usunięte).