我试图了解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