第三章 Linux目标文件解析

解析目标文件内容:举例说明

cpp 复制代码
//root@ubuntu:/mnt/hgfs/share/019-proself/04# cat simplesection.c
int printf(const char* format,...);
int global_init_var=84;
int global_uninit_val;
void func1(int i)
{
        printf("%d\n",i);
}
int main(void)
{
        static int static_var = 85;
        static int static_var2;
        int a=1;
        int b;
        func1(static_var + static_var2 + a  + b);
        return a;
}

1、文件格式有哪些?

2、ELF文件类型有几种类型?

(1)可重定位文件.o

(2)可执行文件

(3)共享目标文件

(4)核心转储文件(Linux下的core dump文件)

3、如何查看文件类型---file命令

4、目标文件的基本框架

(1)虚拟空间的映射关系

(2)objdump -h 查看文件总共的段以及偏移

注意:bss段并不占文件的空间。

(3)接下来分析代码段

从objdump -h查看文件段空间知道,text的偏移和大小,

objdump -s 查看段内容

objdump -d 查看段反汇编

(4)数据段

①.data段存放了初始化的全局变量和局部静态变量。

②printf的时候用到了字符串常量"%d\n",存放在.rodata

③小端存储0x54

④强符号和弱符号概念

(5)bss段

存放未初始化的全局变量和局部静态变量。准确的将是.bss段为他们预留空间。我们只能通过符号表查看,使用objdump -s打印所有段的内容无法查看,以为不在文件中存放。

问题:从代码来看bss,应该有3个整形数

(7)常见的其他短分析

复制代码
root@ubuntu:/mnt/hgfs/share/019-proself/04# objdump -h /bin/ls

/bin/ls:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .interp       00000013  08048154  08048154  00000154  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  08048168  08048168  00000168  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.gnu.build-id 00000024  08048188  08048188  00000188  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     0000006c  080481ac  080481ac  000001ac  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       00000820  08048218  08048218  00000218  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       000005d5  08048a38  08048a38  00000a38  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  00000104  0804900e  0804900e  0000100e  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .gnu.version_r 000000c0  08049114  08049114  00001114  2**2  
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rel.dyn      00000038  080491d4  080491d4  000011d4  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .rel.plt      00000380  0804920c  0804920c  0000120c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .init         00000023  0804958c  0804958c  0000158c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .plt          00000710  080495b0  080495b0  000015b0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .text         0001078c  08049cc0  08049cc0  00001cc0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .fini         00000014  0805a44c  0805a44c  0001244c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .rodata       000040a8  0805a460  0805a460  00012460  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 15 .eh_frame_hdr 00000744  0805e508  0805e508  00016508  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 16 .eh_frame     00002f34  0805ec4c  0805ec4c  00016c4c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 17 .init_array   00000004  08062ef8  08062ef8  00019ef8  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 18 .fini_array   00000004  08062efc  08062efc  00019efc  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 19 .jcr          00000004  08062f00  08062f00  00019f00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 20 .dynamic      000000f8  08062f04  08062f04  00019f04  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 21 .got          00000004  08062ffc  08062ffc  00019ffc  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 22 .got.plt      000001cc  08063000  08063000  0001a000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 23 .data         00000160  080631e0  080631e0  0001a1e0  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 24 .bss          00000c54  08063340  08063340  0001a340  2**5
                  ALLOC
 25 .gnu_debuglink 00000008  00000000  00000000  0001a340  2**0
                  CONTENTS, READONLY

5、为什么需要把数据段和指令分开存放?

(1)权限问题,代码段只读

(2)现代cpu缓存有数据缓存和指令缓存

(3)为了实现多进程共享指令和共享数据

6、反过来分析elf的文件头

ELF头定义的结构体:

7、分析段表

①利用readelf -S 查看段表

②段的类型

8、重定位表

对于每一个需要重定位的代码段和数据段,都需要一个对应的重定位表。因为text中使用了printf函数,需要访问绝对地址。而.data中,没有绝对地址的引用,它只包含了几个常量。

9、字符串表

相关推荐
请注意这个女生叫小美1 小时前
C语言 斐波那契而数列
c语言
Legendary_0081 小时前
Type-C 一拖二快充线:突破单口限制的技术逻辑
c语言·开发语言
智者知已应修善业1 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德2 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
No0d1es3 小时前
电子学会青少年软件编程(C语言)等级考试试卷(四级)2025年12月
c语言·青少年编程·电子学会·四级·2025年
皮皮哎哟3 小时前
深入浅出双向链表与Linux内核链表 附数组链表核心区别解析
c语言·数据结构·内核链表·双向链表·循环链表·数组和链表的区别
wanghu20244 小时前
AT_abc443_C~E题题解
c语言·算法
梵刹古音4 小时前
【C语言】 浮点型(实型)变量
c语言·开发语言·嵌入式
-dzk-5 小时前
【代码随想录】LC 203.移除链表元素
c语言·数据结构·c++·算法·链表
进击的小头5 小时前
陷波器实现(针对性滤除特定频率噪声)
c语言·python·算法