對於LD指令碼的理解

2021-06-19 05:26:32 字數 1177 閱讀 6424

指令碼模型:

entry(__entry)

sections

.dynsym         :

.dynstr         :

.gnu.version    :

.gnu.version_d  :

.gnu.version_r  :

.rel.dyn        :

.rel.plt        :

.dynsym         :

.entry_init :

__param_addr = . ;

.text ***          : at( __param_addr + 100)@此處將會出現問題(將導致.plt以及.got覆蓋.text),原因為__param_addr

為執行態當前位址,則當使用at指明.text段載入位址為當前執行位址再加上100,但後面的.plt以及got段又使用預設的載入位址(即載入位址與執行位址相等),這樣就會在鏈結的時候造成.text段有100位元組的載入位址與.ply段重疊!

要點:.text***           : at( __param_addr + 100)@此處將會出現問題(將導致.plt以及.got覆蓋.text),原因為__param_addr

為執行態當前位址,則當使用at指明.text段載入位址為當前執行位址再加上100,但後面的.plt以及got段又使用預設的載入位址(即載入位址與執行位址相等),這樣就會在鏈結的時候造成.text段有100位元組的載入位址與.ply段重疊!

=0 :.text***  為鏈結指令碼任意命名,可在反彙編中查詢到此段名稱,但*(.text .stub .text.* .gnu.linkonce.t.*)中的.text段為各.o中真實的.text段內容(gcc將會預設**段為.text,預設全域性可讀寫變數資料為.data段,預設唯讀全域性資料為.rodata段,預設未初始化的可讀寫資料為.bss段),如果在某個函式前面加上__attribute__ ((section(".main_data"))) 則將改變函式預設的.text段,而歸為新命名的.main_data段,同理,如果在某個全域性變數前面加__attribute__ ((section(".main_data")))則該變數由原來預設的.data段變為新命名 的.main_data段。

__param_addr = . ;的寫法需要注意為 xx = , ;  而非xx=.; z

對於STL的理解

stl standard template library stl是一些 容器 的集合,這些 容器 有list,vector,set,map等,stl也是演算法和其他一些元件的集合。這裡的 容器 和演算法的集合指的是世界上很多聰明人很多年的傑作。stl的目的是標準化元件,這樣就不用重新開發,可以使用...

對於ftok的理解

回顧了一下以前的實驗,一直不理解為什麼在訊息佇列中要使用ftok,比如下面的乙個例項 if key ftok a 1 qid msgget key,ipc creat 0666 建立乙個訊息佇列 if qid 0 printf created queue id d n qid 輸出訊息佇列的id 要...

對於Zookeeper的理解

zookeeper是google 的chubby乙個開源的實現,是hadoop 的分布式協調服務。它包含乙個簡單的原語集,分布式應用程式可以基於它實現同步服務,配置維護和命名服務等。zookeeper包括乙個leader和多個follower。為什麼使用zookeeper?大部分分布式應用需要乙個主...