- 程序员练级手册
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++会