« Fichier non reconnu » en utilisant l'éditeur de liens GNU
-
23-08-2019 - |
Question
Je fais sans doute quelque chose de mal, d'être un débutant. Pourriez-vous s'il vous plaît me aider?
J'ai écrit un programme simple Bonjour tout le monde en C appelé hello.c et exécuté la commande suivante:
gcc -S hello.c
Ce produit hello.s
. Ensuite, je le fichier avec l'assembleur GNU, as
:
as hello.s
Ce qui a produit un a.out
non exécutable, qui doit encore être lié, je comprends?
J'essaie de le relier à l'aide ld
, comme suit:
ld a.out
Mais l'erreur suivante:
a.out: file not recognized: File truncated
Et ld
supprime mon dossier.
Ceci est un système Ubuntu x86. Qu'est-ce que je fais mal? Un grand merci!
La solution
Ma première question serait: pourquoi êtes-vous assemblez le code? Si vous voulez que le code assembleur le, par tous les moyens, utiliser gcc -S
pour l'obtenir (pour la visualisation, je suppose).
Mais vous ne devez exécuter que par as
pour continuer, il suffit d'utiliser:
gcc -o hello hello.c
gcc -S hello.c
Cette première étape va transformer la source C directement dans un fichier exécutable, le second vous donnera votre source assembleur.
Votre problème spécifique peut être que ld
tente d'écrire sa sortie à a.out
. Si tel est également votre fichier d'entrée, il pourrait bien être détruite dans le processus d'exécution ld
. Vous pouvez essayer de renommer a.out
à a.in
avant d'exécuter la commande ld. ld a.in
Autres conseils
Voici comment je le fais:
> gcc -S forums.c
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums
test
Pourquoi dois-je au lieu de gcc
invoque ld
? Parce que GCC se charge de relier le moteur d'exécution C, et de faire d'autres choses en fonction de la mise en œuvre. Si vous voulez voir que, utilisez l'option --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
EDIT: D'accord, j'ai essayé tout cela sur mon système, et je pense que je sais ce que le problème est. ld
écrit à a.out
(son fichier de sortie par défaut), lors de la lecture de celui-ci en même temps. Essayez quelque chose comme ceci:
ld a.out -o myprog
réinstallez-devel glibc de toute façon vous pouvez et vérifier si elle fonctionne. ce processus fonctionne pour moi.