¿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
¿Es posible hacer la operación inversa? es decir, ¿produce a.o y b.o desde c.o? –
@BertRegelink no, porque no hay inversión única, en términos matemáticos, no forma grupo: P –
Advertencia: '--relocatable' parece ser menos portátil. El ld que viene con Android NDK solo reconoce '-relocatable'. Si necesita portabilidad, quédese con '-r'. –