mikrocontroller.net

Forum: Compiler & IDEs Bibliotheken nur teilweise Linken


Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das unangenehme bei der Benutzung von Bibliotheken ist ja, daß eine 
menge Speicherplatz für nicht benutzte aber gelinkte Funktion verloren 
geht (z.B. stdlib auf STM32). Ich glaube einmal gelesen zu haben, daß 
man den GCC so aufrufen kann, daß nur benutzte Funktionen aus einer 
Biliothek gelinkt werden. Leider kann ich mich überhaupt nicht mehr an 
die Adresse erinnern, und ich finde die Quelle im Moment auch mit Google 
nicht. Kann mir da jemand bitte weiterhelfen?

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AFAIK ist die einzige Möglichkeit beim gcc die, schon bei der Erstellung 
der Lib jede Funktion in eine gesonderte Section zu packen 
(-ffunction-sections). Beim Linken werden dann nur die benötigten 
Sections gefunden. Hängt aber auch vom target ab, ob das geht.

Falls es bessere Möglichkeiten gibt, lasse ich mich gern überzeugen ;-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne das unter dem Begriff Smart Linking, entweder auf C-Modulebene 
oder Funktionsebene (was natürlich am besten ist). Falls letzteres nicht 
geht aber ersteres, dann ist es natürlich am besten jede Funktion in ein 
eigenes Modul zu packen.

Ich kann das halt so vom IAR und anderen Compilern, könnte ja beim GCC 
ähnlich sein.

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> dann ist es natürlich am besten jede Funktion in ein
> eigenes Modul zu packen.

Sowas in "virtuell" ohne Sourcecodemodifikation macht beim gcc das 
-ffunction-sections :-)

Das Problem beim gcc ist ja, dass der Linker an sich recht dumm ist und 
keine Optimierungen/Auslassungen im Code mehr machen kann. Das würde ja 
zB. relative Addressierung und die Relozierungsinfos zerstören. Er kann 
eben nur ganze Sections als eine Einheit verarbeiten. Daher der Umweg 
über die Einzelsections, wo eine Funktion mit ihren Relozierungsinfos 
für sich allein steht. Wenn der Linker die Section nicht braucht, weil 
kein Symbol daraus referenziert wird, baut er sie auch nicht in das 
Ergebnisbinary ein. Das Format muss aber der Compiler schon so 
vorsepariert anliefern.

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für Eure Antworten!

@:  Georg A.

Das heißt also, ich brauche nur den Parameter "-ffunction-sections" beim 
Compilieren angeben und alle Funktionen werden automatisch in eine 
eigene Section gepackt?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.
Aber beim Kompilieren der Lib

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Klaus Wachtler:

Alles klar, danke!

Im Moment geht es bei mir auch um die STM32 Firmware Bibliothek, und die 
liegt ja im Quellcode vor. Im Quellcode könnte man ja mit bedingter 
Compilierung arbeiten, aber ich möchte die Bibliothek nur verändern, 
falls eine Fehler enthalten ist.

Ist die C-Standardbibliothek schon entsprechend vorbereitet, oder fängt 
man sich einen Haufen unbenutzter Funktionen mit ein, wenn man diese 
benutzt? Ich verwende Codesourcery.

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich den Parameter "-ffunction-sections" benutze erhalte ich 
folgende Meldung beim Linken. Alle Funktionen außer NVIC_DeInit befinden 
sich in einer Assemblerdatei. NVIC_DeInit ist eine C-Funktion. Das 
Linkerfile ist für den ROM(Flash) geschrieben. Warum er nur durch das 
Benutzen von "-ffunction-sections" jetzt auf einmal den RAM verwendet 
ist mir nicht klar. Wenn natürlich der RAM voll ist sind die 
entsprechenden Funktionen nicht vorhanden. Ohne "-ffunction-sections" 
wird das gesamte Programm korrekt für den Flash lauffähig übersetzt.

...linking
arm-none-eabi-ld.exe: obj/main.elf section .text.NVIC_DeInit will not 
fit in region ram
arm-none-eabi-ld.exe: region ram overflowed by 33046 bytes
obj/stm32f10x_nvic.o: In function `NVIC_SETPRIMASK':
C:\Dokumente und Einstellungen\woehlb\Eigene 
Dateien\home\Projekte\eclipse_workspace\STM32/lib/src/stm32f10x_nvic.c:1 
86:  relocation truncated to fit: R_ARM_THM_CALL against symbol 
`__SETPRIMASK' defined in .text section in obj/cortexm3_macro.o
obj/stm32f10x_nvic.o: In function `NVIC_RESETPRIMASK':
C:\Dokumente und Einstellungen\woehlb\Eigene 
Dateien\home\Projekte\eclipse_workspace\STM32/lib/src/stm32f10x_nvic.c:1 
98:  relocation truncated to fit: R_ARM_THM_CALL against symbol 
`__RESETPRIMASK' defined in .text section in obj/cortexm3_macro.o
obj/stm32f10x_nvic.o: In function `NVIC_SETFAULTMASK':
C:\Dokumente und Einstellungen\woehlb\Eigene 
Dateien\home\Projekte\eclipse_workspace\STM32/lib/src/stm32f10x_nvic.c:2 
10:  relocation truncated to fit: R_ARM_THM_CALL against symbol 
`__SETFAULTMASK' defined in .text section in obj/cortexm3_macro.o
obj/stm32f10x_nvic.o: In function `NVIC_RESETFAULTMASK':
C:\Dokumente und Einstellungen\woehlb\Eigene 
Dateien\home\Projekte\eclipse_workspace\STM32/lib/src/stm32f10x_nvic.c:2 
22:  relocation truncated to fit: R_ARM_THM_CALL against symbol 
`__RESETFAULTMASK' defined in .text section in obj/cortexm3_macro.o
obj/stm32f10x_nvic.o: In function `NVIC_BASEPRICONFIG':
C:\Dokumente und Einstellungen\woehlb\Eigene 
Dateien\home\Projekte\eclipse_workspace\STM32/lib/src/stm32f10x_nvic.c:2 
39:  relocation truncated to fit: R_ARM_THM_CALL against symbol 
`__BASEPRICONFIG' defined in .text section in obj/cortexm3_macro.o
obj/stm32f10x_nvic.o: In function `NVIC_GetBASEPRI':
C:\Dokumente und Einstellungen\woehlb\Eigene 
Dateien\home\Projekte\eclipse_workspace\STM32/lib/src/stm32f10x_nvic.c:2 
51:  relocation truncated to fit: R_ARM_THM_CALL against symbol 
`__GetBASEPRI' defined in .text section in obj/cortexm3_macro.o
cs-make: *** [main.elf] Error 1

Autor: Sven Woehlbier (woehlb)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal noch mein Linkfile.

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, da müsste man mit nm/objdump mal nachschauen, in welche Sections der 
gcc jetzt den Inhalt aus main.o stecken will. Evtl. fehlt das im 
Linkerscript.

BTW: Hast du die Library-Files auch neu kompiliert?

Autor: Olaf Dreyer (Firma: O.D.I.S.) (dreyero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

so was macht strip aus den binutils. Hier ein Auszug aus der man-Page:

------------------------------------------------------------------------ 
--
GNU  strip  discards  all symbols from object files objfile.  The list 
of object files may include archives.  At least one object file must be 
given.

...

--strip-unneeded    Remove all symbols that are not needed for 
relocation processing.
------------------------------------------------------------------------ 
--

Der Aufruf für das o. g. Beispiel muss also lauten:

arm-none-eabi-strip --strip-unneeded main.elf


Gruß

Olaf

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strip teilt aber doch eine Objektdatei nicht in benötigte
Funktionen auf, sondern entfernt die Symbole (also
Debuginformationen).
Dadurch wird das Ergebis zwar auch ggf. kleiner, aber es hat
nichts damit zu tun, nur wirklich benötigte Funktionen zu
linken.

Autor: Olaf Dreyer (Firma: O.D.I.S.) (dreyero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,

wo Du recht hast, hast du recht.
Habe es mal eben nachgeprüft.

Gruß

Olaf

Autor: Arne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.