我尝试为嵌入式(自定义)基于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
1 回答
您应该做的是在嵌入式系统上安装
libc6
. 阅读this thread关于类似的问题 . 第5期的解决方案是安装:您的另一个选择是将
libc
从嵌入式系统中获取到您的VM上,然后将其传递给gcc
链接器并使用-static
选项 .在上面的线程中也提到了这个解决方案 . 阅读有关静态链接here的更多信息 .
Other things to try:
在this thread中,如果您使用的话,他们建议从您的makefile中删除
-mabi=apcs-gnu
标志 .This article如果您正在从命令行进行编译,则建议feedint gcc
-nostdlib
标志 .或者您可以切换到使用
arm-none-eabi-gcc
编译器 . 有关这方面的参考资料可以在here和here找到 .