当前位置: 首页 > news >正文

网站建设h5简单漂亮的logo图片

网站建设h5,简单漂亮的logo图片,qa wordpress,凡科网站建设样品图目录 疑问 编译、链接和装载#xff1a;拆解程序执行 ELF 格式和链接#xff1a;理解链接过程 小结 疑问 既然我们的程序最终都被变成了一条条机器码去执行#xff0c;那为什么同一个程序#xff0c;在同一台计算机上#xff0c;在 Linux 下可以运行#xff0c;而在… 目录 疑问 编译、链接和装载拆解程序执行 ELF 格式和链接理解链接过程 小结 疑问 既然我们的程序最终都被变成了一条条机器码去执行那为什么同一个程序在同一台计算机上在 Linux 下可以运行而在 Windows 下却不行呢反过来Windows 上的程序在 Linux 上也是一样不能执行的。可是我们的 CPU 并没有换掉它应该可以识别同样的指令呀 如果你和我有同样的疑问那这一节我们就一起来解开。 编译、链接和装载拆解程序执行 我们知道写好的 C 语言代码可以通过编译器编译成汇编代码然后汇编代码再通过汇编器变成 CPU 可以理解的机器码于是 CPU 就可以执行这些机器码了。你现在对这个过程应该不陌生了但是这个描述把过程大大简化了。下面我们一起具体来看C 语言程序是如何变成一个可执行程序的。 我们先把前面的 add 函数示例拆分成两个文件 add_lib.c 和 link_example.c。 // add_lib.c int add(int a, int b) {return ab; } // link_example.c#include stdio.h int main() {int a 10;int b 5;int c add(a, b);printf(c %d\n, c); } 我们通过 gcc 来编译这两个文件然后通过 objdump 命令看看它们的汇编代码。 $ gcc -g -c add_lib.c link_example.c $ objdump -d -M intel -S add_lib.o $ objdump -d -M intel -S link_example.oadd_lib.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 add:0: 55 push rbp1: 48 89 e5 mov rbp,rsp4: 89 7d fc mov DWORD PTR [rbp-0x4],edi7: 89 75 f8 mov DWORD PTR [rbp-0x8],esia: 8b 55 fc mov edx,DWORD PTR [rbp-0x4]d: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8]10: 01 d0 add eax,edx12: 5d pop rbp13: c3 ret link_example.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 main:0: 55 push rbp1: 48 89 e5 mov rbp,rsp4: 48 83 ec 10 sub rsp,0x108: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4],0xaf: c7 45 f8 05 00 00 00 mov DWORD PTR [rbp-0x8],0x516: 8b 55 f8 mov edx,DWORD PTR [rbp-0x8]19: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]1c: 89 d6 mov esi,edx1e: 89 c7 mov edi,eax20: b8 00 00 00 00 mov eax,0x025: e8 00 00 00 00 call 2a main0x2a2a: 89 45 f4 mov DWORD PTR [rbp-0xc],eax2d: 8b 45 f4 mov eax,DWORD PTR [rbp-0xc]30: 89 c6 mov esi,eax32: 48 8d 3d 00 00 00 00 lea rdi,[rip0x0] # 39 main0x3939: b8 00 00 00 00 mov eax,0x03e: e8 00 00 00 00 call 43 main0x4343: b8 00 00 00 00 mov eax,0x048: c9 leave 49: c3 ret 既然代码已经被我们“编译”成了指令我们不妨尝试运行一下 ./link_example.o。 不幸的是文件没有执行权限我们遇到一个 Permission denied 错误。即使通过 chmod 命令赋予 link_example.o 文件可执行的权限运行./link_example.o 仍然只会得到一条 cannot execute binary file: Exec format error 的错误。 我们再仔细看一下 objdump 出来的两个文件的代码会发现两个程序的地址都是从 0 开始的。如果地址是一样的程序如果需要通过 call 指令调用函数的话它怎么知道应该跳转到哪一个文件里呢 这么说吧无论是这里的运行报错还是 objdump 出来的汇编代码里面的重复地址都是因为 add_lib.o 以及 link_example.o 并不是一个可执行文件Executable Program而是目标文件Object File。只有通过链接器Linker把多个目标文件以及调用的各种函数库链接起来我们才能得到一个可执行文件。 我们通过 gcc 的 -o 参数可以生成对应的可执行文件对应执行之后就可以得到这个简单的加法调用函数的结果。 $ gcc -o link-example add_lib.o link_example.o $ ./link_example c 15 实际上“C 语言代码 - 汇编代码 - 机器码” 这个过程在我们的计算机上进行的时候是由两部分组成的。 第一个部分由编译Compile、汇编Assemble以及链接Link三个阶段组成。在这三个阶段完成之后我们就生成了一个可执行文件。 第二部分我们通过装载器Loader把可执行文件装载Load到内存中。CPU 从内存中读取指令和数据来开始真正执行程序。 ELF 格式和链接理解链接过程 程序最终是通过装载器变成指令和数据的所以其实我们生成的可执行代码也并不仅仅是一条条的指令。我们还是通过 objdump 指令把可执行文件的内容拿出来看看。 link_example: file format elf64-x86-64 Disassembly of section .init: ... Disassembly of section .plt: ... Disassembly of section .plt.got: ... Disassembly of section .text: ...6b0: 55 push rbp6b1: 48 89 e5 mov rbp,rsp6b4: 89 7d fc mov DWORD PTR [rbp-0x4],edi6b7: 89 75 f8 mov DWORD PTR [rbp-0x8],esi6ba: 8b 55 fc mov edx,DWORD PTR [rbp-0x4]6bd: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8]6c0: 01 d0 add eax,edx6c2: 5d pop rbp6c3: c3 ret 00000000000006c4 main:6c4: 55 push rbp6c5: 48 89 e5 mov rbp,rsp6c8: 48 83 ec 10 sub rsp,0x106cc: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4],0xa6d3: c7 45 f8 05 00 00 00 mov DWORD PTR [rbp-0x8],0x56da: 8b 55 f8 mov edx,DWORD PTR [rbp-0x8]6dd: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]6e0: 89 d6 mov esi,edx6e2: 89 c7 mov edi,eax6e4: b8 00 00 00 00 mov eax,0x06e9: e8 c2 ff ff ff call 6b0 add6ee: 89 45 f4 mov DWORD PTR [rbp-0xc],eax6f1: 8b 45 f4 mov eax,DWORD PTR [rbp-0xc]6f4: 89 c6 mov esi,eax6f6: 48 8d 3d 97 00 00 00 lea rdi,[rip0x97] # 794 _IO_stdin_used0x46fd: b8 00 00 00 00 mov eax,0x0702: e8 59 fe ff ff call 560 printfplt707: b8 00 00 00 00 mov eax,0x070c: c9 leave 70d: c3 ret 70e: 66 90 xchg ax,ax ... Disassembly of section .fini: ... 你会发现可执行代码 dump 出来内容和之前的目标代码长得差不多但是长了很多。因为在 Linux 下可执行文件和目标文件所使用的都是一种叫ELFExecuatable and Linkable File Format的文件格式中文名字叫可执行与可链接文件格式这里面不仅存放了编译成的汇编指令还保留了很多别的数据。 比如我们过去所有 objdump 出来的代码里你都可以看到对应的函数名称像 add、main 等等乃至你自己定义的全局可以访问的变量名称都存放在这个 ELF 格式文件里。这些名字和它们对应的地址在 ELF 文件里面存储在一个叫作符号表Symbols Table的位置里。符号表相当于一个地址簿把名字和地址关联了起来。 我们先只关注和我们的 add 以及 main 函数相关的部分。你会发现这里面main 函数里调用 add 的跳转地址不再是下一条指令的地址了而是 add 函数的入口地址了这就是 EFL 格式和链接器的功劳。 ELF 文件格式把各种信息分成一个一个的 Section 保存起来。ELF 有一个基本的文件头File Header用来表示这个文件的基本属性比如是否是可执行文件对应的 CPU、操作系统等等。除了这些基本属性之外大部分程序还有这么一些 Section 首先是.text Section也叫作代码段或者指令段Code Section用来保存程序的代码和指令 接着是.data Section也叫作数据段Data Section用来保存程序里面设置好的初始化数据信息 然后就是.rel.text Secion叫作重定位表Relocation Table。重定位表里保留的是当前的文件里面哪些跳转地址其实是我们不知道的。比如上面的 link_example.o 里面我们在 main 函数里面调用了 add 和 printf 这两个函数但是在链接发生之前我们并不知道该跳转到哪里这些信息就会存储在重定位表里 最后是.symtab Section叫作符号表Symbol Table。符号表保留了我们所说的当前文件里面定义的函数名称和对应地址的地址簿。 链接器会扫描所有输入的目标文件然后把所有符号表里的信息收集起来构成一个全局的符号表。然后再根据重定位表把所有不确定要跳转地址的代码根据符号表里面存储的地址进行一次修正。最后把所有的目标文件的对应段进行一次合并变成了最终的可执行代码。这也是为什么可执行文件里面的函数调用的地址都是正确的。 在链接器把程序变成可执行文件之后要装载器去执行程序就容易多了。装载器不再需要考虑地址跳转的问题只需要解析 ELF 文件把对应的指令和数据加载到内存里面供 CPU 执行就可以了。 小结 为什么同样一个程序在 Linux 下可以执行而在 Windows 下不能执行了。其中一个非常重要的原因就是两个操作系统下可执行文件的格式不一样。 我们今天讲的是 Linux 下的 ELF 文件格式而 Windows 的可执行文件格式是一种叫作PEPortable Executable Format的文件格式。Linux 下的装载器只能解析 ELF 格式而不能解析 PE 格式。 如果我们有一个可以能够解析 PE 格式的装载器我们就有可能在 Linux 下运行 Windows 程序了。这样的程序真的存在吗没错Linux 下著名的开源项目 Wine就是通过兼容 PE 格式的装载器使得我们能直接在 Linux 下运行 Windows 程序的。而现在微软的 Windows 里面也提供了 WSL也就是 Windows Subsystem for Linux可以解析和加载 ELF 格式的文件。 我们去写可以用的程序也不仅仅是把所有代码放在一个文件里来编译执行而是可以拆分成不同的函数库最后通过一个静态链接的机制使得不同的文件之间既有分工又能通过静态链接来“合作”变成一个可执行的程序。 对于 ELF 格式的文件为了能够实现这样一个静态链接的机制里面不只是简单罗列了程序所需要执行的指令还会包括链接所需要的重定位表和符号表。
http://www.yingshimen.cn/news/59982/

