从linux到ARM-ELF的交叉编译(ARM926EJ-S / MT7108)

时间:2013-06-27 06:41:56

标签: linux gcc arm

到目前为止,我已经在我的ubuntu系统上安装了所有交叉编译软件包,但是我有一个 问题,需要一些帮助。

Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 184.72
Features        : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5
Cache type      : write-back
Cache clean     : cp15 c7 ops
Cache lockdown  : format C
Cache format    : Harvard
I size          : 32768
I assoc         : 4
I line length   : 32
I sets          : 256
D size          : 32768
D assoc         : 4
D line length   : 32
D sets          : 256

Hardware        : MT7108
Revision        : 0000
Serial          : 0000000000000000

这是我需要交叉编译的目标机器。我应该买什么旗帜 在编译时使用?

2 个答案:

答案 0 :(得分:4)

您有ARMv5没有浮点处理器。使用-march=armv5-mfloat-abi=soft标志应该足够了。

但是,如果这些标志不适合您,我建议编写最小的c应用程序来测试工具链。

/* no includes */
int main(void) {   
    return 42;
}

并使用最完整/严格的标志进行编译

$arm-linux-gnueabi-gcc -Wall --static -O2 -marm -march=armv5 simple.c -o simple

在此之后,将simple推送到目标,然后运行它,然后发出echo $?以验证您是否会获得42。如果有效,请尝试查看是否可以printf正常工作。如果那个也有效,你几乎可以为一切做好准备。如果printf失败,最简单的解决方案就是为您的目标找到合适的工具链。

答案 1 :(得分:2)

apt-cache search arm | grep ^gcc-给出以下列表,

  1. gcc-4.7-aarch64-linux-gnu - GNU C编译器
  2. gcc-4.7-arm-linux-gnueabi - GNU C编译器
  3. gcc-4.7-arm-linux-gnueabi-base - GCC,GNU编译器集合(基础包)
  4. gcc-4.7-arm-linux-gnueabihf - GNU C编译器
  5. gcc-4.7-arm-linux-gnueabihf-base - GCC,GNU编译器集合(基础包)
  6. gcc-4.7-multilib-arm-linux-gnueabi - GNU C编译器(multilib文件)
  7. gcc-4.7-multilib-arm-linux-gnueabihf - GNU C编译器(multilib文件)
  8. gcc-aarch64-linux-gnu - arm64架构的GNU C编译器
  9. gcc-arm-linux-gnueabi - 用于armel架构的GNU C编译器
  10. gcc-arm-linux-gnueabihf - armhf架构的GNU C编译器
  11. 你应该安装 gcc-arm-linux-gnueabi ,这是 gcc-4.7-arm-linux-gnueabi 的别名。 gcc-4.7-multilib-arm-linux-gnueabi 也是可能的,但更复杂。使用标记-march=armv5te -mtune=arm926ej-s -msoft-float -mfloat-abi=soft。您可以通过将--param NAME=VALUE选项指定为gcc并将参数调整为系统内存子系统时间来进行更多调整。

    您可能无法使用这些gcc版本,因为 Linux 可能使用 OABI 编译和/或与编译器相比相当古老是为...而建的。在某些情况下, libc 将调用较新的 Linux API ,这可能不存在。如果编译器/ libc未配置为向后兼容,则它可能无法与您的系统一起使用。您可以使用crosstool-ng创建一个适合您系统的自定义编译器,但这要复杂得多。