2016-03-31 2 views
-1

Je suis relativement nouveau dans l'assemblage et je travaille avec une puce PowerPC. J'utilise un compilateur croisé gcc et travaille avec un environnement buildroot (juste pour l'arrière-plan). J'ajoute du code à la section .head d'un code qui créera un objet .elf (appelons-le target.elf pour des raisons d'arguments) qui sera introduit dans un binaire plus grand tout via buildroot. target.elf est défini comme commençant à l'adresse 0x0 dans le code et l'éditeur de liens local mais sera déplacé plus tard vers un emplacement d'adresse différent. Je souhaite référencer une variable globale, qui est partagée entre le code d'assemblage et un fichier c, à partir du code d'assemblage. Quand je le fais en utilisant des moyens indépendants de l'emplacement, je rencontre des problèmes. Quand j'utilise le GOT comme référence (symbole @ got @ h par exemple), je suis capable de référencer correctement le symbole.Position dépendante, code indépendant et variables globales dans l'assemblage PowerPC

Ceci est un problème parce que je souhaite créer un gestionnaire d'interruption qui ne dépend pas d'avoir un pointeur valide sur la pile ou la table des matières lors de la saisie, et j'ai besoin de la table des matières pour utiliser le GOT.

Existe-t-il un moyen de le faire sans la table des matières?

Voici quelques exemples de code:

Résultat incorrect (% r3 ne contient pas ce "symbole" contient):

.global symbol 
symbol: 
    .long 0 

.global irq_handler 
irq_handler: 
    addi %r3, 0, 0 
    ori  %r3, %r3, [email protected] 
    ld  %r3, 0(%r3) 
    b  . 

In global area of C-file: 
extern uint64_t symbol; 

J'ai aussi essayé de définir le symbole dans le c fichier (si sans extern mais toujours comme global) et en omettant la définition dans le fichier asm. Cela a également échoué.

Je prends aussi un raccourci et je ne charge que la partie @l de l'adresse car les 32 bits supérieurs sont 0x0.

résultat correct (% r3 contient ce "symbole" contient):

.global irq_handler 
irq_handler: 
    ld  %r3, [email protected](%r2) 
    ld  %r3, 0(%r3) 
    b  . 

Notez que dans l'exemple correct la table des matières est disponible en% r2.

Merci à l'avance.

+1

Je ne comprends pas comment vous pouvez avoir * "gestionnaire d'interruption qui ne dépend pas d'avoir un pointeur valide à la pile" * –

+0

Le gestionnaire d'interruption fournit un moyen de se ramifier dans un * contexte * différent. Pour cette situation, je vais sauvegarder mon contexte actuel (registres) dans un emplacement connu avant de se connecter au nouveau contexte. Quand je reviens les registres seront dans un état indéfini. Lorsque l'irq est à nouveau déclenché, je vais restaurer le contexte d'origine mais je souhaite référencer "symbole" avant de restaurer la table des matières. Le gestionnaire d'interruptions gère également d'autres fonctionnalités sans trop entrer dans les détails. – Tyler

+0

Clarification pour le commentaire ci-dessus: Le retour de l'autre contexte est facilité en appelant à nouveau le même gestionnaire d'interruptions. Lorsqu'ils sont à nouveau appelés, les registres sont dans un état inconnu et seront restaurés après avoir coché "symbole". – Tyler

Répondre

0

Semble que la réponse est que le TOC est requis pour le code indépendant de l'emplacement.