123730 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Здесь было рассмотрено уже это но у мя не получилось. Плиз выложите пример с минимумом "лишних" деталей: Возник такой трабл. Програмлю под ARM контроллеры. Использую гнушный софт. Каким макаром подключать стандартные библиотеки к проге? У меня получается компилить файл который содержит вызов функций стандартной библиотеки, но при линковке объектных файлов возникает ошибка: undefened reference на вызываемую стандартную функцию. Желателен пример рабочей проги, которая инклудит, например, stdio.h, и вызывает в main функцию sprintf. Плюс еще какой-нить модуль .c с минимальным количеством кода. Плюс make файл который компилит и линкует эти два модуля: main.c: #include <stdio.h> int main(void) { char *Line[5]; sprintf(Line,"%02d",50);//даст варнинг ну ниче return Return_num(); } ========================= notmain.c: int Return_num(void) { return 5; } PS: Вот лог сборки моей рабочей программы со всеми ключами и версиями прог. В той проге смысл тот же примерно (вызов sprintf в main.c). Обратите внимание, что компиляция всех файлов проходит, трабл только в линковке. Что я не так делаю? make -k -f makefile_rom all rm -f out/*.d out/*.o out/*.lst out/*.map out/*.out out/*.bin =================================================================== arm-elf-gcc (GCC) 4.1.1 (WinARM) Copyright © 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =================================================================== GNU assembler 060606 20060606 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty. This assembler was configured for a target of `arm-elf'. =================================================================== GNU ld version 060606 20060606 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty. =================================================================== arm-elf-as -Wa -amhls=out/crt.lst -ahls -mapcs-32 source/crt.s -o out/crt.o arm-elf-gcc -c -MD -O0 source/adc.c -o out/adc.o arm-elf-gcc -c -MD -O0 source/int.c -o out/int.o source/int.c: In function 'AIC_ConfInt': source/int.c:14: warning: assignment makes integer from pointer without a cast arm-elf-gcc -c -MD -O0 source/Keyboard.c -o out/Keyboard.o arm-elf-gcc -c -MD -O0 source/lowlevelinit.c -o out/lowlevelinit.o arm-elf-gcc -c -MD -O0 source/main.c -o out/main.o arm-elf-ld -T./link/at91sam7s256_flash.ld -Map=out/mit.map out/crt.o out/adc.o out/int.o out/Keyboard.o out/lowlevelinit.o out/main.o -o out/mit.out out/main.o: In function `main': main.c:(.text+0x8b0): undefined reference to `sprintf' make: *** [out/mit.out] Error 1 arm-elf-gcc out/crt.o out/adc.o out/int.o out/Keyboard.o out/lowlevelinit.o out/main.o -mcpu=arm7tdmi -nostartfiles -T./link/at91sam7s256_flash.ld -Wl,--no-warn-mismatch -o out/mit.elf c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(freer.o): In function `_malloc_trim_r': mallocr.c:(.text+0x48): undefined reference to `_sbrk_r' mallocr.c:(.text+0x64): undefined reference to `_sbrk_r' mallocr.c:(.text+0x84): undefined reference to `_sbrk_r' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(makebuf.o): In function `__smakebuf': makebuf.c:(.text+0x3c): undefined reference to `_fstat_r' makebuf.c:(.text+0x110): undefined reference to `isatty' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(mallocr.o): In function `_malloc_r': mallocr.c:(.text+0x424): undefined reference to `_sbrk_r' mallocr.c:(.text+0x4cc): undefined reference to `_sbrk_r' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__sclose': stdio.c:(.text+0xc): undefined reference to `_close_r' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__sseek': stdio.c:(.text+0x30): undefined reference to `_lseek_r' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__swrite': stdio.c:(.text+0x84): undefined reference to `_lseek_r' stdio.c:(.text+0xac): undefined reference to `_write_r' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(stdio.o): In function `__sread': stdio.c:(.text+0xd0): undefined reference to `_read_r' collect2: ld returned 1 exit status make: *** [out/mit.elf] Error 1 make: Target `all' not remade because of errors. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_shamaev 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба ..... ./link/at91sam7s256_flash.ld - на этот файл взглянуть можно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
123730 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 (изменено) · Жалоба Да конешн), файлег был стырен с каково-то примера: /* identify the Entry Point (_vec_reset is defined in file crt.s) */ ENTRY(_vec_reset) /* specify the LPC2106 memory areas */ MEMORY { flash : ORIGIN = 0, LENGTH = 256K /* FLASH EPROM */ ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ } /* define a global symbol _stack_end (see analysis in annotation above) */ _stack_end = 0x2FFFFC; /* now define the output sections */ SECTIONS { . = 0; /* set location counter to address zero */ .text : /* collect all sections that should go into FLASH after startup */ { *(.text) /* all .text sections (code) */ *(.rodata) /* all .rodata sections (constants, strings, etc.) */ *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ *(.glue_7) /* all .glue_7 sections (no idea what these are) */ *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ _etext = .; /* define a global symbol _etext just after the last code byte */ } >flash /* put all the above into FLASH */ .data : /* collect all initialized .data sections that go into RAM */ { _data = .; /* create a global symbol marking the start of the .data section */ *(.data) /* all .data sections */ _edata = .; /* define a global symbol marking the end of the .data section */ } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ .bss : /* collect all uninitialized .bss sections that go into RAM */ { _bss_start = .; /* define a global symbol marking the start of the .bss section */ *(.bss) /* all .bss sections */ } >ram /* put all the above in RAM (it will be cleared in the startup code */ . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ _bss_end = . ; /* define a global symbol marking the end of the .bss section */ } _end = .; /* define a global symbol marking the end of application RAM */ Я пробовал флаги -lc lgcc и по типу этого. Вопщим я многа перепробывал. В какой то момент он просил размещать секции имена которых в моей проге нет. я так подумал они в библиотеке. размещал, но итог нулевой. Всеж прошу выложить пример мелкой проги, которую я привожу выше с минимальным количеством лишнего. Я б тогда наверн примонтировал в свою Изменено 20 декабря, 2007 пользователем 123730 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axle 0 21 декабря, 2007 Опубликовано 21 декабря, 2007 · Жалоба Здесь было рассмотрено уже это но у мя не получилось. Плиз выложите пример с минимумом "лишних" деталей: Для того чтобы использовать функции типа printf, sprintf и т.д. необходимо написать функции "system calls" специфичные для твоей платформы. Именно на их отсутсвие компилятор и ругается (_sbrk_r, _write_r и т.д.). Как это сделать а заодно и рабочий пример смотри сюда: http://www.siwawi.arubi.uni-kl.de/avr_proj...ects/#gcc_stdio Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
123730 0 26 декабря, 2007 Опубликовано 26 декабря, 2007 · Жалоба Стырил я syscalls.c, serials.h, serials.c с рабочего примера, который шел с WinARM. Пример называется at91sam7s64_Hello, сунул в свой проект: arm-elf-as -Wa -amhls=out/Cstartup.lst -ahls -mapcs-32 source/Cstartup.s -o out/Cstartup.o arm-elf-gcc -c -MD -O0 source/adc.c -o out/adc.o arm-elf-gcc -c -MD -O0 source/Cstartup_SAM7.c -o out/Cstartup_SAM7.o arm-elf-gcc -c -MD -O0 source/int.c -o out/int.o arm-elf-gcc -c -MD -O0 source/Keyboard.c -o out/Keyboard.o arm-elf-gcc -c -MD -O0 source/main.c -o out/main.o arm-elf-gcc -c -MD -O0 source/serial.c -o out/serial.o arm-elf-gcc -c -MD -O0 source/syscalls.c -o out/syscalls.o arm-elf-gcc -c -MD -O0 source/timers.c -o out/timers.o arm-elf-ld -TAT91SAM7S64-ROM.ld -Map=out/mit.map -lc out/Cstartup.o out/adc.o out/Cstartup_SAM7.o out/int.o out/Keyboard.o out/main.o out/serial.o out/syscalls.o out/timers.o -o out/mit.out out/main.o: In function `main': main.c:(.text+0x7c8): undefined reference to `iprintf' make: *** [out/mit.out] Error 1 хобанца а вот так получилось)): arm-elf-as -Wa -amhls=out/Cstartup.lst -ahls -mapcs-32 source/Cstartup.s -o out/Cstartup.o arm-elf-gcc -c -MD -O0 source/adc.c -o out/adc.o arm-elf-gcc -c -MD -O0 source/Cstartup_SAM7.c -o out/Cstartup_SAM7.o arm-elf-gcc -c -MD -O0 source/int.c -o out/int.o arm-elf-gcc -c -MD -O0 source/Keyboard.c -o out/Keyboard.o arm-elf-gcc -c -MD -O0 source/main.c -o out/main.o arm-elf-gcc -c -MD -O0 source/serial.c -o out/serial.o arm-elf-gcc -c -MD -O0 source/syscalls.c -o out/syscalls.o arm-elf-gcc -c -MD -O0 source/timers.c -o out/timers.o arm-elf-gcc -Wl,-TAT91SAM7S64-ROM.ld,-Map=out/mit.map,--cref -lc -lm -lc -lgcc out/Cstartup.o out/adc.o out/Cstartup_SAM7.o out/int.o out/Keyboard.o out/main.o out/serial.o out/syscalls.o out/timers.o -o out/mit.out arm-elf-objcopy --output-target=binary out/mit.out out/mit.bin arm-elf-gcc out/Cstartup.o out/adc.o out/Cstartup_SAM7.o out/int.o out/Keyboard.o out/main.o out/serial.o out/syscalls.o out/timers.o -mcpu=arm7tdmi -nostartfiles -TAT91SAM7S64-ROM.ld -Wl,--no-warn-mismatch -o out/mit.elf arm-elf-size out/mit.out text data bss dec hex filename 20336 2176 100 22612 5854 out/mit.out Только исходник вырос на 17 кБ :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gte 6 17 марта, 2008 Опубликовано 17 марта, 2008 · Жалоба Может ли кто поделиться или подсказать где поискать пример проекта для LPC2368, Среда Eclipce + GCC для ARM + OpenOCD (Amontec sdk4arm) + MT-LINK. Среду вроде бы настроил, простой проект на 2294 компилируется. Теперь бы перейти на LPC2368 :-). Поиск в интернете и по конференциям пока безуспешен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Hz! 0 18 марта, 2008 Опубликовано 18 марта, 2008 · Жалоба Может ли кто поделиться или подсказать где поискать пример проекта для LPC2368, Среда Eclipce + GCC для ARM + OpenOCD (Amontec sdk4arm) + MT-LINK. Среду вроде бы настроил, простой проект на 2294 компилируется. Теперь бы перейти на LPC2368 :-). Поиск в интернете и по конференциям пока безуспешен. В демо на FreeRTOS есть то, что вам нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 1 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба В принципе ничего сложного нет. Компилируем binutils, gcc (с опцией --without-headers, нужен для того, чтобы им скомпилить newlib), newlib и снова gcc (уже полностью, с поддержкой newlib). При этом ставим необходимые опции для целевой платформы (для ARM это --target=arm-elf --enable-interwork --enable-multilib). Всё, можно компилировать программки. ой, какая интересная информация... пока что застрял на сборке второго прохода GCC. следую согласно инструкции http://www.eluaproject.net/en/Building_GCC_for_ARM первый проход перед сборкой newlib (шаг 2): ./configure --target=arm-elf --prefix=$TOOLPATH --enable-interwork --enable-multilib --enable-languages="c,c++" --with-newlib --without-headers --disable-shared--with-gnu-as --with-gnu-ld второй проход - шаг 4: вот тут-то и неясно - почему они не переконфигурят make перед сборкой??? и какие опции нужно задавать для этого?? надо ли указывать дислокацию этой newlib или достаточно сделать ей "make install" ?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба следую согласно инструкции http://www.eluaproject.net/en/Building_GCC_for_ARM первый проход перед сборкой newlib (шаг 2): ./configure --target=arm-elf --prefix=$TOOLPATH --enable-interwork --enable-multilib --enable-languages="c,c++" --with-newlib --without-headers --disable-shared--with-gnu-as --with-gnu-ld Просмотрел эту инструкцию, и не понял, в чем глубинный смысл столь хитрых манипуляций (установки gcc в два приема). Какие это дает преимущества перед сборкой gcc вместе с newlib в один прием? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 1 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба alx2 очевидно из требования сборки newlib target-версией компилятора или вы про: "Некоторые компиляторы (GCC) поддерживают внутренние версии множества функций Стандартной библиотеки языка Си; то есть, реализации функций записываются в компилируемый объектный модуль, а программа вызывает внутренние версии вместо функций общей библиотеки Си.Это уменьшает накладные расходы при вызове функции, особенно если вызов функции заменяется встроенными вариантами, и разрешается использование других форм оптимизации (если компилятор поддерживает управление характеристиками внутренних вариантов)" ? http://ru.wikipedia.org/wiki/%D0%A1%D1%82%....BE.D1.80.D0.B0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 1 января, 2009 Опубликовано 1 января, 2009 (изменено) · Жалоба очевидно из требования сборки newlib target-версией компилятораНе понял. Можно подробнее? А чем же еще newlib может собираться? Не host-же версией! Или спрошу по-другому. Я всегда просто помещал в исходники gcc симлинк на newlib и делал make && make install. Это неправильно? или вы про: "Некоторые компиляторы (GCC) поддерживают внутренние версии множества функций Нет, об этом вообще по-моему речи не было... Изменено 1 января, 2009 пользователем alx2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dch 0 2 января, 2009 Опубликовано 2 января, 2009 · Жалоба http://electronix.ru/forum/index.php?act=S...ighlite=eclipse кстати у меня эта ссылка не работает - выдает страничку ошибки поскольку за GNU проекты никто не отвечает. они опубликованы, точно также за коммерческие продукты никто не несет ответсвенности, хоть один раз была какая либо компенсация за подвисание ос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 1 8 апреля, 2009 Опубликовано 8 апреля, 2009 · Жалоба Или спрошу по-другому. Я всегда просто помещал в исходники gcc симлинк на newlib и делал make && make install. Это неправильно? 1) судя по описанию http://www.eluaproject.net/en/Building_GCC_for_ARM , второй проход необходим для сборки библиотек (libgcc.a и прочих), которым для неё необходим newlib. сейчас столкнулся с такой проблемой. делаю всё по вышеописанной ссылке, при втором проходе libgcc.a собираетсЯ, но не инсталлируется(( т.е. присутствует в директории из которой ведётся сборка (build-arm-elf/gcc/libgcc.a ), но при make install почему-то не копируется в дистрибутиве нету тулчейна для ARM, но вот для AVR (для сравнения - с АRM картина идентична) картина такая: дистрибутивный тулчейн AVR $ ll /usr/lib/gcc/avr/4.1.2/ drwxr-xr-x 2 root root 4096 2008-01-04 19:30 avr3 drwxr-xr-x 2 root root 4096 2008-01-04 19:30 avr4 drwxr-xr-x 2 root root 4096 2008-01-04 19:30 avr5 drwxr-xr-x 2 root root 4096 2008-01-04 19:30 include -rw-r--r-- 1 root root 1512932 2007-05-23 13:05 libgcc.a -rw-r--r-- 1 root root 199534 2007-05-23 13:05 libgcov.a $ ll /usr/lib/gcc/avr/4.1.2/avr5 -rw-r--r-- 1 root root 1509392 2007-05-23 13:05 libgcc.a -rw-r--r-- 1 root root 199534 2007-05-23 13:05 libgcov.a тулчейн AVR ручной сборки: $ ll /usr/local/avr-4.3.3/avr/lib drwxr-xr-x 2 root root 4096 2009-04-07 17:12 avr3 drwxr-xr-x 2 root root 4096 2009-04-07 17:12 avr4 drwxr-xr-x 2 root root 4096 2009-04-07 17:12 avr5 drwxr-xr-x 2 root root 4096 2009-04-07 17:04 ldscripts -rw-r--r-- 2 root root 802476 2009-04-07 17:12 libc.a -rw-r--r-- 2 root root 802476 2009-04-07 17:12 libg.a -rw-r--r-- 1 root root 320392 2009-04-07 17:12 libm.a -rwxr-xr-x 1 root root 25358 2009-04-07 17:12 libnosys.a $ ll /usr/local/avr-4.3.3/avr/lib/avr5 -rw-r--r-- 2 root root 789240 2009-04-07 17:12 libc.a -rw-r--r-- 2 root root 789240 2009-04-07 17:12 libg.a -rw-r--r-- 1 root root 313024 2009-04-07 17:12 libm.a -rwxr-xr-x 1 root root 25358 2009-04-07 17:12 libnosys.a 2) в опция makefile многих проектов для ARM вижу " -lgcc -lnewlib" - т.е. должна быть еще и бибилиотека с символьными именем newlib ?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 9 апреля, 2009 Опубликовано 9 апреля, 2009 · Жалоба 1) судя по описанию http://www.eluaproject.net/en/Building_GCC_for_ARM , второй проход необходим для сборки библиотек (libgcc.a и прочих), которым для неё необходим newlib.Видимо, описание неверное, ибо выше мной описанным способом однократный make без проблем собирает и libgcc, и прочие необходимые библиотеки. 2) в опция makefile многих проектов для ARM вижу " -lgcc -lnewlib" - т.е. должна быть еще и бибилиотека с символьными именем newlib ??Если речь идет о редхатовском newlib, то newlib - это общее название проекта. А результатом его сборки являются стандартные библиотеки libc и libm. О библиотеке libnewlib я никогда не слышал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 1 10 апреля, 2009 Опубликовано 10 апреля, 2009 · Жалоба Или спрошу по-другому. Я всегда просто помещал в исходники gcc симлинк на newlib и делал make && make install. Это неправильно? Видимо, описание неверное, ибо выше мной описанным способом однократный make без проблем собирает и libgcc, и прочие необходимые библиотеки. хорошо. хочу прояснить для себя 2 вопроса: 1) почему в использованном мною способе сборки libgcc.a собирается, но не инсталлируется в соответствующую директорию 2) не могу понять почему в большинстве источников, описывающих сборку тулчейна для ARM, используется двухпроходная сборка GCC. даже в том, который сходен с вашим. обратите внимание - первая итерация уже с хидерами: mkdir gcc-build cd gcc-build ../gcc-3.4.3/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers=../newlib-1.12.0/newlib/libc/include # Note: this step requires root privileges under Linux to copy the newlib headers into a subdirectory under $PREFIX. make all-gcc make install-gcc Getting.Started.with.LPC2000.using.GCC.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться