如何在main中访问/打印辅助向量条目?

时间:2011-08-30 14:39:19

标签: c linux stack

enter image description here

根据图像,在启动时使用辅助矢量条目填充堆栈。

我以前不知道。

如何访问/打印它们?

int main(int argc, char *argv[], char *envp[]);

这是否意味着main有一个隐藏的第四个参数?

2 个答案:

答案 0 :(得分:3)

辅助向量位于环境向量的末尾,可以访问(按POSIX)extern char **environ;environ指向一个NULL指针终止的char *指向环境变量的指针数组。迭代环境直到到达NULL,然后进一步前进一个元素并将结果转换为您想要用来访问辅助矢量的任何类型。就个人而言,我将其视为成对出现的size_tuintptr_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,如下所示:

The AMD64 ABI uses the auxiliary vector types defined in figure 3.11.