"archivo no reconocido" al usar el vinculador GNU
-
23-08-2019 - |
Pregunta
Probablemente estoy haciendo algo mal, siendo novato.¿Podrías ayudarme?
Escribí un programa simple Hello World en C llamado hello.c y ejecuté el siguiente comando:
gcc -S hello.c
que produjo hello.s
.Luego usé ese archivo con el ensamblador GNU, as
:
as hello.s
Lo que produjo un no ejecutable a.out
, que todavía necesita ser vinculado, ¿entiendo?
Intento vincularlo usando ld
, al igual que:
ld a.out
Pero aparece 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!
Solución
Mi primera pregunta sería: ¿por qué estás montando el código? Si desea que el código ensamblador de la, por todos los medios, utilice gcc -S
conseguirlo (para ver, 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
intenta escribir su salida a a.out
. Si ese es también el archivo de entrada, bien puede ser destruido en el proceso de ejecución ld
. Usted podría intentar cambiar el nombre de a.out
a a.in
antes de ejecutar el comando ld:. ld a.in
Otros consejos
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
? Debido a GCC se encarga de vincular el tiempo de ejecución C, y haciendo otras cosas depende 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
EDITAR:Bien, probé todo esto en mi sistema y creo que sé cuál es el problema. ld
está escribiendo a a.out
(su archivo de salida predeterminado), mientras lo lee al mismo tiempo.Pruebe algo como esto:
ld a.out -o myprog
volver a instalar glibc-devel todos modos se puede y comprobar si funciona. este proceso funcione para mí.