c++ - 如何在链接存档文件时将库版本信息添加到 elf 文件,并且所有存档文件都有其版本信息?

标签 c++ c linker static-libraries elf

我正在通过将目标文件与一些存档文件链接起来来创建一个 ELF 文件。但是当我在我的 ELF 文件上运行“what”命令时,我只能看到一些存档文件的 lib 信息(版本),而不是全部。

为什么 ELF 文件只有一些文件的信息,即使它链接到所有存档文件? (PS:所有存档文件都有其版本信息,请查看下面的示例)

例子:

$ ld -o bos_epb.ppc.elf a.o b.o c.o -L/home/xrava/lib/powerpc \
  --start-group -lgcc -lm -lcrt -lsslcrypto -lssh --end-group

当我在 ELF 文件上运行“what”时,我只能看到有关 libcrt 的 lib 信息,而不是全部。

$ what bos_epb.ppc.elf
bos_epb.ppc.elf:
    Lib crt swfp version BL910288
    C Run Time Library
    Built Fri 22 Apr 2016 23:31:21 +0200 by tefo@
    Copyright 2016 XXXXXXX

我所有的文件都有它们的版本信息,但除了 libcrt 之外,没有把它写给 elf。

>>what libssh.a 
libssh.a: 
Lib ssh swfp version BL910291 
SSH Built Wed 27 Apr 2016 23:36:24 +0200 by tefo@ 
Copyright 2016 XXXXXXXX

最佳答案

All my archives have their version info but not writing this to elf except libcrt.

为了理解这个结果,你需要理解

  1. what 命令的工作原理和
  2. 链接器的工作原理。

继续表演。 what 命令非常简单:它扫描任意二进制文件,查找以“特殊”符号序列 @(#) 开头的 ASCII 字符串,并打印该序列之后的任何字符串(以 NUL 字符结尾)。 Documentation .

为了使字符串 @(#) Lib ssh swfp version BL910291 出现在链接的可执行文件 bos_epb.ppc.elf 中,对象 包含该字符串的文件必须从 libssh.a 中选择才能成为可执行文件的一部分。这让我们回到上面的第 2 个问题。

仅仅因为这样一个对象存在于 libssh.a 中,您不能假设它将链接到最终的二进制文件中。 here 描述了链接器用来决定是否将对象包含到最终可执行文件中的算法。或 here .

您可以使用 -Wl,--whole-archive -lssh -Wl,保证整个 libssh.a 包含在最终的二进制文件中, --no-whole-archive,但不建议这样做。它可能会导致您的二进制文件无法链接,并且保证使其比应有的更大。

关于c++ - 如何在链接存档文件时将库版本信息添加到 elf 文件,并且所有存档文件都有其版本信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38912146/

相关文章:

ios - 在混合 Swift 和 Obj-C 的项目中使用 Swift Framework 会导致链接器错误

c++ - 从不将涉及动态内存分配的函数注释为 noexcept?

c++ - 在 C/C++ 中是否有类似极度优化的 memcpy2d 之类的东西?

c - 为什么我们需要动态内存分配,尽管我们可以使用可变长度数组来代替?

c - 在 C 中的 for 循环和 if 语句中使用 Malloc 数组 - 导致分段

c++ - 当同一个库动态和静态链接到 C++ 程序时会发生什么?

c++ - typedef-ing 模板类型是否实例化它?

c++ - extern 在 C++ 中如何工作?

c++ - MySQL C++ 连接器是否比 MySQL C API 慢?

c++ - 从 OpenSSL-1.0.1r 中删除 OPENSSL_cleanse