日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第013课_代码重定位

發(fā)布時間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第013课_代码重定位 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。