#c #gcc #linker #gnu #ld
Вопрос:
Я использую набор инструментов GNU для проекта ARM, над которым я работаю. Проект включает операционную систему реального времени (RTOS) и использует блок защиты памяти (MPU) процессора ARM Cortex-R4.
Я использую файл команды компоновщика ( .ld
) для сопоставления .bss
и .data
разделов с блоками памяти, которые могут быть доступны для задач, требующих доступа.
Это конкретное приложение имеет несколько различных конфигураций сборки. В проекте есть две папки с исходным кодом верхнего уровня, которые для всех целей и задач я буду называть common
и. custom
Папка common
содержит весь исходный код, используемый всеми конфигурациями сборки, а папка custom
содержит одну подпапку для каждой конфигурации сборки, содержащую исходный код, специфичный для этой конфигурации сборки. Например, custom/build_cfg1
, custom/build_cfg2
, и т.д.
Весь custom
исходный код вызывается из одной задачи RTOS. Я хотел бы настроить файл компоновщика, чтобы он мог размещать все .data
.bss
разделы и из custom
папки в один раздел в зависимости от расположения файла, но используемый мной подход не улавливает разделы .data
и. .bss
Ниже приведен пример того, как выглядит командный файл компоновщика:
.custom_bss (NOLOAD) : AT (0)
{
custom_bss_start = .;
"./custom/*" (.bss.*)
custom_bss_end = .;
}
/* Define initialized data separately since it must be loaded. */
.custom_data : AT(ld_custom_data_load_addr)
{
custom_data_start = .;
"./custom/*" (.data.*)
custom_data_end = .;
}
Несколько вещей, которые стоит отметить:
- Я проверил, что путь к файлу, переданный компоновщику, начинается с
./custom/
и что разделы.data
и.bss
сопоставляются со всеми.data
.bss
разделами и. - Исходные файлы в
common
папке уже сопоставлены по мере необходимости. - Я настроил свой конструктор так, чтобы он включал файлы только для активной конфигурации сборки при компиляции и связывании.
- Разделы задаются с помощью
.bss.*
и.data.*
, так как я использую эту-fdata-sections
опцию при компиляции.
Существует ли способ указания имени файла, который позволит мне сопоставить все .bss
и .data
разделы из папки и ее вложенных папок с определенным разделом с помощью командного файла компоновщика?
Ответ №1:
Нет, это невозможно.
Из ld
документации:
Подстановочные знаки соответствуют только тем файлам, которые явно указаны в командной строке. Компоновщик не выполняет поиск в каталогах для расширения подстановочных знаков.
Я бы сделал это по-другому. Напишите простую программу и запустите ее перед сборкой, явно добавив файлы (или, по крайней мере, каталоги). Легко архивировать в make, cmake или eclipse.
Комментарии:
1. Спасибо, что нашли время ответить. Я также видел это на странице документации компоновщика ( ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_chapter/… ), но это казалось немного расплывчатым, поэтому я надеялся, что в этом есть какой-то подвох. Оказывается, это работает так, как я изначально это делал, я просто ошибся в указании раздела ввода (.bss вместо .bss.*).
Ответ №2:
После дальнейшего расследования я обнаружил, что на самом деле возникла проблема с тем, как я определил раздел ввода (.bss) вместо (.bss.*). Как только это было исправлено, ./custom/*/*.o (.bss.*)
удалось извлечь разделы .bss из исходных файлов в подкаталогах и подкаталогах подкаталогов custom
.