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

Android - call C function without text reallocation in x86 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 而无需文本重定位。