相关疑难解决方法(0)

70
推荐指数
2
解决办法
6万
查看次数

在64位x86平台上比较PIE,PIC代码和可执行文件有什么区别?

测试是在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.

谁能给我一些关于这些现象的解释?特别是发现 …

c linux x86 assembly elf

15
推荐指数
1
解决办法
5517
查看次数

标签 统计

assembly ×1

c ×1

elf ×1

gcc ×1

linker ×1

linux ×1

x86 ×1