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

时间:2012-07-15 13:06:00

标签: linux ld-preload

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

LD_PRELOAD=lib.so ./program

如何将参数传递给此库?

1 个答案:

答案 0 :(得分:5)

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

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

void init() __attribute__ ((constructor));
void init() {
  std::cout << "Init: " << getenv("MYLIB") << std::endl;
}

允许你这样做:

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

这不必在构造函数(GCC extension)中使用,但这通常是使用它们的便利位置。

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

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