【问题标题】:ARM Thumb mode: Code Size not decreasingARM Thumb 模式:代码大小不减小
【发布时间】:2011-05-05 16:22:21
【问题描述】:

伙计们, 我有一个为 ARM Cortex-A8 处理器编译的项目。我正在使用 GCC 来做到这一点。目前我的可执行文件的大小是 220.1 KB。现在我修改我的 makefile 并添加标志 -mthumb,makefile 行看起来有点像这样 -

gcc -mcpu=cortex-a8 -mthumb -marm -mfloat-abi=softfp -mfpu=neon

我在我的所有 makefile 中进行了此更改并构建了我的项目,但我最终获得的可执行文件仍然是 220.1 KB。

我对命令行又做了一项更改,我添加了 -mthumb-interwork 选项

gcc -mcpu=cortex-a8 -mthumb -mthumb-interwork -marm -mfloat-abi=softfp -mfpu=neon

我再一次得到相同大小的可执行文件 220.1 KB。这样做时我错过了什么吗?

我写了一个小程序,找到两个数字中最小的一个,并使用以下命令行编译它

gcc main.c -o main

我得到一个 8.5 KB 的可执行文件

接下来,我做一个

gcc -mthumb main.c -o main

我仍然得到一个 8.5 KB 的可执行文件。

这里有什么问题?

我做了一个cat /proc/cpuinfo 来查看我的处理器是否真的支持拇指,我发现它确实支持。 我明白了-

Processor: ARMv7 Processor rev 5 (v7l)
Features: swp half thumb fastmult vfp edsp neon vfpv3
....
....

【问题讨论】:

  • -marm-mthumb 的计数器,gcc 采用最后一个选项;这就是 dwelch 的 答案有效的原因。

标签: compilation arm thumb cortex-a


【解决方案1】:

我认为 -marm 表示你的手臂没有拇指,请尝试移除 -marm。

【讨论】:

  • 我想就是这样,它很容易演示,在一个带有小函数的小文件上尝试 -S -mthumb -marm 并查看它会生成 arm 代码,因为 -marm 是最后一件事你要求它做。然后将其更改为 -marm -mthumb,最后使用 -mthumb 生成拇指代码。因此,让 -marm last 胜过您尝试做的所有拇指操作。
  • 如有疑问,请使用“gcc -save-temps”保存 asm 文件,或在目标代码上使用“objdump -d”进行反汇编。根据指令宽度很容易发现 ARM 和 Thumb 之间的区别(ARM 总是 4 字节,Thumb 是 2 字节,Thumb2 是 2 或 4)。我见过在 gcc 输出中 Thumb
【解决方案2】:

没有实际代码很难说,但我有几个建议。

  1. 启用优化。 (例如 -O3 -ffunction-sections -fdata-sections)
  2. 剥离可执行文件以确保不计算调试信息。
  3. 检查实际代码 (.text) 大小,而不是文件大小。也许有一些填充正在进行。您可以为此使用 objdump。
  4. 转储汇编代码(-S 开关)并检查它在一种情况下实际生成 ARM 指令,在另一种情况下生成 Thumb。

【讨论】:

    【解决方案3】:

    对于某些编译器,在为 ARMv7 编译时,拇指是默认设置。您确定您的原始可执行文件不是为拇指构建的吗?

    尝试使用 -mno-thumb 构建,看看代码大小是否增加。

    【讨论】:

    • 斯蒂芬我这样做了,它又是 220.1 KB。没有变化!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多