Возьмите следующее с крошкой соли, поскольку я только посмотрел на это «во время компиляции» (здесь нет деревянных мечей ).
Glibc / NPTL использует TLS для хранения большого количества потоков. TLS указывает на поток struct pthread pd
(pd
, вероятно, означает дескриптор pthread ), размещенный в локальном стеке потока на allocate_stack()
, вызывается с __pthread_create_2_1()
.
В x86 первый член struct pthread
- это void *tcb
, что должно указывать на struct user_desc
(его номер записи, вероятно, будет варьироваться в зависимости от архитектуры, а также, вероятно, также от версии ядра, glibc в моей системе используется 6 для внутреннего TLS). Это tcb
передается в качестве аргумента do_clone()
.
Если вы посмотрите эти функции, вы увидите, что glibc хранит много информации о TLS: информацию о локальном стеке потока, есть ли у этой программы несколько потоков, список надежных мьютексов, подпрограмма запуска потока и его аргумент, Флаги атрибутов pthread, политика планирования, ...
Таким образом, если вам удастся получить реальную нить, это будет намного проще.