combine dos GCC compilado.o archivos de objeto en un tercero.o archivo


Cómo se combinan dos GCC compilados .o archivos de objeto en un tercero .o archivo?

$ 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, el indicador -combine 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 archivos .o como entrada para este comando.

Normalmente, enlazar archivos .o no funciona correctamente, ya que no puede usar la salida del enlazador como entrada para él. El resultado es una biblioteca compartida y no es enlazado 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
Author: Quonux, 2010-06-05

2 answers

Pasar -r (o --relocatable) a ld creará un objeto que sea 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 archivos .o 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
 83
Author: Lucian Adrian Grijincu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-05 11:26:50

Si desea crear un archivo de dos o más .o archivos (i. e.. una biblioteca estática) use el comando ar:

ar rvs mylib.a file1.o file2.o
 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-05 11:30:18