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

Я узнал, что с помощью __attribute__ ((section(".section_name"))) я могу перемещать функцию или переменную в определенный раздел, как определено в сценарии компоновщика. Но у меня есть несколько исходных файлов C, для которых я хочу переместить весь этот код в определенный раздел простым методом вместо того, чтобы писать указанную выше команду для каждого объявления функции / переменной.

Точно так же у меня есть файлы режима C, для которых мне нужно переместить их в другие определенные разделы.

Написание __attribute__ ((section(".section_name"))) для каждой функции и переменной будет трудоемким и сложным процессом. Может ли у кого-нибудь быть альтернативный метод применения определенного раздела для всего файла вместо каждой функции?

См. также:  Как правильно поменять местами пустые указатели?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Logan859

    Вы преувеличиваете, когда говорите «написание __attribute__ ((section(".section_name"))) для каждой функции и переменной будет трудоемким и сложным процессом»?

    Предложение Ctx — жизнеспособное решение. Но когда вы вернетесь к своему коду через полгода, вам будет трудно вспомнить, почему и как он работает. И это добавит много дополнительных усилий, когда вы перейдете на другую систему сборки.

    Более прагматичным решением будет использование макроса:

    #define MY_SECTION __attribute__ ((section(".section_name")))
    

    Использование макроса создает легко читаемый и понятный код без скрытой магии компоновщика:

    int variable MY_SECTION = 10;
    
    int sqr(int n1) MY_SECTION;
    

    Ну конечно это хороший способ. Но, ну … Это именно то, чего ОП явно не хочет, будь то макрос или нет. Может ли у кого-нибудь быть альтернативный метод применения определенного раздела для всего файла вместо каждой функции? здесь просто нет ответа. person Logan859; 22.11.2019

    @Ctx Я часто беру на себя смелость предлагать решения, которые, как мне кажется, в интересах ОП, даже если он / она, возможно, просили чего-то немного другого. Преимущество StackOverflow в том, что на вопрос может быть несколько разумных ответов и что OP и более поздние посетители могут реализовать тот, который лучше всего подходит для их конкретного контекста. person Logan859; 22.11.2019

    Спасибо за ответ, ребята … @Codo Я использую в своем проекте разные SDK с поддержкой FreeRTOS MPU. Итак, мне нужно поместить все сторонние коды в другой раздел для безопасности. Итак, как я упоминал ранее, я не могу использовать подход attribute ((section (.section_name))), поскольку файлов SDK огромное количество. person Logan859; 22.11.2019

    @Codo Я понимаю это в целом, но в данном случае это решение было явно исключено в вопросе. person Logan859; 22.11.2019

  2. Logan859

    Для этого вы можете использовать скрипт компоновщика. Сначала загрузите скрипт компоновщика по умолчанию:

    $ ld —verbose

    Включен SECTIONS раздел, который необходимо изменить:

    SECTIONS
    {
      /* Read-only sections, merged into text segment: */
      PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
      .interp         : { *(.interp) }
      .note.gnu.build-id : { *(.note.gnu.build-id) }
      .hash           : { *(.hash) }
      .gnu.hash       : { *(.gnu.hash) }
      .dynsym         : { *(.dynsym) }
      .dynstr         : { *(.dynstr) }
      .gnu.version    : { *(.gnu.version) }
    ...
    

    Теперь в том месте, где вы хотите разместить новый раздел, поместите следующую команду:

    .mysection : { obj1.o obj2.o }
    

    Это помещает все символы указанных объектных файлов в указанный раздел. Вы также можете ограничить это определенными разделами ввода, например

    .mysection : { obj1.o(.text) obj2.o(.data) }
    

    Вы также можете использовать подстановочные знаки для спецификации имени файла:

    .mysection : { sdk/files_*.o }
    

    Для получения дополнительных сведений см. руководство GNU ld

    Спасибо за ответ @Ctx. Я попробую с вашим предложением. person Logan859; 22.11.2019

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: