Forum: Compiler & IDEs Runtime Libs aus gcc-arm-none-eabi


von J. V. (janvi)


Lesenswert?

Von einem Kollegen habe ich einen selbst compilierten GCC welcher 
ehemals notgedrungen von Cortex-A auf Cortex-M umgebogen wurde. Es gibt 
nur noch ein EXE von 2006 welche nie weiter gepflegt wurde. Die 
Anpassungen an der Runtime sind fraglich. Konsolausgaben landen auf 
einem Breakpoint, es gibt kein malloc usw.  Deshalb möchte ich meine 
alten Projekte auf die offiziell von ARM gepflegte aktuelle GCC Version 
umstellen. Ich verwende derzeit noch keine IDE, dafür aber die alten 
selbst gemachten Startup Quellen und Linker Skripts. Letzeres mit 
möglichst kleinen Änderungen.

Projekt 1 compiliert (und funktioniert auch alles)
Projekt 2 linkt nicht wegen fehlendem memcpy
Projekt 3 linkt nicht wegen fehlendem  __eabi_uldivmod

Wenn ich das korrekt annehme, sind beides Fehler im Zusammenhang mit 
nicht korrekt gelinkter Runtime Bibliotheks-Archive welche Bestandteil 
von gcc-arm-none-eabi sein sollten. Zumindest die Verwendung von memcpy 
ist plausibel ohne die Notwendigkeit in den Quellen aktuell genauer zu 
untersuchen. Projekt 2 krieg ich nun gelinkt, wenn ich folgende Dinge 
gleichzeitig mache:

1) Für einen STM32F103 und F107 nehme ich an, daß die 
Laufzeitbibliotheken aus dem Verzeichniss ../v7-m/ für Cortex-M3 benutzt 
werden sollten.

2) Diese Verzeichnisse finde ich gleich an zwei verschiedenen Stellen 
der Installation. Dazu habe ich im Linker Skript folgende Suchpfade 
eingerichtet:
1
SEARCH_DIR("/usr/lib/arm-none-eabi/newlib/thumb/v7-m/")
2
SEARCH_DIR("/usr/lib/gcc/arm-none-eabi/6.3.1/thumb/v7-m/")

Warum die Dateien auf zwei verschiedene Verzeichnisse verteilt sind (was 
den Suchpfad im Linkerskript auch noch versionsabhängig macht) verstehe 
ich hier nicht. Ich hoffe aber, nicht versehentlich die Archive vom GCC 
für das Linux System (also gcc ohne arm-none-eabi) zu verwenden.

3) Wenn ich die Readme richtig verstehe, hat ARM eine optimierte Version 
der Runtime newlib mit dem modifizierten Dateinamen ..._nano verfügbar. 
Um diesen zu benutzen, habe ich im Linker Aufruf den Parameter 
-specs=nano.specs übergeben (was nutzlos war). Um ein 
projektunabhängiges Linkerskript zu bekommen, habe ich die zu linkenden 
Objektfiles ebenfalls in der Kommandozeile übergeben. Ich weis, dass 
dies auch im Linkerskript gehen würde.
1
arm-none-eabi-ld -gc-sections -M=map.txt -T./link.ld ./o/stm32f10x_dma.o ./o/main.o ./o/stm32f10x_rcc.o ./o/stm32f10x_flash.o ./o/cpuinit.o ./o/stm32f10x_it.o ./o/flop.o ./o/misc.o ./o/stm32f10x_tim.o ./o/stm32f10x_adc.o ./o/stm32f10x_dac.o ./o/stm32f10x_gpio.o ./o/stm32f10x_crc.o ./o/stm32f10x_spi.o ./o/stm32f10x_usart.o ./o/thprintf.o ./o/com.o ./o/kbd.o ./o/lcd.o ./o/motor.o ./o/startup_stm32f10x_cl.o

