android - 使用静态 gnutls 库的共享库具有文本重定位

标签 android c++ android-ndk gnutls

问题:我需要将 gnutls 移植到 Android,以便在我的 Android 应用程序中使用的共享库(比如库 A)中使用。

我尝试过的:我修改了 make file对于 openconnect 为 gnutls 及其依赖项(libgmp、libnettle 和 libhogweed)生成一个 .a 静态库文件,我使用它们在我的 Android 项目中构建静态库并在共享库 A 中引用它们。代码构建和安装正常但M+ 设备我在运行时收到以下错误:

java.lang.UnsatisfiedLinkError: dlopen failed: libA.so: has text relocations

我试图在构建静态库(.a 文件)和构建 libA.so 文件时传递 -fPIC 标志,但没有成功,我总能在 libA 中看到 TEXTREL 条目.so 文件。我确定这是由于那些新的静态库,因为我之前使用 libA 没有任何问题。 我尝试的其他事情:尝试将 gnutls 构建为共享库,生成的 libA.so 现在没有文本重定位,但仍然无法在运行时加载,因为 gnutls so 文件有一个版本(例如 libgnutls.so.3.0)而 Android 有不支持版本库。

具体问题:我如何才能:1.将 gnutls 构建为没有文本重定位的静态库,或者 2. 将其构建为没有 soname 的共享库?

编辑:我看到了相同的 question在 openconnect 邮件列表中询问,但没有关于如何“首先修复 native 代码中的 TEXTREL”的明确方法。

我已经看到了像这样的文本重定位问题的其他答案 questionthis问题,但这没有帮助,因为我使用的是最新的 NDK 构建并已经传递了 PIcflags

最佳答案

您不能加载需要文本重定位的库:

Starting with API 23, shared objects must not contain text relocations. That is, the code must be loaded as is and must not be modified.

( source )

答案:

How can I build gnutls as a static library without text relocations?

-fPIC 无法阻止所有文本重定位。在某些情况下,如果您的库使用内联 asm,编译器将无法使其成为 Position Independent (PIC)。但是,如果您确定您的库可以独立于位置,那么问题可能出在您的构建配置中的某个地方。

如果不是,您应该阻止您的图书馆使用文本重定位。幸运的是,在 Gentoo Wiki 中有一个很棒的 wiki 页面解释了如何做到这一点。 .

How can I build it as a shared library with no soname?

你可以设置你的soname:gcc -shared -Wl,-soname,your_soname

关于android - 使用静态 gnutls 库的共享库具有文本重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232794/

相关文章:

opencv - opencv 的某些功能在某些特定情况下显示错误

java - Robolectric 和 Dagger 测试

android - 更改 Windows 10 中的 Android NDK 位置

android - 在不扩展 Activity 的情况下检测 Android 上的屏幕方向变化

c++ - OpenCV:findContours 异常

c++ - 从基类对象创建派生类

c++ - if else 评价

java - 如何将结构作为参数传递给 java 函数或从 jni 返回 java

android - 在 Android 上更改 "Pulse notification light"/轨迹球灯设置(仅限 Nexus One?)

Android ExpandableListView 在 ChildView 有单选 CheckBox