Как принудительно добавить запись в таблицу импорта при компиляции в Delphi. Импортируемая функция не используется, но нужна в DIRECTORY_ENTRY_IMPORT.
Например, если объявить:
function TlsAlloc: DWORD; stdcall; external 'kernel32.dll';
Но не вызывать функцию, то компилятор не добавить запись в таблицу импорта. А возможно ли указать ему это сделать принудительно?
Зачем это? Хочу зафлудить список импорта )
Сделал так:
unit ForceMyImports;
interface
implementation
uses
Windows;
var
DummyPtr: Pointer;
procedure InitForceMyImports;
begin
DummyPtr := @TlsAlloc;
end;
initialization
ForceMyImports;
end.
Проверено на последней версии Delphi Berlin 10.1 — работает.
Так как Делфи почти не оптимизирует не локальные переменные, то получилось таким образом.
Хотелось бы избавиться от кода инициализации. Хотя он и представляет из себя что-то типа mov [xxx], yyy. Думаю если знать формат dcu файлов для конкретной версии Делфи, то можно сформировать импорт в нем. Если конечно у них умный "сборщик" не отбракует не используемый импорт. Может кто подскажет по формату dcu?
Здравствуйте, sanx, Вы писали:
S>Хотелось бы избавиться от кода инициализации. Хотя он и представляет из себя что-то типа mov [xxx], yyy.
Если цель его не вызвать, то можно ещё добавить косвенности, наверное.
initialization
DummyPtr = @ForceMyImports;
end.
S>Думаю если знать формат dcu файлов для конкретной версии Делфи, то можно сформировать импорт в нем. Если конечно у них умный "сборщик" не отбракует не используемый импорт. Может кто подскажет по формату dcu?
Уж проще тогда прилинковать .obj через $L, наверное
Здравствуйте, sanx, Вы писали:
S>Как принудительно добавить запись в таблицу импорта при компиляции в Delphi. Импортируемая функция не используется, но нужна в DIRECTORY_ENTRY_IMPORT.
S>Например, если объявить:
S>function TlsAlloc: DWORD; stdcall; external 'kernel32.dll';
S>Но не вызывать функцию, то компилятор не добавить запись в таблицу импорта. А возможно ли указать ему это сделать принудительно?
Если в x86 то вот так тоже прокатит:
asm
jmp @1
call TlsAlloc
@1:
end;