W jaki sposób połączyć dwa pliki obiektów .o GCC w trzeci plik .o?połączyć dwa pliki skumulowane GCC .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 flaga -combine
GCC będzie scalić pliki źródłowe przed kompilacji:
$ gcc -c -combine a.c b.c -o c.o
Jednak to działa tylko dla plików źródłowych, a GCC nie akceptuje .o
pliki jako wejście dla tego polecenia.
Zazwyczaj łączenie plików .o
nie działa poprawnie, ponieważ nie można użyć wyjścia łącznika jako wejścia dla niego. Rezultatem jest biblioteka współdzielona i nie jest statycznie połączona z wynikowym plikiem wykonywalnym. (Tj. Biblioteka statyczna)
$ 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
Czy można wykonać operację odwrotną? tj. produkują a.o i b.o z c.o? –
@BertRegelink nie, ponieważ nie ma unikalnej odwrotności, w kategoriach matematycznych, nie ma grupy form: P –
Ostrzeżenie: '--relocatable' wydaje się mniej przenośne. Ld dostarczany z Androidem NDK rozpoznaje tylko "-relocatable". Jeśli potrzebujesz przenośności, trzymaj się '-r". –