共享对象在主二进制文件C++中找不到符号

che*_*kow 11 c++ shared-objects dlopen

我正在尝试为我编写的程序制作一种插件架构,并且在我第一次尝试时遇到了问题.是否可以从共享对象中访问主可执行文件中的符号?我认为以下情况会很好:

testlib.cpp:

void foo();
void bar() __attribute__((constructor));
void bar(){ foo(); }
Run Code Online (Sandbox Code Playgroud)

testexe.cpp:

#include <iostream>
#include <dlfcn.h>

using namespace std;

void foo()
{
    cout << "dynamic library loaded" << endl;    
}

int main()
{
    cout << "attempting to load" << endl;
    void* ret = dlopen("./testlib.so", RTLD_LAZY);
    if(ret == NULL)
        cout << "fail: " << dlerror() << endl;
    else
        cout << "success" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -fPIC -o testexe testexe.cpp -ldl
g++ --shared -fPIC -o testlib.so testlib.cpp
Run Code Online (Sandbox Code Playgroud)

输出:

attempting to load
fail: ./testlib.so: undefined symbol: _Z3foov
Run Code Online (Sandbox Code Playgroud)

显然,这不好.所以我想我有两个问题:1)有没有办法让共享对象在它加载的可执行文件中找到符号2)如果没有,那么使用插件的程序通常如何工作,他们设法在任意共享对象中获取代码在他们的程序内运行?

Chr*_*ung 19

尝试:

g++ -fPIC -rdynamic -o testexe testexe.cpp -ldl
Run Code Online (Sandbox Code Playgroud)

如果没有-rdynamic(或类似的东西-Wl,--export-dynamic),应用程序本身的符号将无法用于动态链接.

  • 根据https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Link-Options.html,使用gcc链接步骤的选项“-rdynamic”可以达到相同的效果。 (2认同)