Как понять разницу между ПОС и без ПОС?

Я пытаюсь понять разницу между 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

0 ответов

Другие вопросы по тегам