相关文章:

  • 模板建网站费用设计装修app
  • 自助建设网站软件找谁做百度关键词排名
  • wordpress主题 建站建设银行网站可以查保单吗
  • 学校网站首页制作海淀网站建设哪家公司好
  • 网站建设规划书结构跨境电商的运营模式有哪些
  • 电器网站建设规划书桂林网
  • 亚马逊雨林简介网站搜索优化公司
  • 有那个网站可以做免费的投票谷歌网站优化推广
  • 杭州免费网站建设用asp.net和access做的关于校园二手网站的论文
  • 建立网站需要多少钱 激发湖南岚鸿北京公司核名工商官网
  • 外网服装设计网站官网天下
  • h5做招聘网站可以吗网站频繁被攻击怎么办
  • 无锡市网站设计惠州网络营销
  • 织梦做的网站_别人提交给我留的言我去哪里看网站制作应该选什么
  • 广州市建设职业培训学校网站常州做网站企业
  • 做网页的软件做网站网站开发的有关公司
  • 无锡网站排名提升纺织服装网站建设规划方案
  • 网站上传权限专业网络营销外包公司
  • 网站建设岗位有哪些南昌网站建设哪家好薇
  • 方一凡和磊儿做家教的网站工程项目网站
  • 杭州做网站哪家最好哪些网站做的好
  • 网站建设图片滑动代码请叫我鬼差大人王烨
  • 嘉兴网站制作如何自己做购物网站
  • 公司弄个网站多少钱西安未央区今天出啥事了
  • 公司网站排名怎么做wordpress博客实例
  • 无锡市无锡市住房和城乡建设局网站软件下载平台
  • 用第三方做网站edge网页视频怎么下载
  • 网站设计制作厂家有哪些做下载网站有哪些
  • cms 网站群网站做浏览器兼容
  • 小网站关键词校园网络设计方案ensp