【问题标题】:What's past the end of `environ`?`environ` 的结尾是什么?
【发布时间】:2013-06-01 02:18:18
【问题描述】:

我正面临着an issue Android 上的 Free Pascal 共享库启动代码。 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 文件的内存结构做出一些假设 - 我可以看到参考吗?

【问题讨论】:

    标签: linux android-ndk pascal elf libc


    【解决方案1】:

    看起来他们要去this。在环境结束之后,有一组称为辅助向量的双 DWORD 数据块。向量中的第一个 DWORD 是它的类型,第二个是值。类型记录在linux/auxvec.h;大约有 20 个。

    具体来说,FPC 启动正在寻找 AT_SYSINFO (32) 类型的向量。

    辅助向量超出了环境块的末尾,但辅助向量块的副本可作为/proc/me/auxv 下的文件获得。

    【讨论】:

      【解决方案2】:

      Seva 发布的链接是它正在查看的内容,并且正在查看是否支持 sysenter 指令。

      该指令允许更快的系统调用,并且在基于 Linux 和 FreeBSD 内核的系统上,通常 Free Pascal 程序直接访问内核,而不是通过 libc。

      请参阅 rtl/linux/i386/* 和 rtl/linux/x86_64 以了解系统调用包装例程,您将在那里看到 sysenter 的测试。

      【讨论】:

      • 谢谢马可;我面临的真正问题是this
      【解决方案3】:

      根据Startup state of a Linux/i386 ELF binary,ELF 二进制文件的段布局在环境数组之后具有程序名称。

      实际上,我不确定这是否是您的程序正在访问的内容。那是环境数据,环境数组(指向这些字符串的指针)位于初始堆栈帧中。之后上面的页面没有显示任何具体内容,我假设它是 main() 函数的本地数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 2016-01-26
        • 2021-06-02
        • 2019-03-11
        • 1970-01-01
        相关资源
        最近更新 更多