我通过链接目标文件和一些存档文件来创建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
答案 0 :(得分:0)
我的所有档案都有他们的版本信息,但除了libcrt之外没有写给elf。
为了理解这个结果,你需要理解
what
命令的工作原理和随着节目。 what
命令非常简单:它扫描任意二进制文件,以及以“特殊”符号序列@(#)
开头的ASCII字符串,并打印该序列后面的任何字符串(以NUL
结尾字符)。 Documentation
为了使字符串@(#) Lib ssh swfp version BL910291
出现在链接的可执行文件bos_epb.ppc.elf
中,必须从libssh.a
中选择包含该字符串的对象文件才能成为其中的一部分可执行文件。这让我们发现了上面的问题#2。
仅仅因为libssh.a
中存在这样的对象,您不能假设它将链接到最终的二进制文件中。链接器用于决定是否将对象包含到最终可执行文件中的算法描述为here或here。
您可以保证使用libssh.a
将整个-Wl,--whole-archive -lssh -Wl,--no-whole-archive
包含在最终二进制文件中,但这是生病 - 修订。它可能导致您的二进制文件无法链接,并且保证使其大于它应该的大小。