2016-03-07 2 views
0

Je suis en train de créer un lien avec FreeScale Code Warrior 5.9 pour MPC5554, qui est une puce PPC avec un noyau e500mc. Je compile avec GCC 4.6.4 compilé pour powerpc-none-eabi.Utilisation de FreeScale Code Warrior pour lier des fichiers objets GCC avec des appels __eabi

Je compile du code C pour mon projet, y compris le fichier avec main, en utilisant un compilateur croisé GCC. J'ai besoin de lier en utilisant Code Warrior, cependant. GCC ajoute un appel à une fonction appelée __eabi au début de main, qui est censée initialiser deux registres. Il ne peut pas être retiré, et n'est pas nécessaire pour ce que je fais. GCC s'attend à ce qu'il soit fourni par le CRT.

Ce sont mes drapeaux de compilation pour GCC: -O2 -std=c99 -w -mno-eabi -mregnames -mcpu=e500mc -misel=yes -mfloat-gprs=single -mno-string -msdata=none

La documentation de GCC PowerPC dit il y a un argument -no-eabi, qui devrait enlever, mais si vous creusez dedans il y a un certain nombre de rapports de bugs de pointage out que la documentation est erronée et le drapeau ne supprime pas réellement l'appel à __eabi.

J'ai essayé simplement d'ajouter une fonction __eabi au crt de CodeWarrior. En __ppc_eabi_init.c j'ai ajouté la fonction:

asm extern void __eabi(void) 
{ 
    addis r13,r0,[email protected] 
    ori  r13,r13,[email protected] 
    addis r2,r0,[email protected] 
    ori  r2,r2,[email protected] 
    blr 
} 

Cependant, lorsque je tente de créer un lien, je reçois toujours l'erreur que __eabi de principal main.o est indéfini. Il semble que le linker Code Warrior ne trouve pas ma fonction. J'ai vérifié que __ppc_eabi_init.c est le premier dans l'ordre des liens.

Comment puis-je obtenir ce lien? Y at-il un moyen de supprimer l'appel à __eabi? Pourquoi Code Warrior est-il incapable de trouver la fonction quand je la fournis?

+0

la langue d'assemblage de CodeWarrior a la directive '.global' pour faire une étiquette visible à d'autres fichiers. Donc je m'attendrais, au minimum que la première ligne soit: 'asm global void __eabi (void)' – user3629249

+0

@ user3629249 on pourrait le penser, mais il attend le mot-clé 'extern' dans ce contexte. – seanmk

Répondre

0

Il s'est avéré que j'avais la bonne idée, mais que je mettais accidentellement la définition de la fonction __eabi à l'intérieur d'un bloc #ifdef qui était exclu de l'assemblage. Lorsque j'ai déplacé la définition en dehors de ce bloc, elle s'est correctement liée.

J'ai également modifié les scripts de liens fournis afin qu'ils localisent correctement les sections .rodata.cst * que GCC utilise pour les données en lecture seule. Je ne suis pas sûr que c'était important, mais je recevais un avertissement de l'éditeur de liens, alors je l'ai corrigé.

En MPC5554.lcf, j'ai changé

.rodata (CONST) : { 
    *(.rdata) 
    *(.rodata) 
} 

lire

.rodata (CONST) : { 
    *(.rdata) 
    *(.rodata) 
    *(.rodata.cst*) 
}