4) Die Runtime lib _nano.a muß in der Liste der zu linkenden Objekt 
Files angegeben werden, während die ohne _nano auch ohne explizite 
Benennung als Linker Input nachgefragt werden. Eigentlich habe ich 
gedacht, daß diese nur alternativ verwendet werden? Ist da der Parameter 
-specs=nano.specs nicht wie beabsichtigt verwendet ?

5) Um zu Linken, muss ich nun die libc.a, libm.a, libgcc.a und 
libc_nano.a  in das Quellverzeichniss des Projekts kopieren. Die im 
Linkerskript angelegten Suchpfad scheinen also nicht korrekt zu 
funktionieren? Erst libgcc_nano.a linkt memcpy und das auch ohne dass 
-specs=nano.specs verwendet wird.

Summa Summarum scheint das beschriebene Vorgehen nicht wirklich korrekt 
und führt bei Projekt 3 auch nicht zum Erfolg.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Wenn du den neuen GCC (wobei 6.3.1 jetzt nicht wirklich neu ist) 
verwendest brauchst du dich im Linkerscript nicht um irgendwelche Pfade 
kümmern. Der Compiler findet die schon selber abhängig von der gewählten 
Architektur (-mcpu=cortex-m3).

Auch die Standardbibliotheken wie libc und libgcc linkt der GCC 
automatisch dazu wenn man ihm das nicht explizit untersagt (-nostdlib).

Ich hab sowas 
https://embedds.com/programming-stm32-discovery-using-gnu-tools-linker-script/ 
als Grundlage für unser aktuelles Linkerscript verwendet.

Matthias

von J. V. (janvi)


Lesenswert?

libc.a libgcc.a bringen leider eine Fehlermeldung dass der Linker sie 
nicht findet. Erst wenn ich sie im Projektverzeichniss habe wird 
gelinkt. Mit -nostdlib kann ich die im Projektverzeichniss löschen und 
es geht trotzdem. Lösche ich dann aber noch den Pfad, kommt wieder ein 
Linkfehler.

Die 6.3.1 ist leider auch eine ältere Version aus dem Ubuntu Debian 
Paket welches mit sudo apt-get installiert wurde. Leider habe ich bei 
der Installation des Tarballs von ARM noch einige weitere Probleme die 
ich gerade nicht verstehe. Daher vorsichtshalber mal das ältere Paket 
aus dem Ubuntu Archiv.

: Bearbeitet durch User
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Wie sieht denn aktuell dein Makefile aus? Und dein Linkerscript? 
Erwischt das Makefile auch wirklich den richtigen Compiler?

Matthias

von Bauform B. (bauformb)


Lesenswert?

Μαtthias W. schrieb:
> Wenn du den neuen GCC verwendest brauchst du dich im Linkerscript
> nicht um irgendwelche Pfade kümmern.

Von wegen neuer GCC: mit dem Debian-Paket für den GCC-7 war es auch 
schon so einfach und dein Ubuntu-Paket wird nicht so viel anders sein. 
Installieren und fertig. Keine Pfade irgendwo anpassen, keine lib extra 
angeben oder gar kopieren, weil
> Der Compiler findet die schon selber abhängig von der gewählten
> Architektur (-mcpu=cortex-m3).

Das funktioniert aber viel besser/einfacher, wenn der gcc selbst den 
Linker aufruft. Ich würde als erstes den Aufruf vom arm-none-eabi-ld und 
das -nostdlib ausbauen. Der gcc bekommt stattdessen ein -o für das 
fertige Programm. Die restlichen Fehler sollten sich dann ohne Tricks 
beheben lassen.

von Andreas M. (amesser)


Lesenswert?

Den Linker nicht direkt aufrufen, sondern bitte über den gcc. (also -ld 
durch -gcc ersetzen). Der kümmert sich dann automatisch um die Pfade 
wenn man die CPU wie beim Compilieren mit angibt. ("-mcpu=cortex-3m"). 
Den Linkerargumente "-Wl," voranstellen. Z.b. aus "-M=map.txt" wird 
"-Wl,-M=map".
-

