Я хочу поместить определенную переменную в конец ее раздела памяти.
Так что если у меня есть:
file1.cpp:
__attribute__((section(".mysection"))) char var1[] = "var1";
и в другом файле2.cpp:
__attribute__((section(".mysection"))) char var2[] = "var2";
Как я могу заставить var2
быть в конце mysection
?
Ну, в итоге я выбрал совершенно другой подход, но я хотел бы поделиться своим окончательным выводом здесь:
Я основываю это на Как получить конечный адрес моего кода
В коде вы должны добавить внешний ссылка на переменную:
extern char var2[];
Сценарий компоновщика должен быть написан следующим образом:
SECTIONS
{
.mysection : {
*(.mysection);
var2 = .;
}
}
INSERT AFTER .mysection
Добавьте скрипт компоновщика во время связывания (например, ld -T <PATH_TO_MY_LINKER_SCRIPT>
)
INSERT AFTER
часть используется, поэтому мой скрипт компоновщика будет добавлен в скрипт компоновщика по умолчанию.
Мне пришлось использовать «золото», чтобы связать мой файл эльфа, и, очевидно, версия, которую я использовал, не поддерживает синтаксис «ВСТАВИТЬ ПОСЛЕ». Таким образом, реальное решение должно состоять в том, чтобы скопировать скрипт компоновщика по умолчанию и просто добавить в него информацию моего скрипта.
Я не проверял это хотя, но я все еще надеюсь, что это может кому-то помочь.
Вам нужно будет создать свой собственный раздел в командном файле компоновщика и разместить его соответствующим образом в разделе переменных в командном файле компоновщика.
С большинством компоновщиков вы не можете определить порядок точных переменных. Более простое решение — создать один раздел для каждой переменной и сообщить компоновщику, как вы хотите упорядочить разделы.
Посмотрите точный синтаксис для командного файла компоновщика коллекции компиляторов GNU.