Forum: Compiler & IDEs Bibliotheken nur teilweise Linken


von Sven W. (woehlb)


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?

von Georg A. (Gast)


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

von Gast (Gast)


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.

von Georg A. (Gast)


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.

von Sven W. (woehlb)


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?

von Klaus W. (mfgkw)


Lesenswert?

Ja.
Aber beim Kompilieren der Lib

von Sven W. (woehlb)


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.

von Sven W. (woehlb)


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

von Sven W. (woehlb)


Angehängte Dateien:

Lesenswert?

Hier mal noch mein Linkfile.

von Georg A. (Gast)


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?

von Olaf D. (Firma: O.D.I.S.) (dreyero)


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

von Klaus W. (mfgkw)


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.

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Klaus,

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

Gruß

Olaf

von Arne (Gast)


Lesenswert?


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.