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

6

我已经在我的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

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


你是否已经安装了交叉编译器? - Ignacio Vazquez-Abrams
如果您能提供目标上的Linux版本、grep ABI .configls -l /lib/libc*,将会非常有帮助。请提供其中任何一个。 - artless noise
是的,我已经安装了交叉编译器。我有:gcc-arm-none-eabi、gcc-arm-linux-gnueabi、gcc-arm-linux-gnueabihf、gcc-aarch64-linux-gnu,应该在哪个目录中使用grep ABI .config命令? - fame
lrwxrwxrwx 1 root root 19 Oct 11 2011 /lib/libc.so.0 -> libuClibc-0.9.29.so -rwxrwxr-x 1 root root 39088 Oct 11 2011 /lib/libcgi.so -rwxr-xr-x 1 root root 39020 Oct 11 2011 /lib/libcli_api.so -rw-r--r-- 1 root root 13212 Oct 11 2011 /lib/libcrypt-0.9.29.so lrwxrwxrwx 1 root root 18 Oct 11 2011 /lib/libcrypt.so.0 -> libcrypt-0.9.29.so -rwxr-xr-x 1 root root 915728 Oct 11 2011 /lib/libcrypto.so lrwxrwxrwx 1 root root 12 Oct 11 2011 /lib/libcrypto.so.0.9.8 -> libcrypto.so - fame
标准的Ubuntu编译器将无法正常工作。你需要一个名为 arm-unknown-linux-uclibcgnueabi (或类似的)编译器;这个编译器将与你系统上的'C'库ucLibc相匹配。crosstool-ng 有一个 arm-unknown-linux-uclibcgnueabi 示例,您可以以此为基础并设置uCLibc v0.9.29,或寻找预制版本。第二部分正确获取Linux版本和配置。这可能并不重要,但仍可能是一个绊脚石。 - artless noise
2个回答

6
你有一台没有浮点处理器的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也能正常工作,那么你就几乎做好了一切准备。如果printf失败,最简单的解决方法是为目标位置找到正确的工具链。

4

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 编译器(多库文件)
  7. gcc-4.7-multilib-arm-linux-gnueabihf - GNU C 编译器(多库文件)
  8. gcc-aarch64-linux-gnu - 用于 arm64 架构的 GNU C 编译器
  9. gcc-arm-linux-gnueabi - 用于 armel 架构的 GNU C 编译器
  10. gcc-arm-linux-gnueabihf - 用于 armhf 架构的 GNU C 编译器

你应该安装 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。您可以通过对 gcc 使用 --param NAME=VALUE 选项来进行更多调整,以针对您系统的 内存子系统 时序进行参数调优。

您可能无法使用这些 gcc 版本,因为您的 Linux 可能使用了 OABI 和/或与编译器构建的版本相比相当古老。在某些情况下,libc 将调用更新的 Linux API,但该 API 可能不存在。如果编译器/库未配置为向后兼容,则可能无法与您的系统配合使用。您可以使用 crosstool-ng 创建一个定制的编译器,以适应您的系统,但这更为复杂。


在某些情况下,您还需要匹配目标上的 libc。例如,如果是 Android 的 bionicuClibc,则 eglibc 标准 Ubuntu 编译器将无法工作。 - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接