Я просто изучаю, как TLS (локальное хранилище потоков) реализовано в системах Linux. В документе Обработка ELF для локального хранилища потока объясняется, как требования программы к локальным переменным потока могут быть закодированы в двоичном формате ELF, и как «среда выполнения» должна обрабатывать такие двоичные файлы.
Однако мне не ясно, будет ли на практике «среда выполнения», которая устанавливает область (области) TLS, ядро Linux (и его код для загрузки двоичных файлов ELF) или какой-либо код инициализации в libc. Кто-нибудь может кратко объяснить?
(Предыстория: я пытаюсь статически связать и запустить приложение, но при запуске оно выдает ошибку сегментации. В gdb я вижу, что код ошибки сегментации — это какой-то код инициализации из libc. Он пытается прочитать статическую переменную с помощью адрес относительно GS, но GS равен нулю.)