【发布时间】:2012-07-15 13:06:00
【问题描述】:
是否可以将参数传递给我的库,该库加载了LD_PRELOAD:
LD_PRELOAD=lib.so ./program
如何将参数传递给这个库?
【问题讨论】:
标签: linux ld-preload
是否可以将参数传递给我的库,该库加载了LD_PRELOAD:
LD_PRELOAD=lib.so ./program
如何将参数传递给这个库?
【问题讨论】:
标签: linux ld-preload
通常我会通过使用环境变量来做到这一点。例如:
#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 extension),但这通常是使用它们的好地方。
我过去所做的就是使用它,并结合一个看起来像是“普通”应用程序的 shell 脚本包装器。 shell 脚本在调用exec 以加载您要插入的程序之前,获取其参数并将它们推送到您的库期望的环境变量中。它以这种方式对用户“感觉”是正确的,而不会太脆弱或侵入性。
如果您愿意,您也可以通过阅读/proc/self/cmdline 来直接读取当前进程的命令行来执行此操作。不过,我个人会尽量避免干扰您正在使用的流程。
【讨论】:
MYLIBARG1=val1 MYLIBARG2=val2 LD_PRELOAD=./test.so /bin/bech 或创建单个列表名称/值对:MYLIB='k1=v1:k2=v2' LD_PRELOAD ...