我尝试使用auxiliary vectors访问C中的the following code:
int main(int argc, char** argv, char* envp[]) {
Elf64_auxv_t *auxv;
while(*envp++ != NULL);
/*from stack diagram above: *envp = NULL marks end of envp*/
int i = 0 ;
for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
/* auxv->a_type = AT_NULL marks the end of auxv */
{
printf("%u %u %u \n", (auxv->a_type), AT_PLATFORM, i++);
if( auxv->a_type == AT_PLATFORM)
fprintf(stdout, "AT_PLATFORM is: %s\n", (auxv->a_un.a_val));
}
}
但我得到的结果是垃圾。运行readelf告诉我,我确实运行了64位二进制文件。我理解其他方法(例如libc中的getauxv),但我很好奇为什么这种特殊的做法不起作用
Thansk
答案 0 :(得分:2)
您的代码中有一些错误gcc -Wall
很乐意告诉您:
#include <stdio.h>
#include <elf.h>
int main(int argc, char** argv, char* envp[]) {
Elf64_auxv_t *auxv;
while(*envp++ != NULL);
/*from stack diagram above: *envp = NULL marks end of envp*/
int i = 0 ;
for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
/* auxv->a_type = AT_NULL marks the end of auxv */
{
printf("%lu %u %u \n", (auxv->a_type), AT_PLATFORM, i++);
if( auxv->a_type == AT_PLATFORM)
printf("AT_PLATFORM is: %s\n", ((char*)auxv->a_un.a_val));
}
}
以上代码适用于我(它打印AT_PLATFORM is: x86_64
)。