装饰库中的函数

时间:2019-05-06 13:12:13

标签: c++ linux override shared-libraries decorator

我有一个共享库,需要为此编写测试。假设该库中有一个名为func()的函数:

// from the library
<some_type> func(<some_params>); // signature of the function func

库的文档指出,必须在某些条件下调用此函数。因此,为了测试该要求,我在测试文件中编写了具有相同签名的我自己的函数func():

// test.cpp
bool is_func_called = false;
<some_type> func(<some_params>) {
    is_func_called = true;
}

这种方法正确吗?是否可以保证我对func()的实现会覆盖库中的实现?

有时,必须能够从库中装饰func()(而不是覆盖它):

// test.cpp
bool is_func_called = false;
<some_type> func(<some_params>) {
    is_func_called = true;
    func(); // a call to the implementation in the library
}

如果我重写了库,如何访问该实现?

环境:Ubuntu,g ++。

我目前正在使用共享库。但是我实际上对共享库和静态库都感兴趣。

1 个答案:

答案 0 :(得分:2)

好吧,您可以在Linux上使用LD_LIBRARY_PRELOAD技巧。

将您自己的func()实现编译到共享库中。

gcc -shared -fPIC func.c -o func.so

然后在shell提示符下

> LD_LIBRARY_PRELOAD=func.so ./main

,您的func()版本将被调用。

如果要链接呼叫-首先用func()装饰原始func(),然后代码应如下所示

typedef a (*original_func_type)(B b);

a func(B b) {
    ... // whatever code you want
    original_func_type orig_func;
    orig_func = (original_func_type)dlsym(RTLD_NEXT, "func");
    return orig_func(b);
}

这就是你想要的吗?

更新

更多tutorial。另一个tutorial。链接到tutorial on symbols/linking