c - 从非主文件中获取 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.
}
解决方案
在绝大多数 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
安排自重定位的部分。)
推荐阅读
- html - 如果我使用 Bootstrap 行作为其子 div 的 flex 容器而不是使用列,是否可以?
- flutter - in Flutter, problem arise when I add ListView in my scaffold
- css - 新手 Drupal-8 样式。如何更改字体颜色?
- jsf - 如何在 EL 中使用嵌套条件运算符显示字符串值
- postgresql - 无法连接到服务器:连接被拒绝服务器是否在主机上运行...并接受端口 5432 上的 TCP/IP 连接?
- perl - Perl chdir 以 glob 模式失败
- c# - AADSTS900561:端点只接受 POST 请求。收到一个 GET 请求
- undertow - Undertow PrefixPath 和欢迎文件
- python - 用于传递给函数的长动态参数的设计模式
- go - r.Handle 参数中的 http.Handler 值:缺少方法 ServeHTTP 错误