mikrocontroller.net

Forum: Compiler & IDEs undefined reference to sprintf


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende das AT91SAM7S64 Board von Olimex zusammen mit dem 
ARM-Tiny-USB und der mitgelieferten OpenOCD-Yagarto-Toolchain-Eclipse.

Ich möchte den Befehl sprintf() verwenden. Dazu habe ich stdio.h 
eingebunden. Trotzdem kommt die Fehlermeldung: undefined reference to 
sprintf

Woran kann dies liegen?

Hier ein Auszug aus dem Makefile:
NAME   = demo_at91sam7_h256_blink_flash

# variables 
CC      = arm-elf-gcc
LD      = arm-elf-ld -v -lc
AR      = arm-elf-ar
AS      = arm-elf-as
CP      = arm-elf-objcopy
OD    = arm-elf-objdump

CFLAGS  = -I./ -c -fno-common -O0 -g
AFLAGS  = -ahls -mapcs-32 -o crt.o
LFLAGS  =  -Map main.map -Tdemo_at91sam7_h256_blink_flash.cmd
CPFLAGS = --output-target=binary
ODFLAGS  = -x --syms

OBJECTS = crt.o  main.o timerisr.o timersetup.o isrsupport.o lowlevelinit.o blinker.o


# make target called by Eclipse (Project -> Clean ...)
clean:
  -rm -f $(OBJECTS) crt.lst main.lst main.out main.bin main.hex main.map main.dmp

         
#make target called by Eclipse  (Project -> Build Project)
all:  main.out
  @ echo "...copying"
  $(CP) $(CPFLAGS) main.out main.bin
  $(OD) $(ODFLAGS) main.out > main.dmp

main.out: $(OBJECTS) demo_at91sam7_h256_blink_flash.cmd 
  @ echo "..linking"
  $(LD) $(LFLAGS) -o main.out $(OBJECTS) libgcc.a

crt.o: crt.s
  @ echo ".assembling crt.s"
  $(AS) $(AFLAGS) crt.s > crt.lst




Und hier ein Auszug aus main.c
#include <stdio.h>
#include <string.h>
#include "AT91SAM7S256.h"
#include "board.h"


//  *******************************************************
//               Global Variables
//  *******************************************************
unsigned int  FiqCount = 0;    // global uninitialized variable


