ELF学习

add.c

int shared = 1;
int add(int num1, int num2)
{
  int sum = 0;
  sum = num1 + num2;
  return sum;
}

编译add.c成.o文件

gcc -c add.c(-c表示只编译不链接)

file add.o输出结果如下:

此结果表明add.o是个重定位文件。

查看elf header可查看到更详细信息:readelf -h add.o

由于是重定位文件,ELF中并没有program header,entry point为0x0,有11个section. section header的字符串表在section 中的索引为8.ELF header的size为52.

通过readelf -S add.o 查看section header。

Off这一列是表示section在ELF文件中的偏移量,.text的偏移量是0x34,转换成十进制正好是52(ELF header大小),说明header后面紧接着是.text。

.text内容可以通过objdump来查看:objdump -s -d add.o(-s表示将内容以16进制打印出来,-d表示反汇编)

.text只包含add函数,其大小为0x1d.

.data保存了初始化了的全局变量和静态变量。在add.c中.data只包含shared这一个int型变量,所以其size为4。

.data的偏移量为0x34+0x1d=0x51,由于.data是4字节对其的,所以offset为0x54.

.bss保存的是未初始化的全局变量和局部静态变量。

时间: 2024-12-28 18:58:34

ELF学习的相关文章

ELF学习--装载过程

当我们在linux bash下执行ELF程序时,Linux系统是怎样装载和执行的呢? 1.bash进程fork出子进程 2.在bash的子进程中调用execve系统调用来执行指定的ELF. 3.execve系统调用的入口是sys_execve,在sys_execve会调用do_execve 4.在do_execve中会读取可执行文件的前128个字节.这128个字节用来判断可执行文件是哪种类型. 5.do_execve读取了128个字节的文件头后,调用serch_binary_handle去搜索匹

ELF(Executable and Linkable Format)学习

目录 0. 引言 1. ELF文件格式 2. ELF格式分析工具 0. 引言 可执行链接格式(Executable and Linking Format)最初是由UNIX系统实验室(UNIX System Laboratories,USL)开发并发布的,作为应用程序二进制接口(Application Binary Interface,ABI)的一部分.ELF标准的目的是为软件开发人员提供一组二进制接口定义,这些接口可以延伸到多种操作环境,从而减少重新编码.重新编译程序的需要.接口的内容包括: 1

C语言的ELF文件格式学习

最近的lab里面有ELF文件相关的,所以成这个几乎,学点ELF的东西. ELF,是一种文件格式.暂时,只看可执行文件的ELF文件格式. 首先,给出文件的格式的布局图: 光看这个很难理解,所以写一个小的程序,用readelf来结合的看. 程序比较简单: #include <stdio.h> #include <stdlib.h> int data[100] ={0}; int bss[100]; int main() { int i=0; for(i=0; i<100; i++

20145309信息安全系统设计基础第2周学习总结

教材学习内容总结 第一章 计算机系统漫游 (每小节基本内容概括) 1.1 信息就是位+上下文 文本文件:由ASCII字符构成的文件 二进制文件:其他文件 在不同的上下文中,一个同样的字节序列可能表示不同信息 1.2 程序被其他程序翻译成不同的格式 从源文件到目标文件的转化是由编译器驱动程序完成gcc -o hello hello.c 编译系统:预处理器.编译器.汇编器和链接器 预处理阶段:.c->.i,根据以字符#开头的命令,修改原始的C程序 编译阶段:.i->.s,汇编语言程序 汇编阶段:.

Smart210学习记录------块设备

转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的块设备进行mkfs,mount和读写文件.为了尽可能简单,这个驱动的规模不是1000行,也不是500行,而是100行以内. 这里插一句,我们不打算在这里介绍如何写模块,理由是介绍的文章已经满天飞舞了.如果你能看得懂.并且成功地编译.运行了这段代码,我们认为你已经达到了本教程的入学资格,当然,如果你不

arm-linux内存管理学习笔记(2)-内核临时页表的建立

学习了arm内存页表的工作原理,接下来就开始咱们软件工程师的本职工作,对内核相关代码进行分析.内核代码那么复杂,该从哪里下手呢,想来想去.其实不管代码逻辑如何复杂,最终的落脚点都是在对页表项的操作上,那么内核是在什么时机会对页表项进行操作,如何操作? 对于一个页表项,抛开所有的软件复杂逻辑,操作无非就是2种吧.一是填写更新页表项,二是读取获取页表项. MMU负责根据页表项进行虚实地址转换,因此读取获取页表项的工作是MMU硬件完成,软件是不参与的.内核代码的主体工作是来更新内存页表.页表更新的时机

linux学习总结

20135103王海宁 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.学习感想 九个星期的学习时间结束了,真的对linux是又爱又恨,爱它的变化多端应用性强,恨它的难以捉摸自己操作起来实在不容易.linux不同于所学的其他东西,捧着一本书死啃一个月也不会有什么进展,除了要自己动手实践之外,还需要一个领路人把你领进去,当你摸索到门道之后才能顺着大路走,否则可能会原地打转,甚至误入歧途,在此真的很荣幸碰到孟老

《Linux内核分析》课程第七周学习总结

姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 学习内容:Linux内核如何装载和启动一个可执行程序 理解编译链接的过程和ELF可执行文件格式: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式: 使用gdb跟踪分析一个execve系统调用内核处

LINUX内核分析第七周学习总结——可执行程序的装载

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 2.目标文件的格式ELF 3.静态链接的ELF可执行文件和进程的地址空间 (二)可执行程序.共享库和动态加载 1.装载可执行程序之前的工作 2.装载时动态链接和运行时动态链接应用举例 (三)