历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2019年12月19日 | 痞子衡嵌入式:ARM Cortex-M文件那些事(4)- 可重定向文件,

2019-12-19 来源:eefocus

  前三节课里,痞子衡都是在给大家介绍嵌入式开发中的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:myProjectbspbuildsdemoReleaseObjmain.o

D:myProjectbspbuildsdemoReleaseObjreset.o

D:myProjectbspbuildsdemoReleaseObjstartup.o

D:myProjectbspbuildsdemoReleaseObjstartup_MKL25Z4.o

D:myProjectbspbuildsdemoReleaseObjsystem_MKL25Z4.o

D:myProjectbspbuildsdemoReleaseObjtask.o -o

一、解析object文件

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


1.1 获得file header

c:cygwin64bin>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:cygwin64bin>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:cygwin64bin>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)文件痞子衡便介绍完毕了


推荐阅读

史海拾趣

Aten International公司的发展小趣事

在全球能源危机和环保意识日益增强的背景下,绿色能源成为了电子行业的一大发展趋势。Aten International积极响应环保号召,研发出了一系列绿色能源解决方案,包括智能型电源分配器和节能感测软件等。这些产品不仅能够有效降低能源消耗,还能提供实时的能源管理与效能指标,为企业实现绿色生产提供了有力支持。

E-tec Interconnect Ltd公司的发展小趣事

为了满足全球客户的需求,E-tec开始在全球范围内进行布局。他们在亚洲、欧洲和北美等地设立了生产基地和研发中心,实现了全球范围内的生产和销售。同时,E-tec还注重供应链的整合和优化,与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和成本控制。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

随着市场需求的不断增长,博众电气意识到传统的生产方式已经无法满足客户的需求。为了提高生产效率和产品质量,公司决定引进自动化生产线。

在自动化生产线的建设过程中,博众电气投入了大量的人力和物力资源。公司引进了先进的自动化组装设备和检测设备,实现了产线90%以上的自动化生产。这不仅大大提高了生产效率,还降低了人力成本,使得博众电气在市场竞争中更具优势。

Corsair Memory Inc公司的发展小趣事

Corsair Memory Inc公司的成功不仅在于其产品的创新,更在于其与全球知名电脑厂商的合作。多家世界级的OEM合作伙伴选择Corsair作为其内存供应商,这不仅提升了Corsair的品牌影响力,也为其带来了稳定的订单和市场份额。这种合作关系的建立,是Corsair在电子行业中持续发展的重要支撑。

Dailywell Electronics Co Ltd公司的发展小趣事

德利威电子一直注重技术创新和研发实力的提升。2001年,公司成功研发了高绝缘开关并导入生产,进一步巩固了其在电子开关领域的领先地位。此外,公司还不断投入研发资金,推出了一系列具有创新性和竞争力的新产品。例如,在2004年,公司成功研发了超迷你开关,这一产品以其小巧的体积和优良的性能迅速在市场上获得了广泛认可。

ABCO公司的发展小趣事

随着国内市场的饱和,ABCO公司开始将目光投向海外市场。公司制定了国际化战略,通过在海外设立分支机构、建立销售网络等方式,逐步拓展国际市场。同时,ABCO公司还积极与国际知名企业进行合作与交流,学习先进的管理经验和技术,为公司的国际化发展提供了有力支持。

这五个故事展示了ABCO公司在电子行业发展中不断挑战自我、追求卓越的过程。通过技术创新、市场拓展、质量管理以及国际化战略的实施,ABCO公司逐渐发展成为一家具有竞争力的电子企业。

问答坊 | AI 解惑

Atmel面向汽车应用推出低功耗高性能8位AVR RISC架构MCU

Atmel推出一款低功耗高性能8位AVR RISC架构的微控制器系列产品——AT90SC,拥有64KB闪存程序存储器和64KB EEPROM数据存储器以及2.5KB的RAM。 该产品可在单周期内执行120条功功能较强的指令,吞吐量接近1MIPS/MHz,其哈佛架构包括32个直接连接到ALU ...…

查看全部问答>

一个电子工程师的经验之谈!

这是“工控论坛”中的一个精彩帖子,是版主“totopper ”的帖子,推荐给“单片机”论坛的朋友们看一看! 一个电子工程师的经验之谈 “工程师是科学家;工程师是艺术家;工程师也是思想家。”一位伟大的工程师曾经提出过这样的一段感言。不错,工 ...…

查看全部问答>

使用CCS进行DSP编程.rar

使用CCS进行DSP编程.rar 三个pdf文件,主要是讲CCS的…

查看全部问答>

请教关于evc中sizeof()函数的问题

大哥大姐们好!小弟这儿有礼了!一定给分!   我在写一个读取串口的程序,但是在其中的sizeof()函数中遇到了问题。当要向串口写数据时,我使用了函数   fWriteStat = WriteFile(hCom, lpBuf, sizeof(lpBuf),&dwHaveNumWritten,NULL);    ...…

查看全部问答>

基于SEED-DIM3517的平板电脑

基于SEED-DIM3517的平板电脑…

查看全部问答>

STM8S关于Vcap问题

STM8S关于Vcap问题: 如果我用的是3,3V系统,那我在Vcap上可以悬空或者把Vcap脚直接接到电源上吗?…

查看全部问答>

问局部变量的地址分配问题

我用IAR3。2,F149的芯片,编程时在定时中断中定义了一个局部变量,硬件仿真时在WATCH窗口中观察此变量有一个初值102(我定义时没复初值),变量地址(LOCATION)被分配为0X9,有时又被分配为0XB,请问高手这个0X9或0XB是指哪的地址,我在MEMORY窗口中 ...…

查看全部问答>

液晶显示问题

我在用f413驱动段式液晶的时候,显示的数字比较模糊不清晰,但我让他显示的段数少点的时候就会好点,不知道是什么原因,请大侠指点…

查看全部问答>

用树莓派节省超多国际漫游费,这么神奇?

       如果你经常旅行,你是否已经习惯那些不合理的手机漫游费呢?然而,手机有时候是绝对必要的 —— 我们在海外工作或度假都不得不支付手机漫游费,因为我们需要与办公室保持联系,还要与世界各地的人谈论关于树莓派的相关 ...…

查看全部问答>