概述:
objdump是一个用于分析目标文件的工具,可以查看目标文件中的符号表、重定位表、代码段、数据段等信息。
- 查看目标文件的符号表:可以列出目标文件中定义的全局变量、函数和其他符号。这对于调试和分析目标文件非常有用。
- 查看目标文件的重定位表:可以列出目标文件中的重定位信息,包括需要在链接时进行地址修正的代码和数据的位置。
- 反汇编目标文件的代码段:可以将目标文件中的机器代码转换为汇编代码,方便我们分析和理解程序的执行流程。
- 查看目标文件的数据段:可以查看目标文件中的全局变量、静态变量和常量等数据。
目标文件包括: 可执行程序,.o文件,.so文件
一、objdump -h 命令用于显示目标文件的节表信息。每个节(section)对应目标文件中的一个特定部分,例如代码段、数据段、符号表等。`-h`选项会以表格的形式列出目标文件中的各个节的详细信息,包括节的名称、大小、内存对齐、偏移等。
objdump -h test.so
节: Idx Name Size VMA LMA File off Algn
0 .text 0000002a 0000000000000000 0000000000000000 00000040 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000004 0000000000000000 0000000000000000 0000006c 2**2 CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000000000 0000000000000000 00000070 2**2 ALLOC
3 .rodata 00000005 0000000000000000 0000000000000000 00000074 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment 00000011 0000000000000000 0000000000000000 0000007a 2**0 CONTENTS, READONLY
二、-fPIC
解释: 是一个编译选项,用于生成位置无关代码,以便在共享对象中使用。生成位置无关代码的目的是确保代码段和数据段可以被加载到内存的任何位置,而无需进行绝对地址的重定位。
如何判断一个so库是不是PIC
readelf -d test.so|grep TEXTREL
如果上面的命令有任何输出,那么test.so就不是PIC的,否则就是PIC的,PIC的DSO是不会包含任何代码段重定位表的,TEXTREL表示代码段重定位表地址。