Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.134.104.173] |
|
Сообщ.
#1
,
|
|
|
Добрый вечер
Вот делать мне нечего, просто из любопытства разбираю некоторые моменты, на которые никогда не обращал внимание. Например, простейшая DLL, без VCL. В таблице импорта первый блок - kernel32.dll, в нем импортируются Цитата Ordn Name ----- ----- 0 DeleteCriticalSection 0 LeaveCriticalSection 0 EnterCriticalSection 0 InitializeCriticalSection 0 VirtualFree 0 VirtualAlloc 0 LocalFree 0 LocalAlloc 0 GetVersion 0 GetCurrentThreadId 0 GetThreadLocale 0 GetStartupInfoA 0 GetLocaleInfoA 0 GetCommandLineA 0 FreeLibrary 0 ExitProcess 0 WriteFile 0 UnhandledExceptionFilter 0 RtlUnwind 0 RaiseException 0 GetStdHandle Я так понял это туда закидывает сам компилятор, т.к. это функции из модулей System, SysInit итд. Далее advapi32.dll Цитата 0 RegQueryValueExA 0 RegOpenKeyExA 0 RegCloseKey Это мусорный код из стандартных модулей, моя DLL реестр не использует. Чтоб убрать - нужно переписать кусок кода, кажется, SysInit и скомпилировать его. 4я секция снова kernel32.dll, Цитата 0 TlsSetValue 0 TlsGetValue 0 TlsFree 0 TlsAlloc 0 LocalFree 0 LocalAlloc Это тоже подарок от компилятора, т.к. лично я эти функции не вызывал. И следующая секция опять таки kernel32.dll, Цитата 0 LoadLibraryA 0 LeaveCriticalSection 0 InitializeCriticalSection 0 GetProcAddress 0 GetModuleHandleA 0 GetModuleFileNameA 0 GetLastError 0 GetCurrentProcessId 0 FindFirstFileA 0 FindClose 0 EnterCriticalSection 0 DeleteCriticalSection 0 CloseHandle Эти функции я использую в коде. Вообще есть вариант это все как-то объединить в 1 секцию импорта из kernel32.dll без повторов функций, таких как LocalFree, LocalAlloc, LoadLibraryA, *CriticalSection* ? Не этим ли должен заниматься оптимизатор в компиляторе / линкере? |
Сообщ.
#2
,
|
|
|
Цитата Виталь @ Вообще есть вариант это все как-то объединить в 1 секцию импорта из kernel32.dll без повторов функций ...? Не этим ли должен заниматься оптимизатор в компиляторе / линкере? Думаю, что нет. В разные блоки попадают функции, явно объявленные через external - если модуль делает такое объявление, а не использует ссылку на функцию, уже объявленную в неком общем модуле импорта (типа Windows и т.п.), значит ему по какой-то причине нужно иметь свой собственный указатель на функцию, независимый от других модулей. Поэтому при таком объявлении линкер не должен ничего оптимизировать и "сливать" разные external объявления в один блок импорта. |
Сообщ.
#3
,
|
|
|
Плохо.
Значит для любителей красивой структуры EXE файла нужно очистить System, Sysinit и писать весь код исключительно в main.dpr. А жаль - не понимаю для чего разным модулям иметь разные указатели - адрес функции то всегда один и тот же если нет никаких дебаггеров/перехватов. |
Сообщ.
#5
,
|
|
|
Ну уж это совсем терминальная стадия перфекционизма... слава богу, RTL последних версий настолько неоптимален в плане минимизации результирующего бинарника, что обычно до таких мелочей уже и дела нет.
Некоторые функции, скорее всего, цепляются менеджером памяти, который должен уметь обращаться с кучей и с TLS Что касается адресов - это логичная инкапсуляция переменных модуля. Если модуль грузит свою версию функции, а потом делает с ней всякие непристойности, это не отразится на остальном коде. |