最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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)的評論 (共 條)

分享到微博請遵守國家法律
高州市| 大邑县| 元阳县| 南平市| 巴彦淖尔市| 读书| 德州市| 盈江县| 巴彦县| 临海市| 宁强县| 平陆县| 麦盖提县| 永福县| 建阳市| 惠水县| 绍兴市| 蓬溪县| 辽源市| 海盐县| 东海县| 灵台县| 临泉县| 鄂伦春自治旗| 昌都县| 阳信县| 九台市| 藁城市| 沙洋县| 武山县| 那曲县| 武川县| 郁南县| 宜城市| 玉树县| 贞丰县| 连州市| 科技| 洪洞县| 呼图壁县| 普宁市|