【问题标题】:How to add library version information to elf file while linking archive files and all archive files has their version info?链接存档文件时如何将库版本信息添加到elf文件并且所有存档文件都有其版本信息?
【发布时间】:2016-08-12 07:20:58
【问题描述】:

我通过将目标文件与一些存档文件链接来创建一个 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

【问题讨论】:

    标签: c++ c linker static-libraries elf


    【解决方案1】:

    我所有的档案都有他们的版本信息,但除了 libcrt 之外没有写给 elf。

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

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

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

    为了使字符串@(#) Lib ssh swfp version BL910291 出现在链接的可执行文件bos_epb.ppc.elf 中,必须从libssh.a 中选择包含该字符串的object 文件以成为可执行文件的一部分。这就引出了上面的问题 #2。

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多