【发布时间】:2018-11-29 14:57:12
【问题描述】:
我正在尝试重新编译现有的 C++ 应用程序。 不幸的是,我必须依赖一个专有库,我只有一个预编译的静态存档。
我使用 g++ 7.3.0 版和 ld 2.30 版。
无论编译时使用的 GCC 版本是什么,它都是古老的。
头文件定义方法:
class foo {
int bar(int & i);
}
正如nm lib.a 所示,库存档包含相应的导出函数:
T bar__4fooRi
nm app.o 显示我最近的编译器使用了另一种名称修饰:
U _ZN4foo9barERi
因此链接器无法解析库提供的符号。
是否可以选择名称修饰算法?
我可以引入地图或明确定义错误名称吗?
【问题讨论】:
-
您可以访问原始编译器吗?你能找到版本吗?
-
随库提示提供给 GCC 版本 2.91.66、2.95.2 和 2.95.3 的示例程序中的注释。可能与那个时代的 EGCS 分支相关或不相关的版本。我想这些版本的源代码在某个地方飘荡,但我手边没有编译器,不。
-
您可以生成一个linker script,为旧式名称提供新式别名。
-
@Hermann GCC 在
#include <cxxabi.h>中提供了一个名为abi::__cxa_demangle()的名称解构函数。如果旧编译器具有相同的功能,您可以使用它来对名称进行解构,并使用新编译器对其进行重新编排。那么您也许可以按照@Botje 的建议创建一个链接器脚本? (但可能存在其他 ABI 不兼容问题) -
即使你设法翻译了所有的符号名称,整个 ABI 也不一样不是吗?
标签: c++ ld name-mangling