gpt4 book ai didi

linux - `environ` 结束后是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:03 25 4
gpt4 key购买 nike

我正面临 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 数组,越过空指针(我认为它表示环境 block 的末尾),然后尝试读取过去的内存。

他们期望在 environ 数组末尾找到什么?可能他们正在对加载的 ELF 文件的内存结构做出一些假设 - 我可以看到引用吗?

最佳答案

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

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

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

关于linux - `environ` 结束后是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com