Android - 在 x86 汇编程序中调用 C 函数而不重新分配文本

标签 android assembly android-ndk x86 gnu-assembler

gas 中函数的定义附加在文本部分的末尾。例如,这定义了函数 foo:

.text
.globl foo
foo:
   <foo body>

一切正常,在您想要在 asm 函数体内调用 C 函数之前。添加 call 指令(使用 x86 汇编程序)导致 warning: shared library text segment is not shareable 当由 Android NDK 编译时由于文本重新分配(你可以用它们编译库,但 API 小于 23)

我在汇编程序方面不是很有经验,所以我的问题是:我能否以某种方式从 asm 函数调用 C 函数而不进行文本重新分配?也许我可以将函数定义移到另一部分(如果可能),或者替换 call

我正在使用 x86 汇编器和 gas 语法

最佳答案

@fuz 的回答(使用call foo@PLT)是正确的,但这个解决方案应该只应用于导出或外部函数。如果您直接在库的代码外部调用汇编函数(因为其他库在其 GOT 中没有关于此函数的信息),则将 PLT 用于本地函数(具有默认可见性)以崩溃告终。

对于本地函数解决方案更简单 - 只需用 __attribute__((visibility("hidden"))) 标记它们。这允许编译 call foo 而无需文本重定位。

关于Android - 在 x86 汇编程序中调用 C 函数而不重新分配文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584475/

相关文章:

android - Google Map API 使线条在弯曲时更平滑

android - 如何使用删除触发器删除同一个表中的行?

Android 文件选择器不从 Android Webview 调用

android - 替换android apk中的.so文件

android - 如何通过 NDK 访问 Android Lollipop DocumentFile 文件?

android - 如何按百分比显示进度条状态

c - STM32 相同的 while 循环代码但编译为不同的汇编代码

assembly - Z80 指令寄存器大小

assembly - 计算 DW 数组中等于 1 的元素个数

android - 使用 ndk 在 Android 上将耗时报告为 0ns