我想为嵌入式系统构建一个共享库,它必须替换另一个库。我试过简单地用相同的符号构建一个lib。当我将原始的lib与mylib进行比较时,会略有不同。因此,可执行文件无法在我的假lib中找到此符号。
假lib:
0000000000000c90 g DF .text 0000000000000098 Base dbus_pending_call_unref(DBusPendingCall*)
原始的lib:
0000000000020430 g DF .text 0000000000000070 Base dbus_pending_call_unref
正如您所看到的,函数的参数在原始库中不可见。可能这是可执行文件无法找到符号的原因?如何使符号中的参数对我的假lib不可见?
我使用objdump -TC来查看符号,在我的src文件中,我使用了CMake导出标头来导出符号。
答案 0 :(得分:0)
您已经指出解决方案正在添加extern "C"
,但是对于上下文,这里的答案是:
C ++允许根据输入参数重载函数,因此例如可以单独定义以下两个函数:
void foo(char *bar);
void foo(const char *bar);
要使其工作,您需要确保这些符号不同,因此符号名称为" mangled",以将参数编码为符号名称的一部分。在现代Linux(以及大多数其他现代Unices)中,此修改的约定是以_Z
开头的Itanium convention。 c++filt
软件可用于将这些受损的符号编码/解码为人类可读的符号。