2015-06-29 2 views
3

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

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

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

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

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

+0

И почему вы думаете, что хотите сделать это? Это похоже на [проблема XY] (http://mywiki.wooledge.org/XyProblem). –

+0

@Jonathan Моя платформа ожидает, что копия содержимого раздела данных будет загружена в предопределенное местоположение, чтобы использовать его в качестве данных ПЗУ. В основном это соглашение было до сих пор связано с цепочкой инструментов компилятора третьей стороны, но мы хотим сейчас перейти на цепочку инструментов GNU с открытым исходным кодом. Существует возможность изменить код сборки, который работает с данными ПЗУ, чтобы удовлетворить требованиям этой новой версии нашего изображения ELF для загрузки, но я не хочу нарушать код сборки, поэтому я хочу достичь этого с помощью создание дублирующей копии раздела данных в скрипте компоновщика. –

+0

Удачи! Я не знаю, что это невозможно, но я не знаю, как это сделать. –

ответ

3

Я не думаю, что это можно сделать только с ld и скриптом компоновщика. С учетом этой линии от here:

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

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

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

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

Это добавит раздел, чтобы последняя секция с VMA/ЛМ 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 

не как чистый, как только что-то дублируя в скрипте линкера, но он должен работать.

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