История изменений
Исправление firkax, (текущая версия) :
Между линковкой PE и ELF важных отличий только два:
1) у ELF-линкера по умолчанию глобальное пространство имён на весь процесс, соответственно не важно в какой именно библиотеке символ, линкер просмотрит все загруженные (но dlopen умеет опционально грузить .so в приватное пространство, откуда его символы будут видны только через dlsym, и рантайм линкер их там не увидит)
2) для ELF допустимы unresolved символы в любом контексте, главное чтобы при итоговой линковке перед запуском они все нашлись - это весьма удобно для всяких so-плагинов, когда символы из хост-бинарника просто объявляются extern и прилинковываются при загрузке этого so - в винде это штатно нельзя
Оба отличия происходят от того, что elf-линкер просто вторая итерация того же самого линкера, который собирает бинарник из .o и статических библиотек.
В PE же рантайм линкер поиском имён не занимается, он только вписывает адреса. Все символы резолвятся на этапе компиляции бинарника (exe или dll), но резолвятся либо статически, если символ тут же, либо «отложенно» - пишется: мы на этапе компиляции «нашли» (обычно благодаря import library) этот символ в такой-то dll-ке, рантайм линкер должен только подгрузить её и вписать из неё адрес.
Исходная версия firkax, :
Между линковкой PE и ELF важных отличий только два:
1) у ELF-линкера по умолчанию глобальное пространство имён на весь процесс, соответственно не важно в какой именно библиотеке символ, линкер просмотрит все загруженные (но dlopen умеет опционально грузить .so в приватное пространство, откуда его символы будут видны только через dlsym, и рантайм линкер их там не увидит)
2) для ELF допустимы unresolved символы в любом контексте, главное чтобы при итоговой линковке перед запуском они все нашлись - это весьма удобно для всяких so-плагинов, когда символы из хост-бинарника просто объявляются extern и прилинковываются при загрузке этого so - в винде это штатно нельзя
Оба отличия происходят от того, что elf-линкер просто вторая итерация того же самого линкера, который собирает бинарник из .o и статических библиотек.
В PE же рантайм линкер поиском имён не занимается, он только вписывает адреса. Все символы резолвятся на этапе компиляции бинарника (exe или dll), но резолвятся либо статически, если символ тут же, либо «отложенно» (пишется: мы на этапе компиляции нашли этот символ в такой-то dll-ке, рантайм линкер должен только подгрузить её и вписать из неё адрес).