(接上篇)反编译两种可执行文件
2017-11-27 20:56
232 查看
上篇地址:http://blog.csdn.net/eliot_shao/article/details/78648314
上篇主要内容回顾:
上篇内容介绍了静态编译生成静态库,然后链接静态库生成可执行文件的过程;也对比介绍了动态编译生成动态库然后链接动态库生成可执行文件的过程。我们也得出了结论:
链接静态库生成的可执行文件main运行不依赖与静态库是否存在,而链接动态库生成的可执行文件main2是依赖于动态库的存在的。
下面我们使用反编译手段分析上面的结论。
1:链接静态链接库,生成可执行文件
gcc main.c -static -L. -lstruct -o main
反编译可执行文件 objdump -D main > static_obj.txt
2:链接动态链接库,生成可执行文件
gcc main.c -L. -lstruct -o main2
反编译可执行文件 objdump -D main > shard_obj.txt
对比大图:
链接静态库(该库只有hello函数)生成的可执行文件反编译结果:
链接动态库(该库只有hello函数)生成的可执行文件反编译结果,分三步查找:
查找过程1、2、3可以通过博文http://blog.csdn.net/eliot_shao/article/details/78549247中的一张图反映。最终还是依赖于解析器将动态库加载到内存,找到动态库对应符号(hello)的位置,然后跳转到hello,执行权利交接,hello函数得以执行!
.so本质和可执行文件一样也是elf,elf一种。.a则不是elf文件,这里没深入研究。见下图。
结论;通过反编译两个可执行文件,我们会发现二者主要区别是动态链接过程,前者已经把静态库的内容链接到可执行文件内部,不需要额外的定位库文件,而后者则需要“解析器”去通过PLT和GOT去加载动态库文件(.so)到内存然后在去定位要访问函数的位置。
上篇主要内容回顾:
上篇内容介绍了静态编译生成静态库,然后链接静态库生成可执行文件的过程;也对比介绍了动态编译生成动态库然后链接动态库生成可执行文件的过程。我们也得出了结论:
链接静态库生成的可执行文件main运行不依赖与静态库是否存在,而链接动态库生成的可执行文件main2是依赖于动态库的存在的。
下面我们使用反编译手段分析上面的结论。
1:链接静态链接库,生成可执行文件
gcc main.c -static -L. -lstruct -o main
反编译可执行文件 objdump -D main > static_obj.txt
2:链接动态链接库,生成可执行文件
gcc main.c -L. -lstruct -o main2
反编译可执行文件 objdump -D main > shard_obj.txt
对比大图:
链接静态库(该库只有hello函数)生成的可执行文件反编译结果:
链接动态库(该库只有hello函数)生成的可执行文件反编译结果,分三步查找:
查找过程1、2、3可以通过博文http://blog.csdn.net/eliot_shao/article/details/78549247中的一张图反映。最终还是依赖于解析器将动态库加载到内存,找到动态库对应符号(hello)的位置,然后跳转到hello,执行权利交接,hello函数得以执行!
.so本质和可执行文件一样也是elf,elf一种。.a则不是elf文件,这里没深入研究。见下图。
结论;通过反编译两个可执行文件,我们会发现二者主要区别是动态链接过程,前者已经把静态库的内容链接到可执行文件内部,不需要额外的定位库文件,而后者则需要“解析器”去通过PLT和GOT去加载动态库文件(.so)到内存然后在去定位要访问函数的位置。
相关文章推荐
- 报textcopy不是可执行文件的话,解决方法(接上篇内容)
- 关于Linux 上两种 mysql 执行语句结果到文件的写法
- MyBatis两种执行XXXMapper.xml配置文件中SQL语句的方法
- BAT启动执行JAVA JAR文件中的MAIN方法的两种方式
- java 执行命令、调用bat文件、调用外部程序的两种方法
- MySQL命令执行sql文件的两种方法
- MySQL命令执行sql文件的两种方法
- 如何将c程序执行文件打包入APK中,两种方法
- Mysql命令行执行sql文件,解决sqlyog或navicat执行sql文件乱码的问题
- Android APK反编译得到Java源代码和资源文件
- pl/sql developer 导出数据库中的表到可执行的.sql 脚本文件
- Android使用Linux命令执行文件操作
- SUSE Linux下查找固定日期内的文件并执行移动或删除操作
- dos界面下执行java文件将错误输出到一个文本小技巧
- cmd下过滤文件名称的两种方法
- navicat执行sql文件失败
- 创建可执行的 JAR 文件包--制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法
- 如何将linux 命令的执行结果在屏幕输出的同时保存到文件
- Visual Studio 2008 中的可执行文件中嵌入清单文件(manifest) Vista/win7 UAC中把应用程序标注为“需要管理员权限”
- 登录Linux时/etc/profile、~/.bash_profile等几个文件的执行过程