是否可以将参数传递给我的库,该库加载了LD_PRELOAD
:
LD_PRELOAD=lib.so ./program
如何将参数传递给此库?
答案 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
直接读取当前进程的命令行来执行此操作。就个人而言,尽管如此,我仍然不会干涉你正在使用的过程。