Je pratique la programmation de mixage C et assembleur en langage GCC. Et cette erreur occered:c appelle la fonction en langage assembleur
1 [email protected]:~/workspace/leos_test$ make
2 ld -o deng c.o asm.o
3 ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
4 c.o: In function `main':
5 c_and_asm.c:(.text+0x19): undefined reference to `add'
6 c_and_asm.c:(.text+0x2e): undefined reference to `printf'
7 make: *** [deng] Error 1
Ceci est le code C:
1 #include<stdio.h>
2 void extern add(int * i);
3 void main(){
4 int i=1;
5 add(&i);
6 printf("%d ",i);
7}
Voici le code de langage assembleur:
1 .globl _add
2 _add:
3 push %bp;
4 mov %sp,%bp;
5 mov 0x4(%bp),%eax;
6 incw (%eax);
7 popw %bp;
8 ret
Voici le Makefile:
1 deng: c.o asm.o
2 ld -o deng c.o asm.o
3 c.o:
4 gcc -o c.o -c c_and_asm.c
5 asm.o:
6 as -o asm.o c_asm.asm
Toute suggestion sera appréciée :).
Pourquoi avons-nous tant de code 16 bits dans le fichier asm? J'utiliserais '% esp','% ebp', 'incl', et' popl'! Je perds le commutateur '-c' et donne à gcc le fichier asm.o et le laisse invoquer ld pour toi. Si vous invoquez ld vous-même, en plus de '-lc', vous aurez besoin de' -I/lib/ld-linux.so.2', et '-melf_i386' si vous utilisez un système 64 bits (' -m32 'pour gcc). Si vous obtenez une mystérieuse erreur "fichier introuvable" lorsque vous exécutez votre chef-d'œuvre, essayez ce commutateur "-I" ... –
Ceci est un copier coller à partir du corps de la question. Que ce soit un défi pour lui. Il en apprendra plus ... – memosdp
Assez juste. Oublie ce que j'ai dit, Deng. :) –