Как я могу добавить символы, указывающие на раздел?

У меня есть некоторые переменные в моем коде C, которые объявлены с помощью __attribute__((section(".data.mystuff"))). Я хотел бы определить два символа, mystuff_start и mystuff_size, которые имеют положение и размер раздела. Похоже, что LOADADDR и SIZEOF ld будут делать то, что я хочу, но я не хочу писать весь скрипт компоновщика. Я тоже не могу понять, как использовать INSERT AFTER, чтобы делать то, что я хочу.


person Isvara    schedule 26.06.2013    source источник


Ответы (1)


Проще всего поместить их в раздел, имя которого имеет действительный идентификатор C. Например, используйте:

__attribute__((section("mystuff")))

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

РЕДАКТИРОВАТЬ: это полностью зависит от GCC!

person Jamie Iles    schedule 26.06.2013
comment
Большинство компиляторов C имеют аналогичные переменные или функции. В Green Hills есть __ghsbeginXXX, __ghsendXXX и __ghssizeXXX. - person Gerhard; 26.06.2013
comment
И у IAR есть две функции, возвращающие указатели __segment_begin(segment) и __segment_end(segment) - person Gerhard; 26.06.2013
comment
Компоновщику это не нравится: 0000000000001771] перекрывает раздел .data, загруженный по адресу [000000000000175a,000000000000193b] - person Isvara; 27.06.2013
comment
@ Derecho: Вы должны обновить свой файл компоновщика, чтобы освободить место для вещей, которые входят в mystuff. - person Gerhard; 10.07.2013
comment
@Gerhard Но могу ли я сделать это, дополнив скрипт компоновщика по умолчанию? Я бы предпочел это копировать все это из GCC в свой проект, чтобы изменить его. - person Isvara; 11.07.2013
comment
@ Derecho У вас может быть только один скрипт компоновщика. Вам нужно будет взять значение по умолчанию и изменить его. Вы можете изменить его при сборке с использованием аргументов gcc. -Xlinker -defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) - person Gerhard; 11.07.2013
comment
@Gerhard Насколько я понимаю, у вас может быть несколько скриптов компоновщика. Есть основной (либо заданный по умолчанию, либо указанный с помощью -T), и есть любые, которые вы указываете, как если бы они были объектными файлами. И если вы укажете с помощью -T тот, у которого есть INSERT AFTER или INSERT BEFORE, он дополняет, а не заменяет значение по умолчанию. Это неправильно? Дело в том, что я не могу определить начало своего раздела вручную, потому что я не знаю, насколько велик раздел .data до него. Мне также нужно, чтобы мой раздел находился в том же разделе вывода, что и .data. - person Isvara; 12.07.2013