Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Указание базового адреса модуля 
Author Message
MVV



PostPosted: Tue Mar 23, 2010 18:10    Post subject: Reply with quote

CaptainFlint wrote:
MVV wrote:
Также, раз код изменяется, он уже не может быть общим с кодом других экземпляров той же библиотеки

Не вижу причин, почему код с релоцированными адресами не может быть общим. Это же не самомодификация, а запланированные изменения, внесённые ОСью на стадии загрузки, она знает их, может учитывать и предсказывать результаты (в отличие от случаев, когда плагин сам модифицирует свой код, например, в случае PE-упаковщиков типа UPX).

Ну подумай сам. Код модуля загружается в память, и все ее копии пользуют его как общий (по логике, второй и далее разы даже читать секцию кода из файла не надо, раз она уже есть в памяти). Но если одна из них загружается по отличному от базового адреса, система ее загрузит и внесет корректировки в ее код, т.е. он уже будет отличаться от кода тех копий, которые загружены по базовому адресу - как минимум, все инструкции call и jmp (кроме вызовов системных функций) будут содержать другие адреса (если быть точным, будет исправлен адрес в каждом месте, указанном в секции релокаций).

VadiMGP wrote:
MVV wrote:
То есть, чтобы библиотека загружалась быстрее и потребляла меньше памяти, нужно на стадии компоновки выбирать уникальный базовый адрес.
И, если с тех пор ситуация не изменилась кардинально в худшую сторону (а я думаю, что сегодня это время еще на пару порядков меньше), то я не готов тратить час своего времени на экономию нескольких миллисекунд.

Давай разбираться. Миллисекунды (про которые ты писал, что их было порядка сотни на старом процессоре, и число которых все-таки зависит от объема кода модуля, т.к. влияет на число адресов, требующих коррекции) тратятся на каждый модуль при каждой его загрузке в каждую запускаемую копию ТК. А от тебя требуется лишь один раз залезть в настройки проекта, или же просто указать в коде прагму с директивой компоновщику, и всё, на выходе будешь получать модуль с уникальным базовым адресом. Где час?
Для C/C++ компиляторов Microsoft достаточно в любом месте файла с исходным кодом указать строчку следующего вида:
Code:
#pragma comment(linker, "/base:0x60000000")


Кстати, более удобный способ просмотра базовых адресов для загруженных плагинов - в нижней панели Process Explorer, переключенной на показ библиотек, посмотреть на столбец Image Base (и на столбец Base, указывающий базовый адрес после перебазирования).
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group