¿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
-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ó).