www.mikrocontroller.net

Forum: Compiler & IDEs Problem WinARM Eclipse gcc libary (undefined reference to `__udivsi3')


Autor: Sebastian H. (rs2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe wiedermal ein kleines Problem mit Eclipse bzw. WinARM.

Ich benutze ein Linker-Script-File und muss hierzu in Eclipse unter den 
Linker-Einstellungen die gcc-library entfernen, da sonst beim Linken 
folgende Fehlermeldung auf der Konsole ausgegeben wird:

c:\WinARM\bin\arm-elf-ld.exe: cannot find -lgcc

Beim Dividieren ist jetzt das folgende Problem aufgetaucht:

undefined reference to `__udivsi3'

Ich vermute, dass es an der entfernten gcc-library liegt.
Weiß jemand, wie man mein Problem lösen kann? Linker-Script-File 
editieren, andere Toolchain benutzen, oder spezielle Library´s 
einbinden?

Linker-Script-File:

/*********************************************************************** 
/
/* 
*/
/*  ROM.ld:  Linker Script File 
*/
/* 
*/
/*********************************************************************** 
/
ENTRY(_boot)
STACK_SIZE = 0x400;

/* Memory Definitions */
/* lpc2129 mt */
MEMORY
{
  ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x0001E000
  RAM (rw) : ORIGIN = 0x40000000, LENGTH = 0x00004000
}

/* Section Definitions */
SECTIONS
{
  /* first section is .text which is used for code */
  .text :
  {
    *crt0.o (.text)            /* Startup code */
    *(.text)                   /* remaining code */
    *(.rodata)                 /* read-only data (constants) */
    *(.rodata*)
    *(.glue_7)
    *(.glue_7t)
  } > ROM

  . = ALIGN(4);

  /* .ctors .dtors are used for c++ constructors/destructors */
  /* added by Martin Thomas 4/2005 based on Anglia Design example */
  .ctors :
  {
    PROVIDE(_ctors_start_ = .);
    KEEP(*(SORT(.ctors.*)))
    KEEP(*(.ctors))
    PROVIDE(_ctors_end_ = .);
  } >ROM

  .dtors :
  {
    PROVIDE(_dtors_start_ = .);
    KEEP(*(SORT(.dtors.*)))
    KEEP(*(.dtors))
    PROVIDE(_dtors_end_ = .);
  } >ROM

    . = ALIGN(4);
  /* mthomas - end */


  _etext = . ;
  PROVIDE (etext = .);

  /* .data section which is used for initialized data */
  .data : AT (_etext)
  {
    _data = .;
    *(.data)
  SORT(CONSTRUCTORS) /* mt 4/2005 */
  } > RAM

  . = ALIGN(4);
  _edata = . ;
  PROVIDE (edata = .);

  /* .bss section which is used for uninitialized data */
  .bss (NOLOAD) :
  {
    __bss_start = . ;
    _bss_start_ = . ;
    *(.bss)
    *(COMMON)
    . = ALIGN(4);
  } > RAM

  . = ALIGN(4);
  _bss_end_ = . ;
  PROVIDE (__bss_end = .);

  /* .stack ALIGN(256) : */
  .stack :
  {
    . = ALIGN(256);
    . += STACK_SIZE;
    PROVIDE (_stack = .);
  } > RAM

  _end = . ;
  PROVIDE (end = .);

  /* Stabs debugging sections.  */
  .stab          0 : { *(.stab) }
  .stabstr       0 : { *(.stabstr) }
  .stab.excl     0 : { *(.stab.excl) }
  .stab.exclstr  0 : { *(.stab.exclstr) }
  .stab.index    0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment       0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the 
beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
}

Gruß Sebastian

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die Funktion __udivsi3 ist in der GCC Lib, das -lgcc brauchst du 
deshalb. Hast schon probiert den Pfad für die GCC Lib als Linkeroption 
anzugeben? Du musst nur aufpassen, es gibt die Lib normalerweise in 
verschiedenen Ausführungen (Thumb-Mode, Interworking, etc). Hier musst 
du dann das Richtige Verzeichniss verwenden.

Gruß

Daniel

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian H. wrote:
> Linker-Einstellungen die gcc-library entfernen, da sonst beim Linken
> folgende Fehlermeldung auf der Konsole ausgegeben wird:
>
> c:\WinARM\bin\arm-elf-ld.exe: cannot find -lgcc

Rufst du den Linker etwa direkt auf?
Oder verwendest du gcc als Treiber?

ld ist ziemlich dumm, du musst ihm haargenau die Pfade vorkauen und was 
er zu machen hat.

Verwende mal gcc als Linker und schau mit -v nach, was er dem ld alles 
mitgibt an Pfaden, denn ld weiß nix von einer libgcc.

Johann

Autor: Sebastian H. (rs2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thx Daniel, TOP-Fachmann ;-)

Habe jetzt "C:\WinARM\lib\gcc\arm-elf\4.1.1" bei Library search path 
eingefügt. In dem Verzeichnis befindet sich u.a. eine libgcc.a Datei.

Autor: Sebastian H. (rs2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johann:

Ja, ich rufe den Linker direkt auf (arm-elf-ld). Wenn ich arm-elf-gcc 
benutze, treten andere Linker-Problemchen auf:

C:\Programme\eclipse\Workspace\Drehzahl\Release/../crt0.s:91: multiple 
definition of `_start':

mallocr.c:(.text+0x424): undefined reference to `_sbrk_r'

usw.

Ich habe die Variante mit dem Linker-Script so übernommen, ohne 
beurteilen zu können, ob das jetzt "hau drauf" oder "elegant" ist.

Ich programmiere einen LPC2119 mit Eclipse und versuche mir jetzt alles 
selbst beizubringen. Bin leider noch weit entfernt, um wirklich zu 
verstehen, was ich da mache ;)

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.