OSDev

для всех
Текущее время: 29 апр 2024, 02:12

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 17:22 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 17:56 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Адреса переменных функций и тд в *.dll хранятся в относительном виде. Также в dll есть таблица релокации.
Это таблица где все позиции этих адресов записаны. Тем самым при загрузке адреса меняются на новую базу простым проходом по таблице и сложением.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 18:09 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
То есть при загрузке DLL из файла берется таблица адресов функций и переменных, ко всем адресам прибавляется адрес, по которому загрузилась DLL'ка, и все переменные используются по указателям? А адрес самой таблицы относительный?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 18:34 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Как сказал какой-то физик всё в нашем мире относительно.

Возьми и изучи формат 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 19:56 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Из приведенных Вами ссылок (а именно с вики):
Цитата:
This involves recalculating every absolute address and modifying the code to use the new values.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 20:02 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Да, именно так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 20:30 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Bargest писал(а):
Получается, загрузчик меняет все глобальные адреса в машинном коде?..


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 20:38 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
В длинном режиме есть адресация относительно RIP, т.е. если исключить хранение указателей, то несложно написать и позиционно-независимый код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 20:40 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
Не только глобальные, а абсолютно все относительные.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DLL Винды: Как?
СообщениеДобавлено: 04 ноя 2011, 20:46 

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB