问题描述
|
我正在尝试为ARM目标编译一个“ Hello World”应用程序。我正在Ubuntu / VMWare上使用gcc进行交叉编译。如果我为主机编译,则可以正常工作。当我为目标编译时,出现以下错误:
/root/picokernel/toolchain/arm-eabi/lib/libcs3hosted.a(hosted-sbrk.o): In function `_sbrk\':
sbrk.c:(.text+0x74): undefined reference to `__cs3_heap_limit\'
/root/picokernel/toolchain/arm-eabi/lib/libcs3hosted.a(hosted-sbrk.o):(.data+0x0): undefined reference to `__cs3_heap_start\'
make: *** [HelloWorld] Error 1
所以我认为我需要链接一些东西-也许我的工具链没有正确的库?我能够构建内核,所以我认为它已经完成。谢谢!这是目标板。 -运行Angstrom或Android。
生成文件:
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
CROSS_LIB1=/root/picokernel/toolchain/arm-eabi/lib
CROSS_LIB2=/root/picokernel/toolchain/lib/gcc/arm-eabi/4.2.1
CFLAGS=-Wall
LDFLAGS= -L$(CROSS_LIB1) -L$(CROSS_LIB2) -lc -lcs3hosted -lg -lgcc --entry main
HelloWorld: HelloWorld.o
$(LD) HelloWorld.o $(LDFLAGS)
清洁:
rm -f HelloWorld HelloWorld.o
程序:
#include <stdio.h>
int main(int argc,char **argv)
{
printf(\"Hello World\\n\");
return 0;
}
解决方法
我得说,这很可疑:
-nostdlib
不使用该标志怎么样?
, 内核不使用C运行时库,因为该库执行内核代码所不允许的许多(如果不是大多数的话)事情,例如文件I / O和分配内存。
通常,您根本不需要指定库。 gcc
假设正确的事情。尝试完全删除设置LDFLAGS
:我敢打赌它会更好。
, 好的-终于解决了这个问题,在这里从源代码中获取了一个工具链:
http://www.codesourcery.com/sgpp/lite/arm/portal/release1803
Hello World很棒!谢谢你的建议
, 您使用的工具链中是否有一个名为“ lcs3arm”的库?如果是这样,请尝试将其添加到列表中。您也可以尝试自己使用“ -lcs3”
出于兴趣,您在这里使用的是哪个版本的GCC? (即哪个CodeSourcery发布)