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

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

Замечательная статья, спасибо!

Сегодня какой-то день чудес. Ваша статья, и ещё эта — habrahabr.ru/post/339962
Какая красота! Задавал на stackoverflow именно такой вопрос и получил похожий ответ, но не на русском языке. Спасибо, что все разжевали по-русски. Кстати, в ходе моих личных эспериментов, на osx нет всех этих функций и секций перед _start, их там штуки 2-3 вместо (около 15) на linux, что и логично. Можно было бы проверить еще, что и как работает в osx :)

P.S. Линк на вопросец, может, кому тоже интересно будет: stackoverflow.com/questions/34966097/what-functions-does-gcc-add-to-the-linux-elf
функция использует DSO-идентификатор, который известен только компилятору

Мне стало интересно как генерится этот __dso_handle. Например, если это случайное число, выбранное в момент компиляции, то оно может совпасть у двух библиотек, в таком случае их atexit'ы перепутаются.
Всё оказалось проще и хитрее: __dso_handle — это объект с релокацией, которая подставляется в момент загрузки библиотеки. А так как адреса библиотек в процессе не могут пересекаться, то и хэндлы от разных библиотек всегда будут разные.
Хорошее замечание. Ещё интересно, что по причине __dso_handle у каждой библиотеки определена своя личная функция atexit.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации