gpt4 book ai didi

android - 在 .so 中混合使用 c/c++ 和程序集时避免文本重定位

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:43 24 4
gpt4 key购买 nike

我正在尝试从混合了 c、c++ 和程序集的 .so 中删除所有文本重定位。对于 c/c++ -fpic 负责 PIC。

在 Android ARM 目标上,我们能够从 c/c++ 调用导出的 asm 函数,而不会导致文本重定位。但是在我们的实现中,我们有数据数组,必须可以从 C++ 和程序集访问这些数据。在 C++ 上,它是一个普通的旧数组,即 extern "C"{ __declspec(align(32)) int16_t myarray[256]; } 在 asm 方面我们使用 .global myarray

第二次我们在 asm 端使用这样的符号,我们在最终的 .so 中看到文本重定位,这是通过 scanelfreadelf 可见的。 api 模式 23 下的 Android L 加载器将拒绝加载这样的 .so。

问题:- 这个问题是预料之中的吗?- 是否在 C 或 asm 端使用一些特殊声明以确保没有文本重定位?

编辑:一个最小的例子有用吗?

最佳答案

感谢大家的评论。所以总结一下,为了其他与 Android M 战斗的人的利益,我们能够解决我们的一些问题。现在我的理解是这样的,如有错误请指正:

1) 我无法在 asm 中直接指向外部全局变量(即 ldr)而不导致文本重定位。

2) 我无法在 asm 中引用数据部分中包含的符号,即使它不是全局的,因为在汇编时从文本到数据的相对地址是未知的。为什么 .so 链接器无法在链接时解决这个问题我不确定,但我只能假设相对地址太远或者根据 PIC 的性质,数据/文本的相对地址在运行时未知(?) .

所以我们的解决方法是:

1) 预先生成数组并添加到文本部分,尽可能靠近使用它的代码(相关指令距离有限)。我们发现将表格放置在离使用它的代码太远的地方失败了。

2) 从标签加载时,使用“adr”优于“ldr”,因为它似乎可以确保您从当前部分加载并帮助我们避免一些文本重定位

幸运的是,我们的数组是静态数据,虽然是在运行时生成的,并且可以在汇编时转换为已知的常量。但是对于那些数组或内存是动态的并且必须从 C 传递到 asm 的那些,我看不出有其他选择可以将它作为参数传递给汇编代码,正如评论中几个人所建议的那样。

有用的读物​​是:ARM - Loading addresses into registers

关于android - 在 .so 中混合使用 c/c++ 和程序集时避免文本重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33510601/

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