我正在尝试为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
所以我认为我需要链接一些内容 - 也许我的工具链没有正确的库?我能够构建内核,所以我认为它是完整的。谢谢! This is the target board. - 运行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;
}
答案 0 :(得分:2)
我得说,这是可疑的:-nostdlib
使用此标志不怎么样?
答案 1 :(得分:1)
内核不使用C运行时库,因为库会执行很多(如果不是大多数)内核代码不允许的事情,例如文件i / o和分配内存。
通常,您根本不必指定库。 gcc
假设正确。尝试完全删除LDFLAGS
设置:我敢打赌它会更好。
答案 2 :(得分:1)
好的 - 终于解决了这个问题,从这里获取了一个工具链:
http://www.codesourcery.com/sgpp/lite/arm/portal/release1803
Hello World效果很棒!感谢您的建议
答案 3 :(得分:0)
您使用的工具链是否有名为“lcs3arm”的库?如果是这样,请尝试将其添加到列表中。您也可以尝试“-lcs3”本身
出于兴趣,您在这里使用哪个版本的GCC? (即CodeSourcery发布)