如何在链接存档文件和所有存档文件时将库版本信息添加到elf文件中有其版本信息?

时间:2016-08-12 07:20:59

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

我通过链接目标文件和一些存档文件来创建ELF文件。但当我运行"什么"我的ELF文件上的命令我只能查看某些存档文件的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文件中,我只能看到有关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

1 个答案:

答案 0 :(得分:0)

  

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

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

  1. what命令的工作原理和
  2. 链接器的工作原理。
  3. 随着节目。 what命令非常简单:它扫描任意二进制文件,以及以“特殊”符号序列@(#)开头的ASCII字符串,并打印该序列后面的任何字符串(以NUL结尾字符)。 Documentation

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

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

    您可以保证使用libssh.a将整个-Wl,--whole-archive -lssh -Wl,--no-whole-archive包含在最终二进制文件中,但这是生病 - 修订。它可能导致您的二进制文件无法链接,并且保证使其大于它应该的大小。