- 程序員練級手冊
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++會