varnimyr titles the power pierce heaven guardian elwiki elsword elrianode elianod eclipse gcc linker arm gnu

eclipse - titles - pierce the heaven elsword



Error de vinculador en un proyecto de C usando Eclipse (5)

Creé un proyecto RTOS usando CubeMX y agregué un printf y tuve el mismo problema al vincular, mientras que depuraba usando OpenOCD.

Reemplacé el printf ("Hello ARM World!") Con trace_puts ("Hello ARM World!"); y tenía los mensajes aparecidos en la consola de depuración.

Quiero crear un proyecto para el microcontrolador STM32F217IG.

Luego instalé Eclipse y el compilador cruzado de GCC incorporado de GNU para ARM . No creo que sea el Código Fuente. Lo usé, porque soporta punto flotante y Code Sourcery no.

Una vez que lo hice, intenté crear un proyecto realmente pequeño con solo dos archivos de origen: test.c y main.c con solo escrito en ambos:

#include <stdlib.h> #include <stdio.h> int main (void) { printf("Hello, World!"); return 0; }

Cambié el comando de línea en la propiedad del proyecto para reemplazar GCC por arm-none-eabi-gcc y luego traté de compilar el proyecto.

Yo no creé ningún archivo make yo mismo; Utilicé la creación automática en Eclipse.

El edificio parece estar bien, pero cuando se trata del vinculador, obtuve los siguientes errores en la consola:

make all ''Building target: test3'' ''Invoking: Cross GCC Linker'' arm-none-eabi-gcc -o"test3" ./main.o ./test3.o c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit'': exit.c:(.text.exit+0x2c): undefined reference to `_exit'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r'': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In function `_write_r'': writer.c:(.text._write_r+0x20): undefined reference to `_write'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In function `_close_r'': closer.c:(.text._close_r+0x18): undefined reference to `_close'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r'': fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r'': isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r'': lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): In function `_read_r'': readr.c:(.text._read_r+0x20): undefined reference to `_read'' collect2: ld returned 1 exit status make: *** [test3] Erreur 1

Busqué en Internet y descubrí que puede tratarse de un problema de syscall. Pero no sé cómo agrego esta biblioteca a mi proyecto en Linux.

¿Es realmente eso? Si es así, ¿cómo lo arreglo? Y si no, ¿de dónde viene eso?

Como alguien sugirió, intenté "vincular" la biblioteca de tiempo de ejecución de C. En Eclipse parece que tengo dos soluciones para hacerlo:

Primero en las propiedades del proyecto → C / C ++CompilaciónConfiguraciónVinculador cruzadobibliotecas . Simplemente agrego la letra c y luego el error no cambia, pero hay -lc al final de la línea de comando:

make all ''Building target: test3'' ''Invoking: Cross GCC Linker'' arm-none-eabi-gcc -o"test3" ./main.o ./test3.o -lc c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit'': exit.c:(.text.exit+0x2c): undefined reference to `_exit'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r'': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In function `_write_r'': writer.c:(.text._write_r+0x20): undefined reference to `_write'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In function `_close_r'': closer.c:(.text._close_r+0x18): undefined reference to `_close'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r'': fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r'': isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r'': lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'' c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): In function `_read_r'': readr.c:(.text._read_r+0x20): undefined reference to `_read'' collect2: ld returned 1 exit status make: *** [test3] Erreur 1

Pero no sé si realmente significa agregar la biblioteca de tiempo de ejecución de C.

Segundo, agregué la biblioteca libc.a en las propiedades del proyecto → C / C ++ generalRuta y símbolosBibliotecas , y esto es lo que obtengo (completamente diferente):

make all ''Building target: test3'' ''Invoking: Cross GCC Linker'' arm-none-eabi-gcc -o"test3" ./main.o ./test3.o -l"C:/Program/ Files/GNU/ Tools/ ARM/ Embedded/4.6/ 2012q4/arm-none-eabi/lib/armv7-m/libc.a" c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/bin/ld.exe: cannot find -lC:/Program/ Files/GNU/ Tools/ ARM/ Embedded/4.6/ 2012q4/arm-none-eabi/lib/armv7-m/libc.a collect2: ld returned 1 exit status make: *** [test3] Erreur 1

