GCC - Label-Adresse gibt die aktuelle EIP-Adresse anstelle der tatsächlichen Label-Adresse zurück

8

Beim Versuch, ein Betriebssystem zu schreiben, muss ich die Adresse des Endes der aktuellen Funktion (kurz vor dem Epilog) für den Task-Wechsel ermitteln.
Konkret ist mein Problem, eine EIP zu bekommen, die meiner neu erstellten Aufgabe (Prozess) innerhalb des kopierten Stapels zugewiesen wird. Ich habe es bereits geschafft, Register für einen Prozess zu speichern / wiederherzustellen, aber ich muss herausfinden, welchen Wert der untergeordnete Prozess in seiner EIP haben wird.

Ich habe die Erweiterungen von GCC für den C-Standard verwendet: Labels als Werte und Lokale Labels
Aus der Dokumentation: Sie können die Adresse eines Etiketts, das in der aktuellen Funktion (oder einer enthaltenden Funktion) definiert ist, mit dem unären Operator '& amp; & amp;' Der Wert hat den Typ void *.
und: GCC ermöglicht es Ihnen, lokale Labels in jedem verschachtelten Blockbereich zu deklarieren. Ein lokales Label ist genau wie ein gewöhnliches Label, aber Sie können es nur (mit einer goto-Anweisung oder mit seiner Adresse) innerhalb des Blocks, in dem es deklariert ist, referenzieren.

%Vor%

GCC kompiliert es nur mit Warnungen über nicht standardmäßigen Code.
Jedoch zeigt gdb, wenn es demontiert wird:

%Vor%

Ich erwarte, dass task->regs.eip = (uintptr_t)&&fork_endl 0x00105096 statt 0x00105008 speichert.
CFLAGS sind -O0 -std=gnu99 -fgnu89-inline -DDEBUG -ggdb3 -ffreestanding -fbuiltin (Warnungen betreffende Optionen werden hier nicht angezeigt).

Kommentar __label__ fork_end; ändert nichts.

    
Aerath 16.08.2016, 21:07
quelle

1 Antwort

1

Offenbar optimiert der Compiler das Label vollständig, da kein Code-Pfad dazu führt. Ich habe bestätigt, dass das Verschieben des Labels vor der return -Anweisung und das Sicherstellen, dass zwischen der Zuweisung und dem Label tatsächlich Code vorhanden ist, zu dem von mir gewünschten Verhalten führt. Hier ist der Code, den ich zum Testen zusammengestellt habe:

%Vor%

Basierend darauf würde ich erwarten, dass Sie tatsächlich erreichen können, was Sie wollen, indem Sie Ihren Code-Pfad leicht umarbeiten, um sicherzustellen, dass der Label-Punkt für jeden Code-Pfad erreichbar ist.

    
Joel C 19.08.2016, 03:59
quelle

Tags und Links