可重定位目标文件

【0】GCC将源代码转化成可执行代码的流程

  • (1)C预处理器cpp扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;
  • (2)编译器ccl产生两个源代码的汇编代码:*.s;
  • (3)汇编器as将汇编代码转化为二进制目标代码 :*.o ; (目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但没有填入地址的全局值)
  • (4)链接器ld将目标代码与实现库函数的代码合并,最终产生可执行代码文件;

【1】第一步,源码演说

【2】生成目标文件p107.o 及对其反汇编

2.1) gcc -O1 -c p107.c 》》 产生目标文件 p107.o (注意,此时还没有链接)

2.2) objdump -d p107.o >> p107-obj-dis.s 反汇编目标文件p107.o 得到 p107-obj-dis.s 如下:

【3】生成可执行文件p107及对其反汇编

3.1) gcc -O1 -o p107 p107.o p107-main.c 生成可执行文件p107(注意, 此时已经经过链接过程了)

3.2) objdump -d p107 >> p107-exe-dis.s 反汇编可执行文件 p107 , 得到p107-exe-dis.s 汇编文件,该文件内容如下:

【4】比较p107-obj-dis.s 和 p107-exe-dis.s

【总结】

一句话说完,重定位目标文件是汇编器 使用编译器输出的汇编语言输出的二进制目标文件, 要知道目标文件使用的是相对物理(内存)地址,重定位的目的就是变相对物理地址到绝对物理地址。(bingo)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-21 22:01:31

可重定位目标文件的相关文章

ELF格式的重定位原理分析

前面有篇文章分析了ELF格式,也只是让我们对目标文件有了一个大概的了解,并没有说明一个十分重要的问题:重定位,今天重新看了下重定位的资料,终于弄懂了重定位的过程,下面来做一个分析. 我们将使用下面两个源代码中的文件a.c和b.c展开分析: //a.c extern int shared; int main() { int a=100; swap(&a,&shared); } //b.c int shared=1; void swap(int *a,int *b) { *a^=*b^=*a^

[CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口

1 平台 1.1 硬件 Table 1. 硬件(lscpu) Architecture: i686(Intel 80386) Byte Order: Little Endian 1.2 操作系统 Table 2. 操作系统类型 操作系统(cat /proc/version) 位数(uname -a) Linux version 3.2.0-4-686-pae i686(32bit) 1.3 编译器 Table 3. 编译器信息 编译器(gcc -v) gcc (Debian 4.7.2-5) 4

链接脚本与重定位

目录 链接脚本与重定位 总结 链接脚本格式 COMM段BSS段 elf和bin文件 获得链接脚本的值 重定位 1-直接指定数据段位置(代码黑洞) 2-分散加载(数据段) 3-全局重定位(一体式) BL跳转指令 bss段处理 汇编处理 C处理 位置无关码 title: 链接脚本与重定位 tags: ARM date: 2018-10-12 19:25:53 --- 链接脚本与重定位 学习视频 韦东山 总结 尽量使用一体式的链接脚本,方便简单,灵活 学会使用链接脚本的值 bss段和comm段是需要我

程序员的自我修养:(1)目标文件

程序员的自我修养:(1)目标文件 1.目标文件 1.1 编译与链接 在使用像Visual Studio或Qt Creator等IDE时,通常有一个叫做"构建"的按钮.当编辑完成要运行和测试时点一下它,程序就能跑起来了,所以我们很少关心编译和链接.其实,编译和链接合并在一起就称为 构建(Build).简单的一次按键,实际背后却是异常复杂的过程: 预编译(Preprocessing) 编译(Compilation) 扫描:算法类似有限状态机(FSM),将字符转换成Token. 语法分析:分

在Unix系统上,从源文件、目标文件、可执行文件的编译过程

是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, [cpp] view plaincopy #include <stdio.h> int main() { printf("hello, world/n"); return 0; } 并把它翻译成一个可执行目标文件hello,这个过程是分为四个阶段完成的.如下图所示,执行这四个阶段的程序(预处理器.

第二部分:S5PV210_重定位和链接脚本_2

重定位和链接脚本 (1)重定位:分为静态重定位和动态重定位 静态重定位:静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令 我们下面要分析就是静态重定位的情况. 动态重定位:动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位.更确切地说,是在每次访问内存单元前才进行地址变换.动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持. 图片的参考来源:http://c.biancheng.ne

目标文件里的秘密

目标文件内包含指令代码.数据和链接环节所需要的一些信息,如符号表.调试信息.字符串表等.一般目标文件将这些信息按不同的属性分类,以"段"的形式存储.本文将在Linux环境下,用bjdump.readelf工具查看目标文件存储的具体形式,可得目标文件中由C语言编译后执行语句放在.text段,已经初始化的全局变量和和局部静态变量放在.data段,未初始化的全局变量和局部静态变量放在.bss段,ELF文件中各个段的基本属性放在.symtab段,段表中很重要的还有重定位表以及ELF文件头. 详

ELF Format 笔记(十)—— 重定位(relocation)

ilocker:关注 Android 安全(新手) QQ: 2597294287 重定位就是把符号引用与符号定义链接起来的过程,这也是 android linker 的主要工作之一. 当程序中调用一个函数时,相关的 call 指令必须在执行期将控制流转到正确的目标地址.所以,so 文件中必须包含一些重定位相关的信息,linker 据此完成重定位的工作. 这些重定位信息保存在一系列的重定位项中,重定位项的结构如下: 这些重定位项位于 .rel.plt section 中. r_offset:对于可

重定位与链接脚本

1.为什么需要重定位 位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关. 位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的. 我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址).就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行.最后得到的二进制程序理论上是和你指定的运行地址有关的,将来这个程序被执