Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avr-gcc, версия 4.1.1 вместо 3.3.1
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
impatt
Решил обновить компилятор (версия 3.3.1, как мне кажется, в одном месте начала глючить, решил, что новый, вероятно, поведёт себя более правильно). Собирал из исходников, работаю в Linux.
Компилятор версии 4.1.1 рожает код (не проверял ещё, насколько он лучше и всё такое), но objdump версий 2.15 и 2.17 перестал везде правильно диззассемблировать рождённые объектники (может, дизассемблирование не совсем правильный термин):
если компилятор версии 3.1.1 практически на каждую строку С-шного текста позволял objdump-у выводить ассемблерный эксивалент строки, то новый позволяет местами: где-то всё по-старому, а где-то идёт массив ассемблерного кода, а С-шные строки сбиваются в кучу или вообще куда-то исчезают.
Кто-нибудь знает ,что происходит и как лечить ?
Примеры ниже.
Заранее благодарю за советы.

****************************************
К примеру, такая С-функция:
void putFString(uint8_t *stringPtr){
uint8_t temp;
while ((temp = pgm_read_byte_near(stringPtr)) != 0){
stringPtr++;
pushToDebugBuffer(temp);
};
return;
}
компилируется и команда 'avr-objdump -h -S ./uart.o' выводит следующее:
0000022c <putFString>:
22c: cf 93 push r28
22e: df 93 push r29
230: ec 01 movw r28, r24
232: 03 c0 rjmp .+6 ; 0x23a <putFString+0xe>
234: 21 96 adiw r28, 0x01 ; 1
236: 0e 94 00 00 call 0 ; 0x0 <nextAddress>
23a: fe 01 movw r30, r28
23c: 84 91 lpm r24, Z
23e: 88 23 and r24, r24
240: c9 f7 brne .-14 ; 0x234 <putFString+0x8>
242: df 91 pop r29
244: cf 91 pop r28
246: 08 95 ret

В то время, как компилятор версии 3.3.1 компилировал в объектники и 'avr-objdump -h -S ./uart.o' выводил листинг так:

00000000 <putFString>:

uint8_t f_hexPrefix[] PROGMEM ="0x";
uint8_t f_CR[] PROGMEM ="\n";

void putFString(uint8_t *stringPtr){
0: cf 93 push r28
2: df 93 push r29
4: ec 01 movw r28, r24
uint8_t temp;
while ((temp = pgm_read_byte_near(stringPtr)) != 0){
6: fc 01 movw r30, r24
8: 84 91 lpm r24, Z
a: 88 23 and r24, r24
c: 39 f0 breq .+14 ; 0x1c <putFString+0x1c>
stringPtr++;
e: 21 96 adiw r28, 0x01 ; 1
pushToDebugBuffer(temp);
10: 0e 94 00 00 call 0 ; 0x0 <putFString>
14: fe 01 movw r30, r28
16: 84 91 lpm r24, Z
18: 88 23 and r24, r24
1a: c9 f7 brne .-14 ; 0xe <putFString+0xe>
};
return;
}
1c: df 91 pop r29
1e: cf 91 pop r28
20: 08 95 ret
Andy Great
Оптимизация в компиляторе поменялась, наверное?
klen
Цитата(Andy Great @ Oct 23 2006, 12:22) *
Оптимизация в компиляторе поменялась, наверное?

Поставте в опциях компиляции -O0 и сравните. Проверьте наличие ключа компиляции -dwarf-2, имено по ней в обектник складывается отладочная информация. Хотя у меня с -Os все выводит нормально, пользуюсь gсс4.2.0+bu2.17
impatt
Цитата(klen @ Oct 23 2006, 11:33) *
Цитата(Andy Great @ Oct 23 2006, 12:22) *

Оптимизация в компиляторе поменялась, наверное?

Поставте в опциях компиляции -O0 и сравните. Проверьте наличие ключа компиляции -dwarf-2, имено по ней в обектник складывается отладочная информация. Хотя у меня с -Os все выводит нормально, пользуюсь gсс4.2.0+bu2.17


Проверил -O0. Та-же фигня.
-gdwarf-2 стандартными binutils не поддерживается, надо либо в параметрах configure при сборке им сказать, либо специальный патч накатить... Как вы делали ?
Впрочем, те binutils, что под avr-gcc-3.3.1 работают, тоже стандартные, без лишних патчей, поддержки dwarf-2 и так далее - нормально. Видимо, дело в компиляторе ?
Andy Great
У, уже 4.2.0 есть... С 4.1.0 на 4.1.1 есть смысл переходить? Или сразу на 4.2.0? Я про GnuARM.
impatt
Цитата(Andy Great @ Oct 23 2006, 11:42) *
У, уже 4.2.0 есть... С 4.1.0 на 4.1.1 есть смысл переходить? Или сразу на 4.2.0? Я про GnuARM.


