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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top