Какая красота! Задавал на stackoverflow именно такой вопрос и получил похожий ответ, но не на русском языке. Спасибо, что все разжевали по-русски. Кстати, в ходе моих личных эспериментов, на osx нет всех этих функций и секций перед _start, их там штуки 2-3 вместо (около 15) на linux, что и логично. Можно было бы проверить еще, что и как работает в osx :)
функция использует DSO-идентификатор, который известен только компилятору
Мне стало интересно как генерится этот __dso_handle. Например, если это случайное число, выбранное в момент компиляции, то оно может совпасть у двух библиотек, в таком случае их atexit'ы перепутаются.
Всё оказалось проще и хитрее: __dso_handle — это объект с релокацией, которая подставляется в момент загрузки библиотеки. А так как адреса библиотек в процессе не могут пересекаться, то и хэндлы от разных библиотек всегда будут разные.
Тернистый путь Hello World