使用与另一个lib相同的符号构建lib

时间:2016-11-10 11:30:54

标签: c++ gcc shared-libraries

我想为嵌入式系统构建一个共享库,它必须替换另一个库。我试过简单地用相同的符号构建一个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导出标头来导出符号。

1 个答案:

答案 0 :(得分:0)

您已经指出解决方案正在添加extern "C",但是对于上下文,这里的答案是:

C ++允许根据输入参数重载函数,因此例如可以单独定义以下两个函数:

void foo(char *bar);
void foo(const char *bar);

要使其工作,您需要确保这些符号不同,因此符号名称为" mangled",以将参数编码为符号名称的一部分。在现代Linux(以及大多数其他现代Unices)中,此修改的约定是以_Z开头的Itanium conventionc++filt软件可用于将这些受损的符号编码/解码为人类可读的符号。

相反,C不支持重载函数,因此唯一的函数名称(而不是其参数)是符号名称的一部分。