2008-12-06 11 views
10

Wir entwickeln einen Port des GNU Assemblers für eine Client-Architektur. Jetzt ist das Problem konfrontiert, dass:Verschiebbare Symbole im ELF-Format (Assemblersprache)

Wenn ein direkter Operand zu einer Anweisung ein Ausdruck ist, der mehr als eine verschiebbare Symbole enthält, wie wird es in der Ausgabedatei im Elf-Format behandelt. Welche Informationen zur Umsiedlung werden in einem solchen Fall erstellt?

Zum Beispiel:

j label1 + label2 

wo label1 und label2 in relocatable Abschnitte definiert sind, könnten sie die gleichen Teile oder unterschiedliche relocatable Abschnitte sein.

Antwort

7

ELF doesn‘ über Anweisungen an sich wissen. Es kennt spezielle Codierungen von Symbolversätzen innerhalb von Anweisungen. Im Assembler müssten Sie zwei Verschiebungsdatensätze ausgeben, von denen jeder das entsprechende Triplet [Adresse, Typ, Symbol] enthält, um diesen Teil des Befehls ordnungsgemäß zu patchen. Der Linker würde nicht unbedingt wissen, dass diese beiden Datensätze auf denselben Befehl zeigen.

Die ELF Relocation-Typen sind vollständig CPU-abhängig (genauer gesagt, ISA-abhängig), so dass Sie frei definieren können, welche Relokationen Sie für eine neue Architektur benötigen.

Es ist schwierig, ohne Details der Befehlskodierung genauer zu sein.

0

Ich kenne Jack über ELF und nur ein wenig mehr über die Verknüpfung aber ...

Ich würde erwarten, dass jeder Operand die gleiche Art und Weise behandelt wird, dass es wäre, wenn es nur eine ist.

OTOH könnte das Problem sein, dass das Format für j ändert sich abhängig davon, wo die Etiketten sind? Wenn ja, ich denke, Sie versenkt als Linker nicht klug genug sind, so etwas zu tun (das ADA-Build-System IIRC könnte als die meisten klüger sein, so man es aussehen könnte.)

0

Ich würde einen Eintrag pro Adresse für jede Anweisung erwarten, die Verlagerung benötigt.

Objdump kann möglicherweise die Umlagerungstabelle einer ausführbaren Datei oder Objektdatei anzeigen, aber ich kenne die Flags nicht ohne weiteres.

Mein Vorschlag ist zu versuchen, eine x86 (oder andere CISC) -Anweisung zu graben, die etwas Ähnliches tut, was Ihr Client-Arch tut, und sehen, welche Relokationen beim Assemblieren/Verknüpfen erzeugt werden.

Verwandte Themen