Wenn ich --strip-debug
oder --strip-unneeded
mache, habe ich die .ko
, die alle Funktionsnamen mit nm
auflistet, wenn ich nur strip foo.ko
habe Ich habe ein Kernel-Modul, das das Laden verweigert.
Kennt jemand eine schnelle Verknüpfung, um alle Symbole zu entfernen, die nicht zum Laden von Modulen benötigt werden, so dass die APIs nicht so einfach zurückentwickelt werden können?
PS: Für alle Open Source-Missionare bigots ; Dies ist etwas, das die Öffentlichkeit in keinem Fall verwenden wird, also keine Notwendigkeit, die Frage in einen GPL-Flammenkrieg zu verwandeln.
Ohne Antwort auf meine vorherigen Fragen, hier sind einige Vermutungen, die auch ein paar Hinweise sein könnten, und ein Schritt zu einer Antwort:
Soweit ich mich erinnere, ist ein .ko nichts anderes als eine .o-Datei, die aus der Zusammenführung aller von Ihrem Quellmodul erzeugten .o-Dateien und dem Hinzufügen eines .modinfo-Abschnitts resultiert. Am Ende jedes Makefile-Builds von .ko gibt es einen LD-Aufruf: Soweit ich mich erinnere, wird ld mit der Option -r aufgerufen, und das erzeugt die .o-Datei, die das Makefile eine .ko aufruft. Diese resultierende Datei ist nicht mit einer Archiv- oder Objektbibliothek (.a-Datei) zu verwechseln, sondern nur ein Format, das mehrere .o-Dateien als eine archiviert / verpackt: Ein zusammengeführtes Objekt ist das Ergebnis einer Verknüpfung, die noch eine andere .o erzeugt Modul: Aber in dem resultierenden Modul waren alle Abschnitte, die zusammengeführt werden konnten, und alle öffentlichen / externen Paare, die aufgelöst werden konnten, befanden sich innerhalb dieser Abschnitte. Also nehme ich an, dass Sie Ihre .ko-Datei mit all Ihren "lokalen" externen Definitionen haben:
Diejenigen, die extern sind, weil sie werden verwendet, um über die .o Module in Ihrem .ko (aber nicht benötigt mehr, da sie nicht sind soll von draußen angerufen werden die .ko) und
diejenigen, die das .ko-Modul tun muss richtig mit dem Lader kommunizieren und Kernel.
Ersteres wurde höchstwahrscheinlich bereits von ld während der Zusammenführung gelöst, aber ich kann nicht wissen, ob Sie beabsichtigen, sie auch außerhalb von .ko aufrufen zu lassen.
Also sind die äußeren Symbole, die Sie sehen, diejenigen, die für jede Ihrer .o-Dateien extern sind, aber für das resultierende .ko nicht als extern benötigt werden. Und was Sie suchen, ist eine Möglichkeit, nur diese zu entfernen.
Beschreibt dieser letzte Absatz die Symbole, die Sie loswerden wollen?
Ich denke, das ist genau das, was wir sind hier reden.
OK, dann sieht es so aus, als ob eine Lösung darin besteht, die überflüssigen Symbole "manuell" zu entfernen. Das Dienstprogramm "strip" scheint es zu ermöglichen, Symbole einzeln zu entfernen (oder zu behalten), also müssten Sie einen - strip-all und einen kleinen Strauß - keep-symbol = verwenden Beachten Sie, dass auch - Platzhalter helfen kann. Sie können natürlich das Gegenteil tun, alles behalten und einzeln abziehen, je nachdem was am bequemsten ist.
Ein guter Anfang könnte sein, alle Symbole zu entfernen, die Sie explizit in Ihrem Modul für das Modul-übergreifende Verknüpfen definiert haben und nicht erscheinen wollen - nur die offensichtlichen nützlichen, Dinge wie init und verlassen. Und diejenigen nicht zu berühren, die von der Kernel-Dev-Software-Infrastruktur erzeugt wurden oder gehören. Dann Versuch und Irrtum, bis Sie das richtige Rezept gefunden haben ... Tatsächlich würde ich denken, dass all Ihre eigenen Symbole entfernbar sein könnten, abgesehen von denen, die Sie explizit als EXPORT_SYMBOL definiert haben (und init / exit natürlich). p>
Viel Glück! :)
PS:
Tatsächlich scheint die erforderliche Quellinformation in allen .ko-Projekten vorhanden zu sein, um das erforderliche Stripping automatisch durchzuführen: Wenn ich etwas nicht vermisse, scheint es, dass alles, was nicht EXPORT_SYMBOL ist oder explizit von der Build-Software eingefügt wurde, theoretisch sein könnte standardmäßig am Ende der "ld -r" -Zeit entfernt, die einen .ko-Build beendet. Es ist nur, dass ich nicht denke, dass die Toolchain (Compiler / Linker) Provision / Direktiven / Optionen haben, um "strip or keep" -Symmen für den relozierbaren Link / Merge individuell zu bestimmen. Andernfalls könnten einige Änderungen im EXPORT_SYMBOL-Makro und an einigen anderen Stellen wahrscheinlich das gewünschte Ergebnis erzielen und einige Bytes aus den meisten .ko-Dateien in jedem Linux-System rasieren.
Ich habe gerade einen Kernel gebaut, ohne zu wissen, dass die Debugging-Symbole in der Kernel-Konfiguration aktiviert waren, daher war die Größe der resultierenden Module ziemlich groß. Das hat für mich funktioniert:
%Vor% Finde alle Dateien in /lib/modules/3.1.0
named *.ko
und führe strip --strip-debug
für jede von ihnen aus.
Ich bin mir nicht sicher, ob ich verstehe, was das Problem wirklich ist: Bei der Entwicklung einer .ko, wenn ich nicht explizit etwas hinzufügen wie
%Vor%in mein Makefile, ich bekomme kein Symbol, außer für diejenigen, die ich veröffentliche oder externe Referenzen habe. Ich bin mir sicher, dass ich aus mehreren guten Gründen keine anderen Symbole bekomme:
Ich bin also ein bisschen verwirrt über deine Frage, wirklich? ... Was sind das für Symbole, die du in deinem .ko siehst (und nicht willst)? Wie sind sie in Ihrer Quelldatei deklariert? In welchen ELF-Sektionen enden sie? Und (sorry, dumme Frage voraus): Haben Sie alle Dinge statisch definiert, die nicht außerhalb ihres eigenen Moduls gesehen werden mussten?
Zusätzlich zu filofel's Post:
Der Grund dafür, dass Benutzerbibliotheken freigegebener Bibliotheken nicht mehr funktionieren, liegt darin, dass sich ihre exportierten Symbole im Abschnitt .dynsym
befinden, der nie entfernt wird. .ko
Dateien verwenden jedoch nicht dynsym.
strip -g XXX.
Mein vorheriges Problem, wie das, was Ihnen passiert ist, wird von diesem Befehl im eingebetteten Gerät mit Linux Kernel 3.0.8
übernommen.
Tags und Links linux-kernel kernel-module strip