почему адрес памяти меняется в Ubuntu, а не в Redhat - PullRequest
1 голос
/ 15 февраля 2020

У меня есть эта программа:

double t;
main() {
}

В Ubuntu я запускаю:

% gdb a.out
(gdb) p &t
$1 = (double *) 0x4010 <t>
(gdb) run
Starting program: /home/phan/a.out 
[Inferior 1 (process 95930) exited normally]
(gdb) p &t
$2 = (double *) 0x555555558010 <t>

Почему адрес изменился с 0x4010 на 0x555555558010. Есть ли способ предотвратить это? На Redhat это не так:

% gdb a.out
(gdb) p &t
$1 = (double *) 0x601038 <t>
(gdb) r
Starting program: /home/phan/a.out 
[Inferior 1 (process 23337) exited normally]
(gdb) p &t
$2 = (double *) 0x601038 <t>

Кстати, это происходит только в Ubuntu 18.04. В Ubuntu 16.04 он работает точно так же, как Redhat, ie адрес один и тот же до и после.

1 Ответ

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

Вы, вероятно, видите адреса до и после перемещения для сегмента .bss.

Этого можно избежать, отключив независимые от позиции исполняемые файлы, таким образом заставив gcc выбрать конечный адрес .bss зарегистрируйтесь заранее:

gcc -no-pie foo.c

-static будет иметь эффект.

Я не знаю, почему будет разница между Ubuntu и Redhat.

...