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).

 83
Author: Piotr Dobrogost, 2010-05-14

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;
}
 54
Author: Employed Russian,
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.

 154
Author: Michael Dillon,
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
 12
Author: Oscar Andreasson,
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.
 1
Author: Craig Ringer,
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