什么是“环境”的结束?

时间:2013-06-01 02:18:18

标签: linux android-ndk pascal elf libc

我正在使用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文件的内存结构做了一些假设 - 我可以看一个参考吗?

3 个答案:

答案 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()函数的本地数据。