g ++在动态库中生成错误的符号

时间:2011-12-23 16:32:18

标签: dynamic g++ symbols shared-libraries

我正在尝试制作最简单的库。

#include <stdio.h>
   void PutLoLoLo(){
   puts("Lololo");
}

用g ++编译:

g++ -shared -fPIC main2.cpp -o simple.so -Wall

我在符号表中得到了这个:

:$ nm -D --dynamic --defined-only simple.so 
0000048c T _Z9PutLoLoLov
00002010 A __bss_start
00002010 A _edata
00002018 A _end
000004f8 T _fini
00000354 T _init

但我期待这样的事情:

0000048c T PutLoLoLo
00002010 A __bss_start
00002010 A _edata
00002018 A _end
000004f8 T _fini
00000354 T _init

因此,当我尝试加载它时,我得到了dlopen()错误。

请帮助我:我做错了什么?

2 个答案:

答案 0 :(得分:4)

C ++ mangles符号名称。如果要避免重复,则必须将函数声明为extern C,如下所示:

#include <stdio.h>
   extern "C" void PutLoLoLo(){
   puts("Lololo");
}

然后链接:

$ g++ -shared -fPIC lolo.cc -o lolo.so -Wall

会给你你期望的东西:

$ nm -D --dynamic --defined-only ./lolo.so 
000000000000061c T PutLoLoLo
0000000000002018 A __bss_start
0000000000002018 A _edata
0000000000002028 A _end
0000000000000668 T _fini
0000000000000500 T _init

您可以通过其“普通”名称来删除库并获取符号。该函数仅限于具有C语义。例如,您不能使用成员函数执行此操作,或者使用具有类语义作为参数的对象等。因此,如果您需要传入对象,则需要将这些参数作为void *,并且铸造。

答案 1 :(得分:3)

看起来像C ++名称错误。试试这个:

extern "C" void PutLoLoLo(){
   puts("Lololo");
}