2016-03-31 11 views
-1

Ich bin relativ neu in der Montage und arbeite mit einem PowerPC-Chip. Ich benutze einen gcc Crosscompiler und arbeite mit einer buildroot Umgebung (nur für den Hintergrund).Positionsabhängiger, unabhängiger Code und globale Variablen in PowerPC-Baugruppe

Ich füge Code in die .head-Sektion von Code, der ein .elf-Objekt erstellen wird (lasst es target.elf für Argumente genannt werden), das über buildroot in eine größere Binärdatei gebracht wird. target.elf ist so definiert, dass es bei der Adresse 0x0 im Code und beim lokalen Linker beginnt, aber später an einen anderen Adressort verschoben wird. Ich möchte auf eine globale Variable verweisen, die zwischen dem Assembler-Code und einer c-Datei vom Assembler-Code geteilt wird. Wenn ich ortsunabhängige Mittel verwende, stoße ich auf Probleme. Wenn ich den GOT als Referenz benutze (zB @ @ @ @ @), kann ich das Symbol korrekt referenzieren.

Dies ist ein Problem, weil ich einen Interrupt-Handler erstellen möchte, der nicht auf einen gültigen Zeiger auf den Stapel oder Inhaltsverzeichnis bei der Eingabe angewiesen ist, und ich brauche das Inhaltsverzeichnis, um das GOT zu verwenden.

Gibt es eine Möglichkeit, dies ohne das TOC zu tun? Hier

ist einige Beispiel-Code:

Falsches Ergebnis (% r3 nicht enthalten, was "Symbol" enthält):

.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; 

Ich habe auch in der c-Datei definiert, das Symbol versucht (so ohne extern aber immer noch als global) und die Definition in der asm-Datei weglassen. Dies ist ebenfalls fehlgeschlagen.

Ich nehme auch eine Verknüpfung und nur den @ l Teil der Adresse, weil die oberen 32 Bits 0x0 sind.

Richtiges Ergebnis (% r3 enthält, was "Symbol" enthält):

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

Beachten Sie, dass in dem richtigen Beispiel der TOC in% r2 verfügbar sind.

Vielen Dank im Voraus.

+1

Ich verstehe nicht, wie Sie haben können * "Interrupt-Handler, der nicht auf einen gültigen Zeiger auf den Stapel angewiesen ist" * –

+0

Der Interrupt-Handler bietet eine Möglichkeit zum Verzweigen in einen anderen * Kontext *. Für diese Situation werde ich meinen aktuellen Kontext (Register) an einem bekannten Ort sichern, bevor ich in den neuen Kontext verzweige. Wenn ich zurückkomme, sind die Register in einem undefinierten Zustand. Wenn der IRQ erneut ausgelöst wird, stelle ich den ursprünglichen Kontext wieder her, möchte aber auf "Symbol" verweisen, bevor ich das Inhaltsverzeichnis wiederherstelle. Der Interrupt-Handler behandelt auch andere Funktionen, ohne zu sehr ins Detail zu gehen. – Tyler

+0

Erläuterung für obigen Kommentar: Die Rückkehr aus dem anderen Kontext wird erleichtert, indem derselbe Interrupt-Handler erneut aufgerufen wird. Bei erneutem Aufruf befinden sich die Register in einem unbekannten Zustand und werden nach Überprüfung des "Symbols" wiederhergestellt. – Tyler

Antwort

0

Scheint, dass die TOC für standortunabhängigen Code erforderlich ist.