【发布时间】: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。获得 gcc、uClibc(或 glibc)和朋友的工作工具链以及构建 Linux 内核、Busybox 和其他包都来自源代码是使用BuildRoot。通过良好的编译器 + libc 组合,您可以静态链接您的应用程序,并独立于目标的库。
标签: gcc embedded arm cross-compiling