połącz dwa GCC skompilowane.o pliki obiektowe w trzeciej.o plik

Jak połączyć dwa GCC skompilowane .o pliki obiektowe w trzeciej .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, znacznik -combine 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 plików .o jako danych wejściowych dla tego polecenia.

Zwykle łączenie plików .o nie działa poprawnie, ponieważ nie można użyć wyjścia linkera jako wejścia dla niego. Rezultatem jest biblioteka współdzielona i nie jest połączony statycznie z wynikowym programem 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
Author: Quonux, 2010-06-05

2 answers

Przejście -r (lub --relocatable) do ld spowoduje utworzenie obiektu, który będzie odpowiedni jako wejście ld.

$ ld -r a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable

Wygenerowany plik jest tego samego typu co oryginalne pliki .o.

$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
 83
Author: Lucian Adrian Grijincu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-05 11:26:50

Jeśli chcesz utworzyć archiwum z dwóch lub więcej .o files (tj.. biblioteka statyczna) użyj polecenia ar:

ar rvs mylib.a file1.o file2.o
 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-05 11:30:18