Погляди в changelog, чего там изменили. И будет более-менее ясно...
Andy Great
На сайте ГЦЦ почитать - так ровным счетом ничего. Вопрос я задал тем, кто реально пользуется, ченжлоги я читаю, но там не про все пишут (если кратко). Например, известный уже прикол с обработчиком прерывания пофиксили?
aesok
Цитата(impatt @ Oct 23 2006, 12:40) *
-gdwarf-2 стандартными binutils не поддерживается, надо либо в параметрах configure при сборке им сказать, либо специальный патч накатить... Как вы делали ?


Да и GCC, и binutils надо сказать про поддержку dwarf2. Вот параметры для binutils.

configure -v --target=avr --prefix=..... --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2

Анатолий.
klen
>> -gdwarf-2 стандартными binutils не поддерживается....
это чтото новенькое для меня. что за "стандартные bu"???, может компилятор был собран без --with-dwarf2. Eсли есть желание возьмите скачайте мою сборку, все кто пользуется довольны. Позавчера собрал bu2.17gcc4.2.0avrlibc1.4.4, щас тестирую, пока все что шется - работает правильно, скоро выложу.

>>Например, известный уже прикол с обработчиком прерывания пофиксили?
Если реч идет о неправильной генерацией пролога IRQ/FIQ для ARM в случае включенного оптимизатора, то я поправил этот глюк
http://electronix.ru/forum/index.php?showt...21799&st=15 вроде новых пока не вылезло, тоже все работает , тестирую на lpc2103. Тоже собираюсь выложить но когда убедюсь что все ок. Токо кто скачивает так ине удосуживается сообщить о результатах sad.gif несознательные .... зла не хватает.

Переходить на ноые версии ? это Вам решать, считаю что нада "трогать". Я перманентно делаю сборки
со shapshot'ов в среднем 1 штука в 2 дня (точнее ночи blink.gif ) под ARM/AVR. Развлекалово у меня такое... ночное...
Убедительная просьба по всем глюкам или сюда почаще писать или мне klen_s@mail.ru
Лучше сюда, здесь обсудить можно будет. Таким образом Вы примете участие в развитии gcc - надеюсь, не только для меня, любимого компиллера всех времен и братских народов.
impatt
Цитата(aesok @ Oct 23 2006, 12:16) *
Цитата(impatt @ Oct 23 2006, 12:40) *


-gdwarf-2 стандартными binutils не поддерживается, надо либо в параметрах configure при сборке им сказать, либо специальный патч накатить... Как вы делали ?


Да и GCC, и binutils надо сказать про поддержку dwarf2. Вот параметры для binutils.

configure -v --target=avr --prefix=..... --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2


Счас попробую и запишу на будущее.
Вообще-то, подобные пересборки для меня редки и откуда выковыривать все волшебные опции (кроме как из configure --help и редкостречающихся инструкций по сборке) - не знаю. Наверное, есть тайное сообщество посвящённых wink.gif, которые знают все опции и рассказывают о них только когда спросят smile.gif

Цитата(klen @ Oct 23 2006, 12:28) *
>> -gdwarf-2 стандартными binutils не поддерживается....
это чтото новенькое для меня. что за "стандартные bu"???, может компилятор был собран без --with-dwarf2. Eсли есть желание возьмите скачайте мою сборку, все кто пользуется довольны.


