又见坑爹问题,32位系统下,函数指针调用

如题,一个函数,在64位系统下没啥问题。现在做32位兼容出现坑爹问题了。
在32系统下调用函数是分thumb和arm的,分别使用blx和bl调用进行切换。

现在问题是我的函数是arm的,我使用函数指针调用该函数,但是xcode编译之后,指针函数调用使用blx调用,就是从arm切换到thumb指令执行我的函数,导致运行错误。
我想有什么办法可以强制指定我的函数指针是arm指令函数那?
int * (*fun_A)( const char * name, void ** address) = GetFunAdr();
fun_A(“hello”,&b);
这里到fun_A调用就出错了,汇编代码是blx fun_A

1 个赞

呃 直接写汇编然后打上注释

汇编32位下如何调用函数指针?bl r3这种报错

我咋感觉不是Thumb指令的问题,GetFunAdr()返回的函数地址对么?汇编的话可以先编译个.s看下或者试试bl _fun_A@PAGEOFF,我一般只写arm64的汇编,32位的都偷懒不写了:grin:

绝对不是blx这个问题.
报的什么错误?

地址是对的,我动态跟踪确定过的是我想调用的函数。只不过这个函数第一句是
movw r2, #0xc222, blx调用这个函数,第一句的汇编指令就出错了

dlsym获取函数指针的吗,用户层面你应该不用管 arm和thumb模式,这是编译器的事。

不是dlsym,是直接在加载的image中得到系统函数指针。

報這個錯誤Thread 1: signal SIGSYS
或者Thread 1: EXC_BAD_ACCESS (code=1, address=0xfb283034),不同函數錯誤不同

:smiley:你单步调试一下呗,查看地址内容

blx会根据目标地址是奇数还是偶数自动切换到thumb或arm.这个问题可能是GetFunAdr()返回的地址跟目标指令集不匹配导致的,比如目标函数是thumb,但是你返回了一个偶数地址。

哎,我手贱了,看奇数以为需要对齐那