@beduin01

Как линковщик производит подстановку функций из динамических библиотек?

Предположим я хочу вынести в библиотеку функцию foo. Я вынес ее и в obj файле вижу: `__D3foo12__ModuleInfoZ`
Вопрос если я в своем коде напишу foo() то как линковщик подберет нужную функцию из библиотеки?

Я праивльно понимаю что после манглинга название foo в коде уже не будет существовать?

Компилил при помощи D, но думаю для Си и С++ ситуация похожая.
  • Вопрос задан
  • 634 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Это называется name mangling — как по-русски, я не знаю, но называю это «козявить имена».

Названия foo в объектных файлах действительно не будет существовать.

Линкер тут ни к чему, имена готовит компилятор. Потому, кстати, в межъязыковых библиотеках стараются имена не козявить.

Чтобы функция называлась именно так, как надо, в Си++ есть ключевое слово extern "C", и часто его применяют, например, при экспорте в межъязыковой DLL, при интеграции Си-кода с Си++. Что в Ди, не знаю.
В Си такого точно нет, как ты назвал, так и называются.

Линкер, конечно, может каким-то образом подхватывать DLL (так работает LD), но это очень не стандартно — при переходе с LD на LLD пришлось готовить *.a для всех имеющихся DLL. Но в любом случае именами занимается компилятор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Как уже сказал Mercury13 манглинг выполняется компилятором. Нужен он чтобы перегрузки функций и методы классов превращались в отдельные символы. И чтобы библиотеку можно было подключить, манглинг должен происходить по единому стандарту. В вашем случае линковщик и будет искать __D3foo12__ModuleInfoZ.
Но линковщик подставляет тело функции только для статических библиотек (.lib/.a).
Динамические библиотеки (.dll/.so) по определению должны загружаться во время старта или в процессе работы программы.
Этим занимается динамический загрузчик. Он так же выполняет поиск по уже преобразованному имени.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы