У меня есть программа, которая отображает память по старшим адресам, используя 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
).