LD_BIND_NOW не влияет на исполняемый файл ELF PIE - PullRequest
2 голосов
/ 09 июня 2019

Наблюдения

Когда исполняемый файл Linux скомпилирован как PIE (Position Independent Executable, по умолчанию в Ubuntu 18.04), символы из общих библиотек (например, libc) будут разрешены, когда программа начнет выполняться, установка переменной среды LD_BIND_NOW в значение null не будет откладывать это процесс.

Однако, если исполняемый файл скомпилирован с флагом -no-pie, разрешение символа может контролироваться LD_BIND_NOW.

Вопрос

Можно ли управлять разрешением символов из общих библиотек в исполняемом файле ELF PIE?

Ниже приведен код и системная информация в моем тесте,

ubuntu: 18.04
kernel: Linux 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
gcc: gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0

#include <stdio.h>
int main() {
    printf("Hello world!\n");
}

Подробности экспериментов (что приводит к приведенным выше выводам).

Эксперименты проводятся в gdb-peda. Поиск gdb-peda в выходных данных покажет команды, используемые для каждого шага.

Адрес, сохраненный в GOT-записи для puts, будет отображаться (disp) всякий раз, когда выполнение продолжается в GDB. Таким образом, этап, когда он залатан с реальным адресом, может быть легко обнаружен.

Выходы для -no-pie двоичного теста.
Выходы для pie двоичного теста.


Кстати, тот же вопрос был первоначально размещен в Reck Engineering Stack Exchange , и ответ там подтвердил приведенные выше наблюдения.

1 Ответ

1 голос
/ 09 июня 2019

Когда исполняемый файл Linux скомпилирован как PIE (Position Independent Executable, по умолчанию в Ubuntu 18.04), символы из общих библиотек (например, libc) будут разрешены при запуске программы, если для переменной среды LD_BIND_NOW установить значение null,не откладывать этот процесс.

Однако, если исполняемый файл скомпилирован с флагом -no-pie, разрешением символа можно управлять с помощью LD_BIND_NOW.

Вы ошибаетесь: символразрешение происходит только , когда программа начинает выполняться в или случае, независимо от того, определен LD_BIND_NOW или нет.

Что LD_BIND_NOW контролирует, являются ли все функции разрешаются одновременно (во время запуска программы), или же такие символы разрешаются лениво (в первый раз, когда программа вызывает данную неразрешенную функцию).Подробнее о ленивом разрешении здесь .

Насколько я понимаю, ничто в изображении выше не меняется между двоичными файлами PIE и не PIE.Мне было бы интересно узнать как вы пришли к выводу, что есть разница.

...