我知道可以使用readelf -d <elf> | grep RPATH从shell中判断给定的二进制文件,但是否可以在一个进程中执行此操作?

比如(我完全虚构的系统调用):

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

我正在try 诊断代码库中一些可疑的SO链接问题,如果可能的话,我希望以这种方式判断RPATH(我不希望生成外部脚本).

推荐答案

#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;
}

Linux相关问答推荐

线程创建会在 Linux 中触发页面错误吗?它与软脏 PTE 有什么关系?

如何在充满 csv 的目录中获得不同的值计数

sed:用空格替换

中的换行符

构建 python 映像时 Docker compose 问题,访问被拒绝或存储库不存在

将文件的一部分插入到另一个文件的特定位置

根据其他列的值创建一个新列

为什么 fork() 在 setsid() 之前

如何计算制表符分隔的文本文件中字段的唯一值的数量?

如何使用不同的出口 IP 一次运行多个 Tor 进程?

更改核心转储的位置

使用 cmake 构建错误:找不到 -lpthreads

让 sudo 和 nohup 一起工作

如何从命令行打开 Ubuntu Linux 上的 AVD 管理器?

如何查看安装的 pip 包大小?

C ++中套接字上的协议缓冲区

Monit 守护程序 - 连接到 monit 守护程序时出错

Colored shell 脚本输出库

在 Linux 中,名称与正则表达式匹配的文件的磁盘使用情况?

如何在 sed 中指定非捕获组?

如何用逗号而不是空格分割列表