Я не думаю, что это можно сделать с помощью только 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