2010-06-05 17 views
67

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 

Odpowiedz

78

Passing -r (lub --relocatable) do ld stworzy obiekt, który jest odpowiedni jako wejście ld. Wygenerowany plik jest tego samego typu, co oryginalny plik .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 
+1

Czy można wykonać operację odwrotną? tj. produkują a.o i b.o z c.o? –

+5

@BertRegelink nie, ponieważ nie ma unikalnej odwrotności, w kategoriach matematycznych, nie ma grupy form: P –

+2

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". –

6

Jeśli chcesz utworzyć archiwum dwóch lub więcej plików .o użyć polecenia ar:

ar rvs mylib.a file1.o file2.o 
+0

@Lucian Ale dlaczego miałbyś to robić? Biblioteka statyczna jest znacznie wygodniejsza w łączeniu niż plik .o. –

+1

Muszę uruchomić "objcopy" na wynikowym pliku i utworzyć pewne rodzaje symboli lokalnych w pliku, aby nie były widoczne na zewnątrz. Niektóre symbole, które muszą być zlokalizowane, są przywoływane między plikami 'a.o' i' b.o'. Nie mogę zlokalizować pojedynczych plików - ponieważ symbole nie zostaną znalezione w czasie łączenia - i nie mogę zlokalizować symboli z archiwum statycznego. –