Предоставляется ли PIE-файлам адрес виртуальной памяти во время связывания?

Я скомпилировал простой код 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 файлы (например, разделяемые библиотеки) загружаются в память? у них есть собственное виртуальное адресное пространство? если да, то почему они должны быть независимыми от позиции? или они загружаются в адресное пространство процессов?


person Josh    schedule 28.08.2019    source источник


Ответы (1)


Это не адреса. Вам следует обратить внимание на смещения относительно ПК:

leaq    93(%rip), %rdi

Это означает, что это код PIC / PIE.

Общие библиотеки сопоставляются с каждым запущенным процессом, который их использует.
Эти библиотеки, однако, необходимо переместить (чтобы соответствовать ограничениям адресного пространства программы), поэтому они компилируются с помощью PIC (позиционно-независимый код, обычно со смещениями относительно ПК).

person S.S. Anne    schedule 28.08.2019
comment
Спасибо, значит, есть адресные пространства за пределами виртуальной памяти, к которым имеет доступ каждый процесс? или его все еще виртуальная память, но разделенная между всеми процессами? - person Josh; 28.08.2019
comment
@Josh: Независимо от того, является ли это PIE, не имеет ничего общего с тем, является ли память совместно используемой (отображение текста / данных программы только для чтения всегда совместно используется). - person R.. GitHub STOP HELPING ICE; 28.08.2019
comment
Они не являются смещениями в файле, хотя могут совпадать с смещениями в файле. Это виртуальные (не виртуальные во время выполнения, а виртуальные адреса сопоставления нагрузки ELF) в PT_LOAD сегментах файла ELF. Для PIC / PIE они обычно начинаются с 0, но могут начинаться с чего-то произвольного и ненулевого. Во время выполнения они сдвигаются на постоянное смещение, равное любому адресу, который разделяемая библиотека PIC / PIE или программа загружаются с минус базовым виртуальным адресом в карте загрузки ELF. Ссылки на адреса в инициализированных глобальных данных должны быть скорректированы на это смещение; ... - person R.. GitHub STOP HELPING ICE; 28.08.2019
comment
... текст программы не нужно корректировать, потому что он не содержит абсолютных адресов, только относительные, которые не меняются независимо от того, где он загружен. - person R.. GitHub STOP HELPING ICE; 28.08.2019
comment
@Josh Типа .. Общая библиотека отображается на каждый процесс, который ее использует. - person S.S. Anne; 28.08.2019