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?
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 ;-)
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.
> 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.
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?
@ 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.
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
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?
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
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.
Hallo Klaus, wo Du recht hast, hast du recht. Habe es mal eben nachgeprüft. Gruß Olaf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.