我已经在我的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
这是我需要交叉编译的目标机器。 我应该在编译时使用哪些标记?
apt-cache search arm | grep ^gcc-
apt-cache search arm | grep ^gcc-
给出以下列表,
你应该安装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
版本,因为您的Linux可能使用OABI进行编译,并且/或者与编译器的编译器相比是相当古老的。 在某些情况下, libc会调用一个更新的Linux API ,这可能不存在。 如果编译器/ libc没有配置为向后兼容,那么它可能不适用于您的系统。 您可以使用crosstool-ng来创建一个自定义编译器,以适合您的系统,但是这更复杂。
你有一个没有浮点处理器的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
失败,最简单的解决方案就是为你的目标找到合适的工具链。