реклама на сайте
подробности

 
 
> WinAVR - проблема с секциями в ld, warning: allocated section `.data' not in segment
Сергей Борщ
сообщение Mar 12 2008, 13:36
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Мега 8. WinAVR 20070525.
Потребовалось организовать в ОЗУ следующую карту памяти:
0x60-0x71 - зарезервировано
0x71-N - Массив (его размер определяется при объявлении в программе)
N-0x45F - данные программы, стеки, в общем как обычно.

Массив определяю в программе в отдельную секцию:
Код
uint8_t Buffer[5] __attribute__((section("buffer"),used));

Скопировал в каталог проекта скрипт avr4.x, изменил в нем регионы, поставил выходную секцию .bss перед .data, добавил свою секцию в .bss:
Код
MEMORY
{
  text   (rx)   : ORIGIN = 0, LENGTH = 0x17F4
  data   (rw!x) : ORIGIN = 0x800071, LENGTH = 1K
  eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 512
}
....
  .bss :
  {
    *(buffer);    /* reserved for TxBuffer */
    KEEP (*(buffer))
     PROVIDE (__bss_start = .);
    *(.bss)
    *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .);
  }  > data

  .data SIZEOF(.bss) + ADDR(.bss)  : AT (ADDR (.text) + SIZEOF (.text) )   /* load from (.text) + sizeof(.text) */
  {
     PROVIDE (__data_start = .);
    *(.data)
    *(.data*)
    *(.rodata)  /* We need to include .rodata here if gcc is used */
    *(.rodata*) /* with -fdata-sections.  */
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
     _edata = .;
     PROVIDE (__data_end = .);
  }  > data
При компиляции получаю предупреждение: ld.exe: Test.elf: warning: allocated section `.data' not in segment
При этом avr-objcopy при создании .hex добавляет в него данные по адресам __data_start (т.е. 0x8000XX). Начал урезать исходники и makefile, чтобы отыскать откуда ноги. Эффект нестабильный - при выкидывании одних кусков исходника пропадает, при выкидывании других - остается. Получил прилагаемый проект, в котором эффект еще повторяется. При дальнейшем уменьшении исходника эффект пропадает. Причем он пропадает даже при изменении той части исходника, код из которой не используется и выкидывается при линковке. Если убрать --gc-sections, эффект также пропадает. Если в линкерном скрипте убрать ". = ALIGN(2);" в .data (кстати, зачем он тут?) - тоже исчезает. Заметил, что одно из условий появления - если в результате сбора мусора линкером сегмент .data получается пустым, однако это не единственное условие, требуется что-то еще.

Пробовал версию 22071221 - поведение идентично. 20060421 - предупреждение не генерится, но в выходной .hex-файл все равно добавляется мусор.

Вопрос первый - что означает это предупреждение? Гугление не помогло.
Вопрос второй - что я делаю не так и как надо правильно добавлять свои секции?
Вопрос третий - пробовал создавать в линкерном скрипте отдельную выходную секцию для массива. В результате avr-objcopy -o ihex -R .eeprom Test.elf Test.hex помещает в .hex нули по VMA адресам этого массива. При указании -R <имя моей секции> она исчезает из выходного файла, но тогда возникет вопрос - почему в выходном файле не появляются секции .noinit, .bss и секции отладочной информации (перечислены в конце скрипта), хотя они и не были перечислены с ключем -R. Где об этом можно почитать? В документации к ld, avr-objcopy, objcopy, gcc ничего на эту тему не нашел.
Прикрепленные файлы
Прикрепленный файл  ld_quest.zip ( 3.24 килобайт ) Кол-во скачиваний: 41
 


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 12 2008, 15:02
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Провел дополнительные исследования. Выяснил, что появление лишней информации в .hex и это предупреждение не связаны (хотя вчера они появлялись и исчезали одновременно). С появлением лишней информации выяснил, что если мои секции описаны в .bss между строчками PROVIDE (__bss_start = .) и PROVIDE (__bss_end = .), то они не появляются в выходном файле, если же вне этих строчек - то появляются:
Код
  .bss :  /* Так появляется */
  {
    *(buffer);    /* reserved for TxBuffer */
    KEEP (*(buffer))
     PROVIDE (__bss_start = .);
    *(.bss)
    *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .);
  }  > data

  .bss :     /* a так - нет */
  {
     PROVIDE (__bss_start = .);
    *(buffer);    /* reserved for TxBuffer */
    KEEP (*(buffer))
    *(.bss)
    *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .);
  }  > data
