OSDev
http://osdev.su/

DLL Винды: Как?
http://osdev.su/viewtopic.php?f=6&t=467
Страница 1 из 2

Автор:  Bargest [ 04 ноя 2011, 17:22 ]
Заголовок сообщения:  DLL Винды: Как?

Надо сделать нечто наподобие виндовских DLL, то есть динамически подгружаемые библиотеки. Работаю в Long-Mode.
Вопрос:
В DLL можно использовать глобальные переменные. И они будут свои для каждого процесса. Но откуда DLL'ка знает, где в виртуальной памяти лежат эти переменные? Ведь сегодня она загрузилась по адресу 12345, а завтра по 54321, и соответственно переменные уже в других адресах. Как это сделано?

Автор:  pavia [ 04 ноя 2011, 17:56 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Адреса переменных функций и тд в *.dll хранятся в относительном виде. Также в dll есть таблица релокации.
Это таблица где все позиции этих адресов записаны. Тем самым при загрузке адреса меняются на новую базу простым проходом по таблице и сложением.

Автор:  Bargest [ 04 ноя 2011, 18:09 ]
Заголовок сообщения:  Re: DLL Винды: Как?

То есть при загрузке DLL из файла берется таблица адресов функций и переменных, ко всем адресам прибавляется адрес, по которому загрузилась DLL'ка, и все переменные используются по указателям? А адрес самой таблицы относительный?

Автор:  pavia [ 04 ноя 2011, 18:34 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Как сказал какой-то физик всё в нашем мире относительно.

Возьми и изучи формат dll. Он не очень сложный.
Или можешь начать с более простого mz-exe там тоже есть таблица релокации.

Формат win *.dll. Это формат Portable_Executable сокращённо PE. Описан много где на английском к примеру тут и далее по ссылкам.
http://en.wikipedia.org/wiki/Portable_Executable

MZ
http://www.delorie.com/djgpp/doc/exe/
http://lib.ru/CTOTOR/IBMPC/abel.txt

Автор:  Bargest [ 04 ноя 2011, 19:56 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Из приведенных Вами ссылок (а именно с вики):
Цитата:
This involves recalculating every absolute address and modifying the code to use the new values.

Получается, загрузчик меняет все глобальные адреса в машинном коде?..

Автор:  pavia [ 04 ноя 2011, 20:02 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Да, именно так.

Автор:  SII [ 04 ноя 2011, 20:30 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Bargest писал(а):
Получается, загрузчик меняет все глобальные адреса в машинном коде?..


Не только глобальные, а абсолютно все относительные.

Автор:  phantom-84 [ 04 ноя 2011, 20:38 ]
Заголовок сообщения:  Re: DLL Винды: Как?

В длинном режиме есть адресация относительно RIP, т.е. если исключить хранение указателей, то несложно написать и позиционно-независимый код.

Автор:  pavia [ 04 ноя 2011, 20:40 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Цитата:
Не только глобальные, а абсолютно все относительные.

Ты что-то попутал? Относительные не трогаются. По крайней мере не все.
Доступ к локальным переменным, являются относительным от bp или sp. Тут ничего не меняется
Условные и без условные переходы jmp +2 тоже являются относительным. Они относительны адресса самих инструкций и поэтому не изменяются.

Изменяются только абсолютные адреса. Таки адреса как адреса глобальных переменных
mov ax, [40096h]
И функций
Call [40096h]

Про длинный режим не скажу не знаю не занимался его изучением.

Автор:  SII [ 04 ноя 2011, 20:46 ]
Заголовок сообщения:  Re: DLL Винды: Как?

Не коды относительных переходов (в которых указываются не адреса, а смещения относительно текущего значения счётчика команд) и тем более не отклонения (displacement) адресов операндов, входящие в состав кодов команд, а именно относительные адреса, которые являются отдельными двойными (32-разрядный режим) или учетверёнными (64-разрядный режим) словами. Глобальные адреса в DLL всегда являются относительными, поскольку при загрузке требуют настройки на конкретное местоположение библиотеки. Однако в ней могут быть и другие относительные адреса (например, точки входа во внутренние подпрограммы, невидимые снаружи).

Что же касается абсолютных адресов, то они как раз никогда не меняются -- на то они и абсолютные. Только в нормальных библиотеках они вряд ли употребляются (разве что если разработчики DLL закладываются на строго определённые адреса, откуда-то им известные и никогда не меняющиеся независимо от версии системы и т.п.).

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/