2013-05-25 3 views
2

Я хочу поместить определенную переменную в конец раздела своей памяти.Как разместить переменную в конце раздела (с помощью GCC)

Так что, если у меня есть:

file1.cpp:

__attribute__((section(".mysection"))) char var1[] = "var1"; 

и в другом file2.cpp:

__attribute__((section(".mysection"))) char var2[] = "var2"; 

Как я могу заставить var2 быть в конце mysection ?

ответ

0

Вам нужно будет создать свой собственный раздел в файле командной строки компоновщика и соответствующим образом разместить свой раздел в разделе переменных в файле командной строки компоновщика.

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

Посмотрите точный синтаксис командного файла компоновщика коллекции компилятора GNU.

3

Ну, я в конечном итоге принимает совершенно другой подход, но я хотел бы поделиться мой окончательный вывод здесь: Я основываю это на How to fetch the end address of my code

В коде, вы должны добавить Экстерн ссылку на переменную:

extern char var2[]; 

линкер скрипт должен быть записан следующим образом:

SECTIONS 
{ 
    .mysection : { 
     *(.mysection); 
     var2 = .; 
    } 
} 
INSERT AFTER .mysection 

Добавьте скрипт компоновщика во время связи (например, ld -T <PATH_TO_MY_LINKER_SCRIPT>) Часть INSERT AFTER используется, поэтому мой скрипт компоновщика будет добавлен к сценарию компоновщика по умолчанию.

Мне пришлось использовать «золото», чтобы связать мой файл эльфа, и, видимо, версия, которую я использовал, не поддерживает синтаксис «INSERT AFTER». Таким образом, фактическое решение должно состоять в том, чтобы скопировать сценарий компоновщика по умолчанию и просто добавить в него информацию о моем скрипте.

Я еще не протестировал его, но я все еще надеюсь, что это может помочь кому-то.

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