2

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

LD_PRELOAD=lib.so ./program

如何将参数传递给这个库?

4

1 回答 1

7

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

#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
初始化:嗨

this 不必在构造函数(它是GCC 扩展)中使用,但这通常是使用它们的好地方。

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

如果愿意,您也可以通过阅读/proc/self/cmdline直接读取当前进程的命令行来做到这一点。就个人而言,我会尽可能地避免干扰您正在使用的过程。

于 2012-07-15T13:20:34.997 回答