von J. V. (janvi)


Lesenswert?

> Erwischt das Makefile auch wirklich den richtigen Compiler?
Bin jetzt wenigstens etwas in Version vorgerrückt auf das was bei Ubuntu 
"aktuell" sein soll. Hier der Output im Erfolgsfall:
1
arm-none-eabi-gcc --version
2
arm-none-eabi-gcc (15:9-2019-q4-0ubuntu1) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599]
3
Copyright (C) 2019 Free Software Foundation, Inc.
4
This is free software; see the source for copying conditions.  There is NO
5
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6
7
jv@JamesWebb:~/Winde2019$ make
8
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_dma.o stm32f10x_dma.c   
9
arm-none-eabi-gcc -Wall -O0  -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 -oo/main.o main.c    
10
arm-none-eabi-gcc  -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_rcc.o stm32f10x_rcc.c   
11
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_flash.o stm32f10x_flash.c
12
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 -save-temps -oo/cpuinit.o cpuinit.c
13
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_it.o stm32f10x_it.c
14
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 -oo/flop.o flop.c
15
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/misc.o misc.c
16
arm-none-eabi-gcc -Wall -O0 -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_tim.o stm32f10x_tim.c
17
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 -oo/stm32f10x_adc.o stm32f10x_adc.c
18
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 -oo/stm32f10x_dac.o stm32f10x_dac.c
19
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_gpio.o stm32f10x_gpio.c
20
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_crc.o stm32f10x_crc.c
21
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_spi.o stm32f10x_spi.c
22
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/stm32f10x_usart.o stm32f10x_usart.c
23
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/thprintf.o thprintf.c
24
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/com.o com.c
25
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/kbd.o kbd.c
26
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/lcd.o lcd.c
27
arm-none-eabi-gcc -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections -oo/motor.o motor.c
28
arm-none-eabi-ld -gc-sections -M=map.txt -T./link.ld ./o/stm32f10x_dma.o ./o/main.o ./o/stm32f10x_rcc.o ./o/stm32f10x_flash.o ./o/cpuinit.o ./o/stm32f10x_it.o ./o/flop.o ./o/misc.o ./o/stm32f10x_tim.o ./o/stm32f10x_adc.o ./o/stm32f10x_dac.o ./o/stm32f10x_gpio.o ./o/stm32f10x_crc.o ./o/stm32f10x_spi.o ./o/stm32f10x_usart.o ./o/thprintf.o ./o/com.o ./o/kbd.o ./o/lcd.o ./o/motor.o ./o/startup_stm32f10x_cl.o libc_nano.a -o./o/out.elf

Entfernt man libc_nano.a aus der Liste des Linker Inputs (oder dem 
Quellverzeichniss), erscheint trotz korrektem Suchpfad im Linkerfile und 
dort vorhandenen Standardbibliotheken
1
arm-none-eabi-ld: ./o/main.o: in function `pcz1':
2
/home/jv/Winde2019/main.c:99: undefined reference to `memcpy'
3
make: *** [makefile:25: o/out.elf] Fehler 1

