大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是嵌入式开发里的relocatable文件(object, library)

  前三节课里,痞子衡都是在给大家介绍嵌入式开发中的input文件。从今天这节课开始,痞子衡就陆续为大家讲output文件。上一节课工程文件(.ewp)里讲说到project文件是一个承前启后的文件,今天痞子衡就为大家讲project生成的第一类output文件:relocatable文件。

  文件关系:源文件(.c/.h/.s) + 工程文件(.ewp) -> 可重定向文件(.o/.a)

  relocatable文件,即可重定向文件,这个文件是由编译器汇编源文件(.c/.s)而成的。直接生成的重定向文件叫object file,经过封装的重定向文件称为library file。可重定向文件属于ELF文件的分支,关于ELF文件的详细解释可见第六节课可执行文件(.out/.elf)。
  本文主角object file和library file,仅是一个中间的过渡文件,其本身也不能被ARM直接执行,需经过第二步转换,即链接,所以这两个文件都是链接器的输入文件。让我们来简单分析一下这两个文件。在开始分析之前我们先回到上一节课工程文件(.ewp)的最后创建的demo工程上,编译这个demo工程可以得到如下.o文件,这些文件全是object文件,每一个源文件都对应一个object文件,本文以task.o为例讲解relocatable文件。

D:\myProject\bsp\builds\demo\Release\Obj\main.o
D:\myProject\bsp\builds\demo\Release\Obj\reset.o
D:\myProject\bsp\builds\demo\Release\Obj\startup.o
D:\myProject\bsp\builds\demo\Release\Obj\startup_MKL25Z4.o
D:\myProject\bsp\builds\demo\Release\Obj\system_MKL25Z4.o
D:\myProject\bsp\builds\demo\Release\Obj\task.o -o

一、解析object文件

  task.o文件大小有11683bytes,而从源文件里看其仅包含4个变量和3个函数,可见更多的数据是记录性数据。

1.1 获得file header

c:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -h task.o
ELF Header:Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class:                             ELF32Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              REL (Relocatable file)Machine:                           ARMVersion:                           0x1Entry point address:               0x0Start of program headers:          0 (bytes into file)Start of section headers:          8283 (bytes into file)Flags:                             0x5000000, Version5 EABISize of this header:               52 (bytes)Size of program headers:           32 (bytes)Number of program headers:         0Size of section headers:           40 (bytes)Number of section headers:         85Section header string table index: 1

  分析file header可知task.o是REL类型ELF文件,其一共含有85个section header,没有program header。

1.2 获得section header

c:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -S task.o
There are 85 section headers, starting at offset 0x205b:Section Headers:[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            00000000 000034 000000 00      0   0  0[ 1] .shstrtab         STRTAB          00000000 000034 0001eb 00      0   0  0[ 2] .symtab           SYMTAB          00000000 00021f 000350 10      3  45  0[ 3] .strtab           STRTAB          00000000 00056f 000248 00      0   0  0[ 8] .bss              NOBITS          00000000 000e1c 000004 00  WA  0   0  4[ 9] .noinit           NOBITS          00000000 000e1c 000004 00  WA  0   0  4[10] .data             PROGBITS        00000000 000e1c 000004 00  WA  0   0  4[11] .bss              NOBITS          00000000 000e20 000010 00  WA  0   0  4[12] .text             PROGBITS        00000000 000e20 000058 00  AX  0   0  4[13] .textrw           PROGBITS        00000000 000e78 000010 00 WAX  0   0  4
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),y (purecode), p (processor specific)

  分析section header可知该task.o里的各个常见section(.bss, .noinit, .data, .text, .textrw)的大小,各个段的含义详见第二节课链接文件(.icf)。

1.3 获得symbol list

c:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -s task.oSymbol table '.symtab' contains 53 entries:Num:    Value  Size Type    Bind   Vis      Ndx Name3: 00000000    16 OBJECT  LOCAL  DEFAULT   11 s_array4: 00000000     4 OBJECT  LOCAL  DEFAULT    8 s_variable05: 00000000     4 OBJECT  LOCAL  DEFAULT   10 s_variable245: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_memcpy46: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_memset47: 00000000     0 FUNC    GLOBAL DEFAULT  UND free48: 00000000     0 FUNC    GLOBAL DEFAULT  UND malloc49: 0000000f    60 FUNC    GLOBAL DEFAULT   12 heap_task50: 00000000     4 OBJECT  GLOBAL DEFAULT    9 n_variable151: 00000001    14 FUNC    GLOBAL DEFAULT   12 normal_task52: 00000001    16 FUNC    GLOBAL DEFAULT   13 ram_task

  分析symbol list可知我们在task.c里定义的函数和全局变量的信息,其中Value表明的是各symbol对象(函数/全局变量)在存储器中的分配地址,由于object文件并没有经过链接,所以此处地址信息是无效的(待分配的)。翻看到第六节课可执行文件(.out/.elf)里2.2.4一节,便可看到这些symbol对象Value的值开始变得真实有效了。这就解释了为什么object文件是relocatable的。