Ну, я прошу прощения. Стандартные - это не то слово. Скажем так, я имел в виду тот случай, когда используются опции configure, взятые из configure --help
Скачивать не стану, но за предложение - спасибо. Сам пособираю, так интеерснее smile.gif
Компилятор собран без -dwarf-2, ессно (так что если он не конфигурируется сам по умолчанию, то удивляться отсусствию поддержки dwarf2 не следует smile.gif
klen
Цитата
..... и откуда выковыривать все волшебные опции (кроме как из configure --help и редкостречающихся инструкций по сборке) - не знаю. Наверное, есть тайное сообщество посвящённых wink.gif, которые знают все опции и рассказывают о них только когда спросят smile.gif

о-о-о--о.... .. это супертайное и сверхсекретное общество .. и как оно живет никто не видит.. потому что GCC можно собрать тоько ночьюю !!! при свете костра и бубна. днем члены общества косят под обычных программистов. Чтоб вступить в общество нада долго-долго-долго компилировать gcc ночью - потом открывается пятый глаз который будет видеть все опции командной строки при первом взгляде.

Без шуток. собрать под линухом просто, собрать под CygWin сложнее(временами шаманство). собрать под MinGW - перманентное шаманство с бубном, четками и жеским рукопрекладством к скриптам и макефайлам. Пример - сегодня ноччу спытался собрать свежий снимок 4.2.0 c поможу 4.1.1 для самой MinGW , вобщем все зациклилось на сборке стадии "сам себя", после 6 пересборки я понял что чтото пошло не так плюнул и лег спать. Вот так.
Andy Great
Цитата
Переходить на ноые версии ? это Вам решать,

Заметил, что речь идет про AVR - лучше поздно, чем никогда. Я больше интересуюсь GCC ARM, но пока на уровне попробовать. Соответственно, интенсивное тестирование не могу провести, потому и спрашиваю у тех, кто использует. Вопрос по переходу в том плане, что хочется иметь стабильно работающий компилер, чтоб когда придет время, поставить его и не иметь геморроя со вспоминанием его закидонов.
impatt
Цитата(klen @ Oct 23 2006, 13:05) *
о-о-о--о.... .. это супертайное и сверхсекретное общество
собрать под линухом просто,

Да, под линуксом несложно. Но всё же: откуда взять хотя бы полный перечень возможных опций configure ? Если будет перечень, то можно погуглить и узнать о них. Уверен, там найдётся что-то полезное, что мне (и не только мне) нужно.
impatt
Цитата(aesok @ Oct 23 2006, 12:16) *
Да и GCC, и binutils надо сказать про поддержку dwarf2. Вот параметры для binutils.
configure -v --target=avr --prefix=..... --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2


binutils с указанными параментрами собрался. gcc - нет. Ошибка получилась. Пытался запускать configure со следующими параметрами (невольно приближаясь к работающиму configure --target=avr):
../gcc-4.1.1/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2 --enable-languages=c
../gcc-4.1.1/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2
../gcc-4.1.1/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2 --without-libssp
../gcc-4.1.1/configure -v --target=avr --quiet --enable-install-libbfd --with-dwarf2
../gcc-4.1.1/configure -v --target=avr --quiet --with-dwarf2
Цитирую последние строки компиляции:
******
/usr/src/gcc-obj/./gcc/xgcc -B/usr/src/gcc-obj/./gcc/ -B/usr/local/avr/bin/ -B/usr/local/avr/lib/ -isystem /usr/local/avr/include -isystem /usr/local/avr/sys-include -O2 -O2 -g -O2 -DIN_GCC -DCROSS_COMPILE -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -DDF=SF -Dinhibit_libc -mcall-prologues -g -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -Dinhibit_libc -I. -I. -I../../gcc-4.1.1/gcc -I../../gcc-4.1.1/gcc/. -I../../gcc-4.1.1/gcc/../include -I../../gcc-4.1.1/gcc/../libcpp/include -DL_fixunsdfdi -c ../../gcc-4.1.1/gcc/libgcc2.c -o libgcc/./_fixunsdfdi.o
../../gcc-4.1.1/gcc/libgcc2.c: In function '__fixunssfsi':
../../gcc-4.1.1/gcc/libgcc2.c:1499: internal compiler error: in compute_frame_pointer_to_cfa_displacement, at dwarf2out.c:10446
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[3]: *** [libgcc/./_fixunssfsi.o] Ошибка 1
make[3]: *** Ожидание завершения заданий...
make[3]: Leaving directory `/usr/src/gcc-obj/gcc'
make[2]: *** [stmp-multilib] Ошибка 2
make[2]: Leaving directory `/usr/src/gcc-obj/gcc'
make[1]: *** [all-gcc] Ошибка 2
make[1]: Leaving directory `/usr/src/gcc-obj'
make: *** [all] Ошибка 2
******

Есть способы лечить ? Я так понимаю, что проблема именно с dwarf-2 ?
aesok
Цитата(impatt @ Oct 24 2006, 06:44) *
Цитата(aesok @ Oct 23 2006, 12:16) *


Да и GCC, и binutils надо сказать про поддержку dwarf2. Вот параметры для binutils.
configure -v --target=avr --prefix=..... --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2


binutils с указанными параментрами собрался. gcc - нет. Ошибка получилась. Пытался запускать configure со следующими параметрами (невольно приближаясь к работающиму configure --target=avr):
../gcc-4.1.1/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2 --enable-languages=c
../gcc-4.1.1/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2
../gcc-4.1.1/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2 --without-libssp
../gcc-4.1.1/configure -v --target=avr --quiet --enable-install-libbfd --with-dwarf2
../gcc-4.1.1/configure -v --target=avr --quiet --with-dwarf2



Есть способы лечить ? Я так понимаю, что проблема именно с dwarf-2 ?



Вот суперсекретное место в инете где, те кто собирает по ночам GCC для AVR прячут патчи.

TOP SECRET: ON

Патчи для binutils:
http://www.freebsd.org/cgi/cvsweb.cgi/port...binutils/files/

Патчи для GCC 4.1:
http://www.freebsd.org/cgi/cvsweb.cgi/port.../avr-gcc/files/

TOP SECRET: OFF

Анатолий.
andrew_b
Цитата(impatt @ Oct 24 2006, 06:24) *
Но всё же:откуда взять хотя бы полный перечень возможных опций configure ?

У каждой программы есть свои специфические опции. Узнать их можно, посмотрев внутрь файла configure.ac (или configure.in). Это сценарий autoconf, которыйи генерирует configure. В общем, пытайте Гугл на тему GNU Autotools.
impatt
Цитата(aesok @ Oct 24 2006, 11:40) *


Интересно. Действительно, не для средних умов.
Достаточно ли патча patch-dwarf для того,чтобы накатить его на gcc-4.1.1 и скомпилить с поддержкой dwarf-2 ?
А то теперь не получается никак скомпилировать.
aesok
Цитата(impatt @ Oct 24 2006, 13:40) *
Интересно. Действительно, не для средних умов.
Достаточно ли патча patch-dwarf для того,чтобы накатить его на gcc-4.1.1 и скомпилить с поддержкой dwarf-2 ?
А то теперь не получается никак скомпилировать.


Какие ошибки?

Как минимум ставте патчи patch-newdevices и patch-dwarf.

Анатолий.
impatt
Цитата(andrew_b @ Oct 24 2006, 12:38) *
Цитата(impatt @ Oct 24 2006, 06:24) *
Но всё же:откуда взять хотя бы полный перечень возможных опций configure ?

У каждой программы есть свои специфические опции. Узнать их можно, посмотрев внутрь файла configure.ac (или configure.in). Это сценарий autoconf, которыйи генерирует configure. В общем, пытайте Гугл на тему GNU Autotools.

Ну, что-ж, уже хорошо smile.gif А то просто непонятно, где что есть.
Спасибо smile.gif

Цитата(aesok @ Oct 24 2006, 12:44) *
Какие ошибки?
Как минимум ставте патчи patch-newdevices и patch-dwarf.

Поставил оба.
Ошибка такая:
Код
checking for avr-gcc... /usr/src/gcc-obj/./gcc/xgcc -B/usr/src/gcc-obj/./gcc/ -B/usr/local/avr/bin/ -B/usr/local/avr/lib/ -isystem /usr/local/avr/include -isystem /usr/local/avr/sys-include  -mmcu=avr3
checking for C compiler default output file name... configure: error: C compiler cannot create executables
See `config.log' for more details.
make[1]: *** [configure-target-libssp] Ошибка 1


Меня не оставляет ощущение, что я не полностью предоставляю информацию об обшибках компиляции. Но каждый раз прикреплять логи конфига, всего-всего как-то избуточно, а как отобрать нужное - только догадываюсь. Так что если что - поправляйте.
aesok
Цитата(impatt @ Oct 24 2006, 14:22) *
Ошибка такая:
Код
checking for avr-gcc... /usr/src/gcc-obj/./gcc/xgcc -B/usr/src/gcc-obj/./gcc/ -B/usr/local/avr/bin/ -B/usr/local/avr/lib/ -isystem /usr/local/avr/include -isystem /usr/local/avr/sys-include  -mmcu=avr3
checking for C compiler default output file name... configure: error: C compiler cannot create executables
See `config.log' for more details.
make[1]: *** [configure-target-libssp] Ошибка 1


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


Отлично!!! Так все и дожно быть!!! Добавте "--disable-libssp" при конфигурации GCC.

Анатолий.
impatt
Цитата(aesok @ Oct 24 2006, 13:33) *
Отлично!!! Так все и дожно быть!!! Добавте "--disable-libssp" при конфигурации GCC.

Собственно, так и делал:
Код
../gcc-4.1.1/configure -v --target=avr --quiet --enable-languages=c --without-libssp


Ошибка та самая, про которую писал в прошлом посте.
Кстати, мож, пропатчил просто плохо ?
Я сперва накатил (кажется smile.gif патч patch-dwarf, затем patch-newdevices, причём ввиду того, что опыта с командой patch немного, то просто поместил оба патча в корень исходников gcc и находясь там-же, сделал patch -p1 <./patch*. Команда patch не захотела найти файлы, подлежащие правке, но написала, мол, файл такой-то предписано патчить, но найти его не могу. Ну, набирал имена вручную и всё такое.
Может, следует делать иначе ?
aesok
Цитата(impatt @ Oct 25 2006, 06:01) *
Цитата(aesok @ Oct 24 2006, 13:33) *

Отлично!!! Так все и дожно быть!!! Добавте "--disable-libssp" при конфигурации GCC.

Собственно, так и делал:
Код
../gcc-4.1.1/configure -v --target=avr --quiet --enable-languages=c --without-libssp


Ошибка та самая, про которую писал в прошлом посте.


"--disable-XXX" и "--without-XXX" не взаимозаменяемы. Нужно всетаки "--disable-libssp".

Цитата(impatt @ Oct 25 2006, 06:01) *
Кстати, мож, пропатчил просто плохо ?
Я сперва накатил (кажется smile.gif патч patch-dwarf, затем patch-newdevices, причём ввиду того, что опыта с командой patch немного, то просто поместил оба патча в корень исходников gcc и находясь там-же, сделал patch -p1 <./patch*. Команда patch не захотела найти файлы, подлежащие правке, но написала, мол, файл такой-то предписано патчить, но найти его не могу. Ну, набирал имена вручную и всё такое.
Может, следует делать иначе ?


Нет эта ошибка никак не связана с этими патчами. Это ошибка при компиляции Stack Smash Protection библиотеки (Защита от разрушения стека). На AVR вещь совершенно бесполезная.

Вот маленькая статья, правда на английском, в ней основное что нужно знать про diff и patch:
http://www.network-theory.co.uk/articles/patchintro.html

Анатолий.
impatt
Цитата(aesok @ Oct 25 2006, 09:20) *
"--disable-XXX" и "--without-XXX" не взаимозаменяемы. Нужно всетаки "--disable-libssp".

Да, это верно. Попутал.

Цитата(aesok @ Oct 25 2006, 09:20) *
Нет эта ошибка никак не связана с этими патчами. Это ошибка при компиляции Stack Smash Protection библиотеки (Защита от разрушения стека). На AVR вещь совершенно бесполезная.

Вот маленькая статья, правда на английском, в ней основное что нужно знать про diff и patch:
http://www.network-theory.co.uk/articles/patchintro.html

Спасибо. Статейку гляну.
В общем, собралось и работает. Спасибо за помощь smile.gif
Правда, всё таки, avr-gcc-4.1.1, поддержкой dwarf-2, вкупе с "avr-objdump -S -h" генерит по прежнему не очень хорошие листинги по сравнению с avr-gcc-3.3.1. С-шный текст куда-то теряется (не везде), и видны здоровые массивы ассемблера. Мож, есть другие причины, например, в gcc-4.* что-то поменяли капитально ?
Впрочем, я уже понял, что эти проблемы ничто, по сравнению с мировой революцией smile.gif
aesok
Цитата(impatt @ Oct 25 2006, 10:53) *
Правда, всё таки, avr-gcc-4.1.1, поддержкой dwarf-2, вкупе с "avr-objdump -S -h" генерит по прежнему не очень хорошие листинги по сравнению с avr-gcc-3.3.1. С-шный текст куда-то теряется (не везде), и видны здоровые массивы ассемблера. Мож, есть другие причины, например, в gcc-4.* что-то поменяли капитально ?


Пожалуйста задавайте вопросы по человечески, как инженер!!!

Что значит "не очень хорошие листинги", что значит "текст куда-то теряется (не везде)", ГДЕ??????

Не генерируеться отладочная информация для вашего кода или для библиотечных функций? Большая часть avr-libc написана на ассемблере. Вы используете avr-libc которая скомпилирована с помощю GCC 3.1, тоесть без отладочно й информации в dwarf-2 формате. Когда вы компилируете свой код, вы указали компилятору что вам нужна отладочная информация в dwarf-2 формате?

Анатолий.
impatt
Цитата(aesok @ Oct 25 2006, 13:27) *
Пожалуйста задавайте вопросы по человечески, как инженер!!!

Я стараюсь smile.gif найти компромисс между большим объёмом подробностей, которые будут затмевать весь смысл поста, и его краткостью-и-привлекательностью. Разумеется, мне не всегда просто догадаться, что может потребоваться знать человеку, который возмётся разобраться с вопросом, а ещё иногда просто что-то о своей проблеме знаю и теряю из вида то, что все остальные не знают.

Цитата(aesok @ Oct 25 2006, 13:27) *
Что значит "не очень хорошие листинги", что значит "текст куда-то теряется (не везде)", ГДЕ??????

Не генерируеться отладочная информация для вашего кода или для библиотечных функций? Большая часть avr-libc написана на ассемблере. Вы используете avr-libc которая скомпилирована с помощю GCC 3.1, тоесть без отладочно й информации в dwarf-2 формате. Когда вы компилируете свой код, вы указали компилятору что вам нужна отладочная информация в dwarf-2 формате?

Ну, вот теперь примерно ясно, что было понято из сказаного мной, и сейчас уточняю:
Как и писал в самом начале топика, и уточняю сейчас, компилятор версии 4.1.1, в отличии от версии 3.3.1, генерит такие объектники, что после обработки objdump получается, что местами вместо строк С, перемежённых сгенерированными компилятором ассемблерными строками, получаются массивы ассемблера, а соответствющий код С сбивается в кучи в других местах. Всё это относится к коду на С, который я пишу сам.

Компилятор вызывается строками типа такой: $(CC) $(CFLAGS) -c -o tables.o $(SRCDIR)/dataconvert/tables.c
CC == avr-gcc (разумеется)

Пример на компиляторе 3.3.1, (CFLAGS такая: -mmcu=atmega128 -Os -g3 -DCALIBR_ENABLE_REAL_COEF_STORE -DCALIBTABLE_EEPROM -DAVRPART -DADCPART=ADS1243 -DPCBVER=0311 -I . -I /usr/local/avr/include -Wall)

Код
00003082 <pushToDebugBuffer>:

uint8_t pushToDebugBuffer(uint8_t symbol){
    3082:       cf 93           push    r28
    3084:       c8 2f           mov     r28, r24
        DEBUG_TX_INT_LOCK();
    3086:       56 98           cbi     0x0a, 6; 10
        while(debugPushCursor == debugPopCursor){
    3088:       20 91 00 03     lds     r18, 0x0300
    308c:       30 91 01 03     lds     r19, 0x0301
    3090:       80 91 fe 02     lds     r24, 0x02FE
    3094:       90 91 ff 02     lds     r25, 0x02FF
    3098:       28 17           cp      r18, r24
    309a:       39 07           cpc     r19, r25
    309c:       71 f4           brne    .+28           ; 0x30ba
                DEBUG_TX_INT_UNLOCK();
    309e:       56 9a           sbi     0x0a, 6; 10
                SLEEP();
    30a0:       88 95           sleep
                DEBUG_TX_INT_LOCK();
    30a2:       56 98           cbi     0x0a, 6; 10
    30a4:       20 91 00 03     lds     r18, 0x0300
    30a8:       30 91 01 03     lds     r19, 0x0301
    30ac:       80 91 fe 02     lds     r24, 0x02FE
    30b0:       90 91 ff 02     lds     r25, 0x02FF
    30b4:       28 17           cp      r18, r24
    30b6:       39 07           cpc     r19, r25
    30b8:       91 f3           breq    .-28           ; 0x309e
        }
        *debugPushCursor = symbol;
    30ba:       e0 91 00 03     lds     r30, 0x0300
    30be:       f0 91 01 03     lds     r31, 0x0301
    30c2:       c0 83           st      Z, r28
        debugPushCursor = nextAddress(debugPushCursor);
    30c4:       80 91 00 03     lds     r24, 0x0300
    30c8:       90 91 01 03     lds     r25, 0x0301
    30cc:       0e 94 9f 18     call    0x313e
    30d0:       90 93 01 03     sts     0x0301, r25
    30d4:       80 93 00 03     sts     0x0300, r24
        DEBUG_TX_INT_UNLOCK();
    30d8:       56 9a           sbi     0x0a, 6; 10
        if(!globIntFlags.isDebugPortBusy) popFromDebugBuffer(); //если передача когда-то закончилась, то возобновляем её
    30da:       80 91 aa 01     lds     r24, 0x01AA
    30de:       88 1f           adc     r24, r24
    30e0:       88 27           eor     r24, r24
    30e2:       88 1f           adc     r24, r24
    30e4:       99 27           eor     r25, r25
    30e6:       89 2b           or      r24, r25
    30e8:       11 f4           brne    .+4            ; 0x30ee
    30ea:       0e 94 7b 18     call    0x30f6
        return symbol;
    30ee:       8c 2f           mov     r24, r28
    30f0:       99 27           eor     r25, r25
}
    30f2:       cf 91           pop     r28
    30f4:       08 95           ret


Пример на версии 4.1.1, та-же самая строка вызова компилятора, добавлено -gdwarf-2 (CFLAGS такая: -gdwarf-2 -mmcu=atmega128 -Os -g3 -DCALIBR_ENABLE_REAL_COEF_STORE -DCALIBTABLE_EEPROM -DAVRPART -DADCPART=ADS1243 -DPCBVER=0311 -I . -I /usr/local/avr/include -Wall)

Код
000030cc <pushToDebugBuffer>:
    30cc:       1f 93           push    r17
    30ce:       18 2f           mov     r17, r24
    30d0:       02 c0           rjmp    .+4            ; 0x30d6 <pushToDebugBuffer+0xa>
    30d2:       56 9a           sbi     0x0a, 6; 10
    30d4:       88 95           sleep
    30d6:       56 98           cbi     0x0a, 6; 10
    30d8:       20 91 00 03     lds     r18, 0x0300
    30dc:       30 91 01 03     lds     r19, 0x0301
    30e0:       80 91 fe 02     lds     r24, 0x02FE
    30e4:       90 91 ff 02     lds     r25, 0x02FF
    30e8:       28 17           cp      r18, r24
    30ea:       39 07           cpc     r19, r25
    30ec:       91 f3           breq    .-28           ; 0x30d2 <pushToDebugBuffer+0x6>
    30ee:       e0 91 00 03     lds     r30, 0x0300
    30f2:       f0 91 01 03     lds     r31, 0x0301
    30f6:       10 83           st      Z, r17
    30f8:       80 91 00 03     lds     r24, 0x0300
    30fc:       90 91 01 03     lds     r25, 0x0301
    3100:       01 96           adiw    r24, 0x01      ; 1
    3102:       22 e0           ldi     r18, 0x02      ; 2
    3104:       8e 3f           cpi     r24, 0xFE      ; 254
    3106:       92 07           cpc     r25, r18
    3108:       11 f4           brne    .+4            ; 0x310e <pushToDebugBuffer+0x42>
    310a:       8e e7           ldi     r24, 0x7E      ; 126
    310c:       92 e0           ldi     r25, 0x02      ; 2
    310e:       90 93 01 03     sts     0x0301, r25
    3112:       80 93 00 03     sts     0x0300, r24
    3116:       56 9a           sbi     0x0a, 6; 10
    3118:       80 91 aa 01     lds     r24, 0x01AA
    311c:       87 fd           sbrc    r24, 7
    311e:       02 c0           rjmp    .+4            ; 0x3124 <pushToDebugBuffer+0x58>
    3120:       0e 94 3d 18     call    0x307a ; 0x307a <popFromDebugBuffer>
    3124:       81 2f           mov     r24, r17
    3126:       99 27           eor     r25, r25
    3128:       1f 91           pop     r17
    312a:       08 95           ret


С-шный код в этом случае потерялся вовсе, но так не всегда: иногда он, как и было сказано ранее, сиротливо лежит в уголке листинга так-же, как он есть в исходном файле.
aesok
Проверте версию "avr-objdump", возможно вы пытаетесь посмотреть отладочную версию в формате dwarf-2, а используемая версия avr-objdump про него не знает. Что показывает "avr-objdump --version"? Точно 2.17? Tокда попробуйте еще раз сконфигурировать/создать binutils с поддежкой dwarf-2.

Анатолий.
impatt
Цитата(aesok @ Oct 26 2006, 17:32) *
Проверте версию "avr-objdump", возможно вы пытаетесь посмотреть отладочную версию в формате dwarf-2, а используемая версия avr-objdump про него не знает. Что показывает "avr-objdump --version"? Точно 2.17? Tокда попробуйте еще раз сконфигурировать/создать binutils с поддежкой dwarf-2.

Проверил, сконфигурил, собрал, установил и снова проверил - всё по старому.
Может, сперва удалить надо всё, что ручками накомпилено было ? Правда, в случае с gcc и binutils я не знаю, как сделать, ибо make uninstall не работает.
А как, кстати, деинсталлировать gcc и binutils ?
И ещё: у вас нет таких проблем ? Листинги чётко получаются ?
klen
Цитата(impatt @ Oct 27 2006, 08:39) *
И ещё: у вас нет таких проблем ? Листинги чётко получаются ?

Странненько. Вообще проблем нет.

Давайте так, напишите полностю:
1. опции конфигурации binutils
2. опции конфигурации gcc
после этого Вы собрали все
3. опции компиляции
4. опции линкера
5. опции avr-objdump

Дальше будем думать

У меня к примеру так собирается прошивка
Цитата
avr-gcc -c -mmcu=atmega48 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -Wp,-M,-MP,-MT,main.o,-MF,.dep/main.o.d main.c -o main.o
---------------- связывание обьектных файлов: image.elf
avr-gcc -mmcu=atmega48 main.o --output image.elf -Wl,-Map=image.map,--cref -lm -lc
---------------- генерация FLASH образа: image.hex
avr-objcopy -O ihex -R .eeprom image.elf image.hex
---------------- генерация EEPROM образа: image.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex image.elf image.eep
---------------- генерация расширенного листинга: image.lss
avr-objdump -h -S image.elf > image.lss
---------------- генерация таблицы символов: image.sym
avr-nm -n image.elf > image.sym
impatt
Цитата(klen @ Oct 27 2006, 08:22) *
Странненько. Вообще проблем нет.

Это хорошо. Во первых, тем, что у кого-то всё таки оно работает, а во вторых тем, что есть шанс, что заработает и у меня smile.gif

Цитата(klen @ Oct 27 2006, 08:22) *
1. опции конфигурации binutils
2. опции конфигурации gcc
после этого Вы собрали все
3. опции компиляции
4. опции линкера
5. опции avr-objdump
Дальше будем думать

На момент начала экспериментов у меня в недрах компа валялась (и валяется по сию пору по причине того, что не могу заняться вплотную удалением) версия avr-gcc-4.0.2, которой особо не пользовался, и avr-binutils-2.15 (тоже по причине трудностей с удалением). Может ли наличие этих вещей мешать ?
Ну, теперь об опциях и способах конфигурирования и компиляции. Сперва я собирал binutils-2.17 и gcc-4.1.1 без dwarf-2 (мне, по идее, не очень пока важно, какая там тема с отладочной информацией, пока что stabs, что dwarf-2 - всё едино). Затем увидел проблемы с листингом и начал спрашивать тут. После этого я пытался скомпилировать gcc с поддержкой dwarf-2, для чего накатил два патча (см. выше по теме). Которые накатились. Собрал снова gcc-4.1.1 и потом, уже сегодня, binutils-2.17. Допускаю, что такой "порядок" сборки мог вызвать некие аномалии в сборке и конфигурировании обоих продуктов. Как уже сказал, удалить то, что уже собрано я не знаю как.
Компиляцию и конфигурирование проводил в отдельных от исходников папках (вроде, так написано в доке на gcc было пару лет назад, больше не проверял, продолжаю действовать согласно этим сведениям).
Теперь про опции:
1. binutils-2.17
1.1. конфигурирование: ../binutils-2.17/configure -v --target=avr --with-gnu-ld --with-gnu-as --quiet --enable-install-libbfd --with-dwarf2
1.2. компилирование: make -j2
1.3. установка: make install
2. gcc
2.1. конфигугрирование: ../gcc-4.1.1/configure -v --target=avr --quiet --enable-languages=c --disable-libssp --with-dwarf2
2.2. компилирование: make -j2
2.3. установка: make install

Компилирование моих объектников, как и было сказано выше в этой ветке, делается так:
avr-gcc -gdwarf-2 -mmcu=atmega128 -Os -g3 -I . -I /usr/local/avr/include -Wall -o file.o file.c

Линкер (пишу, как вызывается линкер самим gcc, ничего не меняя): /usr/local/lib/gcc/avr/4.1.1/../../../../avr/bin/ld -m avr5 -Tdata 0x800100 -o bootstrap.elf /usr/local/lib/gcc/avr/4.1.1/../../../../avr/lib/crtm128.o -L/usr/local/lib/gcc/avr/4.1.1/avr5 -L/usr/local/lib/gcc/avr/4.1.1/../../../../avr/lib/avr5 main.o spi.o in2out.o ads1243.o error.o tables.o modbus.o interrupt.o ifADC.o misc.o memory.o uart.o -lm -lgcc -lc -lgcc

Objdump: avr-objdump -h -S ./bootstrap.elf >./bootstrap.lst

Цитата(klen @ Oct 27 2006, 08:22) *
У меня к примеру так собирается прошивка

Для меня сложны некоторые вещи (передача незнакомых мне параметров ассемблеру и прочее), потому мне несколько затруднительно оценить всю мощь Ваших конструкций smile.gif
Если Вас не затруднит, гляньте в мои изыскания, может, я там просто где-то недоглядел ?
Спасибо
aesok
Пока короткий ответ.

Увидел я про что вы говорите!!! Если объектный файл маленький то листинг правильный, если большой то гдето после килобайта кода (у меня с адреса 0x52e), как вы и писали, кусок кода на С, потом чистый ассеблерный код. (GCC 4.2/binutils 2.17).

Если у вас есть время пожалуста посмотрите что получаеться с отладочной информацией stabs, с без оптимизации (-O0).

> пока что stabs, что dwarf-2 - всё едино

В GDB не полностью поддерживает dwarf-2 - ему нужна stabs, AVRStudio работает с dwarf-2 и coff.

Анатолий.
impatt
Цитата(aesok @ Oct 27 2006, 09:42) *
Увидел я про что вы говорите!!! Если объектный файл маленький то листинг правильный, если большой то гдето после килобайта кода (у меня с адреса 0x52e), как вы и писали, кусок кода на С, потом чистый ассеблерный код. (GCC 4.2/binutils 2.17).

Да, вероятно, так и есть. Я не пытался выявить закономерности (во всяком случае пока).
Хорошо, что уже нашёлся кто-то, кто подтверждает проблему smile.gif

Цитата(aesok @ Oct 27 2006, 09:42) *
Если у вас есть время пожалуста посмотрите что получаеться с отладочной информацией stabs, с без оптимизации (-O0).

Это махом smile.gif Ответ такой: ничего в лучшую сторону не поменялось.

Цитата(aesok @ Oct 27 2006, 09:42) *
В GDB не полностью поддерживает dwarf-2 - ему нужна stabs, AVRStudio работает с dwarf-2 и coff.

Читал в доке, правда, давно. Ну, глядишь, и это рано или поздно сделают smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.