第013课_代码重定位
第013課 代碼重定位
1. 段的概念_重定位的引入
2. 鏈接腳本的引入與簡單測試
參考資料:
Using LD, the GNU linker
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html
3. 鏈接腳本的解析
4. 拷貝代碼和鏈接腳本的改進
a. 拷貝代碼要改進
b. 鏈接腳本要改進
5. 代碼重定位與位置無關(guān)碼
怎么寫位置無關(guān)的程序:
使用位置無關(guān)碼! 不使用絕對地址! 最根本的辦法是看反匯編
a. 調(diào)用程序時使用B/BL相對跳轉(zhuǎn)指令
b. 重定位之前, 不可使用絕對地址,比如:
不可訪問全局變量/靜態(tài)變量
不可訪問有初始值的數(shù)組(因為初始值放在rodata里,使用絕對地址來訪問)
c. 重定位之后, 使用絕對跳轉(zhuǎn)命令跳到Runtime Addr,比如:
ldr pc, =main
6. 重定位_清除BSS段的C函數(shù)實現(xiàn)
C代碼中如何使用鏈接腳本中定義的變量
http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=16231&highlight=%C1%B4%BD%D3%BD%C5%B1%BE
參考文章:https://sourceware.org/ml/binutils/2007-07/msg00154.html
C函數(shù)怎么使用lds文件中的變量abc?
a. 在C函數(shù)中聲明改變量為extern類型, 比如:
extern int abc;
b. 使用時, 要取址, 比如:
int *p = &abc; // p的值即為lds文件中abc的值
作業(yè):
(1).使用printf函數(shù)打印以下信息:
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
a. 打印dest, end, src的值
b. 打印dest, end, src所指向的地址的值
(2). 修改鏈接腳本,把程序重定位到0x32000000
再觀察上述打印結(jié)果
?
posted on 2018-03-10 16:46 Dream998 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/Dream998/p/8540612.html
總結(jié)
以上是生活随笔為你收集整理的第013课_代码重定位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ2647 : [Neerc201
- 下一篇: js特效