2010-06-05 20 views
67

¿Cómo se combinan dos archivos de objeto .o compilados por GCC en un tercer archivo .o?combina 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 la fuente de archivos de la bandera -combine GCC se fusionará los archivos de origen antes de la compilación:

$ gcc -c -combine a.c b.c -o c.o 

Sin embargo, esto sólo funciona para los archivos de origen, y GCC no acepta .o archivos como entrada para este comando.

Normalmente, la vinculación de los archivos .o no funciona correctamente, ya que no se puede utilizar la salida del vinculador como entrada. El resultado es una biblioteca compartida y no está vinculado estáticamente en el ejecutable resultante. (es decir. una biblioteca estática)

$ 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 

Respuesta

78

Pasando -r (o --relocatable) a ld creará un objeto que es adecuado como entrada de ld.

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

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 
+1

¿Es posible hacer la operación inversa? es decir, ¿produce a.o y b.o desde c.o? –

+5

@BertRegelink no, porque no hay inversión única, en términos matemáticos, no forma grupo: P –

+2

Advertencia: '--relocatable' parece ser menos portátil. El ld que viene con Android NDK solo reconoce '-relocatable'. Si necesita portabilidad, quédese con '-r'. –

6

Si desea crear un archivo de dos o más archivos .o utilice el comando ar:

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

@Lucian Pero, ¿por qué querrías hacer esto? Una biblioteca estática es mucho más conveniente para enlazar que un archivo .o. –

+1

Necesito ejecutar '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 se referencian entre los archivos 'a.o' y' b.o'. No puedo localizar archivos individuales, ya que los símbolos no se encontrarán en el momento del enlazador, y tampoco puedo localizar símbolos del archivo estático. –

Cuestiones relacionadas