2009-05-19 16 views
7

Je fais probablement quelque chose de mal, étant un débutant. Pourriez-vous m'aider s'il vous plaît?"fichier non reconnu" lors de l'utilisation du linker GNU

J'ai écrit simple Bonjour programme mondial en C appelé hello.c, et a couru la commande suivante:

gcc -S hello.c 

Ce produit hello.s. Ensuite, je le fichier avec l'assembleur GNU, as:

as hello.s 

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

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? Merci beaucoup!

Répondre

6

Ma première question serait: pourquoi assembler le code? Si vous voulez le code assembleur le, par tous les moyens, utilisez gcc -S pour l'obtenir (pour l'affichage, 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 tournera 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 essaie d'écrire sa sortie à a.out. Si c'est aussi votre fichier d'entrée, il risque d'être détruit lors de l'exécution de ld. Vous pouvez essayer de renommer a.out en a.in avant d'exécuter la commande ld: ld a.in.

+1

Pour répondre à votre question, je suppose qu'il essaie d'apprendre l'assemblage ... – Zifre

+1

Je m'en rends compte, mais je souhaite utiliser as et ld indépendamment de gcc. J'apprends l'assemblage x86. La sortie de gcc -S m'aide à voir comment gcc implémente divers programmes C dans l'assemblage. Ensuite, je peux modifier et jouer avec ce code d'assemblage et finalement l'assembler et le lier moi-même, en utilisant as et ld. Je me rends compte que gcc peut assembler et lier ces fichiers pour moi, mais il n'utilise que as et ld en mon nom. Je souhaite utiliser as et ld directement. –

3

EDIT: OK, j'ai essayé tout cela sur mon système, et je pense que je sais quel est le problème. ld écrit à a.out (son fichier de sortie par défaut), tout en lisant en même temps. Essayez quelque chose comme ceci:

ld a.out -o myprog 
+0

'a.out' peut être n'importe quel type de fichier. En appelant 'gcc' avec l'indicateur' -S', il ne sort que l'assemblage, code lisible par l'homme. Il ne l'assemble pas ou ne le lie pas. "comme" ne devrait certainement pas être le lien, c'est le travail de "ld".L'indicateur '-o' vous permet seulement de changer le nom de fichier du résultat, quel que soit le résultat. –

+0

Oui .. mais le point demeure est que si vous ne spécifiez pas un nom de fichier de sortie pour ld la première chose qu'il fera est de tronquer a.out. Ensuite, il va regarder ses fichiers d'entrée. Si l'un d'eux est a.out, il remarquera qu'il l'a tronqué et échouera. Il supprime ensuite le fichier de sortie incomplet a.out. Utilise -o quelque chose sur as et donne ça à ld. ld a besoin de différents fichiers d'entrée et de sortie, il ne peut pas lier "en place". – pjc50

5

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 prend soin de lier le runtime C et d'effectuer d'autres tâches liées à l'implémentation. 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 
1

Réinstaller glibc-devel de toute façon vous pouvez et vérifier si elle fonctionne. ce processus fonctionne pour moi.