In main.c:99 wird strcpy tatsächlich berechtigt verwendet um einen 
String in den UART Sendepuffer abzulegen welcher sodann im Hintergrund 
über INT verschickt wird:
1
{strcpy ((char*) PcTxBuf, "Num  Flow Temp Volt iTmp Leak-Rpts Posi Flux Supl Torq Sped Baro Sink Time Exor\n\r");

Entfernt man nun libc.a zusätzlich aus dem Quellverzeichniss, so ändert 
sich der Fehler (obwohl der Pfad im Linkerskript stimmt) auf
1
arm-none-eabi-ld -gc-sections -M=map.txt -T./link.ld ./o/stm32f10x_dma.o ./o/main.o ./o/stm32f10x_rcc.o ./o/stm32f10x_flash.o ./o/cpuinit.o ./o/stm32f10x_it.o ./o/flop.o ./o/misc.o ./o/stm32f10x_tim.o ./o/stm32f10x_adc.o ./o/stm32f10x_dac.o ./o/stm32f10x_gpio.o ./o/stm32f10x_crc.o ./o/stm32f10x_spi.o ./o/stm32f10x_usart.o ./o/thprintf.o ./o/com.o ./o/kbd.o ./o/lcd.o ./o/motor.o ./o/startup_stm32f10x_cl.o -o./o/out.elf
2
arm-none-eabi-ld: cannot find libc.a
3
make: *** [makefile:25: o/out.elf] Fehler 1

von J. V. (janvi)


Lesenswert?

Andreas M. schrieb:
> Den Linker nicht direkt aufrufen,

das führt zu
1
arm-none-eabi-gcc -mcpu=cortex-m3, -Wl,-gc-sections -Wl,-M=map.txt -Wl,-T./link.ld ./o/stm32f10x_dma.o ./o/main.o ./o/stm32f10x_rcc.o ./o/stm32f10x_flash.o ./o/cpuinit.o ./o/stm32f10x_it.o ./o/flop.o ./o/misc.o ./o/stm32f10x_tim.o ./o/stm32f10x_adc.o ./o/stm32f10x_dac.o ./o/stm32f10x_gpio.o ./o/stm32f10x_crc.o ./o/stm32f10x_spi.o ./o/stm32f10x_usart.o ./o/thprintf.o ./o/com.o ./o/kbd.o ./o/lcd.o ./o/motor.o ./o/startup_stm32f10x_cl.o -o./o/out.elf
2
arm-none-eabi-gcc: error: unrecognized -mcpu target: cortex-m3,
3
arm-none-eabi-gcc: note: valid arguments are: arm8 arm810 strongarm strongarm110 fa526 fa626 arm7tdmi arm7tdmi-s arm710t arm720t arm740t arm9 arm9tdmi arm920t arm920 arm922t arm940t ep9312 arm10tdmi arm1020t arm9e arm946e-s arm966e-s arm968e-s arm10e arm1020e arm1022e xscale iwmmxt iwmmxt2 fa606te fa626te fmp626 fa726te arm926ej-s arm1026ej-s arm1136j-s arm1136jf-s arm1176jz-s arm1176jzf-s mpcorenovfp mpcore arm1156t2-s arm1156t2f-s cortex-m1 cortex-m0 cortex-m0plus cortex-m1.small-multiply cortex-m0.small-multiply cortex-m0plus.small-multiply generic-armv7-a cortex-a5 cortex-a7 cortex-a8 cortex-a9 cortex-a12 cortex-a15 cortex-a17 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 cortex-m7 cortex-m4 cortex-m3 marvell-pj4 cortex-a15.cortex-a7 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a53 cortex-a57 cortex-a72 cortex-a73 exynos-m1 xgene1 cortex-a57.cortex-a53 cortex-a72.cortex-a53 cortex-a73.cortex-a35 cortex-a73.cortex-a53 cortex-a55 cortex-a75 cortex-a76 neoverse-n1 cortex-a75.cortex-a55 cortex-a76.cortex-a55 cortex-m23 cortex-m33 cortex-r52; did you mean 'cortex-m3'?
4
arm-none-eabi-gcc: error: missing argument to '-march='
5
make: *** [makefile:24: o/out.elf] Fehler 1
habe ich etwas anderes als cortex-m3 angegeben ?

von Oliver S. (oliverso)


Lesenswert?

J. V. schrieb:
> -mcpu=cortex-m3,

Tja, wenn man gaaaaanz genau hinschaut, gibts da noch so einen 
Fliegenschiß, und der macht den Unterschied,

Oliver

: Bearbeitet durch User
von J. V. (janvi)


Lesenswert?

brauch ich ne neue Brille ???

von Andreas M. (amesser)


Lesenswert?

Genau, da ist ein Komma zu viel :-)

