我面对的是Android上免费的Pascal共享库启动代码。自由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是一个单元级变量,在启动序列的前面初始化为libcenviron的值。在我看来,代码试图扫描environ数组,使其超过空指针(我认为它表示环境块的结尾),然后尝试读取过去的内存。
他们希望在environ数组的末尾找到什么?可能他们对加载的ELF文件的内存结构做了一些假设-我能看看引用吗?

最佳答案

Seva发布的链接就是它所看到的,其中它正在查看sysenter指令是否受支持。
此指令允许更快的系统调用,在基于Linux和FreeBSD内核的系统上,通常Free Pascal程序直接访问内核,而不是通过libc。
syscall包装器例程请参见rtl/linux/i386/*一个rtl/linux/x86_64,您将在那里看到sysenter的测试。

07-24 09:38
查看更多