嵌入式C语言编程中经验教训总结(二)LDS链接文件解析
目錄
- 為什么要用到lds鏈接腳本?
- lds文件語法結構
- lds文件實例解析
好的朋友已經做過好多年的arm開發,卻對底層的編譯鏈接邏輯很少接觸,主要原因在于現在大多數應用層的開發不需要從裸板開始,工程師只需要在應用層面開發即可,但是,如果牽涉到較多的硬件改造或系統重構,就需要對整個系統底層進行調整,lds文件的修改將在所難免。
為什么要用到lds鏈接腳本?
首先lds鏈接腳本的作用就是將許多源文件編譯后生成的目標文件*.o,在各個段鏈接在一起,通過此文件,告訴鏈接器這些各個段存放的地址先后順序,它定義了整個程序編譯之后的連接過程,決定了一個可執行程序的各個段的存儲位置。
lds文件語法結構
lds文件的的語法定義,詳見GNU官方網站,文件類型為文本文件,
主要偽代碼有:
OUTPUT_FORMAT :指定輸出文件格式
OUTPUT_ARCH:指定輸出可執行文件運行處理器平臺
ENTRY:指定程序入口位置
ALIGN; 代碼對齊方式
SENCTIONS:定義段,為主要單元,sections的形式為:
SECTIONS {
…
secname start BLOCK(align) (NOLOAD) : AT ( ldadr )
{ contents } >region :phdr =fill
…
}
其中secname和contents是必須的,其他都是可選的。說明如下:
1、secname:段名
2、contents:段內容,可以是整個目標文件,也可以是目標文件中的某些段(代碼段、數據段等)
3、start:本段連接(運行)的地址,如果沒有使用AT(ldadr),本段存儲的地址也是start。
4、AT(ldadr):本段存儲(加載)的地址。
lds文件實例解析
OUTPUT_FORMAT(“elf32-littlearm”, “elf32-littlearm”, “elf32-littlearm”)
;指定輸出可執行文件是elf格式,32位ARM指令,小端
OUTPUT_ARCH(arm);指定輸出可執行文件的平臺為ARM處理器平臺
ENTRY(_start);指定輸出可執行文件的起始代碼段為_start.
MEMORY
{
RAM (xrw) : ORIGIN = 0x00000000, LENGTH = 8M
SRAM (xrw) : ORIGIN = 0x30000000, LENGTH = 16K
}
SECTIONS
{
. = 0x00000000; //指定當前的鏈接地址=0x00000000
}
總結
以上是生活随笔為你收集整理的嵌入式C语言编程中经验教训总结(二)LDS链接文件解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动端软键盘弹起遮挡输入框问题的解决方案
- 下一篇: 田野调查手记·浮山摩崖石刻(六)