//  *******************************************************
//                     MAIN
//  ******************************************************/
int  main (void) {
  unsigned long  j;                // loop counter (stack variable)
  unsigned long  IdleCount = 0;          // idle loop blink counter (2x)

  char buff_send[50];
  unsigned int status;

  // Initialize the Atmel AT91SAM7S256 (watchdog, PLL clock, default interrupts, etc.)
  // ---------------------------------------------------------------------------------
  LowLevelInit();


  // Turn on the peripheral clock for Timer0
  // ---------------------------------------

  // pointer to PMC data structure
  volatile AT91PS_PMC  pPMC = AT91C_BASE_PMC;


  sprintf((char*)buff_send, "Status: %i\r\n", status);

Kann mir da jemand helfen?

Schönen Gruß,
Johannes

: Verschoben durch Admin
Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass dies irgendetwas mit "newlib" zu tun hat? Wenn ja, 
wie löse ich das Problem?

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann sein, dass ein #include <stdio.h> nicht ausreicht, sondern dass man 
die für sprintf() benötigte Bibliothek extra hinzulinken muss.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es spart unnötige Sucherei, wenn man den Linker (*-ld) und Assembler 
(-as) nicht direkt aufruft. Beide können indirekt vom Compiler-Frontend 
(*-gcc) gerufen werden.

Mit Yagarto kommt meines Wissens ein Beispiel für AT91SAM7S. Von 
atmel.com gibt es ein "Software-Package" zum AT91SAM7S-Eval-Board. Gut 
auch "Building bare-metal ARM Systems with GNU" bei state-machine.com 
(Quantum Leaps). Vielleicht sind noch meine Beispiele hilfreich: 
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm... 
("gamma")

Ansonsten: testweise -lc aus definition LD entfernen und hinter 
($OBJECTS) im LD-Aufruf ergänzen.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

kannst du mir das genauer beschreiben?
Wie soll es indirekt vom -gcc aufgerufen werden?
Ich habe gerade mehrere Versuche im Makefile gestartet. Aber alle mit 
dem Ergnis, dass irgendein Fehler aufgetreten ist.

Kannst du mir bitte dazu ein Beispiel geben mit dem ich arbeiten kann? 
Ich kenn mich mit den Makefile nicht aus und bin immer sehr zu frieden, 
wenn es so läuft wie es soll und ich nichts ändern muss...

Schönen Gruß,
Johannes

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes schrieb:

> Wie soll es indirekt vom -gcc aufgerufen werden?

Du benutzt einfach gcc statt ld zum Linken. gcc wiederum ruft dann ld 
auf, übergibt ihm aber zusätzlich zu den Argumenten von dir noch 
weitere, die für das Linken von C-Code notwendig sind.

> Ich habe gerade mehrere Versuche im Makefile gestartet. Aber alle mit
> dem Ergnis, dass irgendein Fehler aufgetreten ist.

Naja, dann hast du wohl irgendwas falsch gemacht. Viel mehr kann man so 
nicht sagen.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt -lc nach OBJECTS gehängt und bekomme jetzt folgende 
Fehlermeldung:
GNU ld (GNU Binutils) 2.18
arm-elf-ld: region flash is full (main.out section .text)
arm-elf-ld: region flash is full (main.out section .text)
arm-elf-ld: section .text [00000000 -> 00013d7b] overlaps section .data [00000000 -> 00000837]
c:\gccfd\yagarto\bin\../arm-elf/lib\libc.a(lib_a-syscalls.o): In function `_sbrk':
C:\msys\1.0\home\yagarto\newlib-build\arm-elf\newlib\libc\sys\arm/../../../../../../newlib-1.16.0/newlib/libc/sys/arm/syscalls.c:506: undefined reference to `end'
make: *** [main.out] Error 1
make: Target `all' not remade because of errors.


Aber ich werde daraus nicht schlau. Ich habe auf meinem Rechner nirgends 
einen Ordner namens "newlib-1.16.0". Aber anscheinend dann ja doch, wenn 
er den Inhalt einer Datei davon bemängelt.

Servus,
Johannes

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes schrieb:
> Ich habe jetzt -lc nach OBJECTS gehängt und bekomme jetzt folgende
> Fehlermeldung:

-lc ist einer der nötigen Linker-Parameter, die gcc automatisch für dich 
mit angehängt hätte. Abhängig vom Zielsystem und der Compilerversion 
gibt es aber meist noch einige andere, die notwendig sind.

Johannes schrieb:
> arm-elf-ld: region flash is full (main.out section .text)
> arm-elf-ld: region flash is full (main.out section .text)
> arm-elf-ld: section .text [00000000 -> 00013d7b] overlaps section .data 
[00000000 -> 00000837]

Das klingt aber auch schon mal seltsam. Dein Flash ist voll und deine 
Daten- und Code-Sektion überschneiden sich?

> c:\gccfd\yagarto\bin\../arm-elf/lib\libc.a(lib_a-syscalls.o): In function 
`_sbrk':
> C:\msys\1.0\home\yagarto\newlib-build\arm-elf\newlib\libc\sys\arm/../../ 
../../../../newlib-1.16.0/newlib/libc/sys/arm/syscalls.c:506:  undefined reference 
to `end'

Klingt für mich, als wäre das Linkerskript unvollständig.

> Aber ich werde daraus nicht schlau. Ich habe auf meinem Rechner
> nirgends einen Ordner namens "newlib-1.16.0".

Das dürfte sich eher auf den Rechner beziehen, auf dem diese newlib 
compiliert wurde.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, da es anscheinend immer schwieriger wird, bin ich jetzt auf ein 
Beispiel vom Thomas Martin umgestiegen. Und bisher sieht es aus, als 
würde alles funktionieren... Jetzt muss ich nur noch meinen Code dort 
einbauen.
Danke an alle!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.