Таким образом обходное решение найдено, но остается третий вопрос - как avr-objcopy по умолчанию определяет, что включать в .hex, а что - нет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
amw
сообщение Mar 13 2008, 09:08
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата
При компиляции получаю предупреждение: ld.exe: Test.elf: warning: allocated section `.data' not in segment

Проблема (несоответствие) адресов/размеров переменных и Memory Region.
То есть попытка разместить символ по адресу, не попападающему в соответствующий регион памяти.

Цитата(Сергей Борщ @ Mar 12 2008, 17:02) *
Провел дополнительные исследования. Выяснил, что появление лишней информации в .hex и это предупреждение не связаны (хотя вчера они появлялись и исчезали одновременно). С появлением лишней информации выяснил, что если мои секции описаны в .bss между строчками PROVIDE (__bss_start = .) и PROVIDE (__bss_end = .), то они не появляются в выходном файле, если же вне этих строчек - то появляются:
Код
  .bss :  /* Так появляется */
  {
    *(buffer);    /* reserved for TxBuffer */
    KEEP (*(buffer))
     PROVIDE (__bss_start = .);
    *(.bss)
    *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .);
  }  > data

  .bss :     /* a так - нет */
  {
     PROVIDE (__bss_start = .);
    *(buffer);    /* reserved for TxBuffer */
    KEEP (*(buffer))
    *(.bss)
    *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .);
  }  > data
Таким образом обходное решение найдено, но остается третий вопрос - как avr-objcopy по умолчанию определяет, что включать в .hex, а что - нет.

Собственно __bss_start и __bss_end являются общепринятыми (в мире CGG) именами и должны обрамлять секцию. То-же касается и __data_start и прочих. Я не копал глубоко, но может эти имена анализируются линкером.
PROVIDE () больше предназначено для устранения дублирующих определений и их гарантированного появления чем для собственно определений. Что будет если PROVIDE (__bss_start = .) заменить на __bss_start = .? Сообщение останется?
objcopy по умолчанию копирует в HEX файл (как впрочем и в binary) выходные секции .text .data .rodata (полный список зависит от архитектуры).

Сообщение отредактировал amw - Mar 13 2008, 09:27


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 13 2008, 11:29
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(amw @ Mar 13 2008, 11:08) *
Проблема (несоответствие) адресов/размеров переменных и Memory Region.
То есть попытка разместить символ по адресу, не попападающему в соответствующий регион памяти.
Пппереведи! (с)"Москва слезам не верит". Какое мое действие приводит к возникновению этого предупреждения и почему оно то появляется, то исчезает в зависимости от седержимого кода, удаляемого сборщиком мусора линкера?
Я интуитивно понял, что при какой-то комбинации сборщик мусора линкера выкидывает все из секции .data, но оставляет там байт-заполнитель от инструкции скрипта . = ALIGN(2). Предполагаю, что для этого байта нет соответствующего значения в области AT (ADDR (.text) + SIZEOF (.text), о чем и ругается линкер. Но это только мое предположение.
Цитата(amw @ Mar 13 2008, 11:08) *
Собственно __bss_start и __bss_end являются общепринятыми (в мире CGG) именами и должны обрамлять секцию. То-же касается и __data_start и прочих. Я не копал глубоко, но может эти имена анализируются линкером.
Вот где про это почитать, кроме исходников линкера? В описании линкера эти символы не упоминаются, в примерах скриптов в этом же описании не встречаются, и вдруг выясняется, что они имеют важное значение. Хотелось бы ознакомиться с документами, где это описано, чтобы не двигаться наощупь. И вдруг там описано еще что-то важное и интересное.
Цитата(amw @ Mar 13 2008, 11:08) *
PROVIDE () больше предназначено для устранения дублирующих определений... Что будет если PROVIDE (__bss_start = .) заменить на __bss_start = .? Сообщение останется?
PROVIDE определяет символ, если такой символ не определен в объектных файлах. В данном конкретном случае не изменилось ничего, чего и следовало ожидать.
Цитата(amw @ Mar 13 2008, 11:08) *
objcopy по умолчанию копирует в HEX файл (как впрочем и в binary) выходные секции .text .data .rodata (полный список зависит от архитектуры).
Цитата
- А я Виндовс-2000 так до конца и не прошел sad.gif
- Так это же не игра, а операционная система!
- Откуда инфа?!?!?
Откуда инфа? Где посмотреть этот полный список? .bss, .noinit, .stab, .comment, .debug, .line - тоже выходные секции. Причем как показал мой эксперимент с перемещением __bss_start = . он может копировать выходные секции не целиком, а частями.
Кто-нибудь знает, какой конкретно TFM мне надо R?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Сергей Борщ   WinAVR - проблема с секциями в ld   Mar 12 2008, 13:36
|- - singlskv   А почему не сделать просто в Makefile ? : Код.......   Mar 13 2008, 13:01
||- - Сергей Борщ   Цитата(singlskv @ Mar 13 2008, 15:01) А п...   Mar 13 2008, 16:21
||- - amw   Цитата(Сергей Борщ @ Mar 13 2008, 18:21) ...   Mar 13 2008, 18:09
||- - Сергей Борщ   Цитата(amw @ Mar 13 2008, 20:09) я имел в...   Mar 13 2008, 21:19
||- - Сергей Борщ   amw, спасибо за толчок в новом направлении! Мы...   Mar 14 2008, 01:17
|||- - Сергей Борщ   Цитата(Сергей Борщ @ Mar 14 2008, 03:17) ...   Mar 14 2008, 11:43
|||- - amw   Цитата(Сергей Борщ @ Mar 14 2008, 13:43) ...   Mar 14 2008, 11:59
|||- - singlskv   Цитата(Сергей Борщ @ Mar 14 2008, 14:43) ...   Mar 14 2008, 19:08
|||- - Сергей Борщ   Цитата(singlskv @ Mar 14 2008, 21:08) ИМХ...   Mar 14 2008, 19:20
|||- - singlskv   Цитата(Сергей Борщ @ Mar 14 2008, 22:20) ...   Mar 14 2008, 19:40
|||- - Сергей Борщ   Цитата(singlskv @ Mar 14 2008, 21:40) то ...   Mar 14 2008, 20:42
|||- - amw   Цитата(Сергей Борщ @ Mar 14 2008, 22:42) ...   Mar 14 2008, 21:13
||||- - Сергей Борщ   Цитата(amw @ Mar 14 2008, 23:13) Точнее у...   Mar 14 2008, 22:42
||||- - singlskv   Цитата(Сергей Борщ @ Mar 15 2008, 01:42) ...   Mar 14 2008, 23:14
|||- - singlskv   Цитата(Сергей Борщ @ Mar 14 2008, 23:42) ...   Mar 14 2008, 21:38
|||- - amw   Цитата(Сергей Борщ @ Mar 14 2008, 22:42) ...   Mar 15 2008, 08:59
|||- - Сергей Борщ   Цитата(singlskv @ Mar 15 2008, 01:14) сек...   Mar 15 2008, 10:58
||||- - amw   Цитата(Сергей Борщ @ Mar 15 2008, 12:58) ...   Mar 15 2008, 11:59
||||- - Сергей Борщ   Цитата(amw @ Mar 15 2008, 13:59) .bss по ...   Mar 15 2008, 14:19
||||- - amw   Цитата(Сергей Борщ @ Mar 15 2008, 16:19) ...   Mar 15 2008, 16:46
|||- - singlskv   Цитата(amw @ Mar 15 2008, 11:59) А вот эт...   Mar 15 2008, 17:07
||- - amw   Цитата(Сергей Борщ @ Mar 13 2008, 23:19) ...   Mar 14 2008, 09:02
||- - Сергей Борщ   Цитата(amw @ Mar 14 2008, 11:02) Как это ...   Mar 14 2008, 10:40
||- - amw   Цитата(Сергей Борщ @ Mar 14 2008, 12:40) ...   Mar 14 2008, 11:27
||- - Сергей Борщ   Цитата(amw @ Mar 14 2008, 13:27) ОК. Убед...   Mar 14 2008, 12:00
||- - amw   Цитата(Сергей Борщ @ Mar 14 2008, 14:00) ...   Mar 14 2008, 12:15
||- - ReAl   Цитата(Сергей Борщ @ Mar 14 2008, 14:00) ...   Mar 16 2008, 20:26
|- - amw   Цитата(Сергей Борщ @ Mar 13 2008, 13:29) ...   Mar 13 2008, 14:11
- - AHTOXA   Цитата(Сергей Борщ @ Mar 12 2008, 18:36) ...   Mar 17 2008, 16:11
- - Сергей Борщ   Цитата(AHTOXA @ Mar 17 2008, 18:11) Это и...   Mar 17 2008, 20:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 20:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016