jjzjj

android app调用so 报错 dlopen failed: library “libnativehelper.so“ not found解决办法

一、问题现象androidNDK开发过程中,APP调用so库出现如下问题二、问题原因主要原因是google在N上对.so库的加载进行了限制,限制了so库指从部分指定的路径进行加载,不在这个路径的so提示 java.lang.UnsatisfiedLinkError:dlopenfailed:library“xxx.so”notfound或 java.lang.UnsatisfiedLinkError:dlopenfailed:library“/vendor/lib64/xxx.so”neededordlopenedby“/system/lib64/libnativeloader.so”isno

c - -rdynamic 仅用于选择符号?

场景:可执行文件在运行时通过dlopen加载共享对象。共享对象引用了一些实际编译到主可执行文件中的符号(函数)。如果我在链接可执行文件时将-rdynamic添加到gcc,则效果很好。-rdynamic导出可执行文件的所有非静态符号。我的共享对象只需要选定的几个。问题:有没有办法实现-rdynamic的效果,但限制了我知道我的共享对象需要的几个选择符号?编辑:至少有两个人误解了这个问题,所以我试着澄清一下:这个问题是关于从主可执行文件中导出一个符号。这个问题不是关于从动态库导出符号。这是一个最小的例子:func.h,公共(public)头文件#includevoidfunc(void);

c - -rdynamic 仅用于选择符号?

场景:可执行文件在运行时通过dlopen加载共享对象。共享对象引用了一些实际编译到主可执行文件中的符号(函数)。如果我在链接可执行文件时将-rdynamic添加到gcc,则效果很好。-rdynamic导出可执行文件的所有非静态符号。我的共享对象只需要选定的几个。问题:有没有办法实现-rdynamic的效果,但限制了我知道我的共享对象需要的几个选择符号?编辑:至少有两个人误解了这个问题,所以我试着澄清一下:这个问题是关于从主可执行文件中导出一个符号。这个问题不是关于从动态库导出符号。这是一个最小的例子:func.h,公共(public)头文件#includevoidfunc(void);

linux - 在运行时加载 Linux 库

我认为Linux的一个主要设计缺陷是在以二进制而非源代码形式分发程序时的共享对象hell。这是我的具体问题:我想以ELF二进制形式发布一个Linux程序,该程序应在尽可能多的发行版上运行,以便我的强制依赖性尽可能低:在任何情况下唯一需要的库是libpthread,libX11、librt和libm(当然还有glibc)。当我使用gcc构建我的程序时,我正在动态链接这些库。但是,我的程序也可以选择支持ALSA(声音接口(interface))、Xcursor、Xfixes和Xxf86vm扩展以及GTK。但是只有当它们在用户的系统上可用时才应该使用这些,否则我的程序应该仍然运行但功能有限。

linux - 在运行时加载 Linux 库

我认为Linux的一个主要设计缺陷是在以二进制而非源代码形式分发程序时的共享对象hell。这是我的具体问题:我想以ELF二进制形式发布一个Linux程序,该程序应在尽可能多的发行版上运行,以便我的强制依赖性尽可能低:在任何情况下唯一需要的库是libpthread,libX11、librt和libm(当然还有glibc)。当我使用gcc构建我的程序时,我正在动态链接这些库。但是,我的程序也可以选择支持ALSA(声音接口(interface))、Xcursor、Xfixes和Xxf86vm扩展以及GTK。但是只有当它们在用户的系统上可用时才应该使用这些,否则我的程序应该仍然运行但功能有限。

linux - 使用文件描述符调用 dlopen?

我想打开一个共享对象作为数据文件并对其执行验证检查。验证是签名检查,我在共享对象上签名。如果验证成功,我想加载当前打开的共享对象作为一个合适的共享对象。第一个问题:是否可以在签名检查期间调用dlopen并将共享对象作为数据文件加载,从而不执行代码?根据手册页,我不这么认为,因为我没有看到类似于RTLD_DATA的标志。因为我将共享对象作为数据文件打开,所以我有可用的描述符。验证成功后,我想将描述符传递给dlopen,以便动态加载程序正确加载共享对象。我不想关闭文件然后通过dlopen重新打开它,因为它可能会引入竞争条件(验证的文件与打开和执行的文件不同)。第二个问题:如何使用文件描述符

linux - 使用文件描述符调用 dlopen?

我想打开一个共享对象作为数据文件并对其执行验证检查。验证是签名检查,我在共享对象上签名。如果验证成功,我想加载当前打开的共享对象作为一个合适的共享对象。第一个问题:是否可以在签名检查期间调用dlopen并将共享对象作为数据文件加载,从而不执行代码?根据手册页,我不这么认为,因为我没有看到类似于RTLD_DATA的标志。因为我将共享对象作为数据文件打开,所以我有可用的描述符。验证成功后,我想将描述符传递给dlopen,以便动态加载程序正确加载共享对象。我不想关闭文件然后通过dlopen重新打开它,因为它可能会引入竞争条件(验证的文件与打开和执行的文件不同)。第二个问题:如何使用文件描述符

c - 当 dlopen one 时,它​​的符号没有被主符号覆盖,为什么?

libp2.c#includevoidpixman(){printf("pixmaninlibp1\n");}libc2.c#includevoidpixman();voidcairo(){printf("cairo2\n");pixman();}ma​​in.c#include#includevoidpixman(){printf("pixmaninmain\n");}intmain(){pixman();void*handle=NULL;void(*callfun)();handle=dlopen("/home/zpeng/test/so_test/libc2.so",RTLD_L

c - 当 dlopen one 时,它​​的符号没有被主符号覆盖,为什么?

libp2.c#includevoidpixman(){printf("pixmaninlibp1\n");}libc2.c#includevoidpixman();voidcairo(){printf("cairo2\n");pixman();}ma​​in.c#include#includevoidpixman(){printf("pixmaninmain\n");}intmain(){pixman();void*handle=NULL;void(*callfun)();handle=dlopen("/home/zpeng/test/so_test/libc2.so",RTLD_L

c - dlopen:是否可以捕获未解析的符号, "manually"在它们发生时解析它们?

是否可以在未解析的符号引用发生时捕获它们,以便调用一个函数来尝试根据需要解析符号?或者是否可以在运行时向动态符号表添加新符号而不创建库文件并打开它?我在GNU/Linux上,使用GCC。(对其他Unix的可移植性会很好,但这不是关键问题。)提前致谢!编辑:我应该更详细地说明我正在尝试做什么。我想为一种编程语言编写一个解释器,它应该支持编译的(dlopen'ed)和解释的模块。我希望从已编译模块调用在别处定义的函数由链接器解析,以避免在每次调用时查找函数,但对解释代码的调用将无法解析。我想捕获这些调用,以便我可以在需要时调用适当的解释函数(或者如果该函数不存在则发出错误信号)。