除了解析main
之外,是否可以在Linux上访问main
之外/proc/self/cmdline
的参数(即在共享库构造函数中)?
答案 0 :(得分:18)
您可以将构造函数放在.init
部分中来完成此操作。调用main
(与argc
不同)中的函数使用相同的参数调用argv
:env
,LD_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
只是为了避免使用实际链接和使用共享库的代码使示例复杂化,但它也可以在更正常的场景中工作。
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。