von J. V. (janvi)


Lesenswert?

au weia - es wird immer schlimmer. Eine Section .data gibts zwar, aber 
.init LMA habe ich im ganzen Linkfile nicht angelegt. Probiert der jetzt 
vielleicht was anders als meinen eigenen Startup zu nehmen ?
1
usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: section .init LMA [0000000008004594,0000000008004597] overlaps section .data LMA [0000000008004594,00000000080045a7]
2
collect2: error: ld returned 1 exit status
3
make: *** [makefile:24: o/out.elf] Fehler 1

: Bearbeitet durch User
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Zeig doch mal dein Linkerscript. Sonst wird das eine wilde Raterei.

von Oliver S. (oliverso)


Lesenswert?

J. V. schrieb:
> Eine Section .data gibts zwar, aber
> .init LMA habe ich im ganzen Linkfile nicht angelegt.

Linker sind hochspezialisierte Sonderlinge, und eine verständliche 
Ausdrucksweise gehört nicht zu deren Stärken.

Was der dir vielleicht sagen will, ist, daß der gerne eine init-Section 
hätte.

Oliver

von J. V. (janvi)


Lesenswert?

Hier das gesamte Linkerskript:
1
jv@JamesWebb:~/Winde2019$ cat link.ld
2
SEARCH_DIR("/usr/lib/arm-none-eabi/newlib/thumb/v7-m/nofp")
3
SEARCH_DIR("/usr/lib/gcc/arm-none-eabi/9.2.1/thumb/v7-m/nofp/")
4
5
ENTRY(Reset_Handler)        /* Reset Symbol ins ELF fuer Segger Ozone */
6
7
/* provide kann vom Objektfile ueberschrieben werden */
8
__Stack_Size = 1024 ;
9
PROVIDE ( _Stack_Size = __Stack_Size ) ;
10
__Stack_Init = _estack  - __Stack_Size ;
11
PROVIDE ( _Stack_Init = __Stack_Init ) ;
12
_Minimum_Stack_Size = 0x100 ;
13
14
MEMORY
15
{
16
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10K
17
  FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K
18
}
19
20
_estack = 0x20002800;  /* bei Low density */
21
22
SECTIONS
23
{
24
    /* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
25
    .isr_vector :
26
    {
27
  . = ALIGN(4);
28
        KEEP(*(.isr_vector))            /* Startup code */
29
  . = ALIGN(4);
30
    } >FLASH
31
 
32
    /* the program code is stored in the .text section, which goes to Flash */
33
    .text :
34
    {
35
      . = ALIGN(4);
36
        *(.text)                   /* remaining code */
37
        *(.text.*)                   /* remaining code */
38
        *(.rodata)                 /* read-only data (constants) */
39
        *(.rodata*)
40
        *(.glue_7)
41
        *(.glue_7t)
42
43
      . = ALIGN(4);
44
      _etext = .;
45
      /* This is used by the startup in order to initialize the .data secion */
46
      _sidata = _etext;
47
    } >FLASH
48
    
49
    /* This is the initialized data section
50
    The program executes knowing that the data is in the RAM
51
    but the loader puts the initial values in the FLASH (inidata).
52
    It is one task of the startup to copy the initial values from FLASH to RAM. */
53
    .data  : AT ( _sidata )
54
    {
55
      . = ALIGN(4);
56
        /* This is used by the startup in order to initialize the .data secion */
57
        _sdata = . ;
58
        
59
        *(.data)
60
        *(.data.*)
61
62
      . = ALIGN(4);
63
      /* This is used by the startup in order to initialize the .data secion */
64
      _edata = . ;
65
    } >RAM
66
    
67
    /* This is the uninitialized data section */
68
    .bss :
