8

我尝试为基于 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
4

1 回答 1

5

您可能应该做的是安装libc6在嵌入式系统上。阅读有关类似问题的主题。帖子 #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从嵌入式系统获取您的虚拟机,然后将其传递给gcc链接器并使用该-static选项。

上述线程中也提到了此解决方案。在此处阅读有关静态链接的更多信息。

其他要尝试的事情:

这个线程-mabi=apcs-gnu中,如果您正在使用它,他们建议从您的 makefile 中删除该标志。

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

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

于 2012-09-20T12:21:20.833 回答