"环境 "的结尾是什么?

问题描述 投票:0回答:3

我面对的是 课题 与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 数组过去的null指针(我认为这表示环境块的结束),然后尝试读取过去的内存。

他们希望在过去的环境块末尾找到什么?environ 数组?可能他们对加载的ELF文件的内存结构做了一些假设--我能看到一个引用吗?

linux android-ndk pascal elf libc
3个回答
1
投票

Seva贴出的链接就是它要看的,在它要看是否支持sysenter指令。

这个指令可以让syscall更快,在基于Linux和FreeBSD内核的系统上,一般Free Pascal程序直接访问内核,而不是通过libc。

参见rtllinuxi386*和rtllinuxx86_64的syscall封装例程,你会在那里看到sysenter的测试。


2
投票

看起来他们是通过 这个. 环境结束后有一组两个DWORD的数据块,叫做辅助向量。向量中的第一个DWORD是它的类型,第二个是值。这些类型被记录在 linux/auxvec.h;其中有大约20个。

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

辅助向量已经过了环境块的末端,但是辅助向量块的副本可以作为文件在 /proc/me/auxv.


0
投票

根据 Linuxi386 ELF二进制文件的启动状态。 ELF二进制的段布局在环境数组后面有程序名称。

其实,我不知道你的程序访问的是不是这个。那是环境数据,环境数组(那些字符串的指针)在初始堆栈框架中。上面的页面没有显示后面的具体内容,我猜测是本地数据的 main() 职能。

© www.soinside.com 2019 - 2024. All rights reserved.