Я скомпилировал простой код hello world
c с gcc -fpie test.c
и теперь смотрю на двоичный файл с помощью objdump
:
Disassembly of section __TEXT,__text:
__text:
100000f40: 55 pushq %rbp
100000f41: 48 89 e5 movq %rsp, %rbp
100000f44: 48 83 ec 10 subq $16, %rsp
100000f48: 89 7d fc movl %edi, -4(%rbp)
100000f4b: 8b 75 fc movl -4(%rbp), %esi
100000f4e: 48 8d 3d 5d 00 00 00 leaq 93(%rip), %rdi
100000f55: b0 00 movb $0, %al
...
Мы ясно видим, что адреса памяти все еще вычисляются компоновщиком слева. Разве pie
файлы не должны иметь статически связанных адресов памяти?
Мой второй вопрос: как pic
файлы (например, разделяемые библиотеки) загружаются в память? у них есть собственное виртуальное адресное пространство? если да, то почему они должны быть независимыми от позиции? или они загружаются в адресное пространство процессов?