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

How to add library version information to elf file while linking archive files and all archive files has their version info?

本文关键字:文件 信息 版本 elf 添加 链接      更新时间:2023-10-16

我通过将目标文件与一些存档文件链接来创建一个ELF文件。但是当我在我的ELF文件上运行"what"命令时,我只能看到一些存档文件的lib info (version),而不是所有的。

为什么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

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

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

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

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

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

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

您可以通过使用-Wl,--whole-archive -lssh -Wl,--no-whole-archive来保证将整个libssh.a包含在最终的二进制文件中,但这是不建议的。它可能导致你的二进制文件链接失败,并且保证使它比它应该的大。