Как понять разницу между ПОС и без ПОС?
Я пытаюсь понять разницу между PIC (позиционно-независимым кодом) и отсутствием PIC-кода.
Тестовый код здесь.
#include <stdio.h>
int global;
int f() { return global; }
Моя ОС - Ubuntu.
$ uname
Linux
Скомпилированный код сборки следующий. Я не очень знаком с ассемблерным кодом. Может ли кто-нибудь помочь мне понять разницу в свете ПОС? Благодарю.
$ 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