五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

13.6代碼重定位_重定位_清除BSS段的C函數(shù)實(shí)現(xiàn)

2020-08-21 17:18 作者:韋東山  | 我要投稿

在前面,我們使用匯編程序來實(shí)現(xiàn)了重定位和清bss段,本節(jié)我們將使用C語言,實(shí)現(xiàn)重定位和清除bss段。

1.打開start.S把原來的匯編代碼刪除改為調(diào)用C函數(shù)?

改為?

2. 在init.c 實(shí)現(xiàn)如上兩個(gè)C函數(shù)?

匯編中,為C語言傳入的參數(shù),依次就是R1、R2、R3。 編譯,燒寫運(yùn)行沒有問題。


我們假設(shè)不想?yún)R編傳入?yún)?shù),而是C語言直接取參數(shù)。

1. 修改start.S 跳轉(zhuǎn)到C函數(shù)不需要任何參數(shù)?

2. 修改鏈接腳本,讓__code_start 等于當(dāng)前地址,也就是這里的0x30000000?

3.修改init.c 用函數(shù)來獲取參數(shù)?

編譯燒寫運(yùn)行 ,沒有問題。

總結(jié): C函數(shù)怎么使用lds文件總的變量abc?

  1. 在C函數(shù)中聲明改變量為extern外部變量類型,比如:extern int abc;

  2. 使用時(shí),要取址,比如:int *p = &abc;//p的只即為lds文件中abc的值


匯編文件中可以直接使用外部鏈接腳本中的變量,但C函數(shù)中要加上取址符號。 解釋一下原因: C函數(shù)中,定義一個(gè)全局變量int g_i;,程序中必然有4字節(jié)的空間留出來給這個(gè)變量g_i。

假如我們的lds文件中有很多變量 lds{ a1 =?; a2 =?; a3 =?; ... } 如果我們C程序只用到幾個(gè)變量,完全沒必要全部存儲lds里面的所有變量,C程序是不保存lds中的變量的。 對于萬一要用到的變量,編譯程序時(shí),有一個(gè)symbol table符號表:

Chapter13 lesson6 001.jpg

如何使用symbol table符號表?

  1. 對于常規(guī)變量g_i,得到里面的值,使用&g_i得到addr;

  2. 為了保持代碼的一致,對于lds中的a1,使用&a1得到里面的值;

這只是一個(gè)編譯器的小技巧,不用深究。

結(jié)論:

  1. C程序中不保存lds文件中的變量,lds再大也不影響;

  2. 借助symbol table保存lds的變量,使用時(shí)加上"&"得到它的值,鏈接腳本的變量要在C程序中聲明為外部變量,任何類型都可以;

13.6代碼重定位_重定位_清除BSS段的C函數(shù)實(shí)現(xiàn)的評論 (共 條)

分享到微博請遵守國家法律
平武县| 盱眙县| 桦川县| 辰溪县| 深圳市| 新安县| 泰来县| 屏边| 疏附县| 永宁县| 德钦县| 寿光市| 襄汾县| 静宁县| 开江县| 穆棱市| 碌曲县| 肇州县| 清镇市| 蛟河市| 万源市| 个旧市| 伊通| 湛江市| 德钦县| 志丹县| 富阳市| 勐海县| 石楼县| 永兴县| 八宿县| 阜城县| 南靖县| 昭平县| 庄浪县| 腾冲县| 马公市| 邻水| 红桥区| 陵水| 吉林市|