如何理解PIC与没有PIC的区别?

时间:2019-01-24 16:46:52

标签: gcc assembly clang x86-64 position-independent-code

我试图了解PIC(与位置无关的代码)与没有PIC代码之间的区别。

测试代码在这里。

#include <stdio.h>

int global;
int f() { return global; }

我的操作系统是Ubuntu。

$ uname
Linux

已编译的汇编代码如下。我对汇编代码不是很熟悉。有人可以帮助我了解PIC的区别吗?谢谢。

$ cat main.sh
#!/usr/bin/env bash
# vim: set noexpandtab tabstop=2:

set -v
function cmd {
diff <($CC -S -fno-pic f.c -c -o -) <($CC -S -fPIC f.c -c -o -)
}

CC=clang cmd
CC=gcc cmd
$ ./main.sh
function cmd {
diff <("$CC" -S -fno-pic f.c -c -o -) <("$CC" -S -fPIC f.c -c -o -)
}

CC=clang cmd
"$CC" -S -fPIC f.c -c -o -
"$CC" -S -fno-pic f.c -c -o -
14c14,15
<     movl    global, %eax
---
>     movq    global@GOTPCREL(%rip), %rax
>     movl    (%rax), %eax
CC=gcc cmd
"$CC" -S -fPIC f.c -c -o -
"$CC" -S -fno-pic f.c -c -o -
14c14,15
<     movl    global(%rip), %eax
---
>     movq    global@GOTPCREL(%rip), %rax
>     movl    (%rax), %eax

这是另一个测试代码f3.c

#include <stdio.h>

int global;
int *f3() { return &global; }
$ ./main.sh
function cmd {
diff <("$CC" -S -fno-pic f3.c -c -o -) <("$CC" -S -fPIC f3.c -c -o -)
}
CC=clang cmd f3.c
"$CC" -S -fPIC f3.c -c -o -
"$CC" -S -fno-pic f3.c -c -o -
14c14
<   movabsq $global, %rax
---
>   movq    global@GOTPCREL(%rip), %rax
CC=gcc cmd f3.c
"$CC" -S -fno-pic f3.c -c -o -
"$CC" -S -fPIC f3.c -c -o -
14c14
<   movl    $global, %eax
---
>   movq    global@GOTPCREL(%rip), %rax

0 个答案:

没有答案