豹哥就陆续为我们讲output文件,豹哥都以在给大家介绍嵌入式开发中的input文件



  大家好,我是豹哥,猎豹的豹,犀利哥的哥。明日豹哥给大家讲的是嵌入式开发里的relocatable文件(object,
library)

  大家好,笔者是豹哥,猎豹的豹,犀利哥的哥。今天豹哥给大家讲的是嵌入式开发里的relocatable文件(object,
library)

  前三节课里,豹哥都是在给我们介绍嵌入式开发中的input文件。在此从前几天那节课开首,豹哥就陆续为我们讲output文件。上一节课project文件里讲说到project文件是2个承接的文件,今天豹哥就为我们讲project生成的首先类output文件:relocatable文件。

  前三节课里,豹哥都以在给大家介绍嵌入式开发中的input文件。从明日那节课伊始,豹哥就陆续为我们讲output文件。上一节课project文件里讲说到project文件是3个承载的公文,前些天豹哥就为大家讲project生成的第叁类output文件:relocatable文件。

  文件涉及:source文件

  文件涉及:source文件

  relocatable文件,即可重定向文件,这些文件是由编写翻译器汇编源文件(.c/.s)而成的。直接生成的重定向文件叫object
file,经过包装的重定向文件称为library
file。可重定向文件属于ELF文件的分段,关于ELF文件的事无巨细分解可知第⑤节课executable文件
  本文主演object file和library
file,仅是壹当中档的连片文件,其自个儿也无法被A奥迪Q5M直接执行,需经过第②步转换,即链接,所以那五个文本都以链接器的输入文件。让大家来大约解析一下那三个公文。在伊始分析以前大家先回到上一节课project文件的末段成立的demo工程上,编译这几个demo工程得以取得如下.o文件,这几个文件全是object文件,每1个源文件都对应三个object文件,本文以task.o为例讲解relocatable文件。

  relocatable文件,即可重定向文件,这些文件是由编写翻译器汇编源文件(.c/.s)而成的。直接扭转的重定向文件叫object
file,经过包装的重定向文件称为library
file。可重定向文件属于ELF文件的分层,关于ELF文件的详实分解可见第⑥节课executable文件
  本文主演object file和library
file,仅是三其中间的连结文件,其本人也不能够被ALacrosseM直接实施,需经过第1步转换,即链接,所以那七个文本都以链接器的输入文件。让大家来回顾分析一下那七个公文。在上马分析从前大家先回到上一节课project文件的结尾成立的demo工程上,编写翻译那个demo工程得以博得如下.o文件,那个文件全是object文件,每贰个源文件都对应2个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,而从源文件里看其仅包涵5个变量和3个函数,可知更多的数量是记录性数据。

一、解析object文件

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

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文件,其一共包蕴8多少个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文件,其一共蕴涵8四个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文件正是缓解这几个难题的,能够依靠编译器的精选(IA奥迪Q5下是Options->General
Options->Output->Output
file里选用Library(暗中同意是executable)),那么添加进整个工程的全数源文件会被汇编封装成三个.a文本(即library文件),那时候你只必要将该.a文件以及配套API头文件分享给外人即可。旁人只须求丰硕你的.a文件以及配套.h文件进她协调的工程,便可一贯调用你的API。

  至此,嵌入式开发里的relocatable文件(object,
library)文件豹哥便介绍达成了,掌声在何地~~~

二、关于library文件

  本质上library文件跟object文件是均等的,都以未经链接器链接的文件。library文件的使用场景是,在有些差别平日地方,你不想把你的C源代码开放给人家阅读和自由修改,不过你又须要分享您的代码给外人使用,怎么消除这些标题?library文件正是化解那个难点的,能够注重编写翻译器的挑选(IA凯雷德下是Options->General
Options->Output->Output
file里选取Library(私下认可是executable)),那么添加进整个工程的全部源文件会被汇编封装成二个.a文书(即library文件),那时候你只须要将该.a文件以及配套API头文件分享给外人即可。别人只供给丰富你的.a文件以及配套.h文件进她协调的工程,便可径直调用你的API。

  至此,嵌入式开发里的relocatable文件(object,
library)文件豹哥便介绍实现了,掌声在哪个地方~~~

相关文章

网站地图xml地图