lll*_*lll 15 c linux x86 assembly elf
测试是在Ubuntu 12.04 64位上进行的.x86架构.
我对位置独立可执行(PIE)和位置无关代码(PIC)的概念感到困惑,我猜它们不是正交的.
这是我的快速实验.
gcc -fPIC -pie quickSort.c -o a_pie.out
gcc -fPIC quickSort.c -o a_pic.out
gcc a.out
objdump -Dr -j .text a.out > a1.temp
objdump -Dr -j .text a_pic.out > a2.temp
objdump -Dr -j .text a_pie.out > a3.temp
Run Code Online (Sandbox Code Playgroud)
我有以下发现.
A. a.out包含一些PIC代码,但仅在libc序言和结尾函数中有效,如下所示:
4004d0: 48 83 3d 70 09 20 00 cmpq $0x0,0x200970(%rip) # 600e48 <__JCR_END__>
Run Code Online (Sandbox Code Playgroud)
在我的简单快速排序程序的汇编指令中,我没有找到任何PIC指令.
B. a_pic.out包含PIC代码,我没有找到任何非PIC指令...在我的快速排序程序的指令中,所有全局数据都由PIC指令访问,如下所示:
40053b: 48 8d 05 ea 02 00 00 lea 0x2ea(%rip),%rax # 40082c <_IO_stdin_used+0x4>
Run Code Online (Sandbox Code Playgroud)
C. a_pie.out包含与a_pic.out比较的语法相同的指令.但是,a_pie.out的.text段的内存地址范围为0x630到0xa57,而a_pic.out的相同部分的范围是0x400410到0x400817.
谁能给我一些关于这些现象的解释?特别是发现Ç.再次,我真的很困惑PIE与PIC,并且不知道如何解释发现C ..
Emp*_*ian 15
我对位置独立可执行(PIE)和位置无关代码(PIC)的概念感到困惑,我猜它们不是正交的.
PIE和之间唯一真正的区别PIC是你可以插入符号PIC,但不允许插入符号PIE.除此之外,它们几乎相同.
C. a_pie.out包含与a_pic.out比较的语法相同的指令.但是,a_pie.out的.text段的内存地址范围为0x630到0xa57,而a_pic.out的相同部分的范围是0x400410到0x400817.
很难理解你对此感到惊讶的是什么.
的PIE二进制连接只是作为共享库,因此它的默认加载地址(.p_vaddr第一LOAD链段)是零.期望是某些东西会将此二进制文件从零页面重新定位,并将其加载到某个随机地址.
另一方面,不可PIE执行文件始终在其链接地址处加载.在Linux上,x86_64二进制文件的默认地址是0x400000,因此.text最终离那里不远.
| 归档时间: |
|
| 查看次数: |
5517 次 |
| 最近记录: |