2017-05-24 7 views
0

Comment faire référence à un symbole externe au fichier actuel dans l'assemblage ppc? J'ai essayé d'examiner le mot-clé .extern ainsi que d'ajouter un nouveau symbole dans le fichier de l'éditeur de liens, mais sans succès.Référencement de symboles dans d'autres fichiers à l'aide de l'assemblage PPC

J'ai deux fichiers d'assemblage ppc qui font partie d'un projet plus important. Je voudrais faire référence à un symbole (__head) dans fichier1 fichier2 de la façon suivante:

file1.S:

.section ".head","ax" 

    . = 0 
.global __head 
__head: 

file2.S:

.section ".head","ax" 
... 
    LOAD_32(%r3, file2_symbol_name - __head) 

où LOAD_32 est

#define LOAD_32(r, e)   \ 
    lis  r,(e)@h;   \ 
    ori  r,r,(e)@l;  

... mais j'obtiens l'erreur suivante:

file2.S: Assembler messages: 
file2.S:113: Error: can't resolve `file2_symbol_name' {.head section} - `__head' {*UND* section} 
file2.S:113: Error: expression too complex 

Lorsqu'il est utilisé dans le fichier 1 LOAD_32(%r3, file1_symbol_name - __head) fonctionne très bien, donc je sais que je n'importe pas le nom du symbole correctement. Comment puis-je faire ceci?

EDIT:

Je réduit mon problème aux parties strict minimum afin que je suis clair sur le problème. Ci-dessous tout le code, le fichier linker, Makefile et la sortie du terminal pour "make quick".

NB: Lorsque je commente la ligne 9 de other.S, le projet compile sans erreur.

head.S:

#include "asm-defines.h" 

    .section ".head","ax" 
    .align 0x10 

    . = 0x0 

.global __head 
__head: 
    LOAD_32(%r3, file1_symbol_name - __head) 
    b . 

file1_symbol_name: 
    b . 

other.S

#include "asm-defines.h" 

    .section ".head","ax" 
    .align 0x10 

.global other 
other: 
    LOAD_32(%r3, file2_symbol_name) 
    LOAD_32(%r3, file2_symbol_name - __head) 
    b . 

file2_symbol_name: 
    b . 

asm-defines.h:

#ifndef ASM_DEFINES_H 
#define ASM_DEFINES_H 

/* Load an immediate 32-bit value into a register */ 
#define LOAD_32(r, e)   \ 
    lis  r,(e)@h;   \ 
    ori  r,r,(e)@l;  

#endif //ASM_DEFINES_H 

quick.lds

ENTRY(__head); 

Makefile

CC=$(CROSS)gcc 
QFLAGS := -Wl,--oformat,elf64-powerpc -pie -m64 -mbig-endian -nostdlib 

quick: 
    $(CC) $(QFLAGS) -T quick.lds head.S other.S -o quick.o 

$ (CROSS) est un chemin vers le compilateur croisé que j'ai omis. Le CC est powerpc64le-buildroot-linux-gnu-gcc

Terminal

$ make quick 
powerpc64le-buildroot-linux-gnu-gcc -Wl,--oformat,elf64-powerpc -pie -m64 -mbig-endian -nostdlib -T quick.lds head.S other.S -o quick.o 
other.S: Assembler messages: 
other.S:9: Error: can't resolve `.head' {.head section} - `__head' {*UND* section} 
other.S:9: Error: expression too complex 
other.S:9: Error: can't resolve `.head' {.head section} - `__head' {*UND* section} 
other.S:9: Error: expression too complex 
make: *** [quick] Error 1 
+0

ce assembleur est-ce assembleur gnu (le programme qui définit alors la langue) –

+0

Oui, c'est gnu. Cette partie je crois que je dois faire en assemblée. Je crée un code qui corrigera le vecteur d'interruption de réinitialisation du système et j'aurai perdu toutes mes valeurs de registre, y compris le pointeur TOC quand ce vecteur est présent. – Tyler

+0

Ah, eh bien, je suppose que je suis en train de faire l'assemblage, mais ça passe d'abord par le préprocesseur. Il est défini comme un fichier **. S ** que je crois que gcc traite comme un "code assembleur qui doit être prétraité". Donc, en utilisant le #define fonctionne bien. Je crois que l'erreur est spécifiquement liée à la référence à '- __head' vu que' LOAD_32 (% r3, nom_symbol_fichier2) 'compile bien dans le fichier2, tout comme' LOAD_32 (% r3, nom_symbol_fichier1 - __head) 'dans le fichier1. Cela dit, c'est l'assemblage ... donc je ne pense pas que #include puisse m'aider avec la référence externe ici si vous suggérez d'inclure un descripteur c-function. – Tyler

Répondre

0

L'assembleur ne peut pas connaître la position de placement/relative de head.S et other.S au moment de l'assemblage pour pouvoir calculer le déplacement relatif des étiquettes file2_symbol_name et __head. Ceci est une question de langage d'assemblage général, pas spécifique à PPC.

+0

Merci beaucoup! J'avais pensé qu'il essayerait de passer par une étape de liaison avant de se plaindre d'un problème comme celui-ci, mais je suppose que ce n'est pas le cas – Tyler

0

En ce qui concerne la réponse de David, voir https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops, où il spécifie: "Soustraction Si le bon argument est absolu, le résultat a la section de l'argument de gauche Si les deux arguments sont dans la même section, le résultat est absolu. ne peut pas soustraire des arguments de sections différentes."Le message d'erreur indique que l'assembleur n'a aucune idée de la section qui contient __head, ce qui n'est pas le cas, car le symbole et sa section ne sont pas définis dans la zone de fichier. des directives faibles et/ou .weakref pour que le symbole puisse être défini dans deux fichiers, avec la référence forte remplaçant la plus faible au moment de la liaison.Je n'ai pas expérimenté cela.Voir le manuel (https://sourceware.org/binutils/docs/as/) et chercher .weak.

Quelques informations sur les symboles faibles est ici.? https://en.wikipedia.org/wiki/Weak_symbol

+0

Merci beaucoup pour votre ajout! Donc, même si j'ai utilisé '.section" .head "' dans les deux fichiers, ils ne sont pas considérés comme faisant partie de la même "section" avant d'être liés. – Tyler

+0

Merci aussi pour la ressource 'as' – Tyler