Как работает ссылка на внешнюю DLL? - PullRequest
0 голосов
/ 07 марта 2011

Мне действительно интересно понять механизм связывания.
В частности, я хочу понять, как работает связывание dll.

Насколько я понимаю,
вызывая внутреннюю функцию, фактически преобразуется компилятором в адрес метода.
То есть doSomething(); (sortof) преобразуется в jmp 00102356.
Я знаю, что это слишком упрощает, так как на самом деле это call инструкция.
Но идея в том, что IP сказано, куда jmp, потому что мы знаем адрес метода.

Что происходит с методами из внешних библиотек?
Всегда ли предполагается, что они находятся в определенном фиксированном месте в памяти, к которому мы обращаемся?

Большое спасибо:)

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Для вызова в DLL, есть таблица всех адресов функций в DLL.Код генерирует поиск в этой таблице, а затем косвенный вызов правильного адреса загруженной функции.Функции не всегда находятся в определенных фиксированных местах в памяти;подумайте о указателях функций (это то, что вы используете при динамической загрузке модулей).См. страницу Википедии о библиотеках для более подробного объяснения.

1 голос
/ 07 марта 2011

Во время выполнения внешние ссылки на DLL также преобразуются в абсолютные адреса памяти, которые были сопоставлены с адресным пространством исполняемого файла.

Исполняемый файл содержит список необходимых DLL-файлов, которые загружаются или отображаются в память, и все ссылки на вызовы на машинном языке изменяются на правильный адрес для любых экспортируемых функций dllexport.

Общие библиотеки DLL загружаются только один раз в физическую память, но этот код логически отображается в адресное пространство любого исполняемого файла, который их использует.

Когда все загружено, оно выглядит как одна монолитная программа на машинном языке для CPU.

Кроме того, программист может использовать функцию API-интерфейса Windows LoadLibrary для загрузки DLL в адресное пространство программы во время выполнения, а функция API GetProcAddress возвращает физический адрес, который можно использовать для вызова функций DLL через переменную-указатель функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...