Kleinerer Code mit -mno-shared

linuxservice

Neuer User
Mitglied seit
15 Feb 2006
Beiträge
70
Punkte für Reaktionen
0
Punkte
0
Bei meinen Versuchen, die letzten paar Bytes rauszuquetschen, um noch ein Paket mehr in die Box zu kriegen, bin ich auf die Compileroption "-mno-shared" gestossen. Busybox wird damit z.B. ca. 5% kleiner, und damit genug, dass man tatsächlich auch komprimiert noch was davon merkt. Leider kann man sie nicht einfach bei den Compileroptionen im Menuconfig mit angeben, weil sie nicht für shared libraries geeignet ist, also musste ich Makefile.in ändern.

Will sich das mal jemand ansehen, der mit dem Make-System von freetz besser vertraut ist als ich? Evtl. separate Menuconfig-Punkte mit den Compileroptionen für Libs und Pakete?

http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/MIPS-Options.html#MIPS-Options:
Code:
-mshared
-mno-shared
    Generate (do not generate) code that is fully position-independent, and that can therefore be linked into shared libraries. This option only affects -mabicalls.

    All -mabicalls code has traditionally been position-independent, regardless of options like -fPIC and -fpic. However, as an extension, the GNU toolchain allows executables to use absolute accesses for locally-binding symbols. It can also use shorter GP initialization sequences and generate direct calls to locally-defined functions. This mode is selected by -mno-shared.

    -mno-shared depends on binutils 2.16 or higher and generates objects that can only be linked by the GNU linker. However, the option does not affect the ABI of the final executable; it only affects the ABI of relocatable objects. Using -mno-shared will generally make executables both smaller and quicker.

    -mshared is the default.
 
Zuletzt bearbeitet:
Für mich sieht das auf den ersten Blick doch interessant aus; ich kenne mich damit allerdings nicht sehr gut aus. Vielleicht kann einer der anderen Mod-Entwickler da mehr zu sagen?
 
Für mich sieht das auf den ersten Blick doch interessant aus; ich kenne mich damit allerdings nicht sehr gut aus. Vielleicht kann einer der anderen Mod-Entwickler da mehr zu sagen?

Das hoffe ich auch, aber es war auch Wochenende - vielleicht kommt ja die Tage noch Feedback.

Für die ungeduldigen meine quick-und-dirty Variante:

make/Makefile.in, Zeile 75 und 76:

Code:
TARGET_CONFIGURE_ENV += CFLAGS="$(TARGET_CFLAGS) -mno-shared"
TARGET_CONFIGURE_ENV += CXXFLAGS="$(TARGET_CFLAGS) -mno-shared"

make/busybox/Makefile.in, Zeile 2:
Code:
TARGET_CFLAGS+=-mno-shared

Hab die Ursprungsversionen gerade nicht mehr da, sonst würde ich einen Patch posten, aber die ersten beiden hatte ich glaube ich abgeändert und beim zweiten eingefügt.

Wie gesagt, das geht bestimmt sauberer, aber das soll jemand entscheiden, der sich damit besser auskennt als ich ;) Persönlich denke ich, das gehört in Menuconfig mit einer Option für die Compileroptionen für libs und einer für die Compileroptionen für Pakete.
 
Jetzt muss ich das doch nochmal nach vorne holen (deshalb auch kein Edit).
132 hits und nur eine Antwort? Kein Interesse (kann ich mir kaum vorstellen, wenn ich so an die bisherigen Diskussionen zum Platz sparen denke) oder zuviel anderes zu tun? Falls letzteres, mein vollstes Verständnis (kenn ich ja auch nicht anders), aber ein kurzes "ich sehs mir bei Gelegenheit mal an" wär schon nett.

Oder soll ich mich besser im trac anmelden und ein Ticket aufmachen? (dafür wollte ich eigentlich erstmal hier das Feedback abwarten)
 
Sobald jemand Zeit hat, wird er/sie sich das schon angucken, so ist das ja nun nicht. Leider aber habendieallermeisten ein Leben neben dem Freetz, was irgnedwie auch gepflegt werdne möchte.

Prinzipiell klingt das natürlich interessant, das wurde ja shcon angemerkt, und ich finde es imemr gut, wenn man Platz einsparen kann.

Aber nun mal interessehalber meinerseits: Du baust "nur" die busyboxdamit oder alles? DEnn im make/Makefile.in setzt man das doch global, wenn ich das richtig sehe,. oder ist das in dem Falle auch nur für die busybox?

Und jetzt ist es sogar eine Antwort mehr und 2 hits mehr. Ist doch was, oder?

lg

c.
 
in make/Makefile.in scheints mir global zu sein. Ich habe beim bauen der libs ein paar -mno-shared gesehen, und später kamen dann ein paar "cannot resolve symbol"-Fehler, die ohne -mno-shared nicht auftreten. Ich bin jetzt dazu übergegangen, -mno-shared in die .mk-Dateien der Pakete einzufügen, die ich auf meiner FBF haben will. Zumindest das bauen läuft damit sauber durch, und das Image wird ca. 20 kb kleiner. Ich kam aber bisher noch nicht dazu, das neue Image zu flashen, weil ich erst nächste Woche wieder in Reichweite meiner 7140 bin. Ich werds dann aber gleich mal ausprobieren.
Btw, als ich gestern Subversion neu gebaut habe, habe ich auch -mno-shared benutzt, und laufen tut es damit. Danke für den Tipp :)
 
