【问题标题】:arm-linux-gnueabi compiler optionsarm-linux-gnueabi 编译器选项
【发布时间】:2013-08-20 06:09:21
【问题描述】:

我正在使用 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() 函数的反汇编时,我可以看到:

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模式的反汇编(因为push指令)。

如何显示反汇编如下:

      .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

但是,我无法查看反汇编的显示方式。

谢谢。

【问题讨论】:

    标签: linux gcc arm objdump


    【解决方案1】:

    push 不一定告诉您它处于拇指模式,实际上 ARM 的新汇编语法称为 unified assembly language 这意味着在大多数情况下您可以将相同的代码编译为 armthumb-2 指令集.

    另一个问题是,您正在-O0 模式下编译,它添加了一些额外的指令以便于调试。试试-O2,你应该会得到你想要的指令流。

    gcc-v 开关如arm-linux-gnueabi-gcc -v 中的arm-linux-gnueabi-gcc -v 应该向您展示它是如何构建的,它还告诉您它在编译源代码时使用的整体默认选项。

    最后一件事,您提到的目标汇编序列使用ATPCS 寄存器命名方案(有关信息,请查看objdump doc),例如它使用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 的新文件。但是我不知道您是否可以设置寄存器命名。

    【讨论】:

    • 谢谢 :) 我明白了。另外,你注意到我上面提到的第二个反汇编例子了吗?在这种情况下,不是移动寄存器 A1 中的值,而是从常量 CON1 中加载值。此外,反汇编中没有提到不同的关键字,如 .global、.align、.word。
    • 我更新了答案以添加另一种生成程序集的方式,您可以在其中播放以获取与您共享的示例类似的输出。另一件事是,您没有注意到他们提到了 TI 的 C/C++ 编译器。他们可能从那个编译器得到了汇编输出。
    【解决方案2】:

    我相信默认是拇指模式:

    arm-linux-gnueabi-gcc -S -mthumb test.c
    

    可以使用 -marm 标志生成完整的 ARM 指令:

    arm-linux-gnueabi-gcc -S -marm test.c
    

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多