Is there a way to inspect the current rpath on Lin

2019-01-10 06:52发布

I'm aware that it is possible to use readelf -d <elf> | grep RPATH to inspect a given binary from the shell, but is it possible to do this within a process?

Something like (my completely made up system call):

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);

I'm trying to diagnose some suspect SO linking issues in our codebase, and would like to inspect the RPATH this way if possible (I'd rather not have to spawn an external script).

标签: linux rpath
4条回答
何必那么认真
2楼-- · 2019-01-10 07:30

For the record, here are a couple of commands that will show the rpath header.

objdump -x binary-or-library |grep RPATH

Maybe an even better way to do it is the following:

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

The second command also lists the direct dependencies on other libraries followed by rpath.

查看更多
地球回转人心会变
3楼-- · 2019-01-10 07:32
#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;
}
查看更多
霸刀☆藐视天下
4楼-- · 2019-01-10 07:32

maybe you can use code from github.com/NixOS/patchelf but AFAIK it is not a library ATM.

查看更多
Ridiculous、
5楼-- · 2019-01-10 07:32

You can also use:

chrpath -l binary-or-library
查看更多
登录 后发表回答