При представлении адресов памяти в шестнадцатеричном формате изменение младшего значащего бита на 2 означает увеличение / уменьшение на 2 байта или бита? - PullRequest
0 голосов
/ 27 октября 2019
reader@hacking:~/booksrc $ cp a.out a
reader@hacking:~/booksrc $ ./a SLEDLESS
SLEDLESS is at 0xbfffff4e
reader@hacking:~/booksrc $ cp a.out bb
reader@hacking:~/booksrc $ ./bb SLEDLESS
SLEDLESS is at 0xbfffff4c
reader@hacking:~/booksrc $ cp a.out ccc
reader@hacking:~/booksrc $ ./ccc SLEDLESS
SLEDLESS is at 0xbfffff4a
reader@hacking:~/booksrc $ ./a.out SLEDLESS
SLEDLESS is at 0xbfffff46
reader@hacking:~/booksrc $ gdb -q
(gdb) p 0xbfffff4e - 0xbfffff46
$1 = 8
(gdb) quit
reader@hacking:~/booksrc $

Он в основном создает разные файлы с разными длинами имен файлов, чтобы посмотреть, как это повлияет на память переменной среды SLEDLESS.

Это его объяснение:

Как показывает предыдущий эксперимент, длина имени исполняемой программы влияет на расположение экспортируемых переменных среды. Общая тенденция, по-видимому, заключается в уменьшении на два байта адреса переменной среды при каждом увеличении длины имени программы на один байт. Это верно и для имени программы a.out, поскольку разница в длине между именами a.out и a составляет четыре байта, а разница между адресами 0xbfffff4e и 0xbfffff46 составляет восемь байтов. Это должно означать, что имя исполняемой программы также находится где-то в стеке, что вызывает смещение.

Разве общая тенденция не должна уменьшаться на 2 бита каждый раз? И поэтому все остальные места, которые он говорит, байты, они должны быть заменены на биты?

1 Ответ

0 голосов
/ 28 октября 2019

Разве общая тенденция не должна быть уменьшением на 2 бита каждый раз?

Нет. С одной стороны, символы (т. Е. Байты), целые числа, указатели и т. Д. Не сохраняются с произвольными смещениями в байтах или словах памяти.

Изменяется ли адрес на один, два, четыре или восемь байтовв этом эксперименте зависит как от архитектуры (например, x86, x86_64, arm, ppc и т. д.), так и от используемого языка. Кроме того, я не могу сказать из вашего вопроса, соответствуют ли адреса аргументу SLEDLESS CLI (то есть, argv[1]) или программа сообщает адрес, возвращенный getenv("SLEDLESS") (я предполагаю, что это Cпрограмма). Это также повлияет на изменение адреса.

...