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:
- bestimmen, welche Symbole in den dynamisch gemeinsam genutzten Bibliotheken geladen werden tatsächlich genutzt?
- Extrahieren Sie nur diese Symbole in eine "schlanke" Kopie der Bibliothek?
Gibt es irgendwelche Werkzeuge dafür?