【问题标题】:Cross-Compiling for an embedded ARM-based Linux system基于 ARM 的嵌入式 Linux 系统的交叉编译
【发布时间】:2012-09-12 18:55:23
【问题描述】:

我尝试为基于 ARM 的嵌入式(定制)Linux 系统编译一些 C 代码。我用一个名为 arm-linux-gnueabi-gcc-4.4 的交叉编译器设置了一个 Ubuntu VM,因为它看起来像我需要的。现在,当我用这个 gcc 编译我的代码时,它会生成一个像这样的二进制文件:

$ file test1
test1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.31,
BuildID[sha1]=0x51b8d560584735be87adbfb60008d33b11fe5f07, not stripped

当我尝试在嵌入式 Linux 上运行这个二进制文件时,我得到了

$ ./test1
-sh: ./test1: not found

权限就足够了。我只能想象二进制格式有问题,所以我查看了一些工作二进制作为参考:

$ file referenceBinary
referenceBinary: ELF 32-bit LSB executable, ARM, version 1, dynamically linked
(uses shared libs), stripped

我发现存在一些差异,但我不知道我需要修复什么以及如何修复它。有人能解释一下哪个区别很重要吗?

我查看的另一件事是依赖项:

$ ldd test1
    libc.so.6 => not found (0x00000000)
    /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

(有趣的是,这在目标系统上有效,尽管它不能执行二进制文件。)嵌入式系统只有libc.so.0 可用。我想我需要告诉编译器我要链接的 libc 版本,但据我了解,gcc 只是链接到它附带的版本,这是正确的吗?我该怎么办?

编辑:这是我使用的 Makefile:

CC=/usr/bin/arm-linux-gnueabi-gcc-4.4
STRIP=/usr/bin/arm-linux-gnueabi-strip          
CFLAGS=-I/usr/arm-linux-gnueabi/include             
LDFLAGS=-nostdlib
LDLIBS=../libc.so.0

SRCS=test1.c
OBJS=$(subst .c,.o,$(SRCS))

all: test1

test1: $(OBJS)
    $(CC) $(LDFLAGS) -o main $(OBJS) $(LDLIBS)
    $(STRIP) main

depend: .depend

.depend: $(SRCS)
    rm -f ./.depend
    $(CC) $(CFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(OBJS)

include .depend

【问题讨论】:

  • 如果您的内存不够用,那么更小的uClibc 可以替代glibc。但是你需要一个gcc 编译器来使用uClibc。获得 gccuClibc(或 glibc)和朋友的工作工具链以及构建 Linux 内核、Busybox 和其他包都来自源代码是使用BuildRoot。通过良好的编译器 + libc 组合,您可以静态链接您的应用程序,并独立于目标的库。

标签: gcc embedded arm cross-compiling


【解决方案1】:

您可能应该做的是在嵌入式系统上安装libc6。阅读this thread 了解类似问题。帖子 #5 中的解决方案是安装:

libc6_2.3.6.ds1-13etch9_arm.deb
linux-kernel-headers_2.6.18-7_arm.deb
libc6-dev_2.3.6.ds1-13etch9_arm.deb

您的另一个选择是从嵌入式系统获取libc 到您的VM,然后将其传递给gcc 链接器并使用-static 选项。

上面的帖子中也提到了这个解决方案。阅读更多关于静态链接的信息here

其他尝试:

如果您正在使用 this thread,他们建议从您的 makefile 中删除 -mabi=apcs-gnu 标志。

如果您从命令行编译,This article 建议 feedint gcc 使用 -nostdlib 标志。

或者您可以切换到使用arm-none-eabi-gcc 编译器。可以在herehere 找到有关此的参考。

【讨论】:

  • 我无法在嵌入式系统上安装软件,但链接到系统的 libc 时出现此错误:ld: error: Source object ../libc.so.0 has EABI version 0, but target main has EABI version 5。这个错误的谷歌结果暗示我实际上需要一个不同的 gcc,这是正确的吗?
  • @flyx 你是使用makefile还是直接在命令行运行gcc?
  • arm-none-eabi-gcc 可能是正确的选择。我没有尝试,因为我从硬件制造商那里得到了一个工作工具链,但无论如何我都会将此标记为正确答案。这些链接很有帮助。
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多