Jakie są rzeczywiste wymagania ABI TLS dla każdego łuku procesora?

Papier Ulricha Dreppera w lokalnym magazynie wątków opisuje ABI TLS dla kilku różnych architektur procesorów, ale uważam, że jest to niewystarczające jako podstawa do implementacji TLS z dwóch powodów:

Pomija wiele ważnych łuków, takich jak ARM, MIPS itp. (Podczas gdy zawiera kilka zupełnie nieistotnych, takich jak Itanium)Co ważniejsze, łączy wiele szczegółów implementacji z ABI, więc trudno jest określić, które właściwości są wymagane dla interoperacyjności i które są tylko aspektami jego implementacji.

Na przykład jedynymi rzeczywistymi wymaganiami ABI dla i386 są:

%gs:0 wskazuje na wskaźnik do siebie.Segment TLS głównego pliku wykonywalnego, jeśli istnieje, musi znajdować się w stałym (przez linker, ujemny) przesunięciu względem tego adresu.Wszystkie pozostałe segmenty TLS dla początkowo załadowanych bibliotek muszą mieć stałą czasu wykonywania (tj. Taką samą dla każdego wątku, ale niekoniecznie taką samą dla różnych przebiegów programu) przesunięć względem tego adresu (a dynamiczny linker musi być w stanie wypełnić relokacje za pomocą te przesunięcia).___tls_get_addr i__tls_get_addr funkcje muszą istnieć z poprawną semantyką do wyszukiwania dowolnych segmentów TLS.

W szczególności istnienie lub układ DTV jestnie część ABI, ani porządek / układ segmentów TLS inny niż główny program.

Wydaje się, że każdy łuk wykorzystujący „wariant TLS II” ma w przybliżeniu powyższe wymagania ABI. Ale w ogóle nie rozumiem wymagań „wariantu TLS I” i wydaje się, że ze źródeł czytających (w uClibc i glibc) może istnieć nawet kilka wariantów „wariantu I”.

Czy są jakieś lepsze dokumenty, na które powinienem się zwrócić, czy też ktoś, kto zna zasady działania TLS, wyjaśnia mi wymagania ABI?

questionAnswers(1)

yourAnswerToTheQuestion