程序員的自我修養 chapeter 3 目標文件






  • 程序員練級手冊
    https://coolshell.cn/articles/4990.html
  • 在這裏插入圖片描述

ELF文件

  • ELF和PE都是COFF文件的變種 所以windows下的.lib和.dll ( library 靜態 ;dynamicl linking library動態 ) 與 linux下的.a和.so (archive 靜態 ; shared object 動態) 很像

共同物件檔案格式(英語:Common Object File Format,縮寫為COFF),又稱通用目標文件格式,是一種用於執行檔、目的碼、共享庫(shared library)的檔案格式,使用於類UNIX系統上。
在這裏插入圖片描述

格式

最基本的.o文件長成這樣
在這裏插入圖片描述

.bss

.bss段存放未初始化的全局變量和局部靜態變量
未初始化的靜態變量肯定是在這個段裏面的,但是未初始化的全局變量不一定放着裏面
當靜態變量被賦值爲0的時候被看作沒有初始化,所以優化掉了可以被放在.bss段裏面

.data

.data段存放存放已初始化的全局變量和局部靜態變量

.text / .code

.text段存放代碼

除此以外目標文件還有很多其他的段


命令

readelf

  • -s symbol
  • -t --section-details
  • -h --file-header
    –> 沒有-f選項

objdump -s (source) -t ( symbol table ) -h section header

od命令


objdump

  • -f file header
  • -h section header
    在這裏插入圖片描述
    -h得到的 其中框起來的那行是屬性,Content表示這個段的內容在這個文件裏面存着,可以看到.bss段沒有在這個文件裏面存着
  • -d disassemble
  • -s full-contents in hex format
  • -t 打印符號表

size

查看代碼段、數據段、BSS段的長度
在這裏插入圖片描述
自己寫的段名字不能以點(.)開頭


objcopy

  • 將二進制文件作爲目標文件中的一個段
  • -R參數可以剔除某些段

nm

name 的縮寫
nm xx.o --> symbol value(heximal) symbol_type symbol name
還有一些參數可以用於只顯示某些段


自定義段




3.4文件結構描述

在這裏插入圖片描述

  • file header
    readelf -h / objdump -f 命令

===== 還要從上面開始好好重新回顧一下

3.5

  • 函數簽名

  • c++filt

  • p94 爲什麼要定義弱引用pthread_create呢 因爲只有有了弱引用 纔會去找強引用 否則你就算-lpthread鏈接器也不會load進去。然後定義了以後呢,沒有-lpthread的話 也不會咋樣,弱引用的值默認爲0(或者是一個程序規定好的值),所以通過if( weak_reference )可以實現多個不同功能版本之間代碼的靈活轉換且不用寫多份了

  • C和C++編譯器一個區別還有:C編譯時不會給變量進行修飾 但是C++會

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章