Есть ли способ сопоставить определенный тип данных из всех исходных файлов в каталоге с разделом памяти в командном файле компоновщика без явного указания?

#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 .