¿Cómo se combinan dos archivos de objeto .o compilados por GCC en un tercer archivo .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
Si tiene acceso a los archivos fuente, la -combine
bandera GCC fusionará los archivos fuente antes de la compilación:
$ gcc -c -combine a.c b.c -o c.o
Sin embargo, esto solo funciona para archivos fuente y GCC no acepta .o
archivos como entrada para este comando.
Normalmente, vincular .o
archivos no funciona correctamente, ya que no puede utilizar la salida del vinculador como entrada para él. El resultado es una biblioteca compartida y no está vinculada estáticamente al ejecutable resultante.
$ 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
fuente
fuente
-combine
opción. Existe en gcc 4.1.2 y no existe en gcc 6.3.0 (alguien más puede averiguar cuándo se eliminó).Respuestas:
Pasar
-relocatable
o-r
parald
creará un objeto que es adecuado como entrada deld
.El archivo generado es del mismo tipo que los
.o
archivos originales .$ 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
fuente
--relocatable
parece ser menos portátil. El ld que viene con Android NDK solo reconoce-relocatable
. Si necesita portabilidad, apéguese-r
.-relocatable
y-r
, pero no--relocatable
. ¡Gracias por aclararlo!Si desea crear un archivo de dos o más archivos .o (es decir, una biblioteca estática) use el
ar
comando:fuente
objcopy
en el archivo resultante y hacer algunos tipos de símbolos locales al archivo para que no sean visibles externamente. Algunos de los símbolos que necesitan ser localizados están referenciados entre los archivosa.o
yb.o
. No puedo localizar archivos individuales, ya que los símbolos no se encontrarían en el momento del enlazador, y tampoco puedo localizar símbolos del archivo estático.