我目前正在为 Arm64 平台实现一个 C 运行时库,并且我不确定我可以在应用程序执行的精确点(ELF 文件定义为入口点)对环境做出哪些假设。对于环境,我主要指的是堆栈设置和 cpu 寄存器。
我能够通过查看内核源代码来拼凑信息,但不是所有内容。
我的问题是:应用程序的调用约定是否已记录和/或标准化?例如,我正在寻找相当于 Arm64 基本过程调用标准的东西。
我将其发布在 Unix & Linux Stack Exchange 中,因为我对 Linix 特别感兴趣,并且我假设只要所有可执行文件都符合要求,操作系统就可以以其定义的任何方式执行此调用。
答案1
不幸的是,Armv8 平台的 System V ABI 标准中似乎不存在进程初始化(来源:ARM 发布的 ABI),尽管存在于该标准的其他版本中。
不过,它似乎确实是标准的一部分,我能够找到问题的答案在 AMD64 SystemV ABI,v0.99 中。
非常简单地总结内容,进程初始化包括
- 将 argc、argv 和 envp(及其数据)放入堆栈
- 应启用浮点运算
- 除了堆栈指针(在某些情况下还包括帧指针和 atexit() 指针)之外,寄存器状态不相关