Перейти к содержанию
    

Здесь было рассмотрено уже это но у мя не получилось. Плиз выложите пример с минимумом "лишних" деталей:

 

Возник такой трабл. Програмлю под 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да конешн), файлег был стырен с каково-то примера:

 

 

/* 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 и по типу этого. Вопщим я многа перепробывал. В какой то момент он просил размещать секции имена которых в моей проге нет. я так подумал они в библиотеке. размещал, но итог нулевой. Всеж прошу выложить пример мелкой проги, которую я привожу выше с минимальным количеством лишнего. Я б тогда наверн примонтировал в свою

Изменено пользователем 123730

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь было рассмотрено уже это но у мя не получилось. Плиз выложите пример с минимумом "лишних" деталей:

 

Для того чтобы использовать функции типа printf, sprintf и т.д. необходимо написать функции "system calls" специфичные для твоей платформы. Именно на их отсутсвие компилятор и ругается (_sbrk_r, _write_r и т.д.).

 

Как это сделать а заодно и рабочий пример смотри сюда:

http://www.siwawi.arubi.uni-kl.de/avr_proj...ects/#gcc_stdio

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стырил я 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может ли кто поделиться или подсказать где поискать пример проекта для LPC2368,

Среда Eclipce + GCC для ARM + OpenOCD (Amontec sdk4arm) + MT-LINK.

Среду вроде бы настроил, простой проект на 2294 компилируется. Теперь бы перейти на LPC2368 :-).

Поиск в интернете и по конференциям пока безуспешен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может ли кто поделиться или подсказать где поискать пример проекта для LPC2368,

Среда Eclipce + GCC для ARM + OpenOCD (Amontec sdk4arm) + MT-LINK.

Среду вроде бы настроил, простой проект на 2294 компилируется. Теперь бы перейти на LPC2368 :-).

Поиск в интернете и по конференциям пока безуспешен.

В демо на FreeRTOS есть то, что вам нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В принципе ничего сложного нет. Компилируем 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" ?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

следую согласно инструкции 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 в один прием?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

alx2

 

очевидно из требования сборки newlib target-версией компилятора

 

или вы про:

"Некоторые компиляторы (GCC) поддерживают внутренние версии множества функций Стандартной библиотеки языка Си; то есть, реализации функций записываются в компилируемый объектный модуль, а программа вызывает внутренние версии вместо функций общей библиотеки Си.Это уменьшает накладные расходы при вызове функции, особенно если вызов функции заменяется встроенными вариантами, и разрешается использование других форм оптимизации (если компилятор поддерживает управление характеристиками внутренних вариантов)"

?

 

http://ru.wikipedia.org/wiki/%D0%A1%D1%82%....BE.D1.80.D0.B0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

очевидно из требования сборки newlib target-версией компилятора
Не понял. Можно подробнее? А чем же еще newlib может собираться? Не host-же версией!

 

Или спрошу по-другому. Я всегда просто помещал в исходники gcc симлинк на newlib и делал make && make install. Это неправильно?

 

или вы про:

"Некоторые компиляторы (GCC) поддерживают внутренние версии множества функций

Нет, об этом вообще по-моему речи не было...
Изменено пользователем alx2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кстати у меня эта ссылка не работает - выдает страничку ошибки

 

поскольку за GNU проекты никто не отвечает.

они опубликованы, точно также за коммерческие продукты никто не несет ответсвенности, хоть один раз была какая либо компенсация за подвисание ос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или спрошу по-другому. Я всегда просто помещал в исходники 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 ??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 я никогда не слышал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или спрошу по-другому. Я всегда просто помещал в исходники 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...