Идентификация физического или виртуального адреса - PullRequest
0 голосов
/ 11 мая 2018

Мне трудно разобраться между физическим и виртуальным адресом. У меня есть двоичный файл, который я загружаю в дизассемблер IDA, который показывает мне адрес, такой как 0x000008a1. Когда я отлаживаю тот же двоичный файл в GDB, он показывает мне адрес как 0x5555555508a1.

Когда я делаю info proc mappings в gdb, это дает мне необычный адрес в libc 0x7ffff7a0d000, который начинается с 0x7ff ....

Итак, я хочу знать

1.) Почему GDB добавляет 0x0x55555555 перед правильным адресом, который IDA показывает

2.) Что это за адреса? Виртуальный или физический?

3.) Почему адрес libc начинается с 0x7ffff7a?

4.) Как определить физический адрес запущенного процесса?

1 Ответ

0 голосов
/ 11 мая 2018

дизассемблер IDA, который показывает мне адрес, такой как 0x000008a1. Когда я отлаживаю тот же двоичный файл в GDB, он показывает мне адрес как 0x5555555508a1.

У вас есть независимый от позиции исполняемый файл (в последнее время это значение по умолчанию во многих дистрибутивах). Двоичный файл перемещен по адресу 0x555555550000.

По умолчанию GDB отключает рандомизацию адресов, поэтому вы всегда будете получать согласованный перемещенный адрес. Вы можете снова включить рандомизацию в GDB с помощью set disable-randomization off, и тогда двоичный файл будет перемещаться на разные адреса от запуска к запуску.

Когда я делаю отображения информационных процессов в GDB, он дает мне необычный адрес в libc 0x7ffff7a0d000

В этом адресе ничего нет необычного.

Что это за адреса? Виртуальный или физический?

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

...