热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将.o文件链接到.elf文件时

我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool

我有一个从 C 项目编译的.o文件,该文件引用了名为init_static_pools的函数。我使用objdump -t来显示其符号依赖信息:


  

00000000 UND 00000000 init_static_pools

根据此thread, UND 只是说“ 我需要其他人来提供该功能”。

因此,我将此.o文件链接到一个.elf文件,该文件包含init_static_pools的定义。 objdump -t显示此文件中的符号确实是


  

00004dcf g F .text 00000048 init_static_pools

根据此thread,gF标志表示它是 glbal函数。我想这意味着该功能可以静态链接

我尝试通过以下命令行将.o文件和.elf文件链接:


  

/ usr / bin / c ++ -m32 -rdynamic unittest1.o -o unittest1 target.elf
  lib / libgtest.a lib / libgtest_main.a -lpthread

我遇到了以下错误:


  

unittest1.cc :(。text + 0x2d):对“ init_static_pools”的未定义引用

该功能仅位于.so文件中,为什么无法链接?

这可能与动态链接和静态链接之间的不同符号解析机制有关吗?因为我使用objdump -f并看到target.elf是动态对象。如下图所示:


  

target.elf:文件格式elf32-i386

  
  

体系结构:i386,标记为0x00000150:

  
  

HAS_SYMS,动态,D_PAGED

  
  

起始地址0x00001144


2019年11月6日上午1-9:17

根据 @EmployedRussian 的评论,我尝试了readelf

对于target.elf,它仅包含1行:


  

486:00004dcf 72 FUNC GLOBAL DEFAULT 13 init_static_pools

对于unittest1.o,它包含两行,内容为:


  

0000002d 0000fb04 R_386_PLT32 00000000 init_static_pools


  

251:00000000 0 notyPE全局默认UND init_static_pools

为了完成,它们的标题是:

target.elf

ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement,little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x1144
Start of program headers: 52 (bytes into file)
Start of section headers: 246936 (bytes into file)
flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 43
Section header string table index: 42

unittest1.o

ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement,little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 36988 (bytes into file)
flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 262
Section header string table index: 261

到目前为止,我还不能说出链接失败的根本原因。幸运的是,我刚在 the series的链接器上找到了Ian Lance Taylor。希望能启发我。但是我想这需要一些时间。

ADD 2-2019/11/6上午10:33

基于@EmployedRussian的回复,我尝试了以下命令:

nm target.elf | grep init_static_pools
nm -D target.elf | grep init_static_pools

就像@EmployedRussian怀疑的那样,第二个命令行没有输出。因此,这意味着 target.elf不在其动态符号表中导出init_static_pools,这使得该符号不符合从target.elf外部进行链接的条件。

下面是一些与target.elf的链接有关的标志:

-Wl,-T zephyr/linker.cmd (this is quite long,but it seems to be mostly layout info)
-Wl,-Map=target_prebuilt.map
-Wl,--whole-archive
-Wl,--gc-sections
-Wl,--build-id=none
-Wl,--sort-common=descending
-Wl,--sort-section=alignment
-ldl
-lm

还是我也应该检查编译标志?

我找到了--export-all-symbols,--export-dynamic,--gc-keep-exported选项,我正在尝试。

似乎--export-all-symbols被忽略了。我想这是针对DLL的。

我将--export-dynamic--gc-keep-exported放在一起,构建就可以通过。
但是nm -D仍显示以下消息:


  

target.elf:没有符号


ADD 3-2019/11/6上午11:16

有关动态符号表(.dynsym)和符号表(.symtab)的文章。
https://blogs.oracle.com/solaris/inside-elf-symbol-tables-v2

一些报价:


  

实际上,在可共享库和动态链接出现之前,
  在运行时不需要。只有一个不可分配的
  符号表(合理命名为“ symtab”)。当动态链接是
  添加到系统中后,原始设计师面临一个选择:
  symtab可分配,或提供第二个较小的可分配副本。的
  运行时所需的符号只是总数的一小部分,因此一秒钟
  符号表可在运行过程中保存虚拟内存。这是一
  重要的考虑。因此,发明了第二个符号表
  动态链接,因此命名为“ dynsym”。

因此,我认为.dynsym是用于运行时动态链接的。但是我想我的unittest1.otarget.elf在构建时会被静态链接

所以这引出了我这个问题:我可以静态链接到.ELF文件吗?在Windows上,我通常静态链接到.lib文件而不是{ {1}}文件。这里的.DLL文件看起来更像.ELF。顺便说一句,我的构建过程还生成了一个.DLL文件。我应该用它代替libtarget.a吗?

不幸的是,我在target.elf上尝试了nm -treadelf -s,但它们都没有显示libtarget.a的存在。

顺便说一句,如果您对我的问题有所了解,请放一些提示。谢谢!




  

对于target.elf,它仅包含1行,即:
  486: 00004dcf 72 FUNC GLOBAL DEFAULT 13 init_static_pools

不幸的是,这还不足以肯定发生了什么。

要确定,请运行以下两个命令:

nm target.elf | grep init_static_pools
nm -D target.elf | grep init_static_pools

我怀疑第一个命令会产生输出,而第二个命令不会产生输出。

如果是这种情况,那么target.elf不会 导出其动态符号表中的init_static_pools,这使得该符号不适合从{{ 1}}。

关于您最终如何不导出该符号,我只能猜测(因为您没有提供用于链接它的链接命令)。您可能使用隐藏它的链接描述文件。


推荐阅读
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • Spring Boot单元测试中Redis连接失败的解决方案
    本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
author-avatar
小仙女
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有