【发布时间】:2012-02-15 23:12:05
【问题描述】:
我正在尝试使用 GCC 在 ARM 中进行一些裸机编程并在 QEMU 上进行测试。每当我从 C 调用 ARM 标签时,我的程序就会挂起。我有一个简单的代码示例,在https://gist.github.com/1654392 处显示了问题——当我在该代码中调用 activate() 时,它挂起。
我使用 objdump 观察到,当我从汇编代码到 C 代码(从 _start 开始)执行 bl 时,它会生成一个切换到拇指指令的小包装器。似乎 C 代码都是在拇指指令中生成的,但我所有的程序集都是在 ARM(32 位)指令中生成的。我不知道为什么会这样或如何解决它。
【问题讨论】:
-
kernel.o:(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr1' make: *** [kernel.elf] Error 1
-
您是否正在尝试构建一个 arm linux 应用程序?还是嵌入式(无操作系统)应用程序?如果是 linux 应用程序,那么您不需要启动代码,工具链应该为您完成所有这些,您担心 main() 作为您的入口点。
-
你能提供一些你感到困惑的地方的汇编转储吗?
-
使用 codesourcery 的 (lite) 工具链(现在是指导图形)我没有看到任何拇指代码,它正在生成 32 位臂代码。 armv6 确实支持拇指模式。
-
看来,Ubuntu的gcc ARM交叉编译器默认生成thumb。我不确定是否有办法使用它,但我终于找到了 -marm 选项,并使用它摆脱了所有 thumb 指令输出。下一个问题:)