2009-05-19 9 views
7

Probablemente estoy haciendo algo mal, siendo un novato. ¿Podrías por favor ayudarme?"archivo no reconocido" durante el uso del enlazador GNU

He escrito un sencillo programa Hola Mundo en C llamado hola.c, y corrió el siguiente comando:

gcc -S hello.c 

que produjo hello.s. Luego utiliza ese archivo con el ensamblador de GNU, as:

as hello.s 

que produjo un no ejecutable a.out, que todavía debe estar vinculada, entiendo?

que tratan de vincularlo mediante el uso de ld, así:

ld a.out 

Pero sale el siguiente error:

a.out: file not recognized: File truncated 

Y ld borra mi archivo.

Este es un sistema Ubuntu x86. ¿Qué estoy haciendo mal? ¡Muchas gracias!

Respuesta

6

Mi primera pregunta sería: ¿por qué está armando el código? Si quiere el código del ensamblador, use gcc -S para obtenerlo (para verlo, supongo).

Pero no es necesario correr que a través de as para seguir adelante, sólo tiene que utilizar:

gcc -o hello hello.c 
gcc -S hello.c 

Ese primer paso a su vez, la fuente de C directamente en un archivo ejecutable, el segundo le dará su fuente en ensamblador .

Su problema específico puede ser que ld intente escribir su salida en a.out. Si ese también es su archivo de entrada, bien puede ser destruido en el proceso de ejecutar ld. Puede intentar cambiar el nombre de a.out a a.in antes de ejecutar el comando ld: ld a.in.

+1

Para responder a su pregunta, supongo que está tratando de aprender ensamblaje ... – Zifre

+1

Me doy cuenta de eso, pero deseo usar as y ld independientemente de gcc. Estoy aprendiendo ensamblaje x86. La salida de gcc -S me ayuda a ver cómo gcc implementa varios programas C en el ensamblaje. Luego puedo modificar y jugar con ese código ensamblador y finalmente ensamblarlo y vincularlo, usando as y ld. Me doy cuenta de que gcc puede ensamblar y vincular estos archivos por mí, pero solo está usando as y ld en mi nombre. Deseo usar as y ld directamente. –

3

EDIT: bien, probé esto en mi sistema, y ​​creo que sé cuál es el problema. ld está escribiendo en a.out (su archivo de salida predeterminado), mientras lee desde allí al mismo tiempo. Pruebe algo como esto:

ld a.out -o myprog 
+0

'a.out' puede ser cualquier tipo de archivo. Al invocar 'gcc' con el indicador' -S', solo muestra el código de ensamblaje, legible para el ser humano. No lo ensambla ni lo vincula. 'como 'definitivamente no debería vincularlo, ese es el trabajo de' ld'.El indicador '-o' solo le permite cambiar el nombre del archivo del resultado, cualquiera que sea el resultado. –

+0

Sí ... pero el punto es que si no especifica un nombre de archivo de salida para ld, lo primero que hará es truncar a.out. Luego verá sus archivos de entrada. Si uno de ellos es a.out, detectará que lo ha truncado y ha fallado. A continuación, elimina el archivo de salida incompleto a.out. Usa -o algo en as y dale a ld. Necesita archivos de entrada y salida diferentes, no puede vincular "en su lugar". – pjc50

5

Aquí es cómo lo hago:

> gcc -S forums.c 
> as forums.s -o forums.o 
> gcc forums.o -o forums 
> ./forums 
test 

¿Por qué invoco gcc en lugar de ld? Porque GCC se encarga de vincular el tiempo de ejecución de C y hacer otras cosas que dependen de la implementación. Si usted quiere ver eso, utilice la opción --verbose:

> gcc --verbose forums.o -o forums 
Using built-in specs. 
Target: i686-pc-linux-gnu 
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic 
Thread model: posix 
gcc version 4.4.0 (GCC) 
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic' 
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o 
1

reinstalación glibc-devel todos modos se puede y comprobar si funciona. este proceso funciona para mi

Cuestiones relacionadas