探寻ELF文件内容,理清符号所在section

受《CSAPP》P453启发,想实际的看看ELF文件的内容,所以做了简单的尝试,希望不虚此行。

采用的程序demo是:

swap.c

extern int buf[];

int *bufp0 = &buf[0];
int *bufp1;

void swap()
{
    int temp;

    bufp1 = &buf[1];
    temp = *bufp0;
    *bufp0 = *bufp1;
    *bufp1 = temp;
}

main.c

#include <stdio.h>

void swap();

int buf[2] = {1, 2};

static int foo = 99;

int f(){
        static int x = 1;
        return x;
}

int g(){
        static int x = 2;
        return x;
}

int main()
{
    swap();
    printf("Hello World.\n");
    return 0;
}

下面通过命令readelf命令来探寻ELF内部。

?

可以看到ELF头的一些信息:采用补码,小段序;目标文件的类型是可重定位目标文件;机器类型是Intel80386;ELF header的大小是52B;有30个section header,共40B;等等。

可以看到ELF中各个section的索引号,起始地址,大小,标志字段。只读数据段15,已初始化全局变量24,未初始化全局变量25,符号表28,字符串表29,代码段13.(其他的现在还不懂)。接下来结合上面的代码看符号表信息。

Ndx列表明每个符号所在的段,其中有三个伪段(pseudo section):ABS表示不该被重定位的符号,UNDEF表示在本模块引用,却在其他模块定义,COMMON表示还未分配位置的未初始化对象。

main.c, swap.c代表源文件名,类型是ABS。

f, g是在main.c中定义的俩函数,type=FUNC, bind=GLOBAL, 表示全局函数,所在的section是13(.text),起始地址分别为80483d4,de,大小都是10B.

变量foo, buf都是初始化的全局变量,在24号段(.data)中,大小分别是4,8B,不同在于foo有static修饰,所以bind=LOCAL,对于buf0,buf1也是类似情况.

特别值得关注的是定义在函数f, g中的有static修饰的同名局部变量x,在符号表中有唯一的local linker symbols:x.1688, x.1691都在全局初始化段中,bind=LOCAL.

接下来看swap.o的ELF信息:

可以看到类型是可重定位目标文件。(REL)

与前面readelf -a a.out很大不同的地方在于这里多了一些.rel.text  .rel.data等可重定位的section,这是有目标文件的类型决定的,可重定位目标文件存在的意义就是被链接到其他目标文件中,构建可执行目标文件,所以就需要在ELF中表明哪些符号需要进行地址的修改。调用外部函数或者引用全局变量的指令都需要修改,本地函数调用是相对地址,所以不需要修改。上述代码段位置列表在这里显然表示的就是swap()里面需要重定位的对象,其中操纵了1次buf符号,3次bufp1,
2次bufp0, 所以出现了对应的条目,并且根据偏移量可以更好的理解。在重定位数据段中就只有我们引用的外部变量buf。

在swap.o的符号表中,bu所在的section是UND Type=NOTYPE,表明其是extern的。bufp0是以初始化的全局变量,32位系统指针大小是4B,所在的section number是3(.data).特别要注意的是bufp1是未初始化未分配位置的对象,所以Ndx=COM, value值指明的是对齐要求。

总结:通过以上的分析可以更清晰的理解可执行文件的内存布局, 不同对象所在的section,从而指导自己的程序设计。

时间: 2024-10-24 02:17:08

探寻ELF文件内容,理清符号所在section的相关文章

ELF文件

ELF文件格式是一个开发标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型: 可重定位的目标文件 可执行文件 共享库 现在分析一下上一篇文章中经过汇编之后生成的目标文件max.o和链接之后生成的可执行文件max的格式,从而理解汇编.链接和加载执行的过程. 一.目标文件 ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器看来它是由Program Hea

实例分析ELF文件静态链接

1.ELF文件格式概貌 readelf -h 查看elf文件头部信息可以看到Type值有三种:REL,EXEC,DYN. REL文件是只被编译没有被链接过的文件,其格式属于左边一种,elf header+section1,2,3...+section header table,每个section对应一个section header table entry,section header table为各个section提供索引.没有被链接过的文件没有program header,不能被加载到内存中运

十二:对文件内容索引练习例子

需求: 对文件中的内容进行索引,并且显示出对文件内容索引以及所在文件名称: a.txt hello tom hello jerry hello tom b.txt hello jerry hello jerry tom jerry c.txt hello jerry hello tom 最终输出结果: hello   a.txt-->3  b.txt-->2  c.txt -->2 jerry   a.txt-->1  b.txt-->3  c.txt -->1 tom

关于cat命令修改文件内容(导入变量符号以及变量内容)

cat >1.txt<<END $1=1 $2=2 $1 $2 END 查看文件内容为: [root@server04 ~]# cat 1.txt =1 =2 [root@server04 ~]# 说明导入的$1,$2自动被解析了.但是当我们想输入一些变量而不被解析时怎么办呢?只需要为END加上单引号即可 cat >2.txt<<'END' $1=1 $2=2 $1 $2 END [root@server04 ~]# cat 2.txt $1=1 $2=2 $1 $2

Linux内核工程导论——进程:ELF文件执行原理(2)

ELF 强符号与弱符号(本小节是转别人的) 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将它们都初始化,那么链接器将A和B进行链接时会报错: 1 b.o:(.data+0x0): multiple definition of `global'2 a.o:(.data+0x0): first defined here 这种符号的定义

Linux之ELF文件初探

对比windowsPE文件与概述 在windows中可执行文件是pe文件格式,Linux中可执行文件是ELF文件,其文件格式是ELF文件格式,在Linux下的ELF文件除了可执行文件(Excutable File),可重定位目标文件(RellocatableObject File).共享目标文件(SharedObjectFile).核心转储文件(Core DumpFile)也都是ELF格式文件. 一个典型的ELF文件大致的结构如下 文件头(ELF Header) 程序头表(Program Hea

linux实践之ELF文件分析

linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf.o文件. 查看scn15elf.o中各个段和符号表的信息. 各个段的详细信息如下. 符号表的信息如下: 使用readelf命令查看各个段的详细信息: 段表信息如下: 符号表信息如下: 下面让我们开始分析文件头吧! 由于我的虚拟机是32位的,我下面就主要以32位的系统进行分析,就不比较32位机和64

ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-04 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 加载和动态链接 从编译/链接和运行的角度看,应用程序和库程序的连接有两种方式. 一种是固定的.静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中: 另一种是动态链接,是指库函数的代码并不进入应用软件的目标映像,应用软件在编译/链接阶段并

ELF文件加载与动态链接(一)

ELF格式文件简单介绍 关于ELF文件的详细介绍,推荐阅读: ELF文件格式分析 —— 滕启明.ELF文件由ELF头部.程序头部表.节区头部表以及节区4部分组成. 通过objdump工具和readelf工具,可以观察ELF文件详细信息. ELF文件加载过程分析 从编译.链接和运行的角度,应用程序和库程序的链接有两种方式.一种是静态链接,库程序的二进制代码链接进应用程序的映像中:一种是动态链接,库函数的代码不放入应用程序映像,而是在启动时,将库程序的映像加载到应用程序进程空间. 在动态链接中,GN