<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:ARM Cortex-M文件那些事(4)- 可重定向文件(.o/.a)


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

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

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

        relocatable文件,即可重定向文件,這個(gè)文件是由編譯器匯編源文件(.c/.s)而成的。直接生成的重定向文件叫object file,經(jīng)過(guò)封裝的重定向文件稱(chēng)為library file??芍囟ㄏ蛭募儆贓LF文件的分支,關(guān)于ELF文件的詳細(xì)解釋可見(jiàn)第六節(jié)課可執(zhí)行文件(.out/.elf)。

        本文主角object file和library file,僅是一個(gè)中間的過(guò)渡文件,其本身也不能被ARM直接執(zhí)行,需經(jīng)過(guò)第二步轉(zhuǎn)換,即鏈接,所以這兩個(gè)文件都是鏈接器的輸入文件。讓我們來(lái)簡(jiǎn)單分析一下這兩個(gè)文件。在開(kāi)始分析之前我們先回到上一節(jié)課工程文件(.ewp)的最后創(chuàng)建的demo工程上,編譯這個(gè)demo工程可以得到如下.o文件,這些文件全是object文件,每一個(gè)源文件都對(duì)應(yīng)一個(gè)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個(gè)變量和3個(gè)函數(shù),可見(jiàn)更多的數(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類(lèi)型ELF文件,其一共含有85個(gè)section header,沒(méi)有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里的各個(gè)常見(jiàn)section(.bss, .noinit, .data, .text, .textrw)的大小,各個(gè)段的含義詳見(jiàn)第二節(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可知我們?cè)趖ask.c里定義的函數(shù)和全局變量的信息,其中Value表明的是各symbol對(duì)象(函數(shù)/全局變量)在存儲(chǔ)器中的分配地址,由于object文件并沒(méi)有經(jīng)過(guò)鏈接,所以此處地址信息是無(wú)效的(待分配的)。翻看到第六節(jié)課可執(zhí)行文件(.out/.elf)里2.2.4一節(jié),便可看到這些symbol對(duì)象Value的值開(kāi)始變得真實(shí)有效了。這就解釋了為什么object文件是relocatable的。

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

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

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

      歡迎訂閱

      文章會(huì)同時(shí)發(fā)布到我的 博客園主頁(yè)CSDN主頁(yè)、知乎主頁(yè)、微信公眾號(hào) 平臺(tái)上。

      微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機(jī)上第一時(shí)間看了哦。

      posted @ 2018-01-10 21:46  痞子衡  閱讀(2701)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 蜜臀视频在线观看一区二区| 荔浦县| 亚洲欧美自偷自拍视频图片| 99热门精品一区二区三区无码 | 被灌满精子的少妇视频| 99热精品国产三级在线观看| 无码人妻丝袜在线视频红杏| 老司机午夜免费精品视频| 亚洲国产成人精品区综合| 精品一区二区不卡免费| 人妻互换一二三区激情视频| 一区二区三区四区黄色片| 精品国产中文字幕在线| 欧美黑人添添高潮a片www| 久久九九日本韩国精品| 成人做受视频试看60秒| 男女爽爽无遮挡午夜视频| 精品亚洲综合一区二区三区| 熟妇人妻无码中文字幕老熟妇| 黑人大战中国av女叫惨了| 河北真实伦对白精彩脏话| 麻豆国产va免费精品高清在线| 性xxxx欧美老妇胖老太性多毛| 狠狠v日韩v欧美v| 国产亚洲一级特黄大片在线| 国产亚洲天堂另类综合| 国产不卡一区二区精品| 久久99久久99精品免观看| 国产精品爽爽va在线观看网站 | 临湘市| 国产精品熟女一区二区三区| 亚洲中文字幕日产无码成人片| 无码免费中文字幕视频| 国产精品三级一区二区三区| 翘臀少妇被扒开屁股日出水爆乳| 国产成人无码午夜视频在线观看| 女同另类激情在线三区| 亚洲中文字幕精品第一页| 囯产精品久久久久久久久久妞妞| 福利一区二区在线观看| 国产成人精品无人区一区|