2012-07-15 81 views

回答

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脚本包装器。在调用exec来加载要插入的程序之前,shell脚本会将其参数压入您的库期望的环境变量中。它对用户来说“没有太脆弱或侵入性”是正确的。

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

+0

我已经在c中编写了我的围兜没有C++ .. – 2012-07-15 16:44:06

+0

@ChercheurChercheur这很好 - 我只用iostreams进行打印,你可以简单地把它变成stdio,除此之外没有别的C++特定的东西。 (构造函数属性在C中起作用,它在库加载时自动调用该函数,而不是C++构造函数) – Flexo 2012-07-15 17:20:13

+0

请将我的lib中更多的参数传递给我的库,这可能吗? – 2012-08-04 16:54:39