@beduin01

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

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

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

Компилил при помощи D, но думаю для Си и С++ ситуация похожая.
  • Вопрос задан
  • 495 просмотров
Решения вопроса 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) по определению должны загружаться во время старта или в процессе работы программы.
Этим занимается динамический загрузчик. Он так же выполняет поиск по уже преобразованному имени.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы