linux學習(十一) 鏈結指令碼

2021-09-12 23:59:28 字數 1216 閱讀 5919

鏈結指令碼,其實是個規則檔案. 是程式設計師用來指導鏈結器工作的, 鏈結器會參考鏈結指令碼, 並使啟動的使用規定的規則來處理.o檔案中的那些段, 將其鏈結成乙個可執行程式.

段: 程式中有分為各個不同的段

段名分為2中: 一種是編譯器鏈結器內部定好的, 這是先天的名字, 另外一種是程式設計師自己指定的,自定義的段名.

先天性段名

**段(.text): 又叫文字段, **段其實就是函式編譯後生成的東西.

資料段(.data), 資料段就是c語言中初始化為非0的全域性變數

bss段(.bss), 又叫zi(zero initial)段,就是零初始化段, 對應c語言中初始化0的全域性變數.

後天性段名:

段名由程式設計師自己定義, 段的屬性和特徵也由程式設計師自己定義.

鏈結指令碼的理解:

sections{} // 這是整個鏈結指令碼

. 點號在鏈結指令碼中代表當前位置

= 等號代表賦值.

一段指令碼**

sections

.data :

bss_start = .; // 這裡是將當前的位址賦值給 bss_start 這個標號. 千萬不要以為這的 . 是0xd0024000 因為前面已經經過了

// **段和資料段, . 已經是0xd0024000 + .text 大小 + .data 大小, 這裡賦值給bss_start 應該是給外部使用的.

.bss :

bss_end = .; // 同理 將當前位址賦值給bss_end

}

2023年4月16日21:09:45

uboot.lds 鏈結指令碼中的

entry(_start) 用來制定整個程式的入口位址, 所謂入口位址就是整個程式的開頭位址, 可以認為就是整個

程式的第一句指令, 有點像c語言中的main

指定程式的連線位址有2中方法, 一種是在makefile 中ld 的flags用-ttext 0x20000000來指定,

另外一種是在鏈結指令碼的sections開頭用.=0x20000000 來指定,

兩種方法都是可以實現, 但是如果兩種方式都同時存在, 那麼 起到效果的是-ttext 0x20000000.

**段中, 注意檔案的排列順序, 指定必須放在前面部分的那些檔案, 就是必須安排在前16kb內的檔案, 這些檔案中的函式在前16kb會被呼叫, 在後面第二部分(16kb之後)中呼叫的程式,前後順序就無所謂了.

Linux鏈結指令碼學習 lds

l一 概論 ld gnu的鏈結器.用來把一定量的目標檔案跟檔案檔案鏈結在一起,並重新定位它們的資料,鏈結符號引用.一般編譯乙個程式時,最後一步就是執行ld進行鏈結 每乙個鏈結都被乙個鏈結指令碼所控制,這個指令碼是用鏈結命令語言書寫的.二 鏈結指令碼 鏈結指令碼的乙個主要目的是描述輸入檔案中的各個段 ...

Linux命令學習(十一) 鏈結檔案命令

鏈結檔案的命令ln一直沒有理解好,鬱悶。不過現在不太想花太多時間在linux命令上面,所以先說一下現在知道的,以後再在實踐中慢慢理解。ln命令的結果有點類似於windows系統中的快捷方式,可以從不同的路徑訪問同乙個檔案。但與快捷方式也只是類似而已。1 不能對目錄檔案做硬鏈結 2 不能在不同檔案系統...

Linux鏈結指令碼學習 lds 轉)

一 概論 ld gnu的鏈結器.用來把一定量的目標檔案跟檔案檔案鏈結在一起,並重新定位它們的資料,鏈結符號引用.一般編譯乙個程式時,最後一步就是執行ld進行鏈結 每乙個鏈結都被乙個鏈結指令碼所控制,這個指令碼是用鏈結命令語言書寫的.二 鏈結指令碼 鏈結指令碼的乙個主要目的是描述輸入檔案中的各個段 資...