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