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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> WinAVR - проблема с секциями в ld, warning: allocated section `.data' not in segment
Сергей Борщ
сообщение Mar 14 2008, 12:00
Сообщение #16


Гуру
******

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



Цитата(amw @ Mar 14 2008, 13:27) *
ОК. Убедили, но проверте все же как именно выполняется копирование. Выравние из ниоткуда?
Должны же быть причины для такого выравнивания.
Нормально выполняется. Вот я и надеюсь, что aesok прояснит этот вопрос.
Цитата(amw @ Mar 14 2008, 13:27) *
Да. Но! В любом случае, эта часть (копирование и обнуление секций) не есть часть компилятора.
В embedded-мире - это часть libc.
Да, согласен.

Цитата(amw @ Mar 14 2008, 13:27) *
Ага. А где гарантия, что за секция .data (LMA) идет после секции .text? Простейший пример:
Цитата
Что делает Ричи Блэкмор, когда берет неправильную ноту?
- Вау! Еще и так можно!
smile.gif Вот уж не знал, что выходные секции можно разбивать на части и тасовать. Но в таком случае было бы логично выравнивать начало .text, а не конец предыдущей .data. В общем, пока получается гадание на кофейной гуще.

А вот родилась мысль - может они хотели сделать быстрое копирование, копируя по два байта за каждый проход цикла? Или может так оно и было когда-то, но потом отказались, а это выравнивание - рудимент?


--------------------
На любой вопрос даю любой ответ
"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 14 2008, 12:15
Сообщение #17


Знающий
****

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



Цитата(Сергей Борщ @ Mar 14 2008, 14:00) *
Нормально выполняется. Вот я и надеюсь, что aesok прояснит этот вопрос.Да, согласен.

smile.gif Вот уж не знал, что выходные секции можно разбивать на части и тасовать. Но в таком случае было бы логично выравнивать начало .text, а не конец предыдущей .data. В общем, пока получается гадание на кофейной гуще.
Цитата

Это был простейший пример.
За секцией .data следуют другие секции, и они могут то-же требовать выравнивания. В общем случае, разумеется. Логично выравнивать каждую секцию, размер которой может быть не кратным.

А вот родилась мысль - может они хотели сделать быстрое копирование, копируя по два байта за каждый проход цикла? Или может так оно и было когда-то, но потом отказались, а это выравнивание - рудимент?

Может и так быть. Однако следует осторожно к этому подходить. И ждать специалиста по binutils smile.gif.
И еще вариант.
Пишем скрипт для одного процессора. Потом появляется новый. Копируем старый скрипт, добавляем нужное (например выравнивание). Потом появляется еще один процессор. Копируем уже модифицированный скрипт и вносим изменения для третьего процессора и т.д.


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


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ Mar 14 2008, 14:43) *
Развил мысль, все получилось. Надо objcopy указывать не только -j .text, но и -j .data Итого: $(OBJCOPY) -O ihex -j .text -j .data $< $@ копирует в хекс-файл только исполняемый код и инициализирующие значения для .data. Все остальное не копирует.
ИМХО, этот вариант ничем не лучше того что я(и видимо Real) предлагал с удалением
секции -R buffer при производстве hex.

Основная проблемма скорее всего заключается в том, что сегмент определенный
в исходнике как:
Код
uint8_t Buffer[5] __attribute__((section("buffer"),used));
будет иметь все признаки секции .data , те его образ должен появлятся в выходном
hex файле, конечно если мы его "ручками"(-R) не выкинули.
Но при этом для таких секций не будет произведено преобразование адреса VMA в правильный
для сохранения в флеш адрес LMA, те либо это должно делаться в скрипте, либо пользуемся
опцией -R sectname

Покажите минимальный исходник+скрипт в котором есть проблема с лишними
данными в результируещем hex..., будем подумать...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 19:20
Сообщение #19


Гуру
******

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



Цитата(singlskv @ Mar 14 2008, 21:08) *
ИМХО, этот вариант ничем не лучше того что я(и видимо Real) предлагал с удалением
секции -R buffer при производстве hex.
Мне он кажется "прямее", потому что надо явно указать что нужно (что я хочу) в выходном файле, а не указанием того, что мне не нужно.

Цитата(singlskv @ Mar 14 2008, 21:08) *
Основная проблемма скорее всего заключается в том, что сегмент определенный
в исходнике как:
Код
uint8_t Buffer[5] __attribute__((section("buffer"),used));
будет иметь все признаки секции .data , те его образ должен появлятся в выходном
hex файле,
Откуда такой вывод? Если я его помещу в выходную секцию .data - появится, если в .bss - нет, и будет обнулен. Если в .noinit (или свою секцию) - и не появится и обнулен не будет.
Цитата(singlskv @ Mar 14 2008, 21:08) *
Покажите минимальный исходник+скрипт в котором есть проблема с лишними данными в результируещем 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
singlskv
сообщение Mar 14 2008, 19:40
Сообщение #20


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ Mar 14 2008, 22:20) *
Мне он кажется "прямее", потому что надо явно указать что нужно (что я хочу) в выходном файле, а не указанием того, что мне не нужно.
Вот в этом мы и пытаемся разобраться... smile.gif как "прямее"
Цитата
Откуда такой вывод? Если я его помещу в выходную секцию .data - появится, если в .bss - нет, и будет обнулен. Если в .noinit (или свою секцию) - и не появится и обнулен не будет.

You may only use the section attribute with a fully initialized global definition
because of the way linkers work. The linker requires each object be defined once,
with the exception that uninitialized variables tentatively go in the common (or
bss) section and can be multiply “defined”. You can force a variable to be
initialized with the ‘-fno-common’ flag or the nocommon attribute.

это из описания gcc.pdf

то есть, ИМХО, по сути обявление своей секции данных, есть объявление алтернаивной
секции .data , но, для нее при этом, без доп телодвижений адрес LMA совпадает с адресом VMA,
и как следствие, мусор в hex тк эта секция не отмапилась на нужные нам адреса в флеш.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 20:42
Сообщение #21


Гуру
******

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



Цитата(singlskv @ Mar 14 2008, 21:40) *
то есть, ИМХО, по сути обявление своей секции данных, есть объявление алтернаивной секции .data , но, для нее при этом, без доп телодвижений адрес LMA совпадает с адресом VMA, и как следствие, мусор в hex тк эта секция не отмапилась на нужные нам адреса в флеш.
Это я должен обдумать. Сейчас (пятница smile.gif ) немного не могу въехать. Что-то мне казалось, что все у нас в руках - все секции можно описать в скрипте линкера. Надо указать LMA - указываем, не надо - будет совпадать с VMA. Куда хотим поместить - тот регион и указываем.

Прилагаю обещаный пример. Скрипт - стандартный avr4.x, только добавлена выходная секция .buffer в которую складывается входная buffer. В программе объявлен массив, помещаемый в buffer и массив, помещаемый в .noinit. в .data размещается переменная. По make all создаюся два хекса - Test1.hex создается по примеру WinAVR (objcopy -R .eeprom) - в нем появляются и .buffer и .noinit. Test2 создается по objcopy -j .text -j data - в нем только необходимые для прошивки .text и .data (по адресу LMA). В создаваемом из .elf дизассемблированном Test.lss видно, что все переменные размещаются в нужных адресах ОЗУ.

Извиняюсь, пропустил это письмо:
Цитата(amw @ Mar 14 2008, 13:59) *
А .rodata? Константы нужны? В том числе и те, которые есть в компиляторах и библиотеках.
Конечно. Но они уже сложены в выходную секцию .text в скрипте линкера.
Цитата(amw @ Mar 14 2008, 13:59) *
Не могу добиться варнинга.
А сравните версии компиляторов. (Я свою приводил выше). Может и в правду какая бага. У Вас есть, а у меня уже (или еще) нет.
avr-gcc.exe (GCC) 4.1.2 (WinAVR 20070525)
avr-gcc.exe (GCC) 3.4.6 (WinAVR 20060421)
avr-gcc.exe (GCC) 4.2.2 (WinAVR 20071221)
во всех трех случаях варнинг есть.

P.S. родилась еще одна безумная мысль - если у вас нет каких-то особых требований к расположению выходной секции .data в ОЗУ, то в ее начало можно поместить входные секции векторов в ОЗУ и .ramfunc, тогда они будут копироваться crt0.s из флеш в ОЗУ одним заходом вместе с .data
Прикрепленные файлы
Прикрепленный файл  Test2.ZIP ( 2.77 килобайт ) Кол-во скачиваний: 27
 


--------------------
На любой вопрос даю любой ответ
"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 14 2008, 21:13
Сообщение #22


Знающий
****

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



Цитата(Сергей Борщ @ Mar 14 2008, 22:42) *
Конечно. Но они уже сложены в выходную секцию .text в скрипте линкера.avr-gcc.exe (GCC) 4.1.2

Точнее у Вас в .data.
У меня (ARM) отдельная секция для .rodata, и ее не надо копировать в озу.
Цитата
(WinAVR 20070525)
avr-gcc.exe (GCC) 3.4.6 (WinAVR 20060421)
avr-gcc.exe (GCC) 4.2.2 (WinAVR 20071221)
во всех трех случаях варнинг есть.

avr-gcc (GCC) 4.1.0 (Debian/amd64)
Цитата
P.S. родилась еще одна безумная мысль - если у вас нет каких-то особых требований к расположению выходной секции .data в ОЗУ, то в ее начало можно поместить входные секции векторов в ОЗУ и .ramfunc, тогда они будут копироваться crt0.s из флеш в ОЗУ одним заходом вместе с .data

Это Вы про мой пример?
Мысль не безумная, а вполне здравая.
Однако есть причины.


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


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ Mar 14 2008, 23:42) *
Это я должен обдумать. Сейчас (пятница smile.gif ) немного не могу въехать.

Таки пятница... и Ваш пример сразу не собрался,
собственно интересно что показывает "avr-objdump -h projname.elf"
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 22:42
Сообщение #24


Гуру
******

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



Цитата(amw @ Mar 14 2008, 23:13) *
Точнее у Вас в .data.
Да, с .rel.rodata попутал.
Цитата(amw @ Mar 14 2008, 23:13) *
У меня (ARM) отдельная секция для .rodata, и ее не надо копировать в озу.
Да, точно. Опять же это распределяется распихиванием входных секций по соответствующим выходным (секциям, а не дням smile.gif ).

Цитата(singlskv @ Mar 14 2008, 23:38) *
Таки пятница... и Ваш пример сразу не собрался,
собственно интересно что показывает "avr-objdump -h projname.elf"
Код
Test.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000074  00000000  00000000  000000b4  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .buffer       00000005  00800060  00800060  00000129  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .data         00000001  00800065  00000074  00000128  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  3 .noinit       00000005  00800066  00800066  0000012e  2**0
                  ALLOC
  4 .stab         00000378  00000000  00000000  00000130  2**2
                  CONTENTS, READONLY, DEBUGGING
  5 .stabstr      00000071  00000000  00000000  000004a8  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_aranges 00000028  00000000  00000000  00000519  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_pubnames 00000038  00000000  00000000  00000541  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_info   0000011d  00000000  00000000  00000579  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_abbrev 00000099  00000000  00000000  00000696  2**0
                  CONTENTS, READONLY, DEBUGGING
10 .debug_line   00000127  00000000  00000000  0000072f  2**0
                  CONTENTS, READONLY, DEBUGGING
11 .debug_frame  00000020  00000000  00000000  00000858  2**2
                  CONTENTS, READONLY, DEBUGGING
12 .debug_str    000000b1  00000000  00000000  00000878  2**0
                  CONTENTS, READONLY, DEBUGGING
Все как и задумано.


--------------------
На любой вопрос даю любой ответ
"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
singlskv
сообщение Mar 14 2008, 23:14
Сообщение #25


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ Mar 15 2008, 01:42) *
Код
Test.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000074  00000000  00000000  000000b4  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .buffer       00000005  00800060  00800060  00000129  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .data         00000001  00800065  00000074  00000128  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  3 .noinit       00000005  00800066  00800066  0000012e  2**0
                  ALLOC
  4 .stab         00000378  00000000  00000000  00000130  2**2
                  CONTENTS, READONLY, DEBUGGING
  5 .stabstr      00000071  00000000  00000000  000004a8  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_aranges 00000028  00000000  00000000  00000519  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_pubnames 00000038  00000000  00000000  00000541  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_info   0000011d  00000000  00000000  00000579  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_abbrev 00000099  00000000  00000000  00000696  2**0
                  CONTENTS, READONLY, DEBUGGING
10 .debug_line   00000127  00000000  00000000  0000072f  2**0
                  CONTENTS, READONLY, DEBUGGING
11 .debug_frame  00000020  00000000  00000000  00000858  2**2
                  CONTENTS, READONLY, DEBUGGING
12 .debug_str    000000b1  00000000  00000000  00000878  2**0
                  CONTENTS, READONLY, DEBUGGING
Все как и задумано.
не понимаю что Вы имеете в виду говоря "как и задуманно"
секции .bss просто нет!
секция .buffer по сути(судя по ее атрибутам CONTENTS, ALLOC, LOAD, DATA) есть суть
вторая секция .data , те будет прописанна в флеш

Вопрос, куда будут попадать переменные которые должны были бы быть в .bss ?

ну и LMA у .buffer указывает на 00800060, те при генерации hex гарантированно будет "мусор"...
Go to the top of the page
 
+Quote Post
amw
сообщение Mar 15 2008, 08:59
Сообщение #26


Знающий
****

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



Цитата(Сергей Борщ @ Mar 14 2008, 22:42) *
Это я должен обдумать. Сейчас (пятница smile.gif ) немного не могу въехать. Что-то мне казалось, что все у нас в руках - все секции можно описать в скрипте линкера. Надо указать LMA - указываем, не надо - будет совпадать с VMA. Куда хотим поместить - тот регион и указываем.

bb-offtopic.gif На третий день до жирафа дошло, что его ноги сбил паровоз smile.gif .

А вот это не то что Вам надо?
Код
  .buffer (NOLOAD) :
  {
    *(buffer);
    KEEP (*(buffer))
  } > data

  .bss :
  {
     PROVIDE (__bss_start = .);
    *(.bss)
    *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .);
  }  > data

Полный пример прилагается. Без -R и -j.
Прикрепленные файлы
Прикрепленный файл  sections.zip ( 9.25 килобайт ) Кол-во скачиваний: 32
 


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


Гуру
******

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



Цитата(singlskv @ Mar 15 2008, 01:14) *
секции .bss просто нет!
Вопрос, куда будут попадать переменные которые должны были бы быть в .bss ?
Ее нет, потому что в данном конкретном случае нет данных для нее. Когда есть - все размещается в те адреса, которые указаны для .bss в скрипте.
Цитата(singlskv @ Mar 15 2008, 01:14) *
секция .buffer по сути(судя по ее атрибутам CONTENTS, ALLOC, LOAD, DATA)
А вот на эту строчку я никогда не обращал внимания, ибо не понимал ее содержание. Теперь все стало на свои места. Спасибо! Теперь понятно, почему objcopy -R .eeprom - потому что если скрипт написан правильно, то все, что кроме .eeprom должно идти во флеш.
Цитата(amw @ Mar 15 2008, 10:59) *
А вот это не то что Вам надо?
А вот это именно оно! И решение лежит-то на поверхности... Видать меня ввело в заблуждение то, что (NOLOAD) в скриптах avr-libc не указан для .bss и .noinit. Спасибо! Вопрос можно считать закрытым.

P.S. WinAVR 20070525 (GNU ld version 2.17 + coff-avr-patch (20050630)) NOLOAD проигнорировал. WinAVR 20060421(GNU ld version 2.16.1 + coff-avr-patch (20050630)) и WinAVR 20071221(GNU ld (GNU Binutils) 2.18) отработали правильно.


--------------------
На любой вопрос даю любой ответ
"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 15 2008, 11:59
Сообщение #28


Знающий
****

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



Цитата(Сергей Борщ @ Mar 15 2008, 12:58) *
А вот это именно оно! И решение лежит-то на поверхности... Видать меня ввело в заблуждение то, что (NOLOAD) в скриптах avr-libc не указан для .bss и .noinit. Спасибо! Вопрос можно считать закрытым.

.bss по умолчанию (NOLOAD).


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


Гуру
******

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



Цитата(amw @ Mar 15 2008, 13:59) *
.bss по умолчанию (NOLOAD).
Теперь догадываюсь. Где про это можно прочитать? wink.gif


--------------------
На любой вопрос даю любой ответ
"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 15 2008, 16:46
Сообщение #30


Знающий
****

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



Цитата(Сергей Борщ @ Mar 15 2008, 16:19) *
Теперь догадываюсь. Где про это можно прочитать? wink.gif

Не помню точно. sad.gif
Где-то в Binutils online documentation кажется.
Тут по GCC http://gcc.gnu.org/onlinedocs/
Тут по binutils http://sources.redhat.com/binutils/


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

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

 


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


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