在Linux上访问main之外的主要参数

时间:2016-05-20 23:27:27

标签: c linux elf

除了解析main之外,是否可以在Linux上访问main之外/proc/self/cmdline的参数(即在共享库构造函数中)?

1 个答案:

答案 0 :(得分:18)

您可以将构造函数放在.init部分中来完成此操作。调用main(与argc不同)中的函数使用相同的参数调用argvenvLD_PRELOAD#include <stdio.h> static int printargs(int argc, char** argv, char** env) { puts("In printargs:"); for (int i = 0; i < argc; ++i) printf(" Arg %d (%p) '%s'\n", i, (void*)argv[i], argv[i]); return 0; } /* Put the function into the init_array */ __attribute__((section(".init_array"))) static void *ctr = &printargs;

这是一个简单的例子。我使用-Wall只是为了避免使用实际链接和使用共享库的代码使示例复杂化,但它也可以在更正常的场景中工作。

file:printargs.c

ctr

构建和使用共享库

(如果您使用$ gcc -o printargs.so -std=c11 -shared -fpic printargs.c $ LD_PRELOAD=./printargs.so /bin/echo Hello, world. In printargs: Arg 0 (0x7ffc7617102f) '/bin/echo' Arg 1 (0x7ffc76171039) 'Hello,' Arg 2 (0x7ffc76171040) 'world.' Hello, world. ,则会看到警告,因为{{1}}未使用。)

{{1}}

这个解决方案来自question的建议,而且这个答案有更简洁的版本Mike Frysinger in the libc-help mailing list