Ich bin mir bewusst, dass es möglich ist, readelf -d <elf> | grep RPATH
eine bestimmte Binärdatei von der Shell aus zu untersuchen, aber ist es möglich, dies innerhalb eines Prozesses zu tun?
So etwas wie (mein komplett erfundener Systemaufruf):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Ich versuche, einige verdächtige SO-Verknüpfungsprobleme in unserer Codebasis zu diagnostizieren, und möchte den RPATH nach Möglichkeit auf diese Weise überprüfen (ich möchte lieber kein externes Skript erstellen).
grep PATH
stattdessen. Es liegt am Linker, ob RPATH oder RUNPATH verwendet wird, und es gibt subtile, aber wichtige Unterschiede zwischen den beiden: stackoverflow.com/a/52020177Antworten:
#include <stdio.h> #include <elf.h> #include <link.h> int main() { const ElfW(Dyn) *dyn = _DYNAMIC; const ElfW(Dyn) *rpath = NULL; const char *strtab = NULL; for (; dyn->d_tag != DT_NULL; ++dyn) { if (dyn->d_tag == DT_RPATH) { rpath = dyn; } else if (dyn->d_tag == DT_STRTAB) { strtab = (const char *)dyn->d_un.d_val; } } if (strtab != NULL && rpath != NULL) { printf("RPATH: %s\n", strtab + rpath->d_un.d_val); } return 0; }
quelle
/proc
gemountet ist, ist das Erweitern$ORIGIN
so einfach wie dasreadlink("/proc/self/exe", ...)
NUL-Beenden beim letzten Schrägstrich.RPATH
, möchte ich darauf hinweisen, dass es ebenso wichtig ist, dasDT_RUNPATH
Tag zu überprüfen, wenn man wissen möchte, aus welchen Pfaden eine Binärdatei ihre gemeinsam genutzten Bibliotheken laden könnte.Für die Aufzeichnung sind hier einige Befehle, die den
rpath
Header anzeigen.Vielleicht ist der folgende Weg noch besser:
Der zweite Befehl listet auch die direkten Abhängigkeiten von anderen Bibliotheken auf, gefolgt von
rpath
.quelle
Sie können auch verwenden:
quelle
apt-get install -y chrpath
Folgendes verwende ich der Einfachheit halber als Shell-Funktion:
Dies verbraucht
eu-readelf
Ausgabe vonelfutils
wie:und emittiert
Es sollte auch mit Binutils
readelf
anstelle von Elfutils gut funktioniereneu-readelf
.quelle