x86-64 objdump против адресов pmap - PullRequest
       74

x86-64 objdump против адресов pmap

0 голосов
/ 13 февраля 2020
#include <stdio.h>
int main() {
    printf("text at %p\n", main);
    int c = getchar();
}

Скомпилировав вышеприведенный код в 64-битной VirtualBox Ubuntu и запустив его, я получаю:
текст в 0x55555555468a
pmap:
0000555555554000 4K rx-- a.out

Однако,

objdump -dj .text a.out | sed -n '/: /, / ^ $ / p':
000000000000068a :
68a: 55 pu sh% rbp

gdb a.out
Дамп кода ассемблера для функции main:
0x000000000000068a <+0>: pu sh% rbp

Совершенно разные адреса для связанных кодов?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я нашел ответ здесь Что такое опция -fP IE для позиционно-независимых исполняемых файлов в g cc и ld?

Когда я компилирую с флагом -no-p ie, вывод a.out:
текст в 0x400537

Выход pmap:
0000000000400000 4K rx-- a.out

Вывод objdump:
0000000000400537 main:

Однако g cc (версия 7.4.0) по умолчанию создает независимый от позиции исполняемый файл, так что он может быть загружен в случайный адрес.
Следовательно, адрес в pmap настолько отличается от адреса в objdump.

При компиляции с флагом -no-p ie команда «file» выводит:
a.out: исполняемый 64-битный LSB ELF, x86-64

При компиляции без флага команда «file» выводит:
a.out: ELF 64-битный LSB общий объект , x86-64

1 голос
/ 13 февраля 2020

Полностью разные адреса для связанного кода?

Вы смотрите на независимый от позиции исполняемый файл , который перемещается на произвольный адрес во время выполнения.

...