程序员的自我修养 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++会

发布了177 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Hesy_H/article/details/100782411