二、关于library文件

  本质上library文件跟object文件是一样的,都是未经链接器链接的文件。library文件的应用场景是,在一些特殊场合,你不想把你的C源代码开放给别人阅读和自由修改,但是你又需要分享你的代码给别人使用,怎么解决这个问题?library文件就是解决这个问题的,可以借助编译器的选项(IAR下是Options->General Options->Output->Output file里选择Library(默认是executable)),那么添加进整个工程的所有源文件会被汇编封装成一个.a文件(即library文件),这时候你只需要将该.a文件以及配套API头文件分享给别人即可。别人只需要添加你的.a文件以及配套.h文件进他自己的工程,便可直接调用你的API。

  至此,嵌入式开发里的relocatable文件(object, library)文件痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页、CSDN主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:ARM Cortex-M文件那些事(4)- 可重定向文件(.o/.a)相关推荐

  1. 痞子衡嵌入式:ARM Cortex-M文件那些事(6)- 可执行文件(.out/.elf)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的executable文件(elf). 第四.五节课里,痞子衡已经给大家介绍了2种output文件,本文继续给大家讲proje ...

  2. 痞子衡嵌入式:ARM Cortex-M文件那些事(3)- 工程文件(.ewp)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的project文件. 前面两节课里,痞子衡分别给大家介绍了嵌入式开发中的两种典型input文件:源文件(.c/.h/.s). ...

  3. 痞子衡嵌入式:ARM Cortex-M文件那些事(8)- 镜像文件(.bin/.hex/.s19)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的image文件(.bin, .hex, .s19). 今天这节课是痞子衡<ARM Cortex-M文件那些事>主 ...

  4. 痞子衡嵌入式:ARM Cortex-M内核那些事(5)- 一表搜罗指令集

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M指令集. 指令集 指令长度 (bits) 包含指令 Cortex M0 Cortex M0+ Cortex M1 ...

  5. 痞子衡嵌入式:IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案(宏文件.mac+双Flashloader)...

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案. 分散链接与加载一直是嵌入式领域比较劝退新手的难题,在恩智浦 i.MXR ...

  6. 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...

  7. 痞子衡嵌入式:ARM Cortex-M内核那些事(9.1)- 存储保护(MPU - PMSAv6/7)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M存储保护模块(MPU). <ARM Cortex-M内核MCU开发那些事>的内核篇连载最早是 201 ...

  8. 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...

  9. 痞子衡嵌入式:单片机AI的春天已来,ARM Cortex-M55发布了

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M55. 鼠年春节,大家都在时刻关心 2019nCoV 疫情发展,没太多心思搞技术,就在这个时候,ARM 不声不响 ...

最新文章

  1. android 正则表达式3,含有至少3个字符类型的android正则表达式
  2. hdu 2065DP
  3. 【Python教程】七种创建对象的方式,你知道几种?
  4. java加互斥锁关键字_Java中用于给对象加“互斥锁”标记的关键字是。( )
  5. 在线word转html
  6. .NET2.0中,Winform程序如何异步调用Web Service呢?[Demo下载]——与.net1.1环境下比较...
  7. 计算机应用项目教案,计算机应用基础2项目二--电子教案.doc
  8. 计算机检索的pdf格式,计算机检索基础.pdf
  9. Stepping Number
  10. 三、OpenDaylight应用基础开发(ODL的Hello World)
  11. 一文搞懂supervisor进程管理
  12. 初中晨读必看古诗名句
  13. javaFX实现登录界面并跳转
  14. python opencv 画黑白棋盘
  15. 2023最新WSL搭建深度学习平台教程(适用于Docker-gpu、tensorflow-gpu、pytorch-gpu)
  16. Alfira学习篇(Python)
  17. vue项目中去空格 回车
  18. linux系统下安装pip3,linux下安装python3和对应的pip环境教程详解
  19. Android开发--Udp方式的数据传输
  20. 我们的Web3创业项目,黄了

热门文章

  1. SQL语句去连接两个表,内连接,左连接以及右连接
  2. 【金融统计】R语言平滑指数和模型计算等权重组合收益日波动率
  3. conda env create -f conda.yml出错
  4. 腾讯、网易云、字节跳动面试点总结—AMS在Android起到什么作用?
  5. 小学作文计算机能帮助我们什么,小学作文电脑对我欢喜对我忧.docx
  6. log4net进阶手札(二):基本用法
  7. 记一次安装Roon1.6版本
  8. 如果《后浪》目的就是为了感动中年人呢?B站破圈之战你看懂了吗
  9. 群签名技术的理解和总结
  10. nohup 执行mysql命令_Linux nohup命令:后台命令脱离终端运行