Как стать автором
Обновить

Комментарии 8

Почему так происходит, мне выяснить не удалось, буду рад, если поделитесь информацией на этот счёт.

У glibc есть тяжелые проблемы с статической компоновкой. Слинковать можно, но она все равно пытается загружать какие-то динамические модули. И если не найдет их, падает.


Подробности не могу рассказать. Сам сталкивался, только когда пытался статически скомпилировать SQLite и fossil. Все получилось с MUSL. A я программирую только на ассемблере, где все это не нужно.

При тестировании было замечено, что программы статически скомпанованные с glibc, при запуске уходят в segfault, на данной инструкции:

movq %fs:0x28, %rax

Это обращение к TLS (thread local storage). C таким скриптом компоновщика TLS вряд ли будет работать.
Спасибо за наводку на TLS. Я уверен, что проблема не в скрипте компоновщика, а в самом упаковщике, так как с данным скриптом собирается только загрузчик.

Эту магию где нибудь преподают? Какие курсы нужно пройти чтобы начать понимать хотя бы что тут написано?

ну… робачевского прочитать, например. для старта вроде бы неплохо.
хотя я же не знаю с какого уровня вы стартуете, может быть вам с k&r нужно начать.

Для понимания структуры ELF есть мануал. Также про ELF'ы хорошо написано в книге Learning Linux Binary Analysis. Про скрипты компоновщика можно прочитать здесь.
В статье в начале жутко не хватает абзаца о том что такое «упаковка» и зачем она нужна :-)
Возможно как отправная точка подошли бы исходники утилиты upx?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.