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
ce assembleur est-ce assembleur gnu (le programme qui définit alors la langue) –
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
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