Czy istnieje sposób sprawdzenia bieżącej ścieżki w systemie Linux?

83

Zdaję sobie sprawę, że można użyć readelf -d <elf> | grep RPATHdo 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).

Justicle
źródło
1
Pamiętaj, że podczas diagnozowania problemów z bibliotekami współdzielonymi należy również sprawdzić tag RUNPATH. Dlatego powinieneś grep PATHzamiast 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/52020177
Nicolas Capens

Odpowiedzi:

54
Zatrudniony Rosjanin
źródło
1
jest genialny, ale nie działa z $ ORIGIN. $ ORIGIN nie jest interpretowane i zwracane bez zmian przez funkcję. Czy istnieje sposób na dodanie interpretacji $ ORIGIN?
Jérôme
5
@ Jérôme Jeśli wykonujesz w środowisku, w którym /procjest zamontowany, rozwijanie $ORIGINjest tak proste, jak readlink("/proc/self/exe", ...)zakończenie NUL-u na ostatnim ukośniku.
Zatrudniony w Rosjaninie
Chociaż pytanie dotyczyło konkretnie RPATH, chciałbym zauważyć, że równie ważne jest sprawdzenie DT_RUNPATHtagu, jeśli ktoś chce poznać ścieżki, z których plik binarny może ładować swoje biblioteki współdzielone.
Nicolas Capens
155

Dla przypomnienia, oto kilka poleceń, które pokażą rpathnagłówek.

objdump -x binary-or-library |grep RPATH

Może jeszcze lepszym sposobem na zrobienie tego jest:

readelf -d binary-or-library |head -20

Drugie polecenie wyświetla również bezpośrednie zależności od innych bibliotek, po których następuje rpath.

Michael Dillon
źródło
7
Na Ubuntu 15.04 muszę użyć: objdump -x binary-or-library | grep RUNPATH
Andreas Roth
11
Ta odpowiedź nie ma nic wspólnego z zadanym pytaniem (i jest zawarta w samym pytaniu).
Zatrudniony w Rosji
12

Możesz także użyć:

chrpath -l binary-or-library
Oscar Andreasson
źródło
Na ubuntu:apt-get install -y chrpath
Toby Brull
1

Oto, czego używam dla wygody, jako funkcji powłoki:

function getrpath {
    eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}

To zużywa eu-readelfdane wyjściowe z elfutils:

Type              Value
NEEDED            Shared library: [libpq.so.5]
NEEDED            Shared library: [libc.so.6]
RUNPATH           Library runpath: [/some/path/to/lib]
....

i emituje

 /some/path/to/lib

Powinien działać dobrze z binutils readelfzamiast z elfutils eu-readelf.

Craig Ringer
źródło