Davantage de problèmes de temps de liaison GCC: référence non définie au principal

J’écris un logiciel pour un processeur Cortex-A8 et je dois écrire du code d’assemblage ARM pour accéder à des registres spécifiques. Je me sers des compilateurs gnu et des chaînes d’outils connexes, ces outils sont installés sur la carte processeur (Freescale i.MX515) avec Ubuntu. J’établis une connexion à partir de mon ordinateur hôte (Windows) à l’aide de WinSCP et du terminal PuTTY.

Comme d’habitude, j’ai commencé avec un simple projet en C avec main.c et functions.s . Je comstack le fichier main.c en utilisant GCC , assemble les fonctions.s en utilisant as et lie les fichiers objects générés en utilisant à nouveau GCC , mais des erreurs étranges se produisent pendant ce processus.

Une découverte importante –

Entre-temps, j’ai découvert que mon code d’assemblage pouvait ./functions.o problème, car lorsque je l’assemble individuellement à l’aide de la commande as -o functions.o functions.s , j’essaie d’exécuter le ./functions.o functions.o généré à l’ aide de la commande ./functions.o , le shell bash. ne reconnaît pas ce fichier en tant qu’exécutable (en appuyant sur l’onglet functions.o n’est pas sélectionné / PuTTY ne met pas le fichier en surbrillance).

Quelqu’un peut-il suggérer ce qui se passe ici? Dois- je envoyer des options spécifiques à GCC pendant le processus de liaison? Les erreurs que je vois sont étranges et au-delà de ma compréhension, je ne comprends pas à quoi le GCC fait référence.

Je colle ici le contenu de main.c, functions.s, le Makefile et la liste des erreurs.

Aidez-moi, s’il vous plaît!!!

Les dernières erreurs incluses après la modification du fichier makfile, comme suggéré par les gars ici –

 ubuntu@ubuntu-desktop:~/Documents/Project/Others/helloworld$ make gcc -c -mcpu=cortex-a8 main.c as -mcpu=cortex-a8 -o functions.o functions.s gcc -o hello main.o functions.o functions.o: In function `_start': (.text+0x0): multiple definition of `_start' /usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o:init.c:(.text+0x0): first defined here collect2: ld returned 1 exit status make: *** [hello] Error 1 

principal c

 #include  #include  int main(void) { puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ return EXIT_SUCCESS; } 

fonctions.s

 * Main program */ .equ STACK_TOP, 0x20000800 .text .global _start .syntax unified _start: .word STACK_TOP, start .type start, function start: movs r0, #10 movs r1, #0 .end 

Makefile

 all: hello hello: main.o functions.o gcc hello -o main.o functions.o 

– bonjour a été inclus ici après suggéré ici par les gars de stackoverflow, mais le problème persiste, je reçois toujours les mêmes erreurs.

 main.o: main.c gcc -c -mcpu=cortex-a8 main.c functions.o: functions.s as -mcpu=cortex-a8 -o functions.o functions.s 

les erreurs

 ubuntu@ubuntu-desktop:~/Documents/Project/Others/helloworld$ make gcc -c -mcpu=cortex-a8 main.c as -mcpu=cortex-a8 -o functions.o functions.s gcc -o main.o functions.o functions.o: In function `_start': (.text+0x0): multiple definition of `_start' /usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o:init.c:(.text+0x0): first defined here /usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o: In function `_start': init.c:(.text+0x30): undefined reference to `main' collect2: ld returned 1 exit status make: *** [hello] Error 1 

Dans le makefile:

 hello: main.o functions.o gcc -o main.o functions.o 

devrait être:

 hello: main.o functions.o gcc -o hello main.o functions.o 

Dans l’état actuel des choses, vous liez functions.o, mais pas main.o, et produisez un exécutable de sortie appelé main.o, qui écrase votre fichier main.o. existant.

Ne devrait pas

 hello: main.o functions.o gcc -o main.o functions.o 

être

 hello: main.o functions.o gcc -o hello main.o functions.o 

Comme Bigbohne le suggère, gcc tente de créer un lien dans la bibliothèque d’exécution standard. Essayez d’append l’option -nostdlib à votre appel gcc:

 gcc -nostdlib -o hello main.o functions.o 

Je pense que cela a quelque chose à voir avec la bibliothèque Runtime que gcc relie à la fin.

Et dans cette bibliothèque, il y a déjà un “_start”.

Je pense que vous devez comstackr sans “bibliothèque std”. mais vous n’aurez pas printf, getchar et toutes les autres choses utiles.