从C,GCC(裸机)调用ARM组件

sin*_*yma 7 gcc arm qemu thumb armv6

我试图在ARM中使用GCC进行一些裸机编程并在QEMU上进行测试.每当我从C调用ARM标签时,我的程序就会挂起.我有一个简单的代码示例,在https://gist.github.com/1654392上显示问题- 当我在该代码中调用activate()时,它会挂起.

我用objdump观察到当我从汇编到C代码(从_start开始)执行bl时,它生成一个小包装器,切换到拇指指令.看起来C代码都是用拇指指令生成的,但我的所有程序集都是用ARM(32位)指令生成的.我无法弄清楚为什么会这样或如何解决它.

小智 5

为了从C中定义的THUMB模式函数调用程序集中定义的ARM模式函数,您需要在程序集中将符号定义为函数,而工具(Linaro gcc)将生成blx指令而不是bl.

例:

@ Here, we suppose that this part of code is inside of .code 32

.type fn, %function

fn:
   mov  pc, lr
Run Code Online (Sandbox Code Playgroud)