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