我正在通过将目标文件与一些存档文件链接起来来创建一个 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.
为了理解这个结果,你需要理解
what
命令的工作原理和- 链接器的工作原理。
继续表演。 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/