Entonces todavía no funciona, pero ¿es la buena manera de buscar?

Ah y un dato muy interesante:

Tengo los errores sólo en el modo de depuración. Si estoy en modo de lanzamiento, todo está bien, y no tengo ningún error (excepto si agrego libc.a, entonces creo que esto no es lo correcto). ¿Eso significa que el problema es la creación del archivo .elf?


Guardando su programa C como "myprint.c", lo compilo de la siguiente manera:

arm-none-eabi-gcc myprint.c -lc -specs = nosys.specs

No hay errores y la salida está bien.


He mirado el conjunto de herramientas que ha vinculado, solo para leer lo siguiente en el readme.txt :

Esta cadena de herramientas está construida y optimizada para el desarrollo de metales desnudos Cortex-R / M.

En otras palabras, esta cadena de herramientas está configurada específicamente para sistemas integrados, tal vez sin ningún sistema operativo ejecutándose. En tal caso, no hay un sistema que proporcione, por ejemplo, una salida estándar donde se supone que escriba printf() , no hay un sistema de archivos, etc. - tiene que vincularse con alguna biblioteca que proporcione estos servicios básicos, si desea usarlos.

Dicho esto, su kit de herramientas proporciona librdimon.a biblioteca que proporciona todos esos servicios básicos. Esta biblioteca es en realidad una parte de la compilación libgloss . Si quieres enlazar contra él, prueba el siguiente comando:

arm-none-eabi-gcc --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group -o test test.c

Esto está bien en mi PC, pero si lo que realmente quieres es otra historia (¿dónde esperas ver la salida de printf() , de todos modos?).

Para su chip, probablemente debería buscar una biblioteca que redirija la salida estándar al puerto serie o proporcione una salida de depuración a través de JTAG. Alternativamente, puede usar su función personalizada, por ejemplo, enviar la salida de depuración a la consola serie en lugar de a printf() , usted decide. Si decides utilizar printf() te sugiero leer la documentación de libgloss .

Además, sugiero buscar una cadena de herramientas que se incluye específicamente para la familia STM32. La configuración adecuada de todas estas cosas básicas (biblioteca C, script de vinculador, etc.) requiere un poco de experiencia.

Edición: muchos sistemas integrados realmente no usan la biblioteca C estándar, comenzando casi desde cero. Si quieres ir por este camino, debes pasar -nostdlib a tu invocación de gcc . Por supuesto, ya no tendrás cosas como printf() disponibles.

Edición 2: Otra forma es usar la biblioteca estándar ( newlib , quiero decir) sin libgloss y proporcionar libgloss adecuados para cosas que no necesitas. Es posible que desee seguir este tutorial , donde _read and _write se implementa en el puerto serie, y todo lo demás se apaga. Esto es muy probablemente lo que realmente quieres.


Sé que esta es una pregunta antigua, pero me encontré con esto hoy cuando intento construir una placa STM32. El proyecto que tengo tiene algunos scripts de vinculador (específicamente libs.ld). Agregar una entrada para libnosys.a en esto satisfizo el enlazador y pude continuar.

libs.ld:

GROUP( libgcc.a libg.a libc.a libm.a libnosys.a )


También hubo un problema malloc() con las llamadas a las funciones malloc() y free() en el proyecto Eclipse. He escrito firmware para un microcontrolador STM32 usando Eclipse + GNU para compilador cruzado GCC integrado ARM + STM32CubeMX para la inicialización de periféricos de microcontroladores y la creación de scripts del vinculador.

Cuando agregué las cadenas perdidas libg.a (*) y libnosys.a (*) en la sección .ld script .ld , mi proyecto se .ld correctamente.