微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

arm-linux-gnueabi编译器选项

我正在使用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] 举报,一经查实,本站将立刻删除。

相关推荐