Ulrich Drepper's paper auf Thread-Local Storage umreißt das TLS ABI für verschiedene CPU-Architekturen, aber ich finde es als Grundlage unzureichend für TLS aus zwei Gründen Umsetzung:Was sind die wirklichen ELF TLS ABI Anforderungen für jeden CPU-Arch?
- Es läßt eine Reihe wichtiger Archs wie ARM , MIPS, etc. (mit einer Reihe von komplett irrelevanten wie Itanium)
- Noch wichtiger ist, es mischt viele Implementierungsdetails mit ABI, so dass es schwer zu sagen ist, welche Eigenschaften für die Interoperabilität benötigt werden und welche nur Aspekte seiner Umsetzung.
Als Beispiel die einzigen tatsächlichen ABI Anforderungen für i386 sind:
%gs:0
zeigt auf einen Zeiger auf sich selbst.- Das TLS-Segment der Hauptausführung muss (falls vorhanden) an einem festen (durch den Linker, negativ) Offset von dieser Adresse liegen.
- Alle anderen TLS-Segmente für anfänglich geladene Bibliotheken müssen eine Laufzeitkonstante (dh für jeden Thread, aber nicht notwendigerweise die gleichen über verschiedene Programmläufe hinweg) Offsets relativ zu dieser Adresse haben (und der dynamische Linker muss füllen können) in Umzügen mit diesen Offsets).
___tls_get_addr
und__tls_get_addr
Funktionen müssen mit der korrekten Semantik zum Nachschlagen beliebiger TLS-Segmente vorhanden sein.
Insbesondere die Existenz oder das Layout eines DTV ist nicht Teil des ABI, noch ist die Bestellung/Layout TLS Segmente außer dem Hauptprogramm.
Es scheint, dass jeder Bogen, der "TLS-Variante II" verwendet, ungefähr die obigen ABI-Anforderungen hat. Aber ich verstehe die Anforderungen der "TLS-Variante I" überhaupt nicht sehr gut, und aus den Quellen (in uClibc und glibc) scheint es, dass es sogar mehrere Varianten von "Variante I" geben kann.
Gibt es bessere Dokumente, die ich mir ansehen sollte, oder kann jemand, der mit der Funktionsweise von TLS vertraut ist, die ABI-Anforderungen für mich erklären?
Es tut mir leid, wenn ich das offensichtliche frage, aber haben Sie die 'GCC' TLS Unterstützung überprüft? Zum Beispiel hat die Mailingliste 'gcc-patches' einen Thread, der am 1. Juni diesen Jahres beginnt und MIPS16-TLS-Unterstützung hinzufügt (http://marc.info/?l=gcc-patches&m=132586147826602). Die Compiler-Leute scheinen bezüglich dieser Art von Dingen viel formeller zu sein als die C-Bibliotheksentwickler; sie könnten eine bessere formelle Dokumentation haben. –