【问题标题】:Why an assertion failed during the linking phase?为什么断言在链接阶段失败?
【发布时间】:2019-08-14 19:29:49
【问题描述】:

我想将libdds.a 静态链接到一个简单的 C++ 应用程序(进行一些测试)。这是我的 C++ 代码(文件名为bridge.cpp):

#include <iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;

    return 0;
}

这段代码暂时不使用libdds.a 中的函数,但我想确保编译之前运行良好。所以我尝试编译:

$ g++ -Wall -o bridge bridge.cpp -L. -ldds
collect2: fatal error: ld terminated with signal 6 [Abandon], core dumped
compilation terminated.
ld: ../../src/lto-plugin/lto-plugin.c :388 : dump_symtab:  assertion « resolution != LDPR_UNKNOWN » failed.

这里是g++ld的版本:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.26.1

我没有使用任何 IDE,而是使用前一个命令从命令行编译。我在 Ubuntu 16.04.6 LTS 上:

$ lsb_release -a
LSB Version:    core-9.20160110ubuntu0.2-amd64:core-9.20160110ubuntu0.2-noarch:printing-9.20160110ubuntu0.2-amd64:printing-9.20160110ubuntu0.2-noarch:security-9.20160110ubuntu0.2-amd64:security-9.20160110ubuntu0.2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:    16.04
Codename:   xenial

这个错误是什么意思,我该如何纠正它?

【问题讨论】:

  • 缺少很多特定信息来重现您的特定问题,请添加所有信息。
  • @πάνταῥεῖ 您需要什么信息?
  • 所有关于您的操作系统和开发环境的信息。
  • 这类问题通常特定于 g++ 版本(或其使用的链接器)、IDE 或构建环境、所有运行的操作系统、libdds.a 是什么、如何实现图书馆建成了,还有一大堆东西。
  • @Pierre “我应该自己编译吗?”这可能是让它与您的开发环境兼容的最佳选择。

标签: c++ static-libraries ld


【解决方案1】:

此错误表示lto-plugin 至少无法解析一个符号。事实上,静态库dds.a 是用旧版本的 GCC 编译的。例如,如果您尝试使用lto1 读取其中的一个目标文件,您将收到以下错误:

$ /usr/lib/gcc/x86_64-linux-gnu/5/lto1 Par.o
Reading object files: Par.olto1: fatal error: bytecode stream generated with LTO version 2.1 instead of the expected 4.1

要更正它,您有两个选择:禁用 LTO 或重新编译 dds.a(如 cmets 中所建议的那样)。

要禁用 LTO,您可以使用 -fno-use-linker-plugin GCC 选项,但您会收到另一个错误:

$ g++ -Wall -fno-use-linker-plugin -o bridge bridge.cpp -L. -ldds
/usr/bin/ld : skipping incompatible ./libdds.a when searching for -ldds

确实,对象文件是elf32-i386 格式,您尝试将它们与elf64-x86-64 文件格式链接:

$ objdump -p Par.o
Par.o:     file format elf32-i386
$ g++ -c bridge.cpp 
$ objdump -p bridge.o 
bridge.o:     file format elf64-x86-64

此时,将dds.a 链接到您的程序的唯一好的解决方案是使用您将用于编译最终应用程序的同一编译器重新编译它。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2013-09-06
    • 2019-01-19
    • 2020-12-30
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多