69
    {
70
      . = ALIGN(4);
71
        /* This is used by the startup in order to initialize the .bss secion */
72
        _sbss = .;
73
        
74
        *(.bss)
75
        *(COMMON)
76
        
77
      . = ALIGN(4);
78
      /* This is used by the startup in order to initialize the .bss secion */
79
      _ebss = . ;
80
    } >RAM
81
    
82
    PROVIDE ( end = _ebss );
83
    PROVIDE ( _end = _ebss );
84
    
85
    /* This is the user stack section 
86
    This is just to check that there is enough RAM left for the User mode stack
87
    It should generate an error if it's full.
88
     */
89
    ._usrstack :
90
    {
91
      . = ALIGN(4);
92
        _susrstack = . ;
93
        
94
        . = . + _Minimum_Stack_Size ;
95
        
96
      . = ALIGN(4);
97
        _eusrstack = . ;
98
    } >RAM
99
 }

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> Was der dir vielleicht sagen will, ist, daß der gerne eine init-Section
> hätte.

Das Linkerscript bestätigt das. .init taucht nirgends auf.

@TO
Mach mal nach *(.glue_7t) ein KEEP (*(.init)) rein.

Matthias

von J. V. (janvi)


Lesenswert?

Μαtthias W. schrieb:
> Mach mal nach *(.glue_7t) ein KEEP (*(.init)) rein.
Resultat bleibt gleich aber der Name der section ändert sich von init in 
fini:

section .fini LMA [00000000080045a0,00000000080045a3] overlaps section 
.data LMA [00000000080045a0,00000000080045b3]

von Oliver S. (oliverso)


Lesenswert?

Die Transferleistung bekommst du jetzt aber selber hin...

Oliver

von J. V. (janvi)


Lesenswert?

die neue Brille hat dabei etwas nachgeholfen:
1
make
2
arm-none-eabi-gcc -mcpu=cortex-m3 -Wl,-gc-sections -Wl,-M=map.txt -Wl,-T./link.ld ./o/stm32f10x_dma.o ./o/main.o ./o/stm32f10x_rcc.o ./o/stm32f10x_flash.o ./o/cpuinit.o ./o/stm32f10x_it.o ./o/flop.o ./o/misc.o ./o/stm32f10x_tim.o ./o/stm32f10x_adc.o ./o/stm32f10x_dac.o ./o/stm32f10x_gpio.o ./o/stm32f10x_crc.o ./o/stm32f10x_spi.o ./o/stm32f10x_usart.o ./o/thprintf.o ./o/com.o ./o/kbd.o ./o/lcd.o ./o/motor.o ./o/startup_stm32f10x_cl.o -o./o/out.elf
3
jv@JamesWebb:~/Winde2019$ make
4
make: o/out.elf ist bereits aktuell.

Jetzt kann ich mal wieder rumprobieren um rauszukriegen wann das Teil 
welche Runtime nimmt und ob das am Projekt 3 auch hilft.

von PittyJ (Gast)


Lesenswert?

Ich hatte mir letztens mal die Cube-IDE installiert.
Da waren für viele STM Prozessoren die benötigten Architektur abhängigen 
Dateien dabei.
Ich habe mir dann mit der IDE ein Projekt gezimmert. Danach alles, was 
benötigt wurde rüberkopiert. Einen Standard ARM-Compiler noch dazu (oder 
den aus der IDE), und alles in Makefiles verpackt.
War einen Tag Arbeit, aber nun kann ich Remote compileren, ohne IDE.

Evtl geht dieser Weg ja auch für die älteren Prozessoren.
Und man hat die aktuelle STM HAL-Implementation.

von Andreas M. (amesser)


Lesenswert?

Probiers mal mit "-nostartfiles", dann sollte der gcc nicht mehr sein 
internes crt0.o benutzen.

von J. V. (janvi)


Lesenswert?

zumindest für die vom Linker erfundenen .init und .fini hilft das nicht. 
Ob -nostartfiles am abgesetzten Code irgendwas ändert ist noch zu 
untersuchen

