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


von Sebastian H. (rs2)


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

von Daniel (Gast)


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

von Johann L. (gjlayde) Benutzerseite


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

von Sebastian H. (rs2)


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.

von Sebastian H. (rs2)


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 ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.