我正在使用Android上的Free Pascal共享库启动代码an issue。 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
是一个单元级变量,它在启动序列的早期初始化为libc的environ
的值。这看起来对我来说,代码试图扫描environ
数组超过空指针(我认为它表示环境块的结尾),然后尝试读取已经过去的内存。
他们期望在environ
数组的末尾找到什么?可能他们对加载的ELF文件的内存结构做了一些假设 - 我可以看一个参考吗?
答案 0 :(得分:2)
看起来他们要经过this。有一组两个int数据块,在环境结束时称为辅助向量。
答案 1 :(得分:1)
Seva发布的链接正是它所看到的,并且它正在查看是否支持sysenter指令。
该指令允许更快的系统调用,并且在基于Linux和FreeBSD内核的系统上,通常Free Pascal程序直接访问内核,而不是通过libc。
对于syscall包装器例程,请参阅rtl / linux / i386 / * an rtl / linux / x86_64,您将在那里看到sysenter的测试。
答案 2 :(得分:0)
根据Startup state of a Linux/i386 ELF binary,ELF二进制文件的段布局在环境数组之后具有程序名称。
实际上,我不确定这是否是您的程序正在访问的内容。这是环境数据,环境数组(指向这些字符串的指针)位于初始堆栈帧中。上面的页面没有显示任何具体内容,我认为这是main()
函数的本地数据。