C - 共享库 - dlopen,dlsym

时间:2014-01-02 14:14:33

标签: c++ shared-libraries dlopen dlsym

对于研究主题,我使用C ++程序将SQL查询转换为C ++程序。翻译后,c ++查询源代码被编译成共享库:

g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so

一切正常,库正确编译。在第二个程序中,我尝试实现一个read-eval-print-loop,它从用户那里获取查询,翻译和编译它,用dlopen和dlsym加载共享库,最后执行它。在查询代码中使用英特尔TBB之前一切正常,但现在我输入的第二个查询出现了分段错误(第一个查询工作正常,但循环中加载的第二个查询失败)。

来源(read-eval-print-loop):http://pastebin.com/pWkRN7Dx

示例查询代码:http://pastebin.com/A1pBZC3d

如果我的查询中没有联接,因此在查询源代码中出现单个parallel_for,则没有问题。但是如果有多个parallel_fors,我输入的第二个查询会出现分段错误(编译成功并且dlopen有效,但dlsym失败)。

这是gdb输出

0x00007ffff7de394b in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de429e in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de4523 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff6cc612a in ?? () from /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7bd7044 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7de9176 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd752f in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7bd709a in dlsym () from /lib/x86_64-linux-gnu/libdl.so.2
0x000000000041fd58 in main (argc=1, argv=0x7fffffffe1d8) at ../src/tpcc.cpp:141

我真的不明白第二个查询的失败。我为dlopen尝试了不同的标志,但它不能用于任何组合。

希望有人可以帮助我,因为我对共享库非常缺乏经验。

此致

3 个答案:

答案 0 :(得分:3)

尝试替换

extern "C" { void run { ... } }

extern "C" void run { ... }

参见伟大的http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html论文中的解释。

答案 1 :(得分:1)

我不确定我所说的是否正确,但我记得去年有一个类比问题我解决了它生成包含库的.so。像这样:

g ++ -O0 -g3 -fPIC -std = c ++ 0x GeneratedQuery.cpp ../type/Types.cpp {add intel stuff here .a etc} -shared -o lib.so

我使用了CMAKE,我不得不添加add_library内容。

我希望这有帮助,如果不是道歉!。

答案 2 :(得分:0)

让它运行,但我仍然感到困惑:

如果我给每个库文件另一个名字,比如lib..so并加载它,一切正常。是否有类似缓存的内容可能导致上述行为?