99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

痞子衡
認證:普通會員
所在專題目錄 查看專題
從文件角度看Cortex-M開發(fā)(1) - 源文件
從文件角度看Cortex-M開發(fā)(2) - 鏈接文件
從文件角度看Cortex-M開發(fā)(3) - 工程文件
從文件角度看Cortex-M開發(fā)(4) - 可重定向文件
從文件角度看Cortex-M開發(fā)(5) - 映射文件
從文件角度看Cortex-M開發(fā)(6) - 可執(zhí)行文件
作者動態(tài) 更多
一種多MCU分時復(fù)用Flash啟動的創(chuàng)新方法(下)
2星期前
一種多MCU分時復(fù)用Flash啟動的創(chuàng)新方法(上)
3星期前
RT10xx系列UART SDP能設(shè)置多高波特率?
06-06 09:51
有時候MCU片內(nèi)合封Flash就是個黑盒子!
05-15 13:52
有人說高性能MCU片內(nèi)合封Flash不可靠?
05-13 14:33

從文件角度看Cortex-M開發(fā)(4) - 可重定向文件

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家講的是嵌入式開發(fā)里的relocatable文件(object, library)

前三節(jié)課里,痞子衡都是在給大家介紹嵌入式開發(fā)中的input文件。從今天這節(jié)課開始,痞子衡就陸續(xù)為大家講output文件。上一節(jié)課工程文件(.ewp)里講說到project文件是一個承前啟后的文件,今天痞子衡就為大家講project生成的第一類output文件:relocatable文件。

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

relocatable文件,即可重定向文件,這個文件是由編譯器匯編源文件(.c/.s)而成的。直接生成的重定向文件叫object file,經(jīng)過封裝的重定向文件稱為library file。可重定向文件屬于ELF文件的分支,關(guān)于ELF文件的詳細解釋可見第六節(jié)課可執(zhí)行文件(.out/.elf)。

本文主角object file和library file,僅是一個中間的過渡文件,其本身也不能被ARM直接執(zhí)行,需經(jīng)過第二步轉(zhuǎn)換,即鏈接,所以這兩個文件都是鏈接器的輸入文件。讓我們來簡單分析一下這兩個文件。在開始分析之前我們先回到上一節(jié)課工程文件(.ewp)的最后創(chuàng)建的demo工程上,編譯這個demo工程可以得到如下.o文件,這些文件全是object文件,每一個源文件都對應(yīng)一個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個函數(shù),可見更多的數(shù)據(jù)是記錄性數(shù)據(jù)。

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)的大小,各個段的含義詳見第二節(jié)課鏈接文件(.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里定義的函數(shù)和全局變量的信息,其中Value表明的是各symbol對象(函數(shù)/全局變量)在存儲器中的分配地址,由于object文件并沒有經(jīng)過鏈接,所以此處地址信息是無效的(待分配的)。翻看到第六節(jié)課可執(zhí)行文件(.out/.elf)里2.2.4一節(jié),便可看到這些symbol對象Value的值開始變得真實有效了。這就解釋了為什么object文件是relocatable的。

二、關(guān)于library文件

本質(zhì)上library文件跟object文件是一樣的,都是未經(jīng)鏈接器鏈接的文件。library文件的應(yīng)用場景是,在一些特殊場合,你不想把你的C源代碼開放給別人閱讀和自由修改,但是你又需要分享你的代碼給別人使用,怎么解決這個問題?library文件就是解決這個問題的,可以借助編譯器的選項(IAR下是Options->General Options->Output->Output file里選擇Library(默認是executable)),那么添加進整個工程的所有源文件會被匯編封裝成一個.a文件(即library文件),這時候你只需要將該.a文件以及配套API頭文件分享給別人即可。別人只需要添加你的.a文件以及配套.h文件進他自己的工程,便可直接調(diào)用你的API。

至此,嵌入式開發(fā)里的relocatable文件(object, library)文件痞子衡便介紹完畢了,掌聲在哪里~~~

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關(guān)注 41
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 成年女人粗暴毛片免费观看 | 亚洲欧洲日韩综合二区 | 夜夜夜夜曰天天天天拍国产 | 在线看免费无码av天堂的 | 白天躁晚上躁麻豆视频 | 国产91xxx在线观看大全 | 91精品综合久久久久久3u8 | 中文无字幕一区二区三区 | 国产理论一区二区三区 | 中文字幕一综合88久久 | 丰满少妇高潮惨叫久久久 | www.se天堂 | 国产日韩精品SUV | 毛片一级在线 | 亚洲一区二区精品视频 | 韩国三级中文字幕HD | 亚洲欧美日韩精品久久 | 日本一区二区不卡在线 | 网红主播精品视频在线观看 | 在线播放视频 | 精品久久久久久久久久香蕉 | 成人AV鲁丝片一区二区免费 | 国产三级无毒无害视频 | 久久久com | 强壮的公次次弄得我高潮a片日本 | 欧美视频网 | 久做在线视频免费观看 | 成人极品视频 | 国产精品三级在线观看无码 | 日韩在线播放网站 | 在线中文字幕有码中文 | 国产精品午夜久久久久久99热 | 风韵丰满熟妇啪啪区老老熟女百度 | 久久久久久久人妻无码中文字幕爆 | 人人爽在线视频 | 在线播放毛片 | 天天色天天搞 | 在线亚洲小视频 | 欧美黄色一级片在线观看 | 亚洲日韩色在线影院性色 | 久久香蕉国产线看观看6 |