Как сделать дублирующиеся разделы в ELF файле

У меня есть требование, когда мне нужно создать дубликат / копию раздела .data.

Я попытался создать фиктивный раздел с таким же размером раздела данных в сценарии компоновщика и скопировать содержимое раздела данных в фиктивный раздел в функциях инициализации моего изображения ELF, но это не соответствует моим требованиям, так как я хочу, чтобы копировать / дублировать раздел, который будет создан вместе с финальным изображением ELF не во время его выполнения.

Ниже то, что я хотел в своем скрипте компоновщика,

SECTIONS {
    .data : { <data section contents> }
    .dummydata : { <copy of .data section> } 
}

Может ли кто-нибудь помочь написать сценарий компоновщика в соответствии с вышеуказанным требованием?


person vimal prathap    schedule 29.06.2015    source источник
comment
И почему вы думаете, что хотите это сделать? Это похоже на проблему XY.   -  person Jonathan Leffler    schedule 29.06.2015
comment
@Jonathan Моя платформа ожидает, что копия содержимого раздела данных будет загружена в заранее определенное место для использования в качестве данных ROM. По сути, до сих пор такая схема использовалась сторонней цепочкой инструментов компилятора, но сейчас мы хотим перейти на цепочку инструментов с открытым исходным кодом GNU. Есть способ изменить код сборки, который работает с данными ROM, чтобы удовлетворить требованиям этой новой версии нашего образа ELF для загрузки, но я не хочу нарушать код сборки, поэтому я хочу добиться этого с помощью создание дубликата раздела данных в скрипте компоновщика.   -  person vimal prathap    schedule 30.06.2015
comment
Развлекайся! Я не знаю, что это невозможно, но понятия не имею, как это сделать.   -  person Jonathan Leffler    schedule 30.06.2015


Ответы (1)


Я не думаю, что это можно сделать с помощью только ld и скрипта компоновщика. Учитывая эту строку из здесь:

Если имя файла соответствует более чем одному шаблону подстановки или если имя файла отображается явно и также соответствует шаблону подстановки, компоновщик будет использовать первое совпадение в сценарии компоновщика.

Похоже, что скрипт компоновщика поместит данные (или что-то еще) только в один раздел.

Однако надежда еще не потеряна. Вы можете скопировать раздел, используя objcopy, а затем снова добавить раздел, используя objcopy

objcopy -O binary --only-section=.data your-file temp.bin
objcopy --add-section .dummydata=temp.bin your-file

Это добавит раздел, который будет последним разделом с VMA / LMA, равным 0. Затем вы можете использовать objcopy, чтобы переместить раздел в желаемое место.

objcopy --change-section-address .dummydata=desired-address your-file

Конечно, если там что-то уже есть, это будет проблематично. К счастью, вы можете создать дыру сразу после первого .data с помощью чего-то вроде:

data_start = .;
.data : { *(.data) }
data_end = .;
. += (data_end - data_start);

Это должно создать дыру сразу после ваших первых данных, достаточно большую, чтобы поместить еще одну копию данных сразу после нее. Если это не совсем то место, где вы хотите, просто добавьте (data_end - data_start) там, где вы хотите отверстие.

Наконец, вы можете изменить флаги раздела, снова с помощью objcopy

objcopy --set-section-flags .dummydata=the-flags-you-want your-file

Не так чисто, как просто дублировать что-то в сценарии компоновщика, но это должно работать.

person missimer    schedule 29.06.2015