Диапазоны адресов, зарезервированные GDB? - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть программа, которая отображает память по старшим адресам, используя MAP_FIXED в TASK_SIZE - PAGE_SIZE.

Эта программа работает нормально, если я ее выполняю, но если я запускаю ее с gdb, она просто вызывает ошибкипосле mmap.Также в этот момент состояние gdb кажется полностью поврежденным, и кажется, что выполнение достигает диапазона адресов, заполненного 0's (может быть из только что созданных новых сопоставлений).

Использует ли gdb этот диапазон адресов в рабочем процессе?Я очистил часть состояния GDB?Этот диапазон адресов задокументирован где-то?

Далее следует мой звонок mmap и вычисление адреса -

#define TASK_SIZE64 (0x800000000000UL - 4096)
#define TASK_SIZE TASK_SIZE64
#define PAGE_OFFSET (void*)TASK_SIZE
...
char *load_address = PAGE_OFFSET - file_size_aligned;
if(load_address != mmap(load_address, file_size_aligned, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)){
    err("Failed to allocate memory for raw_binary with: %d\n", errno);
    return -1;
}

file_size_aligned доходит до PAGE_SIZE.Это одно из распределений.Есть еще один, который начинается с load_address и выделяет еще несколько страниц в обратном направлении (только с PROT_READ и PROT_WRITE).

1 Ответ

0 голосов
/ 25 ноября 2018

Использует ли GDB этот диапазон адресов в процессе работы?

Нет.

Я очистил часть состояния GDB?

Нет.

Задокументирован ли где-нибудь этот диапазон адресов?

Возможно в источниках ядра.

Ваша программа делает недопустимые предположения о доступныхадресное пространство и «взрывается» при запуске с отключенным ASLR (что GDB делает по умолчанию).

Вы можете подтвердить это, запустив вашу программу вне GDB, но с отключенным ASLR.Также должно произойти сбой.Попробуйте один из них:

# echo 0 > /proc/sys/kernel/randomize_va_space

или

setarch $(uname -m) -R /path/to/exe

Вы также можете подтвердить, что ваша программа будет работать под GDB, если вы включите ASLR:

gdb /path/to/exe
(gdb) set disable-randomization off
(gdb) run
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...