你有听过“动态重定位”这个名字吗?不过你知道什么叫“静态重定位”不?这跟给宝宝洗澡调水温有点像,就是先把程序里的各种线索(比如函数名全局变量啦)放到合适的地方去。这样,它们就能在跑起来的时候快速找到家了,整个程序也就运转的溜溜的!所以,今天咱们就来聊聊这件既有趣又实用的事情,看看它在编程中到底有多魔法呢~
可执行文件中的二进制代码和符号信息
搞定了那个执行文件之后,就可以看见我们预想到的代码和一些特别符号。别只盯着代码和积木看,这儿还有个“符号表”,真的有点像地图,能告诉你每个符号到底在什么地方。不过,这些符号现在还不知道它们应该待在哪儿,就是找不到那个叫做“内存地址”的神奇地方。现在咱们需要给它来点狠招——静态重定位,让它们找到自己真正的家。
操作系统加载可执行文件
电源一开,电脑就开始启动了,就是我们说的那个“EASY RIDE”(简单启动)功能。你想用哪个APP的话,它马上就能打开。这时候,电脑得先了解一下这个新进的小伙子到底是什么鬼,然后把它的指令安排到正确的地方去。如果这个文件里面有啥符号表之类的,那电脑也会立刻跟内存地址联系在一起。
静态重定位过程
让我给你举个例子说明,好比这句简单的C代码:
c #include <stdio.h> void func(){ 快看看,这就是个函数~ }#include int globalVar = 10; void func() { printf("Hello, world! "); } int main() { func(); printf("The value of globalVar is: %d ", globalVar); return 0; }int main(){
func();
return 0;gcc -o example example.c搞定了!我们用 GCC 把程序编译成能跑起来的小家伙,然后生成了一个 output 文件,里面有程序的二进制码和符号解析信息哈。
查看可执行文件内容
通过objdump命令可以查看这个可执行文件的内容:
shell objdump -d example 运行后可以看到类似以下输出:objdump -d exampleassembly
08048454 <func>:
8048454:55,把上一个堆栈的指针挪下来。
... 0804860d : 804860d: 55 push %ebp 804860e: 89 e5 mov %esp,%ebp 8048610: 83 ec 10 sub $0x10,%esp 8048613: c7 04 24 20 87 04 08 movl $0x8048720,(%esp) 804861a: e8 d1 fe ff ff call 80484f0 804861f: c9 leave 8048620: c3 ret 08048621: 8048621: 55 push %ebp 8048622: 89 e5 mov %esp,%ebp 8048624: 83 ec 10 sub $0x10,%esp 8048627: e8 e1 ff ff ff call 804860d 804862c: 8d 05 fc ff ff ff lea -0x4(%ebp),%eax 8048632: 8b 00 mov (%eax),%eax 8048634: 50 push %eax 8048635: 8d 45 f4 lea -0xc(%ebp),%eax 8048638: 50 push %eax 8048639: 68 00 88 04 08 push $0x8048800 804863e: e8 7d fe ff ff call 804841e 8048643: 83 c4 10 add $0x10,%esp 8048646: b8 00 00 00 00 mov $0x0,%eax 804864b: c9 leave 804864c: c3 ret ... 各位,我得说清楚!”7e21″在我们计算机程序里就是”mov”的意思!它干啥?就是让堆栈指针移动到ebp寄存器里面。
…
080484cc <main>:
80484cc: 55, 把上一条的EBP给推过去。
这你肯定知道!那著名的”80484cd:89e5″指令居然能从 esp 把数据搬到 ebp 上,是不是很厉害?!
这段代码说,要跑到8048454这个地方去。
分析汇编代码
好,关于这些代码你们搞得定吗?看了这里,你应该能明白什么是func函数和main函数,以及它们是如何出现的。接下来我们在main函数中通过call指令调用func函数,就像是让电脑告诉func函数去执行任务。这时候,我们需要运用“静态重定位”这个技巧。简单来说,就是将 call指令提到的func函数地址换成真正运行时候的内存地址!
操作系统加载与链接
想运行EXE文件?咱们电脑操作系统可是大功臣!首先得让系统用”打开文件”这个功能,把所有东西塞进内存里;然后,就是找出每个符号在哪里的事儿啦;稍后,还得告诉程序哪个库函数要用;最后,启动程序让它跑起来这就是所谓的静态重定位,保证每个符号都有自己的正确内存地址喔!
确保程序正常运行
要让软件飞快运行,必须先搞定这个叫静态重定位的玩意儿。它就像个迷路的快递员,帮我们把符号送对地方。搞定了它,软件就会飞起来哒,实现你想要的各种功能!
总结与展望
说实话,动态重定位非常关键,直接影响到电脑程序能否顺畅启动和运行!尤其是编写或者使用软件时,更要弄明白它怎么运作,包括哪些过程,以及为什么这么重要。这样才能真正理解动态重定位。
电子产品太神奇!这次静态重定向变得厉害极了,不过也带来了不少问题。咋办?我们当然要考虑怎样提升效率、节约资源,更重要的是要保护数据安全性。这可不是小事情,需要花时间好好琢磨琢磨。
看完这个文章,你就能明白静态重定位是啥!这样工作和学习都能轻松处理记得留个言跟我说说你对电脑编程的理解,咱们可以一起侃大山!
原文链接:https://www.icz.com/technicalinformation/web/2024/04/13742.html,转载请注明出处~~~
评论0