Wie interpretiere ich die Segmentregisterzugriffe auf x86-64?

8

Mit dieser Funktion:

%Vor%

Wie interpretiere ich die zweite Anweisung und finde heraus, was zu RAX hinzugefügt wurde?

    
Alex B 21.10.2011, 04:25
quelle

2 Antworten

8

Dieser Code:

%Vor%

gibt die Adresse einer Thread-lokalen Variablen zurück. %fs:0x0 ist die Adresse des TCB (Thread Control Block), und 1069833(%rip) ist der Offset von dort zur Variable, der bekannt ist, da sich die Variable entweder im Programm oder in einer dynamischen Bibliothek befindet, die zur Ladezeit des Programms geladen wird ( Bibliotheken, die zur Laufzeit über dlopen() geladen werden, benötigen einen anderen Code).

Dies wird ausführlich in Ulrich Dreppers TLS-Dokument , speziell §4.3 und §4.3.6, erklärt.

    
ninjalj 21.10.2011, 18:03
quelle
3

Ich bin mir nicht sicher, ob sie seit der schlechten alten Zeit der segmentierten Architektur als Segment -Register bezeichnet wurden. Ich glaube, der richtige Ausdruck ist ein Selektor (aber ich könnte falsch liegen).

Aber ich denke, du brauchst nur das erste Vierwort (64 Bit) im fs -Bereich.

Das Bit %fs:0x0 steht für den Inhalt des Speichers bei fs:0 . Da Sie das generische add (anstatt addl zum Beispiel) verwendet haben, denke ich, dass es die Datenbreite vom Ziel %rax benötigt.

Was den tatsächlichen Wert betrifft, hängt es davon ab, ob Sie sich im Legacy- oder Long-Modus befinden.

Im Legacy-Modus müssen Sie den Wert fs ermitteln und in der GDT (oder möglicherweise LDT) nachschlagen, um die Basisadresse zu erhalten.

Im langen Modus müssen Sie sich die relevanten modellspezifischen Register ansehen. Wenn Sie an diesem Punkt sind, sind Sie leider über mein Fachwissen hinausgekommen.

    
paxdiablo 21.10.2011 04:32
quelle

Tags und Links