如何在链接存档文件时将库版本信息添加到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 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。
为了理解这个结果,需要理解
-
what
命令如何工作和 - 链接器的工作原理
继续表演。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
包含在最终的二进制文件中,但这是不建议的。它可能导致你的二进制文件链接失败,并且保证使它比它应该的大。
相关文章:
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 将对象信息保存到二进制文件中
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- Qt读取文本文件的一些信息
- 将文件信息(字符数组)嵌入到编译的二进制文件中
- 从带有 getline() 的文件读入一行上有多个信息得到无效参数错误
- 如何使用所有其他文件信息来编译代码,例如HAAR级联训练的权重的XML文件
- 是否可以将信息从XML文件转换为CPP
- 如何在文本文件中搜索员工记录(按名称)并仅显示其详细信息?
- CVE解析文件信息
- C++Pig拉丁代码,只删除文件信息
- 如何在Linux终端的目录下显示详细的文件信息?-C++
- CaptureStackBackTrace和文件信息
- 如何在 Linux 中获取当前目录下的文件信息
- 如何获取文件信息
- 损坏的配置文件信息与g++和CMake
- fscanf,逗号文本文件信息字符串和数字
- 添加资源.Rc文件信息项目
- 在用c++或c#打开文件之前检测文件信息