2017-11-10 5 views
0

Ich habe eine Reihe von gemeinsam genutzten Bibliotheken (Intel MKL), die nur in binärer Form verteilt sind. Ein Top-Level „Laufzeit“ Bibliothek, libmkl_rt.so, Links gegen meine ausführbare Datei und ist sichtbar mit ldd:Unbenutzte Symbole aus dlopen() 'löschen .so

... 
libmkl_rt.so => /var/task/lib/libmkl_rt.so (0x00007f8049a1f000) 
... 

jedoch die anderen, wie libmkl_avx.so, nehme ich an dynamisch mit dlopen() geladen, wie die ausführbare Datei wirft ein Fehler, der besagt, dass die Bibliotheken fehlen, wenn sie nicht gefunden werden, aber nicht mit ldd sichtbar sind.

Diese Bibliotheken sind groß (> 100 MB) und dies ist die einzige ausführbare Datei in meinem Container, die sie verwendet. Ich gehe davon aus, dass die ausführbare Datei nicht jede der Funktionen in diesen Bibliotheken aufruft, also möchte ich sie abbauen, indem ich zuerst feststelle, welche Funktionen aufgerufen werden, und dann diese nur beibehalten.

Wie kann ich:

  1. bestimmen, welche Symbole in den dynamisch gemeinsam genutzten Bibliotheken geladen werden tatsächlich genutzt?
  2. Extrahieren Sie nur diese Symbole in eine "schlanke" Kopie der Bibliothek?

Gibt es irgendwelche Werkzeuge dafür?

Antwort

2

Ermitteln, welche Symbole in den dynamisch geladenen gemeinsam genutzten Bibliotheken tatsächlich verwendet werden?

Sie können Ihr Programm unter LD_DEBUG=bindings LD_BIND_NOW=1 laufen und sehen, welche Symbole von libmkl_avx.so gebunden waren.

Extrahieren Sie nur diese Symbole in eine "schlanke" Kopie der Bibliothek?

Leider ist dies aus den gleichen Gründen nicht möglich, warum Sie Funktionen in ausführbaren Dateien nicht neu anordnen können. Sobald der Code verknüpft ist, sind alle internen gotos und globalen Variablenstandorte fest und können nicht geändert werden. Auch das korrekte Disassemblieren von verknüpftem Code (um Funktionsgrenzen und Aufrufgraphen zu bestimmen) ist ein unlösbares Problem (Werkzeuge wie IDA verwenden Heuristiken, um sie zu lindern, aber das Problem bleibt bestehen).

Dies sollte kein großes Problem sein, da OS nur Codeseiten lädt, die tatsächlich von Ihrer Anwendung verwendet werden.

Verwandte Themen