gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:56:30 28 4
gpt4 key购买 nike

问题:我需要将 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com