国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

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

分享到微博請遵守國家法律
论坛| 葫芦岛市| 西贡区| 甘泉县| 吉安县| 新乐市| 青海省| 沂水县| 田阳县| 醴陵市| 青州市| 和林格尔县| 政和县| 西丰县| 栾城县| 邯郸县| 神农架林区| 获嘉县| 丽水市| 拜城县| 云南省| 海淀区| 宾川县| 嘉峪关市| 茌平县| 祁连县| 揭阳市| 囊谦县| 邓州市| 新龙县| 孝感市| 五原县| 裕民县| 布拖县| 东乡县| 东乡族自治县| 芜湖县| 手机| 天气| 凉城县| 桂东县|