在 Linux 上访问 main 之外的主要参数
Accessing main arguments outside of main on Linux
除了解析 /proc/self/cmdline
之外,是否可以在 main
之外(即在共享库构造函数中)在 Linux 上访问 main
的参数?
您可以通过将构造函数放在 .init_array
部分来完成此操作。 .init_array
中的函数(与 .init
不同)使用相同的参数调用 main
将使用以下参数调用:argc
、argv
和 env
。
这是一个简单的例子。我使用 LD_PRELOAD
只是为了避免使用实际链接和使用共享库的代码使示例复杂化,但它也可以在更正常的情况下工作。
文件:printargs.c
#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.
此解决方案来自 Mike Frysinger in the libc-help mailing list and there is an even more laconic version of this answer 的建议。
除了解析 /proc/self/cmdline
之外,是否可以在 main
之外(即在共享库构造函数中)在 Linux 上访问 main
的参数?
您可以通过将构造函数放在 .init_array
部分来完成此操作。 .init_array
中的函数(与 .init
不同)使用相同的参数调用 main
将使用以下参数调用:argc
、argv
和 env
。
这是一个简单的例子。我使用 LD_PRELOAD
只是为了避免使用实际链接和使用共享库的代码使示例复杂化,但它也可以在更正常的情况下工作。
文件:printargs.c
#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.
此解决方案来自 Mike Frysinger in the libc-help mailing list and there is an even more laconic version of this answer