2013-09-27 2 views
0

Я пытаюсь понять, как именно код сборки выкладывается в пространство памяти. Я написал простой ассемблерный код, содержащий несколько строк инструкции и раздел .data. Когда я осмотрел его с помощью GDB, я увидел больше данных за пределами раздела данных, которые я не мог видеть с помощью команды objdump -section-header. Ниже выведено из gdb.Что такое материал за пределами раздела .data в сборке?

(gdb) x/100x &data 
0x804909c <data>: 0x03020100 0x07060504 0x0b0a0908 0x050e0d0c 
0x80490ac <other>: 0x00000000 0x6d79732e 0x00626174 0x7274732e 
0x80490bc: 0x00626174 0x7368732e 0x61747274 0x742e0062 
0x80490cc: 0x00747865 0x7461642e 0x00000061 0x00000000 
0x80490dc: 0x00000000 0x00000000 0x00000000 0x00000000 
0x80490ec: 0x00000000 0x00000000 0x00000000 0x00000000 
0x80490fc: 0x00000000 0x0000001b 0x00000001 0x00000006 
0x804910c: 0x08048074 0x00000074 0x00000027 0x00000000 
0x804911c: 0x00000000 0x00000004 0x00000000 0x00000021 

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

+2

Что относительно файла карты компоновщика? Он расскажет вам, что находится в разделе .data, например. переменные от кода запуска или около того. –

+0

Могу ли я проверить это с помощью objdump или аналогичных инструментов? – REALFREE

+0

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

ответ

2

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

Это, как говорится, является содержимым исполняемого файла после раздела данных на диске. Если вы посмотрите на начало этих дополнительных данных в виде строк, вы увидите, что это имена разделов в файле (первые два - «.symtab» и «.strtab»). После этого появляется другая информация из файла. Это данные, используемые компоновщиком или загрузчиком для анализа файла, который, как оказалось, был помещен в память.

+0

Другой вопрос, скажем, я хочу сравнить некоторое значение со значением в разделе данных. И если условие не проверяет конец данных и не сравнивает значения за пределами раздела данных, нет гарантии, что это условие будет удовлетворительным? – REALFREE

+0

Вправо. Если вы прочтете за конец раздела данных, невозможно быть уверенным, что там будет. Там может быть даже ничего, что могло бы вызвать segfault. – ughoavgfhw

Смежные вопросы