热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Linux上使用C/C++执行的程序中列出共享库

我想知道在Linux上执行CC++程序时加载了哪些动态库。例如,intmain()

我想知道在Linux上执行C / C ++程序时加载了哪些动态库。

例如,

int main()
{
...
list = GetallSharedlibraryFilePaths();
}

列表应包含:libm.so.6,librt.so.1,...
或路径:/lib/x86_64-linux-gnu/libm.so.6、/lib/x86_64-linux-gnu/librt.so.1 ...

是否有返回所有共享库文件路径的API?
我知道lddreadelf可以做到这一点,但是我需要使用加载共享库的可执行文件中的C / C ++编程来做到这一点。

谢谢。




  

在加载共享库的可执行文件中。

我相信要获取当前进程,读取/proc/self/maps文件是在Linux上获取此信息的最简单方法,并且查找最后映射到进程内存的所有唯一.so文件列,例如

55e8485f5000-55e8485fd000 r-xp 00000000 fd:01 654093 /bin/cat
55e8487fc000-55e8487fd000 r--p 00007000 fd:01 654093 /bin/cat
55e8487fd000-55e8487fe000 rw-p 00008000 fd:01 654093 /bin/cat
55e84a238000-55e84a259000 rw-p 00000000 00:00 0 [heap]
7f403d604000-7f403d8e2000 r--p 00000000 fd:01 920600 /usr/lib/locale/locale-archive
7f403d8e2000-7f403dac9000 r-xp 00000000 fd:01 1439402 /lib/x86_64-linux-gnu/libc-2.27.so
7f403dac9000-7f403dcc9000 ---p 001e7000 fd:01 1439402 /lib/x86_64-linux-gnu/libc-2.27.so
...

因此,您可以看到其中一个已加载的库是/lib/x86_64-linux-gnu/libc-2.27.so。它应该包括通过dlopen加载的内容以及直接链接的内容。

,

您可以使用proc文件系统通过/proc//maps查询共享库。查阅完整的reference for proc,其中显示了一些您可以解析的示例输出:

address perms offset dev inode pathname
...
35b1800000-35b1820000 r-xp 00000000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a20000-35b1a21000 rw-p 00020000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a21000-35b1a22000 rw-p 00000000 00:00 0
35b1c00000-35b1dac000 r-xp 00000000 08:02 135870 /usr/lib64/libc-2.15.so
35b1dac000-35b1fac000 ---p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870 /usr/lib64/libc-2.15.so

在第六列中使用唯一的路径名集,将为您提供给定进程中加载​​的所有实际共享库。

请注意,这只会为您提供在调用时在进程中处于活动状态的共享库,如果您在启动时调用它,则将获得由加载程序使用{{1 }}在ELF中的条目。如果该工具使用NEEDED,则需要再次检查列表。

请注意,如果出于安全目的执行此操作,则在您检查此列表时将已加载共享库,因此任何潜在的有害操作都可能已经发生并被掩盖。如果出于安全原因要检查共享库,则需要解析ELF dyld条目,然后从环境中使用NEEDED进行解析。

,

您可以使用非标准的 dl_iterate_phdr(3) 函数来遍历加载的共享对象列表。

#define _GNU_SOURCE
#include
#include
int print(struct dl_phdr_info *info,size_t size,void *data) {
printf("%s\n",info->dlpi_name);
return 0;
}
int main() {
dl_iterate_phdr(print,NULL);
return 0;
}

$ gcc test.c -o test
$ ./test
linux-vdso.so.1
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

推荐阅读
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • PriorityQueue源码分析
     publicbooleanhasNext(){returncursor<size||(forgetMeNot!null&am ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
author-avatar
Jolina
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有