我熟悉使用dlopen()来检查共享库是否已被加载到一个进程使用先前调用dlopen()而不触发负载,如果它不存在,如下所示:
void* lib = dlopen(lib_name,RTLD_NOLOAD); if (lib != NULL) { ... }
我最近试图应用相同的模式来确定是否有less数共享库中的一个已经使用LD_PRELOAD加载到进程空间中。 然而,在所有情况下,上面提到的dlopen()调用都返回NULL 。
所以基本上,如果我使用这个命令行启动进程
LD_PRELOAD=libawesome.so ./mycoolprocess
然后在mycoolprocess.c中的代码中运行以下检查
C ++符号在共享对象中具有不同的大小
如何列出c / c ++静态库的依赖关系?
ldd输出的说明
void* has_awesome = dlopen("libawesome.so",RTLD_NOLOAD); if (has_awesome != NULL) { printf("libawesome is availablen"); }
无论共享库是否使用LD_PRELOAD加载,对dlopen()的调用总是返回NULL 。 基于Andrew Henle的下面的评论,我也试着用重载共享对象之一的绝对path调用dlopen ,但在这种情况下, dlopen仍然返回NULL,尽pipe共享对象被预加载。
所以我的问题是双重的:
上述模式是否适用于使用LD_PRELOAD加载的库?
是否有另一种方法让stream程确定是否已经预装了特定的共享库?
如何编译以避免共享库错误?
用soname插入共享对象的一部分
在Linux上是否有一个.def文件用于控制共享库中的导出函数名称?
符号查找错误:./executableName:undefined symbol:_ZN18QXmlDefaultHandlerC2Ev
不,是,是,分别。
dlopen()和LD_PRELOAD技巧,尽管它们都处理共享库,但它们的运行方式根本不同。
LD_PRELOAD环境变量由动态链接器/加载程序(ld-linux.so)处理,并影响可执行二进制文件中重定位记录的解析度。 简而言之,在代码中调用动态库中定义的函数的每一点,链接器(构建时)都会插入一个占位符,以便跳转到内存地址。 在运行时,这些占位符被基于加载到内存中的共享库的真实地址所取代,这些共享库本身被命名为可执行文件,但是如果使用LD_PRELOAD,则可能会覆盖它们。
所以一旦可执行文件被加载到内存中,并且所有的占位符都被填充了真实的地址,就没有简单的(或者便携的)方式来告诉哪里来的是哪里。 然而…
你可以检查正在运行的进程的内存映射。 在Linux上,这意味着解析/ proc / <pid> / maps。 文件内容是不言而喻的,所以随便挑一个,看看。
不知道如何在其他系统上做,但我相信大多数现代unixen有一个/ proc文件系统的某种。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。