ELF对象文件和共享对象之间的ELF头有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (33)

首先,我是从技术角度,而不是从库代码用户的角度来问这个问题的。一个不同的例子是共享对象包含程序头,而普通对象文件不包含。其他的区别是什么?

至于我的问题的目的,我正在试图找出哪些内容需要从共享对象文件中删除,以便链接器将其作为一个普通的对象文件来处理,并尝试将其重新定位并静态链接到生成的可执行文件中。而不是将其标识为共享库并生成DT_NEEDED推荐信。这反过来又是将共享库的原始“转换”到可以静态链接的东西的第一步(然而,可能需要进一步的工作来使重定位满足要求)。

提问于
用户回答回答于

在最后的链接阶段,许多C库组件静态地链接到库中,形成INIT和fini符号等。这些被指定为DT_INITDT_FINI程序头中的条目;需要将这些条目转换为静态构造函数/析构函数条目,需要手动重新添加它们。

在最后的链接阶段生成的PLT需要与最终的输出文件合并,或者转换回普通的重定位;这是不平凡的,因为PLT只是代码。GOT也是一个问题;它位于一个固定的相对偏移量。文本段,并包含指向数据成员的指针。但是,它还包含指向动态结构,其中每个库或可执行文件只能有一个。而且您不能更改GOT中的偏移量,因为它们是直接从代码中引用的。

在转换为PLT/GOTS时丢失了信息。一个更好的方法可能是修改C库中的动态链接器,以支持链接已经作为静态映像映射到内存中的共享库。然后将其传递给动态链接器,以便使用适当的权限重新映射并执行正常的共享库初始化。然后添加一个静态构造函数来调用C库来初始化共享库。最后,添加适当的导出符号以对应共享库中的动态符号。

但是,这种方法的一个问题是,静态构造函数可能在初始化假solib的静态构造函数之前运行。在这种情况下,它们不能尝试从solib调用函数,否则可能会崩溃,因为solib尚未初始化。通过将导出的符号指向蹦床函数,可以避免这种情况,以确保首先初始化Solib。

热门问答

快照容量与费用的比例?如何关闭停用?

帅的惊动我国计算机大神
推荐已采纳
快照已于2019年1月22日0时启动正式商业化进程,商业化后所有存量快照和新产生的快照将根据快照使用的存储容量进行收费。 在快照商业化后,腾讯云仍旧会在国内主要地域为用户提供一定量的免费额度。免费额度策略如下: 免费额度覆盖范围为中国大陆地域,中国香港及海外地域暂无免费快照额...... 展开详请

红包消息如何构建?

红包消息的话,与@消息类似,可以通过 TIMCustomElem 来实现。需要应用在UI上做相应的特殊处理,比如检查到当前消息为红包消息后,消息展示为红包的样式。 另外,红包消息作为重要消息,最好在发送消息的时候将其设置为高优先级消息,以最大程序保证消息在触达频率限制的情况下仍可...... 展开详请

AVChatRoom和ChatRoom有什么区别?

面向的应用场景不同 ChatRoom适用于群组规模中等(不超过数千人级别)、成员进出不太频繁(每秒十几个人进出)的场景;AVChatRoom是专门为了大型直播设计的,适用于人数众多(万级以上)、成员进出频繁(每秒数百人以上进出)的场景。 AVChatRoom的优点 支持人数无上限...... 展开详请

serverless函数如何支持跨域?

解决跨域的方式有几种: 1. 如果不像自行解决跨域问题,且没有处理 http header 方法的问题,可以在 API 网关中,针对 API 配置,不选择 ANY 方法,而且仅选择非 header 的方法,然后勾选启用 CORS,由 API 网关协助解决跨域。完成配置后记得保存并...... 展开详请

调用短信接口返回错误?

您好,短信错误码文档:https://cloud.tencent.com/document/product/382/3771。 报错1021说明:请求发起时间不正常,通常是由于您的服务器时间与腾讯云服务器时间差异超过 10 分钟导致的 核查步骤: 1.请核查服务器时间是否正常; ...... 展开详请

对象存储数据三副本问题,谢谢 ?

波斯狗儿对象存储产品经理
推荐已采纳

1 COS 不完全使用副本的方式保存,数据调度能力属于我们的产品核心竞争力,具体实现方式一般不披露。

2 副本对用户是不感知的,COS 是一个最终一致性的存储,如果发起删除导致数据丢失,所有的数据都会被删除。

所属标签

扫码关注云+社区