如何在链接存档文件时将库版本信息添加到 elf 文件,并且所有存档文件都有其版本信息?
How to add library version information to elf file while linking archive files and all archive files has their version info?
我正在通过将目标文件与一些存档文件链接起来来创建 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
命令的工作原理和
- linker 的工作原理。
继续表演。 what
命令非常简单:它扫描任意二进制文件并查找以 "special" 符号序列 @(#)
开头的 ASCII 字符串,并打印该序列之后的任何字符串(以 NUL
字符)。 Documentation.
为了让字符串 @(#) Lib ssh swfp version BL910291
出现在 linked 可执行文件 bos_epb.ppc.elf
中,包含该字符串的 object 文件必须是从 libssh.a
中选择成为可执行文件的一部分。这让我们回到上面的第 2 期。
仅仅因为 libssh.a
中存在这样的对象,您不能假设它会被 link 编辑到最终的二进制文件中。 linker 用来决定是否将对象包含到最终可执行文件中的算法描述为 here or here.
您可以保证使用-Wl,--whole-archive -lssh -Wl,--no-whole-archive
将整个libssh.a
包含在最终的二进制文件中,但这是生病-建议。它可能会导致您的二进制文件无法 link,并且 保证 使其比应有的更大。
我正在通过将目标文件与一些存档文件链接起来来创建 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
命令的工作原理和- linker 的工作原理。
继续表演。 what
命令非常简单:它扫描任意二进制文件并查找以 "special" 符号序列 @(#)
开头的 ASCII 字符串,并打印该序列之后的任何字符串(以 NUL
字符)。 Documentation.
为了让字符串 @(#) Lib ssh swfp version BL910291
出现在 linked 可执行文件 bos_epb.ppc.elf
中,包含该字符串的 object 文件必须是从 libssh.a
中选择成为可执行文件的一部分。这让我们回到上面的第 2 期。
仅仅因为 libssh.a
中存在这样的对象,您不能假设它会被 link 编辑到最终的二进制文件中。 linker 用来决定是否将对象包含到最终可执行文件中的算法描述为 here or here.
您可以保证使用-Wl,--whole-archive -lssh -Wl,--no-whole-archive
将整个libssh.a
包含在最终的二进制文件中,但这是生病-建议。它可能会导致您的二进制文件无法 link,并且 保证 使其比应有的更大。