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