将参数传递给加载了LD_PRELOAD的库

Che*_*eur 2 linux ld-preload

是否可以将参数传递给我的库,该库加载有LD_PRELOAD:

LD_PRELOAD=lib.so ./program
Run Code Online (Sandbox Code Playgroud)

如何将参数传递给此库?

Fle*_*exo 6

通常我会通过使用环境变量来做到这一点.例如,有:

#include <iostream>
#include <stdlib.h>

void init() __attribute__ ((constructor));
void init() {
  std::cout << "Init: " << getenv("MYLIB") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

让你做:

MYLIB=hi LD_PRELOAD=./test.so /bin/echo
Init: hi

这不必在构造函数中使用(这是一个GCC扩展),但这通常是一个使用它们的便利位置.

我过去所做的就是使用它,结合一个看起来像是"普通"应用程序的shell脚本包装器.shell脚本在调用exec加载要插入的程序之前接受其参数并将它们推送到库所期望的环境变量中.这种方式对用户"感觉"是正确的,而不是太脆弱或侵入性.

如果您愿意,也可以通过读取/proc/self/cmdline直接读取当前进程的命令行来执行此操作.就个人而言,尽管如此,我仍然不会干涉你正在处理的过程.