von Oliver S. (oliverso)


Lesenswert?

J. V. schrieb:
> zumindest für die vom Linker erfundenen .init und .fini hilft das nicht.

Der linker erfindet eigentlich gar nichts. Woher .init und .fini kommen, 
erzählt dir auf Nachfrage google.

Kurzfassung: die brauchts bei deinem System halt einfach.

Oliver

von J. V. (janvi)


Lesenswert?

Das indirekte Aufrufen des Linkers funktioniert auch bei Projekt 3 
welches damit prompt korrekt gelinkt wird. Alle Suchpfade im 
Linkerskript und alle Runtime Lib-Archivdateien in den Verzeichnissen 
der Projektquellen können dabei gelöscht werden. Weil der Linker den 
Suchpfad trotz Pfadangabe nicht schnallt, haben Andere schon muckiert 
(zufällig genauso mit __eabi_uldivmod):

https://answers.launchpad.net/gcc-arm-embedded/+question/693328

Die Anwort hier ist genauso wenig erhellend. Entweders ist das ein 
Fehler vom Linker oder wir machen beim Aufrufen etwas falsch. Der dort 
empfohlene -lgcc Parameter ist für GCC und hilft dann beim direkten 
Linkeraufruf auch nicht (?)

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Suchpfade im Linkerscript sollte man vermeiden. Das ist ne Krücke die 
man nur braucht wenn man nicht weis wie Linkerkomandozeilen 
funktionieren oder zu viele Suchpfade hat.

Wenn Ihr das Thema jahrelang vor euch hergeschoben habt, dann müsste Ihr 
jetzt halt in den sauren Apfel beißen und lernen, das Wissen für die 
Benutzung eines Compilers einkaufen oder aufhören Software zu erstellen. 
Man kann so ein Thema nicht jahrelang links liegeb lassen und dann 
erwarten es in wenigen Stunden zu lösen, schon gar nicht wenn man 
nichtmal in der Lage ist Anständige Informationen (Vollständige 
Makefiles, Linkerscripte, Verwendetet Toolchains etc.) liefert.

von Bauform B. (bauformb)


Lesenswert?

J. V. schrieb:
> Der dort empfohlene -lgcc Parameter ist für GCC und hilft dann
> beim direkten Linkeraufruf auch nicht (?)

Dann mach das eben nicht. "-lgcc" ist genau das, was für __eabi_uldivmod 
gebraucht wird. Im Prinzip sagen auch alle nicht hilfreichen Antworten 
genau das. Warum muss der Linker überhaupt direkt aufgerufen werden?

von Janvi (Gast)


Lesenswert?

Bauform B. schrieb:
> "-lgcc" ist genau das, was für __eabi_uldivmod
> gebraucht wird.

-lgcc ändert am Linkfehler __eabi_uldivmod bei mir rein gar nichts. 
Abgesehen davon ist die Beschreibung dieses Parameters in meinem GCC-PDF 
dazu schwach bis für mich ganz unverständlich.
-nostartfiles führt alleine dazu, daß der Linker einfach kein ELF mehr 
erzeugt. Dazu wird noch nicht mal eine Fehlermeldung absetzt was ebenso 
zu den zahlreichen für mich unergründlichen Details gehört

Jan

von Blume (Gast)


Lesenswert?

Da werden so viele Sachen durcheinandergebracht. Du musst aufpassen das 
du nicht aufgrund von Irrungen den Holzweg einschlägst:

Janvi schrieb:
> -nostartfiles führt alleine dazu, daß der Linker einfach

von J. V. (janvi)


Lesenswert?

Zielt zwar nicht direkt auf arm-none-eabi hat hier aber halbwegs 
ergiebige Erklärungen zu -lgcc und zu den Suchpfaden bei direktem und 
indirektem Aufruf:

https://wiki.osdev.org/Libgcc

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.