激发手臂皮质上带有GCC的_aeabi_fxxx函数的长时间调用

激发手臂皮质上带有GCC的_aeabi_fxxx函数的长时间调用,c,gcc,assembly,arm,C,Gcc,Assembly,Arm,我试图从foo.c文件中引发对_aeabi_fmul函数的长时间调用。 我没有使用libgcc,在链接过程中,我传递的是一个地址为uuu aeabi_fmul的符号文件 在foo.c中,我可以看到编译器将调用组装到指令中: BL address_of_aeabi_function 这很好,但我想引发一个长调用,其中函数的32位地址将位于.get部分,编译器将使用32位寄存器执行BL,从而执行长调用 我可以使用以下属性对自己的函数进行长时间调用: float my_func(float) __a

我试图从foo.c文件中引发对_aeabi_fmul函数的长时间调用。 我没有使用libgcc,在链接过程中,我传递的是一个地址为uuu aeabi_fmul的符号文件

在foo.c中,我可以看到编译器将调用组装到指令中:

BL address_of_aeabi_function
这很好,但我想引发一个长调用,其中函数的32位地址将位于.get部分,编译器将使用32位寄存器执行BL,从而执行长调用

我可以使用以下属性对自己的函数进行长时间调用:

float my_func(float) __attribute__((long_call));
但是

不起作用

如果我在编译器标志中指定了-mlong调用,我还能够激发对_aeabi_fmul的长调用
但是如果我这样做,所有函数都会使用长调用,这不是我想要的。

只是澄清一下,如果调用
\uuuu aeabi\ufmul(a,b)
,你会得到链接器错误吗?或者这是可行的,但是你想在有浮点乘法的时候隐式地使用长调用?实际上显式调用_aeabi_fmul(a,b)是可行的,它也会引发长调用!但是,当我在代码中使用*并且编译器发出对uuu aeabi_fmul(a,b)的调用时,它就不是了。。在这种情况下,它似乎忽略了“长通话”attribute@BubbleBobble我想这是因为通过调用该函数来实现
*
是一个独立于您声明的任何函数的实现细节。@fuz是的,可能就是这样,编译器没有打印任何类似的警告“警告:函数_aeabi_fmul的隐式声明”,因此它确实可以从内部某处找到定义(?)因此,没有办法覆盖该定义,不管它是什么?@BubbleBobble我想这个实现细节没有像普通函数调用那样处理,因此无法以任何方式覆盖或更改。您可能需要查看编译器源代码才能确定。如果您调用
\uAEABI\uFMUL(a,b),只需澄清一下
,你会得到一个链接器错误?或者这是可行的,但你希望在有浮点乘法时隐式使用长调用?实际上显式调用uu aeabi_fmul(a,b)是可行的,它也会引发长调用!但是,当我在代码中使用*时,编译器发出对u aeabi_fmul(a,b)的调用时,情况并非如此…在这种情况下,它似乎忽略了“长通话”attribute@BubbleBobble我想这是因为通过调用该函数来实现
*
是一个独立于您声明的任何函数的实现细节。@fuz是的,可能是这样,编译器没有打印任何类似于警告:函数_aeabi_fmul“的隐式声明,因此它确实从内部某处找到定义(?)因此,无论定义是什么,都无法覆盖该定义?@BubbleBobble我认为此实现细节的处理方式与普通函数调用不同,因此无法以任何方式覆盖或更改。您可能需要查看编译器源代码才能确定。
float __aeabi_fmul(float, float) __attribute__((long_call));