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
gcc
compiler-construction
linker
ld
object-files
Lucian Adrian Grijincu
źródło
źródło
-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).Odpowiedzi:
Przekazanie
-relocatable
lub-r
dold
spowoduje utworzenie obiektu odpowiedniego jako dane wejścioweld
.Wygenerowany plik jest tego samego typu, co oryginalne
.o
pliki.$ 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
źródło
--relocatable
wydaje się być mniej przenośny. Dysk twardy dostarczany z systemem Android NDK rozpoznaje tylko pliki-relocatable
. Jeśli potrzebujesz przenośności, trzymaj się-r
.-relocatable
i-r
, ale nie--relocatable
. Dzięki za wytłumaczenie!Jeśli chcesz utworzyć archiwum dwóch lub więcej plików .o (np. Bibliotekę statyczną), użyj
ar
polecenia:źródło
objcopy
plik wynikowy i uczynić niektóre rodzaje symboli lokalnymi dla pliku, aby nie były widoczne na zewnątrz. Niektóre symbole, które muszą być zlokalizowane, znajdują się między plikamia.o
ib.o
. Nie mogę zlokalizować pojedynczych plików - ponieważ symbole nie zostałyby znalezione w czasie konsolidatora - i nie mogę również zlokalizować symboli z archiwum statycznego.