Zdaję sobie sprawę, że można użyć readelf -d <elf> | grep RPATH
do sprawdzenia danego pliku binarnego z powłoki, ale czy można to zrobić w ramach procesu?
Coś takiego (moje całkowicie wymyślone wywołanie systemowe):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Próbuję zdiagnozować podejrzane problemy z łączeniem SO w naszej bazie kodu i chciałbym sprawdzić w ten sposób RPATH, jeśli to możliwe (wolałbym nie musieć tworzyć zewnętrznego skryptu).
grep PATH
zamiast tego. To zależy od linkera, czy użyjesz RPATH czy RUNPATH, i istnieją subtelne, ale ważne różnice między nimi: stackoverflow.com/a/52020177Odpowiedzi:
#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; }
źródło
/proc
jest zamontowany, rozwijanie$ORIGIN
jest tak proste, jakreadlink("/proc/self/exe", ...)
zakończenie NUL-u na ostatnim ukośniku.RPATH
, chciałbym zauważyć, że równie ważne jest sprawdzenieDT_RUNPATH
tagu, jeśli ktoś chce poznać ścieżki, z których plik binarny może ładować swoje biblioteki współdzielone.Dla przypomnienia, oto kilka poleceń, które pokażą
rpath
nagłówek.Może jeszcze lepszym sposobem na zrobienie tego jest:
Drugie polecenie wyświetla również bezpośrednie zależności od innych bibliotek, po których następuje
rpath
.źródło
Możesz także użyć:
źródło
apt-get install -y chrpath
Oto, czego używam dla wygody, jako funkcji powłoki:
To zużywa
eu-readelf
dane wyjściowe zelfutils
:i emituje
Powinien działać dobrze z binutils
readelf
zamiast z elfutilseu-readelf
.źródło