Адрес второго загрузочного сегмента в формате ELF .data + .bss

Вывод в формате ELF для readelf

В этом случае правильный адрес:

.data от 0x08048054 до 0x08048054+0x0000e

.bss от 0x08048054+0x0000e до 0x0804805+0x00016

или я что-то упускаю? пожалуйста, проясните это для меня.

ИЗМЕНИТЬ

Я использовал эту команду, чтобы получить информацию, как на изображении:

readelf -l filename

person The Mask    schedule 08.04.2014    source источник
comment
У вас есть доступ к сценарию компоновщика или он был скомпилирован с помощью сценария компоновщика по умолчанию? Если да, то какой компилятор / компоновщик использовался?   -  person nonsensickle    schedule 09.04.2014
comment
Проблема в том, что у вас нет возможности узнать, что идет первым, bss или данные, если вы не получите информацию скрипта компоновщика (при условии, что вы используете GCC или Clang).   -  person nonsensickle    schedule 09.04.2014
comment
@nonsensickle: он был скомпилирован старым компилятором C. Я не знаю, что использовался компоновщик, но могу попытаться выяснить. Но обычно первым идет .bss, это поведение большинства компиляторов. В этом случае, если мы предполагаем, что это и для этого компилятора, я прав насчет адреса?   -  person The Mask    schedule 09.04.2014
comment
Если вы предполагаете, что первым идет .bss, тогда .bss будет в 0x08048054, а .data будет в 0x08048054+0x0000e. Да, это справедливое предположение.   -  person nonsensickle    schedule 09.04.2014
comment
исполняемый файл не связан динамически, как говорит команда file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped в этом случае нет сценария компоновщика, не так ли?   -  person The Mask    schedule 09.04.2014
comment
Верно, сама библиотека будет содержать информацию о символах, которая затем будет проходить через скрипт компоновщика, который использует ваше приложение. Итак, если это так, вы действительно можете контролировать порядок расположения .bss и .data.   -  person nonsensickle    schedule 09.04.2014
comment
@nonsensickle: Извините, я хотел иметь в виду, что .data обычно идет первым.   -  person The Mask    schedule 09.04.2014
comment
@nonsensickle: Большое спасибо за комментарии. Вы можете подумать о переносе, чтобы ответить. Последний вопрос: если у меня есть две глобальные переменные с неинициализированными значениями, скажем, a и b на 32-битной машине, где sizeof(int) = 4, a находится в 0x08048054+0x0000e и b в 0x08048054+0x0000e+0x4 правильно, или мне следует рассмотреть что-то еще?   -  person The Mask    schedule 09.04.2014
comment
Неинициализированные глобальные объекты и глобальные объекты, инициализированные нулем, находятся в сегменте .bss. Если это то место, где мы договорились, что .bss сегмент находится, то мы можем предположить, что a и b оба находятся в этом блоке памяти. Я уже отвечал на подобные вопросы в прошлом и постараюсь дать вам некоторые ссылки, которые у меня были в них.   -  person nonsensickle    schedule 09.04.2014
comment
Спасибо еще раз. Это такая большая помощь! Я пытаюсь понять формат файла ELF (чтобы создать свой собственный). Я не нашел себе учебника, в котором я мог бы понять эти конкретные вещи (у меня уже есть спецификация файла ELF), поэтому я изучаю вывод некоторых старых компиляторов, потому что они менее сложны и на данный момент лучше для изучения.   -  person The Mask    schedule 09.04.2014
comment
Извините, я не смог найти ссылки, которые, как мне казалось, у меня были. Вместо этого вот сообщение в блоге, которое я сделал некоторое время назад. Не все это актуально, но я упоминаю, где вы можете ожидать размещения ваших переменных при использовании C. blog.lazar.co.nz/post/71304177510/how-an-arm-cortex-m3-boots, можете пропустить примерно половину этого сообщения и перейдите к материалам, связанным с компоновщиком.   -  person nonsensickle    schedule 09.04.2014
comment
Спасибо за статью. Прочитал всю статью. Отличная работа. Еще один (последний, действительно) вопрос, все еще связанный: когда мы создаем второй PT_LOAD сегмент, который является нашими .data + .bss секциями вместе, запрашиваются размеры p_filesiz и p_memsiz, и ядро ​​должно выделить (выделить соответствующее слово?) p_memsiz байта и обнулить разницу между p_memsiz и p_filesiz,   -  person The Mask    schedule 09.04.2014
comment
[продолжение ...] т.е. N = p_memsiz - p_filesiz и N - это .bss область памяти, теперь заполненная нулями. В этом случае, где же адрес этого блока, вновь выделенного ядром? т.е. при запуске этой области блочной памяти (в нашем случае здесь, в 0x08048054) ядро ​​модифицирует p_paddr и помещает туда адрес? Надеюсь, понятно.   -  person The Mask    schedule 09.04.2014
comment
(извините, я имею в виду p_vaddr в предыдущем комментарии)   -  person The Mask    schedule 10.04.2014


Ответы (2)


Хорошо, с чего мне начать ... Да, и .data, и .bss находятся в этой области памяти. Проблема в том, что невозможно определить, в каком порядке они расположены.

Мы можем предположить, что используется порядок по умолчанию, и сделать обоснованное предположение, но мне это не нравится.

В длинной ветке комментариев под вопросом вы упомянули кое-что интересное, чего не было в вашем вопросе.

исполняемый файл не связан динамически, как говорит команда файла: 32-разрядный исполняемый файл LSB ELF, Intel 80386, версия 1 (SYSV), статически связан, в данном случае удален, нет сценария компоновщика, не так ли? - Маска

В этом случае библиотека содержит таблицу символов со всеми смещениями символов. Эта таблица включает информацию о разделе. Он будет обработан компоновщиком при компиляции приложения. На этом этапе именно ваш скрипт компоновщика управляет порядком, в котором выводятся разделы .data и .bss.

Если это сценарий компоновщика по умолчанию, найдите его. Если он индивидуальный, у вас должен быть к нему доступ и вы можете его читать. Если не уверены, уточните здесь, и мы постараемся помочь :)

Я сам задал вопрос не имеет отношения, но предлагает пример кода сценария компоновщика и некоторого кода C. В этом скрипте компоновщика сегмент .bss идет после сегмента .data.

person nonsensickle    schedule 09.04.2014
comment
Спасибо большое. И нет. Ссылка полезная. Не нужно удалять. - person The Mask; 09.04.2014

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

Чтобы увидеть заголовки разделов, используйте:

readelf -S

person Tom Gooding    schedule 10.04.2014