从非主文件中获取 argv[0]?例如 _start no libc ,no libs

0 c linux assembly gcc startup

我可以通过 _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.
 }
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 5

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

argc, argv[0], ..., argv[argc-1], 0, environ[0], ..., environ[N], 0,
auxv[0].a_type, auxv[0].a_value, ..., 0
Run Code Online (Sandbox Code Playgroud)

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

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