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

标签 c linux elf

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

最佳答案

您可以通过将构造函数放在 .init_array 部分来完成此操作。 .init_array 中的函数(与 .init 不同)使用相同的参数调用 main 将使用:argcargvenv

这是一个简单的例子。我使用 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 的建议这个答案还有一个更简洁的版本 here on SO .

关于c - 在 Linux 上访问 main 之外的主要参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37357268/

相关文章:

Windows 和 Linux 上的 Android SDK 项目

linker - 如果位置计数器在链接描述文件中被初始化为太小或太大,则静态可执行段错误

c - 如何在c中读取文件输入名称

c - 在右边和左边用 1 填充位表示

c - unix DECLARE_WAIT_QUEUE_HEAD (var) var 原型(prototype)?

c - 在 C 中使用 fread() 从二进制文件读取时出现奇怪的值

linux - 将非标准字符写入 Linux 命令行

c - GCC 将所有字符串存储在 .rodata 中

linux - 有效地在 ELF 文件中添加新部分

C++ 什么是 NULL 指针值?