Also, diese Option bringt bei mir bei meinem "Testimage" (keine Zeit, das zu Flashen, aber imemrhin baut es durch ohne Fehler) ca. 160KB ein. Also nciht wirklich wenig.

Vorgehensweise: Frischer Trunk ein paar ausgewählte Pakete. einmal bauen ohne die Option, einmal mit. Natürlich nach einem "make dirclean"

Ich hänge mal den Patch hier an.


@linuxservice: Du könntest auch ein Ticket im Freetz aufmachen.

LG

cinereous
 

Anhänge

  • mno-shared.patch.bz2
    310 Bytes · Aufrufe: 9
Muss man die Toolchain neu bauen oder funktioniert das auch mit der "Download-Toolchain"?

MfG Oliver
 
Das kompilieren an sich lief bei mir mit der Download-Toolchain durch oliver. Ob das Image nun läuft, weiss ich allerdings nicht, wie ich schrieb. Denn in der firma gibt es zwar entsprechende Boxen, aber eben keine, mit der ich mal eben schnell "spielne" kann :)
 
Na also, ihr lebt ja doch ;)

Habe mich jetzt ein bisschen tiefer in das Make-System eingearbeitet. Zwei prinzipielle Moeglichkeiten ohne ans Menuconfig zu gehen und neue Variablen einzuführen:

Es gibt zwei Init-Macros PKG_INIT_BIN und PKG_INIT_LIB. Ersteres wird von den Makefiles der Pakete aufgerufen (leider nicht von allen), letzteres von den Makefiles der libs (und da scheinbar von allen). Man könnte "-mno-shared" jetzt entweder in PKG_INIT_BIN dazufügen oder in PKG_INIT_LIB rausnehmen. Da es für Libraries auf keinen Fall gesetzt sein darf, habe ich mich für letzteres entschieden:

Code:
--- Makefile.in-orig    2008-04-11 14:47:38.000000000 +0200
+++ Makefile.in 2008-04-11 19:17:17.000000000 +0200
@@ -189,2 +189,3 @@
 $(PKG)_DEST_DIR:=root
+$(PKG)_CONFIGURE_ENV:=$(filter-out -mno-shared,$(TARGET_CONFIGURE_ENV))
 endef

Wer es haben will, schreibt es dann einfach im Menuconfig bei den Compiler-Optionen dazu.
 
Zuletzt bearbeitet:
Wie ich schon schrieb, wird bei mir komplett durchgebaut, auch ohne die libs in Ruhe zu lassen. Aber nun gut, dies wird sich noch heruasstellen, nicht wahr?
 
Dann hast Du vermutlich weder screen noch tcpdump drin. Da knallts schon beim Bauen, wenn ncurses bzw. pcap mit -mno-shared übersetzt sind.

Den Patch habe ich noch etwas geändert, werde den Post von vorhin gleich updaten. Ist besser, wenn configure die selben Flags sieht mit denen man wirklich compiled ;)

(edit: leider immer noch nicht ganz das gewünschte. Die Makefiles einiger Libs holen sich munter selbst noch mal $(TARGET_CFLAGS). Da hab ich grad auch keine Idee mehr, denn wenn ich es da rausnehme, kommt es nicht mehr rein...)
 
Zuletzt bearbeitet:
Die Idee hört sich gut an, auch wenn ich im Moment keine Gelegenheit zum Testen habe.

Daß diese Option nicht für die Libraries gedacht ist, ergibt sich schon fast aus der zitierten Beschreibung im ersten Beitrag.

Die Lösung, diese Option aus den Library Optionen herauszufiltern, ist natürlich nicht elegant. Vom Grundgedanken gehören solchen Optionen nach PKG_INIT_BIN. Wenn das nicht bei allen Paketen verwendet wird, sollte man nach den Gründen dafür suchen bzw. diese ändern.
Wenn ein Binary Paket auch Libraries erstellt, könnte es aber ein Problem geben.

Ich gehe davon aus, daß es auch mit der Download-Toolchain funktioniert, da nur andere Optionen beim Erstellen verwendet werden.
 
Die Lösung, diese Option aus den Library Optionen herauszufiltern, ist natürlich nicht elegant. Vom Grundgedanken gehören solchen Optionen nach PKG_INIT_BIN. Wenn das nicht bei allen Paketen verwendet wird, sollte man nach den Gründen dafür suchen bzw. diese ändern.
Wenn ein Binary Paket auch Libraries erstellt, könnte es aber ein Problem geben.

Klar. Was mir als Königsweg vorschwebt, hatte ich ja schon skizziert. Hatte nur versucht, obs mit einem minimalen Patch vielleicht auch geht. Tuts nicht ;)


Ich gehe davon aus, daß es auch mit der Download-Toolchain funktioniert, da nur andere Optionen beim Erstellen verwendet werden.

Klar. Das tut. Wenn man es schafft, dass alles richtig übersetzt wird (dafür habe ich inzwischen auch das globale config.cache rausgenommen, das sonst auch querschiesst)
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.