大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是嵌入式开发里的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 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: ARM
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 8283 (bytes into file)
Flags: 0x5000000, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 85
Section 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.o

Symbol table '.symtab' contains 53 entries:
Num: Value Size Type Bind Vis Ndx Name
3: 00000000 16 OBJECT LOCAL DEFAULT 11 s_array
4: 00000000 4 OBJECT LOCAL DEFAULT 8 s_variable0
5: 00000000 4 OBJECT LOCAL DEFAULT 10 s_variable2
45: 00000000 0 FUNC GLOBAL DEFAULT UND __aeabi_memcpy
46: 00000000 0 FUNC GLOBAL DEFAULT UND __aeabi_memset
47: 00000000 0 FUNC GLOBAL DEFAULT UND free
48: 00000000 0 FUNC GLOBAL DEFAULT UND malloc
49: 0000000f 60 FUNC GLOBAL DEFAULT 12 heap_task
50: 00000000 4 OBJECT GLOBAL DEFAULT 9 n_variable1
51: 00000001 14 FUNC GLOBAL DEFAULT 12 normal_task
52: 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. 痞子衡嵌入式:MCUBootUtility v2.4发布,轻松更换Flashloader文件

    -- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.3.1)发布过去2个月了,这一次痞子衡为大家带来了版本升级v2.4.0,这个版本主要有一个非常重要的更新需要跟大家特别说 ...

  2. 痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的source文件. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就是 ...

  3. 痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 链接文件(.icf)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的linker文件. 在前一节课源文件(.c/.h/.s)里,痞子衡给大家系统地介绍了source文件,source文件是嵌入 ...

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

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

  5. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的map文件. 第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲projec ...

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

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

  7. 痞子衡嵌入式:ARM Cortex-M文件那些事(7)- 反汇编文件(.s/.lst/.dump)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的反汇编文件(.s, .lst, .dump). 痞子衡在第四.五.六节课分别介绍了编译器/链接器生成的3种output文件( ...

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

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

  9. 痞子衡嵌入式:ARM Cortex-M调试那些事(1)- 4线协议标准(JTAG)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M文件那些事>系列文章之后,痞子衡休整了一小段时间,但是讲课的 ...

随机推荐

  1. Linux系统下,在文件中查找某个字符串

    在normal模式下按下/即可进入查找模式,输入要查找的字符串并按下回车. Vim会跳转到第一个匹配.按下n查找下一个,按下N查找上一个. Vim查找支持正则表达式,例如/vim$匹配行尾的" ...

  2. vue-router路由学习总结

    vue路由 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. promise的理解

    为什么会有promise,他的作用是什么? promise主要是为了解决js中多个异步回调难以维护和控制的问题. 什么是promise? 从图中,我们可以看出,Promise是一个函数,这个函数上有在 ...

  4. Spring中Model、ModelMap及ModelAndView之间的区别

    Spring中Model.ModelMap及ModelAndView之间的区别   1. Model(org.springframework.ui.Model)Model是一个接口,包含addAttr ...

  5. XML语言1.简介和语法

    一.什么是XML语言? XML 指可扩展标记语言(Extensible Markup Language) Xml是独立于软件和硬件的信息传输工具. XML 是一种很像HTML的标记语言. 但xml不是 ...

  6. android sdk 历史版本下载地址

    https://developer.android.google.cn/studio/archive#android-studio-3-0?utm_source=androiddevtools& ...

  7. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  8. CSS面试细节整理(二)

    5.css盒模型: CSS 框模型 (Box Model) 规定了元素框处理元素内容.内边距.边框 和 外边距 的方式

  9. linux sqlite3 相关

    数据库sqlite 1 用下载好的安装包安装 linux@ubuntu:~/sqlite3$ sudo dpkg -i libsqlite3-0_3.7.2-1ubuntu0.1_i386_1.deb ...

  10. mysql根据字符截取字符串(总结)

    mysql根据字符截取字符串(总结) 1.1 前言   为结合自己平常查资料的习惯,我会先给出例子,然后再对相关知识进行详解.该案例使用到的函数为:SUBSTRING_INDEX 1.2 需要实现的实 ...