根据图像,在启动时使用辅助矢量条目填充堆栈。
我以前不知道。
如何访问/打印它们?
int main(int argc, char *argv[], char *envp[]);
这是否意味着main
有一个隐藏的第四个参数?
答案 0 :(得分:3)
辅助向量位于环境向量的末尾,可以访问(按POSIX)extern char **environ;
。 environ
指向一个NULL指针终止的char *
指向环境变量的指针数组。迭代环境直到到达NULL
,然后进一步前进一个元素并将结果转换为您想要用来访问辅助矢量的任何类型。就个人而言,我将其视为成对出现的size_t
或uintptr_t
值数组,因为这比elf.h
Elf32_auxv_t
和{{1}更容易,更便携}类型(无论您是为32位还是64位目标构建,都需要特殊情况。)
请注意,辅助向量的存在和位置不是由POSIX指定的,但这是它们将位于使用辅助向量的任何基于ELF-ABI的实现上的位置。
答案 1 :(得分:0)
您的问题的答案是系统特定的。 C ISO仅定义main
函数的两个参数。其他参数不是标准的,应被视为扩展。从维基百科引用Main function:
参数argc,参数count和argv,参数vector,[1]分别给出程序命令行参数的数量和值。 argc和argv的名称可以是C中的任何有效标识符,但使用这些名称是常见的惯例。在C ++中,名称将按字面意思取得,如果需要严格一致,则省略参数列表中的“void”。 [2] C和C ++标准也允许使用其他依赖于平台的格式,但在C ++中,返回类型必须保持为int;例如,Unix(虽然不是POSIX.1)和Microsoft Windows有第三个参数给出程序的环境,否则可以通过stdlib.h中的getenv访问:
int main(int argc, char **argv, char **envp)
Mac OS X和Darwin有第四个参数,包含任意OS提供的信息,例如执行二进制文件的路径:[3]
int main(int argc, char **argv, char **envp, char **apple)
AMD64 ABI
根据System V ABI for AMD64, Draft 0.99.5,辅助矢量条目的类型为auxv_t
,如下所示: