阻止库调用 getenv?
Stop library from calling getenv?
我的程序使用一个现有的库,但文档有限,我无法控制。就此问题而言,其用途如下:
#include <theirlib.hpp>
using their_lib::Node;
int main ( int argc, char** argv )
{
Node my_node;
// connect to the master communication server
my_node.init();
// ...
}
出于众所周知的原因,init()
不采用任何参数,而是尝试从环境变量中查找通信服务器的 URI(以及其他参数(。我可以ltrace
看到这一点:
...
15:43:24 libtheirlib.so->getenv("THEIRLIB_MASTER_URI") = nil <0.000173>
...
现在,我可以用脚本包装我的程序并事先设置环境变量,但是如果我希望能够在运行时更改它们怎么办?我可以使用setenv()
但这仍然让我感到污染环境,如果我想一次连接到多个主服务器怎么办?
我有哪些选项(如果有(可以防止theirlib
使用环境变量来更改其行为并强制其使用我可以在代码中提供的值?
你的程序将在子shell中运行,所以没有"污染环境"——没有其他进程会看到你setenv()
的内容。
肮脏的把戏,但可以插入你自己的getenv
实现。
#define _GNU_SOURCE
#include <dlfcn.h>
#include <string.h>
static char *theirlib_master_uri;
static char *(*real_getenv)(const char *);
char *getenv(const char *name) {
if (!strcmp(name, "THEIRLIB_MASTER_URI"))
return theirlib_master_uri;
if (!real_getenv)
*((void **)&real_getenv) = dlsym(RTLD_NEXT, "getenv");
return real_getenv(name);
}
这可以在LD_PRELOAD
共享对象或您自己的程序中完成。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 阻止库调用 getenv?
- 调用 getenv() 时__strlen_sse2中的分段错误
- C++LPTSTR使用getenv调用CreateProcessAsUser时出现问题
- C++调用getenv("LINES")或getenv("COLUMNS")在Xcode中运行良好,在终端中运行时会出现段错误