Comments 4
Похоже, Вы путаете сегменты и секции ELF. У сегментов нет ни имён, ни полей с префиксом sh_
, это всё как раз есть у секций. Если Вы делаете более-менее нормальную поддержку ELF, то для загрузки исполняемых файлов нужно использовать именно сегменты, а конкретно для TLS нужно искать сегмент с типом PT_TLS
.
Короткое контр-предложение: если у вас такие проблемы с fs, то сделайте функционал БЕЗ использования этого регистра. Вы же делаете свою реализацию под обособленную ОС. Сделайте же хорошо! (..., плохо само получится).
Более развёрнуто:
[Извините], по-моему исходные предпосылки статьи не совсем правильные. Вы берёте функционал C++ и говорите, что расскажите, как он работает. После этого компилируете это некоторым (неуказанным) компилятором (под неуказанную ОС) и героически пытаетесь сделать так, чтобы скомплированный код запускался на некоторой другой (какой?) "учебной ОС".
Если для запуска скомпилированного кода (обычного, пользовательского режима) нужно пропатчить ядро ОС, то либо компилятор "не-торт" (сомнительно), либо ОС не соответствует компилятору (более вероятно).
Так может проще было выбрать правильный компилятор? (для "учебной ОС" есть компилятор? Нет?)
Или написать статью в стиле: (например) рассказываю как работает thread_local в компиляторе ххх под ОС цццц на процессорах ччч. Иначе может быть нехорошо, что какой-нибудь ARM+Ubuntu - есть; компилятор C++ под него - есть; регистр fs - а что это?.
Прим.: регистры cs... ИЗНАЧАЛЬНО задумывались для того, чтобы 16-битная адресация могла добраться до 1 Мбайта памяти. И изначально в регистр cs... можно было записывать что хочешь (и не делать системный вызов) и получающийся результирующий адрес (например, cs * 16 + ip) уже покрывал 1 мб.
Должно быть, вы правы в том, что название статьи не совсем точное.
Компилятор - gcc, запускаемый под Linux для компиляции без стандартной библиотеки. Естественно, про особенности ОС Infos ему ничего неизвестно - но писать собственный компилятор только для того, чтобы не вносить одно исправление в одну строчку в ядро мне не хотелось.
Да, из приведенного выше кода только две строки из ядра - остальное - это код пользовательской библиотеки.
Как устроена работа thread_local переменных: разбираемся и добавляем поддержку в учебную ОС