豹哥嵌入式讲堂:ARM Cortex-M开发之文件详解(4)- 可重定向文件(.o/.a)豹哥嵌入式讲堂:ARM Cortex-M开发之文件详解(4)- 可重定向文件(.o/.a)



  大家吓,我是豹哥,猎豹的金钱豹,犀利哥的哥哥。今天豹哥为大家提的是嵌入式开发里的relocatable文件(object,
library)

  大家吓,我是豹哥,猎豹的金钱豹,犀利哥的父兄。今天豹哥为大家提的凡嵌入式开发里之relocatable文件(object,
library)

  前三节课里,豹哥都是于为大家介绍嵌入式开发被的input文件。从今日即刻节课开始,豹哥即陆续也大家讲output文件。上同节省课project文件里讲说到project文件是一个承载的公文,今天豹哥就是为大家讲讲project生成的第一类output文件:relocatable文件。

  前三节课里,豹哥都是在叫大家介绍嵌入式开发被的input文件。从今日立马节课开始,豹哥虽陆续也大家讲output文件。上一致节省课project文件里讲说到project文件是一个承接的公文,今天豹哥就是为大家提project生成的第一类output文件:relocatable文件。

  文件涉及:source文件

  文件涉及:source文件

  • project文件 ->
    relocatable文件
  • project文件 ->
    relocatable文件

  relocatable文件,即可重定向文件,这个文件是由编译器汇编源文件(.c/.s)而改为的。直接扭转的重定向文件叫object
file,经过包装的重定向文件称library
file。可重定向文件属于ELF文件之分支,关于ELF文件的详细分解可见第六节课executable文件。
  本文主角object file和library
file,仅是一个中的联网文件,其本人为无克于ARM直接实施,需经第二步转换,即链接,所以马上半只文本都是链接器的输入文件。让咱们来简单解析一下顿时有限单文本。在开班分析之前我们事先回到上同一节课project文件的最终创建的demo工程及,编译这个demo工程得以博如下.o文件,这些文件都是object文件,每一个来源文件都对应一个object文件,本文为task.o为例称解relocatable文件。

  relocatable文件,即可重定向文件,这个文件是由编译器汇编源文件(.c/.s)而成为的。直接生成的重定向文件叫object
file,经过包装的重定向文件称library
file。可重定向文件属于ELF文件的道岔,关于ELF文件之详尽分解可见第六节课executable文件。
  本文主角object file和library
file,仅是一个中级的接文件,其自身为不可知吃ARM直接实施,需通过第二步转换,即链接,所以就简单个公文都是链接器的输入文件。让我们来概括解析一下眼看有限独公文。在起来分析之前我们先返上一致节省课project文件的终极创建的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
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单函数,可见更多之数是记录性数据。

一、解析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.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)的分寸,各个段的义详见第二节课linker文件。

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)的大小,各个段的意思详见第二节课linker文件。

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文件并没通过链接,所以这里地址信息是行不通的(待分配的)。翻看到第六节课executable文件里2.2.4一样节,便只是张这些symbol对象Value的价值开始转换得真实有效了。这便说明了为何object文件是relocatable的。

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文件并没经过链接,所以这边地址信息是杯水车薪的(待分配的)。翻看到第六节课executable文件里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)文件豹哥就介绍了了,掌声以哪里~~~

二、关于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)文件豹哥就介绍完了,掌声在乌~~~

相关文章