在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

e2 studio中鏈接腳本的修改指導

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 2024-06-13 10:49 ? 次閱讀

程序編譯的幾個階段

一般而言,程序編譯經歷下圖四個階段,鏈接是編譯的最后一步,無論是在PC上編譯代碼,還是在PC上使用嵌入式gcc工具交叉編譯嵌入式代碼,編譯過程都是如下幾步。深入理解鏈接過程是嵌入式工程師必要掌握的能力!

677e0400-2483-11ef-91d2-92fbcf53809c.png

ld鏈接腳本的基礎概念

鏈接過程是將各式各樣的.o文件鏈接為一個文件的過程。鏈接腳本描述連接器如何將這些輸入文件(.o)文件映射為一個輸出文件的,并且定義了輸出文件的memory layout。幾乎所有的鏈接腳本都是在做這些事情。

下面給出一個簡單的鏈接腳本實例,每行腳本都有相應的注解:

左右滑動查看完整內容

SECTIONS
{
  . = 0x10000; 
  .text : { *(.text) }
  . = 0x8000000;
  .bss : { *(.bss) }
}

上面提到的定位計數器就是點 ‘.

這個鏈接腳本文件(Linker Scripty),用于告訴鏈接器如何將不同的代碼和數據段(sections)組合在一起形成可執行文件。下面我會解釋其中的每一部分:

1. = 0x10000;

這行代碼重新設置了定位計數器(location counter)的值為0x10000,即地址0x10000。

它告訴鏈接器在此處開始分配.text段的地址空間。

2.text : { *(.text) }

這行代碼定義了一個.text段,并告訴鏈接器將所有名為.text的數據節(section)放入這個段中。

*(.text)表示將所有輸入文件中的.text段合并到輸出文件的.text段中。

3 . = 0x8000000;

這行代碼重新設置了定位計數器的值為0x8000000,即地址0x8000000。

它告訴鏈接器在此處開始分配.data和.bss段的地址空間。

4 .data : { *(.data) }

這行代碼定義了一個.data段,并告訴鏈接器將所有名為.data的數據節放入這個段中。

*(.data)表示將所有輸入文件中的.data段合并到輸出文件的.data段中。

5.bss : { *(.bss) }

這行代碼定義了一個.bss段,并告訴鏈接器將所有名為.bss的數據節放入這個段中。

*(.bss)表示將所有輸入文件中的.bss段合并到輸出文件的.bss段中。

總體來說,這段鏈接腳本告訴鏈接器在特定的地址處分配.text、.data和.bss段,并將對應的數據節合并到這些段中。

鏈接腳本相關的概念

內存(Memory)

左右滑動查看完整內容

MEMORY
{
  name [(attr)] : ORIGIN = origin, LENGTH = len
…
}

注解:這里的“attr”只能由以下特性組成:

‘R’ Read-only section

‘W’ -- Read/write section

‘X’ -- Executable section

‘A’ -- Allocatable section

‘I’ -- Initialized section

‘L’ -- Same as ‘I’

‘!’ -- Invert the sense of any of the attributes that follow

左右滑動查看完整內容

/* Memories definition */
MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 36K
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
}

注解:

“xrw”表示“RAM”區是可讀、可寫和可執行的,且RAM 的起始地址為“0x20000300”,長度為36K。

“rx”表示“FLASH”區是可讀和可執行的,FLASH的起始地址為“0x08000000”,長度為128K。

段(Section)

Section有loadable(可加載)和allocatable(可分配)兩種類型。不可加載也不可分配的內存段,通常包含某些調試信息

loadable(可加載)是指:程序運行時,該段內容應該被加載到內存中。

allocatable(可分配)是指:該段的內容應該被預留出,但不應該加載任何別的內容(某些情況下,這些內存必須歸零)。

“可加載”和“可分配”的section都有兩個地址:“VMA”和“LMA”。

VMA(the virtual memory address):這是運行輸出文件時,該section的地址。VMA是可選項,可以不設置。

LMA(load memory address):這是加載section時的地址。

在大多數情況下,這兩個地址是相同的。當然也可以不相等,比如下面的例子就是LMA和VMA不同的案例:

數據段被加載到ROM中,然后在程序啟動時復制到RAM中(通常用于初始化全局變量)。此時ROM地址就是LMA,RAM地址就是VMA。

語法:

左右滑動查看完整內容

SECTIONS
{
  section [address] [(type)] :
  {
    [AT(lma)]
    [ALIGN(section_align)  | ALIGN_WITH_INPUT]
    [SUBALIGN(subsection_align)]
    [constraint]
    {
      output-section-command 
      output-section-command 
      …
    } [>region] [AT>lma_region] [:phdr  :phdr ...] [=fillexp] [,]
...
}

大多數的段僅使用了上述的一部分屬性。

示例:

左右滑動查看完整內容

/* Sections */ 
SECTIONS
{
  /* The startup code into "FLASH" Rom type memory */
  .isr_vector : 
  {
    . = ALIGN(4); 
    KEEP(*(.isr_vector)) /* Startup code */ 
    . = ALIGN(4); 
  } >FLASH


  /* Initialized data sections into "RAM" Ram type memory */
  .data:
  {
    . = ALIGN(4);
    _sdata = .; /* create a global symbol at data start */
    *(.data) /* .data sections */
    *(.data*) /* .data* sections */
    . = ALIGN(4);
    _edata = .; /* define a global symbol at data end */
  } >RAM AT> FLASH
 
}

上述示例中“.isr_vector”的LMA與VMA是相等的。“.data”因為有“>RAM AT> FLASH”的修飾,表示.data段的VMA為RAM,LMA為FLASH。即.data段的內容會放在FLASH中,但是運行時,會加載到RAM中。

常用命令

ASSERT

語法:ASSERT(exp, message)

確保exp是非零值,如果為零,將以錯誤碼的形式退出鏈接文件,并輸出message。在必要的位置添加斷言,可以清晰的定位問題。

左右滑動查看完整內容

/* The usage of ASSERT */ 
.test : 
{ 
  ASSERT ((_estack > (_Min_Stack_Size + _Min_Heap_Size)),"Error: There is an ERR occurred"); 
}

當示例中的“_estack”大于“_Min_Stack_Size + _Min_Heap_Size”時,就會打印“There is an ERR occurred”。

KEEP

用途:當鏈接器使用('--gc-sections')進行垃圾回收時,KEEP()可以使得被標記段的內容不被清除。

左右滑動查看完整內容

/* The startup code into "FLASH" Rom type memory */
.isr_vector : 
{
  . = ALIGN(4); 
  KEEP(*(.isr_vector)) /* Startup code */ 
  . = ALIGN(4); 
} >FLASH

指定“變量”的輸出地址:

可以定義如下的memory,然后將“變量”存放于該memory,就能控制“變量”的輸出地址。

左右滑動查看完整內容

/* Memories definition */
 
MEMORY 
{ 
  FW_RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x300 /* 0x20000000 ~ 0x200002FF */ 
  RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 35K 
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K 
}

同時在c文件中,在定義“變量”時,添加如下對應的屬性:

__attribute__((section(".FW_RAM"))) uint8_t key[8] = {0,1,2,3,4,5,6,7 };

變量將位于“0x20000000 ~ 0x200002FF”區域(如果僅僅只有key數組位于該區域,將從0x20000000開始存放,如果有多個變量存儲于該區域,將按照編譯的順序,從0x20000000依次存放)。

指定“函數”的輸出地址:

可以定義如下的memory和section,然后將“函數”存放于該section,就能控制“函數”的輸出地址。

左右滑動查看完整內容

/* Memories definition */ 
MEMORY 
{ 
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x300 /* 0x08000000 ~ 0x080002FF */ 
  CG_FLASH (rx) : ORIGIN = 0x08000300, LENGTH = 0x134 /* 0x08000300 ~ 0x08000433 */ 
  RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 0x900 /* 0x20000300 ~ 0x20001FFF */ 
}
 
SECTIONS
{
  …
  .SE_Call_Fun:
  {
     . = ALIGN(4); 
     . = . + 0x4; 
    *(.SE_Call_Fun) 
     . = ALIGN(4);
  } > CG_FLASH
  …
}

同時在c文件中, 在“函數”的實現部分,添加如下對應的屬性:

__attribute__((section(".SE_Call_Fun"))) uint32_t call_fun(Callgate_Func_Type_t ftype, void *param)

函數“call_fun”將存放于0x08000304處(留意此處的位置計數器將產生0x04的內存間隙)。

指定“文件”輸出地址:

可以定義如下的memory和section,然后將指定的文件存放于該section,就能控制“文件”的輸出地址。

左右滑動查看完整內容

/* Memories definition */
 MEMORY 
{
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x300 /* 0x08000000 ~ 0x080002FF */ 
  FW_FLASH (rx) : ORIGIN = 0x08000434, LENGTH = 0x2BCC/* 0x08000434 ~ 0x08003000 */ 
  RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 0x900 /* 0x20000300 ~ 0x20001FFF */ 
}
/* Sections */ 
SECTIONS 
{
  … 
  .main_section : 
  {
    . = ALIGN(4); 
    Core/Src/main.o(.text*) 
    . = ALIGN(4); 
  } >FLASH 
  … 
}

示例中將main.o指定到FLASH區域中;更改FLASH的地址或者main_section的LMA,就可以實現將特定文件指定到特定內存區域。

案例:RZ/N2L把 .text, .data, .bss段從ATCM改到SYSTEM_RAM

這里描述的RZ/N2L的內存分配:

左右滑動查看完整內容

67a1825e-2483-11ef-91d2-92fbcf53809c.png

長按可保存查看大圖

把.text段從ATCM改到SYSTEM_RAM:

左右滑動查看完整內容

67da1bfa-2483-11ef-91d2-92fbcf53809c.png

長按可保存查看大圖

把.data段從ATCM改到SYSTEM_RAM:

左右滑動查看完整內容

67fc3b5e-2483-11ef-91d2-92fbcf53809c.png

長按可保存查看大圖

.bss段的改動也是類似的:

左右滑動查看完整內容

6831d1ba-2483-11ef-91d2-92fbcf53809c.png

長按可保存查看大圖

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5083

    文章

    19131

    瀏覽量

    305536
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81073
  • 腳本
    +關注

    關注

    1

    文章

    390

    瀏覽量

    14879

原文標題:e2 studio中鏈接腳本的修改指導(通用)

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    linux kernel通過修改鏈接腳本lds文件,如何在esp32的linker.lf文件實現?

    linux kernel通過修改鏈接腳本lds文件實現,請問如何在esp32的linker.lf文件實現? linux kernel實現過程:
    發表于 06-26 06:19

    請問不修改GNU鏈接腳本可以嗎?

    我使用的是Psoc Creator 3.3 SP1的Pro模塊。我不想修改GNU鏈接腳本或使用備用腳本。(更改起始地址和ROM大小)我應該怎么做,在這個時候,這是一個生成的文件。問候
    發表于 10-30 06:57

    鏈接腳本的相關資料下載

    文章目錄鏈接腳本鏈接腳本的特點鏈接腳本的語法鏈接
    發表于 12-23 08:00

    MDK鏈接腳本的相關資料分享

    單片機編程使用 MDK時不可避免的要涉及到鏈接腳本文件。在鏈接腳本可以指定代碼的存儲布局,可以將代碼段、只讀數據段、可讀寫的數據段分別存放
    發表于 12-23 08:19

    RISC-V鏈接腳本的_stack_size的作用是什么

    使用的是CH32V103R8T6的開發板,代碼是RT-Studio上下載的EVK的例程。對于例程鏈接腳本_stack_size變量的作
    發表于 11-16 11:28

    蜂鳥e203處理器開源代碼惡的Makefile編譯腳本和測試腳本怎么修改

    求助蜂鳥e203處理器開源代碼惡的Makefile編譯腳本和測試腳本怎么修改?有沒有大佬指點一下,萬分感謝
    發表于 08-12 06:52

    在Linux中生成新的gcc工具鏈后,如何使用鏈接腳本來生成能夠被e203使用的.verilog文件?

    求在Linux中生成新的gcc工具鏈后,如何使用鏈接腳本來生成能夠被e203使用的.verilog文件,希望老師能夠提供較為詳細的步驟指導,萬分感謝!
    發表于 08-12 07:11

    LabVIEW編程指導腳本講解

    LabVIEW編程指導腳本講解,感興趣的可以看看。
    發表于 06-01 17:28 ?34次下載

    LD鏈接腳本解析-STM32F4xx

    本篇文章主要圍繞項目 STM32_RTOS_GUN 的鏈接腳本 STM32F417IG_FLASH.ld 進行分析,同時對編寫鏈接腳本的方法進行相應的講解,盡可能地做到通過閱讀這篇文章
    發表于 11-26 10:51 ?12次下載
    LD<b class='flag-5'>鏈接</b><b class='flag-5'>腳本</b>解析-STM32F4xx

    【gcc編譯優化系列】如何獲取gcc默認的鏈接腳本

    elf文件這一步,我們需要使用到一個叫鏈接腳本的文件,這個文件主要描述了程序的ROM分布和RAM分布,它也直接決定了二進制文件的內容結構。 那么問題來了,當我們手上沒有可用的鏈接
    的頭像 發表于 07-11 09:15 ?3626次閱讀

    e2 studio創建lib文件及使用

    通過一個LED閃爍例程,簡單介紹了創建庫文件,使用庫文件的流程。 工具 e 2 studio 復制以下鏈接到瀏覽器打開獲取瑞薩e 2
    的頭像 發表于 07-12 12:05 ?1182次閱讀
    <b class='flag-5'>e</b>2 <b class='flag-5'>studio</b>創建lib文件及使用

    關于STM32CubeIDE鏈接腳本的小問題

    電子發燒友網站提供《關于STM32CubeIDE鏈接腳本的小問題.pdf》資料免費下載
    發表于 09-20 11:25 ?0次下載
    關于STM32CubeIDE<b class='flag-5'>鏈接</b><b class='flag-5'>腳本</b>的小問題

    shell實例三(編寫批量修改擴展名腳本)

    實現功能: 編寫批量修改擴展名腳本,如批量將 txt 文件修改為 doc 文件 執行腳本時,需要給腳本添加位置參數
    的頭像 發表于 11-09 09:35 ?702次閱讀
    shell實例三(編寫批量<b class='flag-5'>修改</b>擴展名<b class='flag-5'>腳本</b>)

    e2 studiowaveform內存渲染工具應用

    e2 studiowaveform內存渲染工具應用
    的頭像 發表于 09-22 08:07 ?743次閱讀
    <b class='flag-5'>e</b>2 <b class='flag-5'>studio</b><b class='flag-5'>中</b>waveform內存渲染工具應用

    e2 studio安裝QE的流程介紹

    e2 studio安裝QE的流程介紹
    的頭像 發表于 04-04 08:05 ?543次閱讀
    在<b class='flag-5'>e</b>2 <b class='flag-5'>studio</b><b class='flag-5'>中</b>安裝QE的流程介紹
    主站蜘蛛池模板: 欧美伦理影院| 456主播喷水在线观看| 色在线免费视频| 亭亭色| 四虎新网站| 日本特黄特色| 酒色激情网| 32pao强力打造免费高速高清 | 四虎新网站| 欧美性野久久久久久久久| 欧美三级手机在线| 好吊色青青青国产在线观看| 成人a毛片高清视频| 两性色午夜视频免费国产| 精品免费久久久久久成人影院| 天堂bt| 日本高清色图| 日韩午夜精品| 色综合天天射| 男人的天堂一区二区视频在线观看| 免费人成观看在线网| 国产欧美久久久精品影院| 亚洲插| 91破处视频| 哥也操| 亚洲 午夜在线一区| 性生交酡| 亚洲色妞| 亚洲福利片| 欧美午夜视频在线观看| 国产高清一区二区三区| 日韩一级片免费在线观看| 狂野欧美性色xo影院| 在线中文字幕一区| 国产免费啪啪| 91国内视频| 亚洲一区免费在线| 亚洲mv在线观看| 激情六月色| 色天天网| 乡村乱人伦短小说|