编译嵌入式ARM

我尝试编译一些嵌入式(定制)基于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

你应该做的是在嵌入式系统上安装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选项。

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

其他事情要尝试:

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

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

或者你可以切换到使用arm-none-eabi-gcc编译器。 关于此的参考可以在这里和这里找到。

链接地址: http://www.djcxy.com/p/63729.html

上一篇: Compiling for an embedded ARM

下一篇: based for loops in C++11 segfault, but not with regular for loop