Предупреждение: загружаемый раздел "my_section" вне сегментов ELF

Я создал файл axf (elf), используя Arm Compiler v6.9 для Cortex-R4. Однако, когда я загружаю это к цели, используя подключаемые модули JD-Link GDB Arm MCU, он не загружает данные инициализации для моих сегментов. Если я загружаю axf, используя Segger Ozone и J-Link, он загружает данные инициализации правильно.

Если я запускаю файл arm-none-eabi-gdb.exe для файла axf, я получаю "Предупреждение: Загружаемый раздел"my_section"вне сегментов ELF" для всех моих инициализированных сегментов.

Глядя на изображение, данные инициализации должны быть загружены после изображения по адресам, указанным в таблице в области $$Table$$Base.

У нас нет этой проблемы, если мы связываемся с gcc, поскольку инициализированные данные выполняются по-другому.

Есть идеи?

0 ответов

Я столкнулся с той же проблемой сегодня и заметил ту же проблему, которую вы описали:

"Глядя на изображение, данные инициализации должны быть загружены после изображения по адресам, указанным в таблице в области $$Table$$Base".

Кажется, что файл ELF, сгенерированный armlink, очень похож, но немного отличается от файла ELF, сгенерированного GCC. Во всяком случае, я нашел обходной путь для этого.

Проверяя свой main.elf, я заметил, что armlinker сохранил данные инициализации в разделе ER_RW:

arm-none-eabi-readelf.exe" -S main.elf 
   There are 16 section headers, starting at offset 0x122b0:
     Section Headers:
         [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
         [ 0]                   NULL            00000000 000000 000000 00      0   0  0
         [ 1] ER_RO             PROGBITS        20000000 000034 001358 00  AX  0   0  4
         [ 2] ER_RW             PROGBITS        20002000 00138c 0000cc 00  WA  0   0  4
         [ 3] ER_ZI             NOBITS          200020cc 001458 0004e8 00  WA  0   0  4
         [ 4] .debug_abbrev     PROGBITS        00000000 001458 0005c4 00      0   0  1
         [ 5] .debug_frame      PROGBITS        00000000 001a1c 000dc4 00      0   0  1
         ...

Я заметил, что проблема возникает из-за того, что GDB загрузил ER_RW при addr=0x20002000, но, на самом деле, мне нужно было загрузить его сразу после раздела ER_RO (т.е. при addr=0x20001358)

Обходной путь для этого:

1- Используйте fromelf, чтобы выгрузить все разделы в двоичный файл main.bin. Fromelf добавит ER_RW сразу после ER_RO, как и должно быть:

fromelf.exe --bin -o main.bin main.elf

2- Используйте objcopy, чтобы заменить содержимое раздела ER_RO данными из main.bin. Обратите внимание, что теперь мы можем удалить раздел ER_RW, так как он уже был объединен с ER_RO в main.bin:

arm-none-eabi-objcopy.exe main.elf --update-section ER_RO=main.bin --remove-section=ER_RW  main.gdb.elf

Новый файл main.gdb.elf теперь можно загрузить с помощью arm-none-eabi-gdb.exe

Вот как это выглядит:

arm-none-eabi-readelf.exe" -S main.gdb2.elf
   There are 15 section headers, starting at offset 0x11c0c:

   Section Headers:
       [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
       [ 0]                   NULL            00000000 000000 000000 00      0   0  0
       [ 1] ER_RO             PROGBITS        20000000 000054 001424 00  AX  0   0  4
       [ 2] ER_ZI             NOBITS          200020cc 000000 0004e8 00  WA  0   0  4
       [ 3] .debug_abbrev     PROGBITS        00000000 001478 0005c4 00      0   0  1
       ...

Удачной отладки с GDB!!;-)

Другие вопросы по тегам