访问命令行参数而不在main中使用char**argv

Jef*_*rth 5 c command-line-arguments

有没有办法访问命令行参数,而不使用主参数?我需要在另一个函数中访问它,我宁愿不传入它.

我需要一个只能在Mac OS和Linux上使用GCC的解决方案.

SIG*_*EGV 9

我不知道如何在MacOS上做到这一点,但我怀疑我将在这里描述的技巧可以通过一些交叉阅读移植到MacOS.

在linux上,您可以使用ELF二进制文件的所谓".init_array"部分来注册在程序启动期间调用的函数(在调用main()之前).此函数与普通的main()函数具有相同的签名,除非返回"void".因此,您可以使用此函数来记住或处理argc,argv []和evp [].

以下是您可以使用的一些代码:

static void my_cool_main(int argc, char* argv[], char* envp[])
{
    // your code goes here
}

__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main;
Run Code Online (Sandbox Code Playgroud)

PS:这段代码也可以放在库中,所以它应该适合你的情况.它甚至可以工作,当你的prgr与valgrind一起运行时 - valgrind不会分叉一个新的进程,这会导致/ proc/self/cmdline显示原始的valgrind命令行.

PPS:请记住,在这个非常早期的程序执行期间,许多子系统尚未完全初始化 - 我尝试了libc I/O例程,它们似乎有效,但不依赖它 - 即使可能尚未构建全局变量,等等...


t0m*_*13b 2

我认为你不应该这样做,因为 C 运行时将准备参数并将其传递到 main via int argc, char **argv,不要尝试通过破解它来操纵行为,因为它很大程度上是不可移植的或可能是未定义的行为!遵守规则,你就会拥有可移植性……除了打破规则,没有其他方法可以做到这一点……