1.目標檔案
編譯器和彙編器生成可重定位目標檔案(包括共享目標檔案)。鏈結器生成可執行目標檔案。
2.可重定位目標檔案和可執行目標檔案的格式
可重定位目標檔案格式:
可執行目標檔案格式:
3.下面我們開始分析上面
而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中標記它們,當程式執行的時候才為它們在記憶體中分配空間,並把它們初始化為零。
4.未初始化的全域性變數和static區域性變數
上圖是目標檔案main.o中的符號表。i的ndx值是com:代表未被分配空間的未初始化的資料目標;j的ndx是3,我們檢視到這是.bss段的索引,所以j在.bss段有佔位符(並不是空間)。
像i這種未初始化內建型別的變數,他並沒有分配空間,是沒法設定斷點的。
下面我們分析i、j最終分配空間時,屬於線性位址空間的哪部分?
這裡我們需要使用cat /proc/processid/maps命令這裡是要檢視程序的id,可以使用ps -aux |grep a.out獲取程序的id。
根據我的測試,像目標檔案的.data,.bss段的內容都會在位址空間的資料段分配空間(bss段內容在第一次使用才才在資料段分配記憶體),像const int k=0和字串常量是在****段中分配記憶體的。這點也可以從深入理解作業系統的p466頁得到驗證。
參考文章:
ELF檔案格式
在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...
ELF檔案格式
elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。準備的說,也就是三種 這不廢話嗎 可執行檔案 靜態鏈結庫 動態鏈結庫 要觀察elf的具體資訊,可以用以下幾個工具 nm lists symbols from object fil...
elf檔案格式
1.elf檔案頭 elf header 標識該檔案為elf檔案 有關檔案型別和大小的資訊 檔案載入進入記憶體後的入口點資訊。2.程式頭表 program header table 向系統提供了可執行檔案的資料在程序虛擬位址空間中組織方式 檔案包含的段的數目 位置和用途。3.節 section 和 段...