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/ |