我正在使用arm-linux-gnueabi-gcc来为Linux中的ARM处理器编译C程序。 不过,我不确定它编译的默认ARM模式是什么。
例如,对于C代码:
test.c的
unsigned int main() { return 0x1ffff; } arm-linux-gnueabi-gcc -o test test.c
现在,当我看着用objdump反汇编main()函数时,我可以看到:
可以在Windows上运行Docker中的ARM / rpi映像,但不能运行linux
ARM汇编“retne”指令
用户应用程序是否有任何标准方式访问ARM Linux上的协处理器?
Windows 8胖二进制文件(EXE的x86和ARM)
arm-linux-gnueabi-objdump -d test <main>: push {r7} add r7,sp,#0 movw r3,#65535 ; 0xffff movt r3,#1 mov r0,r3 mov sp,r7 pop {r7} bx lr
看来这是ARM的Thumb模式的反汇编(由于推送指令)。
我如何显示反汇编如下:
.sect ".text" .global _fn _fn: MOVW A1,#65535 MOVT A1,#1 BX LR
或这个
.sect ".text" .global _fn _fn: LDR A1,CON1 BX LR .sect ".text" .align 4 CON1: .word 0x1ffff
我在这里看到这个例子:
http://e2e.ti.com/support/development_tools/compiler/f/343/t/40580.aspx
但是,我无法按照它在那里显示的方式查看反汇编。
谢谢。
交叉编译为armv5,但它创buildv7二进制文件
在ARM i.MX287上增加Linux DMA_ZONE内存
使用framebuffer错误运行JavaFX应用程序错误Cubieboard A10
为新手ARM程序员提供的资源?
在Android上安装预构build二进制文件:“not found”
推并不一定告诉你它是在拇指模式,事实上ARM的新的汇编语法称为unified assembly language ,这意味着在大多数情况下,你可以编译相同的代码到arm或thumb-2指令集。
其他问题是,你正在-O0模式编译,这增加了一些额外的指令,方便调试。 尝试-O2 ,你应该得到你想要的指令流程。
在arm-linux-gnueabi-gcc -v gcc用-v开关显示它是如何构建的,这也告诉你在编译你的源代码时使用的整个默认选项。
最后一件事情是,您提到的目标汇编序列使用ATPCS寄存器命名方案(查看objdump文档以获取信息),它使用a1而不是r0 。 您也可以通过使用-M开关在objdump设置disassembler-options来获得。 如下所示;
$ arm-linux-gnueabihf-gcc -c -O2 -o test test.c $ arm-linux-gnueabihf-objdump -M reg-names-special-atpcs -d test test: file format elf32-littlearm disassembly of section .text.startup: 00000000 <main>: 0: f64f 70ff movw a1,#65535 ; 0xffff 4: f2c0 0001 movt a1,#1 8: 4770 bx LR a: bf00 nop
另一个选择是通过使用-S开关从gcc本身获得程序集输出。 如下所示;
$ arm-linux-gnueabihf-gcc -S test.c
那么你应该在同一个文件夹中得到一个名为test.s的新文件。 但是我不知道是否有一个选项来设置寄存器命名。
我相信默认是拇指模式:
arm-linux-gnueabi-gcc -S -mthumb test.c
完整的ARM指令可以使用-marm标志生成:
arm-linux-gnueabi-gcc -S -marm test.c
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。