首页 > 解决方案 > 从非主文件中获取 argv[0],例如 _start no libc ,no libs

问题描述

我可以通过 _start 而不是 C 函数中的 main 获取 argv[0] 吗?我不使用任何库。

void _start(void) __attribute__((noreturn));
 void _start(void)
 {
   //how can get argv[0] here . I don't use main as my first entry.
 }

标签: clinuxassemblygccstartup

解决方案


在绝大多数 psABI(特定于处理器的 ABI,ELF 的架构相关部分)中,ELF 入口点合约不是 C 函数。在入口处,堆栈指针寄存器指向一个系统字大小的槽数组,包括:

argc, argv[0], ..., argv[argc-1], 0, environ[0], ..., environ[N], 0,
auxv[0].a_type, auxv[0].a_value, ..., 0

您至少需要一个最小的 asm 存根将其转换为 C 可读的形式。最简单的方法是将堆栈指针寄存器复制到第一个参数寄存器中,根据函数调用 ABI 要求将堆栈指针向下对齐,并使用单个指针参数调用您的 C 函数。

您可以在 musl libc 中查看crt_arch.h文件(此处为 x86_64 版本),了解如何完成此操作的示例。(当入口点用于动态链接器启动或静态 PIE 可执行文件时,您可能会忽略_DYNAMIC安排自重定位的部分。)


推荐阅读