Компоновщик и сценарий компоновщика GNU: компоновщик не генерирует правильный LMA

В моем скрипте компоновщика есть следующая строка

JumpTable ABSOLUTE(0x2000000C): AT(eROData)
{
    JumpTableStart = .;
    *(.JumpSection);
    . = ALIGN(4);
    JumpTableEnd = .;
} > SRAM

eROData - это адрес из флэш-памяти и принимает значение 0x1000xxxx

После связывания я заметил, что компоновщик назначает VMA и LMA разделу JumpTable. Это список из файла списка.

 2 .rodata       00000004  10001214  10001214  00001214  2**2

              CONTENTS, ALLOC, LOAD, READONLY, DATA

 3 JumpTable     00000140  2000000c  2000000c  00008954  2**2

              CONTENTS, READONLY

С разделом .data таких проблем нет.

Это известная проблема компоновщика GNU?

РЕДАКТИРОВАТЬ: Я заметил, что если раздел «.JumpSection» был определен в файле C, LMA был назначен правильно.

Я столкнулся с этой проблемой, потому что раздел определен в файле сборки.

Вы сталкивались с этой проблемой раньше?

РЕДАКТИРОВАТЬ - РЕШЕНИЕ: Оказалось, что .JumpSection должен был быть определен с правильными атрибутами: .section ".JumpSection", "ax",% progbits

Только тогда компоновщик будет вести себя правильно.


person Raj    schedule 07.12.2012    source источник


Ответы (1)


Итак, вот что я узнал. Возможно, это спасет кого-нибудь от многих часов утомительной отладки.

Моя основная проблема заключалась в том, что существовал фрагмент ассемблерного кода, который нужно было связать с пространством SRAM и загрузить из пространства флеш-памяти. Таким образом, VMA должен был быть адресом SRAM, а LMA - адресом флэш-памяти.

Раньше мне всегда удавалось выполнить вышеуказанное для функций / данных, определенных в файле c. Все, что мне нужно было сделать, это назначить атрибут раздела и соответствующим образом изменить скрипт компоновщика.

ВЫВОД 1: компоновщик позволяет использовать разные LMA для стандартных разделов ТЕКСТ и ДАННЫЕ, хотя они могут называться по-разному с помощью атрибута раздела.

Нет такой удачи, когда то же самое было предпринято в файле сборки. Компоновщик отказался подтвердить, что определенная выше входная секция .JumpTable на самом деле является пользовательской секцией TEXT.

Решение было тогда

  1. Чтобы переместить ассемблерный код в новый файл JumpTable.S.

  2. Переименуйте раздел ввода .JumpTable в .text

  3. Измените файл компоновщика следующим образом

     .text :
    
    {
    
    *(EXCLUDE_FILE(*JumpTable.o) .text); /* Exclude .text of JumpTable.o and place others */
    
    } > FLASH
    
    
    JumpTable ABSOLUTE(0x2000000C) : AT (eROData) /* Link to SRAM and Load after const data */
    
     {
    
       JumpTableStart = .;
    
       *JumpTable.o(.text); /* Place .text of JumpTable.o into JumpTable output section) */
    
       JumpTableEnd = .;
    
     } > SRAM
    

Может быть, есть лучшее объяснение / другая первопричина. Но это точно спасло мне день.

person Raj    schedule 08.12.2012