Я столкнулся с проблемой с кодом запуска общей библиотеки Free Pascal на Android. В исходниках Free Pascal RTL есть следующий фрагмент:
type
TAuxiliaryValue = cuInt32;
TInternalUnion = record
a_val: cuint32; //* Integer value */
{* We use to have pointer elements added here. We cannot do that,
though, since it does not work when using 32-bit definitions
on 64-bit platforms and vice versa. *}
end;
Elf32_auxv_t = record
a_type: cuint32; //* Entry type */
a_un: TInternalUnion;
end;
TElf32AuxiliaryVector = Elf32_auxv_t;
PElf32AuxiliaryVector = ^TElf32AuxiliaryVector;
var
psysinfo: LongWord = 0;
procedure InitSyscallIntf;
var
ep: PPChar;
auxv: PElf32AuxiliaryVector;
begin
psysinfo := 0;
ep := envp;
while ep^ <> nil do
Inc(ep);
Inc(ep);
auxv := PElf32AuxiliaryVector(ep);
repeat
if auxv^.a_type = AT_SYSINFO then begin
psysinfo := auxv^.a_un.a_val;
if psysinfo <> 0 then
sysenter_supported := 1; // descision factor in asm syscall routines
Break;
end;
Inc(auxv);
until auxv^.a_type = AT_NULL;
end;
Процедура InitSyscallIntf
вызывается как часть последовательности запуска SO. envp
— это переменная уровня модуля, которая инициализируется ранее в последовательности запуска значением environ
библиотеки libc. Как мне это выглядит, код пытается просканировать массив environ
за нулевым указателем (который, как я думал, обозначает конец блока среды), а затем пытается прочитать прошлую память.
Что они ожидают найти за концом массива environ
? Вероятно, они делают какие-то предположения о структуре памяти загруженного ELF-файла - можно ссылочку?