gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:08:03 25 4
gpt4 key购买 nike

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

#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() 错误。

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

最佳答案

C++ mangles符号名称。如果你想避免 mangling,该函数必须声明为 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

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

关于dynamic - g++ 在动态库中生成错误的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8618391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com