Czy istnieje sposób na sprawdzenie bieżącej ścieżki rpath w Linuksie?
Jestem świadomy, że możliwe jest użycie readelf -d <elf> | grep RPATH
do sprawdzenia danych binarnych z powłoki, ale czy jest to możliwe w ramach procesu?
Coś w stylu (moje całkowicie zmyślone wywołanie systemowe):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Próbuję zdiagnozować jakiegoś podejrzanego, więc linkowanie problemów w naszej bazie kodowej, i chciałbym sprawdzić RPATH w ten sposób, jeśli to możliwe (wolałbym nie mieć spawn zewnętrznego skryptu).
4 answers
#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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 20:17:58
Dla przypomnienia, oto kilka poleceń, które pokażą nagłówek rpath
.
objdump -x binary-or-library |grep RPATH
Może jeszcze lepszym sposobem na to 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
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-15 02:25:12
Możesz również użyć:
chrpath -l binary-or-library
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 12:28:57
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-readelf
wyjście z elfutils
Jak:
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
To powinno działać dobrze z binutils readelf
zamiast elfutils eu-readelf
zbyt.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-30 03:27:03