交叉编译为基于嵌入式ARM-Linux系统(Cross-Compiling for an embed

2019-07-31 18:20发布

我尝试编译一些C代码嵌入(自定义),基于ARM-Linux系统。 我设立一个Ubuntu VM名为ARM-Linux的gnueabi-GCC-4.4,因为它看起来像什么,我需要一个交叉编译器。 现在,当我编译我的代码与此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

Answer 1:

什么你应该做的是安装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,如果你使用一个标志。

本文提出feedint海湾合作委员会-nostdlib标志,如果你在命令行编译。

或者你可以切换到使用arm-none-eabi-gcc编译器。 在此引用可以发现这里和这里 。



文章来源: Cross-Compiling for an embedded ARM-based Linux system