Linux 交叉编译与ARM的链接问题

Linux 交叉编译与ARM的链接问题,linux,arm,cross-compiling,Linux,Arm,Cross Compiling,我正在尝试为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'

我正在尝试为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
所以我想我需要链接一些东西-也许我的工具链没有正确的LIB?我能够构建内核,所以我认为它已经完成了。谢谢运行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)
#include <stdio.h>

int main(int argc, char **argv)
{
   printf("Hello World\n");
   return 0;
}
清洁: rm-f HelloWorld HelloWorld.o

节目

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)
#include <stdio.h>

int main(int argc, char **argv)
{
   printf("Hello World\n");
   return 0;
}
#包括
int main(int argc,字符**argv)
{
printf(“Hello World\n”);
返回0;
}

内核不使用C运行时库,因为库执行许多内核代码不允许的操作,如文件i/o和分配内存


通常,您根本不必指定库<代码>gcc假设正确。尝试删除设置LDFLAGS:我打赌它工作得更好。

内核不使用C运行时库,因为库做了很多内核代码不允许的事情,比如文件I/o和分配内存


通常,您根本不必指定库<代码>gcc假设正确。尝试删除设置
LDFLAGS
:我打赌效果更好。

我得说,这是可疑的:
-nostlib


不使用这个标志怎么样?

我得说,这是可疑的:
-nostlib


不使用此标志如何?

您使用的工具链是否有一个名为“lcs3arm”的库?如果是,请尝试将其添加到列表中。您也可以尝试“-lcs3”本身


出于兴趣,您在这里使用的是哪个版本的GCC?(即哪个CodeSourcery版本)

您正在使用的工具链是否有一个名为“lcs3arm”的库?如果是,请尝试将其添加到列表中。您也可以尝试“-lcs3”本身


出于兴趣,您在这里使用的是哪个版本的GCC?(即哪个CodeSourcery版本)

确定-最终解决了这个问题,从源代码中获取了一个工具链:


你好,世界很好!感谢您的建议

好的-最终解决了这个问题,从这里的来源获取了一个工具链:



你好,世界很好!感谢您的建议

感谢Karl-removing-Nostlib导致以下错误,我认为这是意料之中的,因为ARM二进制文件没有使用默认的crt0/root/picokernel/toolchain/bin/arm-eabi-gcc-lc-lgcc--entry main HelloWorld.o-o HelloWorld/root/picokernel/toolchain/bin//lib/gcc/arm-eabi/4.2.1/../../../../../../arm eabi/bin/ld:crt0.o:没有这样的文件:没有这样的文件或目录集合2:ld返回了1个退出状态您是否尝试过向命令行?你有C++的编译器吗?OK -刚刚尝试过SyS根系,得到这个:这个链接器没有被配置为使用SysRooScript。我认为编译器是可以的,它构建了内核。要编译这个例子,你需要
crt0
。在工具链中搜索它。你有吗?谢谢Karl-removing-Nostlib导致以下错误,我认为这是意料之中的,因为ARM二进制文件没有使用默认的crt0/root/picokernel/toolchain/bin/arm-eabi-gcc-lc-lgcc--entry main HelloWorld.o-o HelloWorld/root/picokernel/toolchain/bin//lib/gcc/arm-eabi/4.2.1/../../../../../../arm eabi/bin/ld:crt0.o:没有这样的文件:没有这样的文件或目录集合2:ld返回了1个退出状态您是否尝试过向命令行?你有C++的编译器吗?OK -刚刚尝试过SyS根系,得到这个:这个链接器没有被配置为使用SysRooScript。我认为编译器是可以的,它构建了内核。要编译这个例子,你需要
crt0
。在工具链中搜索它。您有吗?谢谢-但是需要-nostlib,或者您得到的“crt0.o”没有这样的文件错误,请参见上面的注释。如果我以主机系统为目标,不使用LDFLAGS效果很好,但在交叉编译hanks-但需要-nostlib时,或者您得到“crt0.o”时,没有这样的文件错误,请参见上面的注释。如果我以主机系统为目标,不使用LDFLAGS会很好,但在交叉编译嵌入式Arm时,无论是否使用Linux内核,都不会这样做?在没有内核的情况下,你必须自己实现。谢谢-我应该注意到这是一个内核-我已经更新了问题Embedded Arm有没有Linux内核?在没有内核的情况下,您必须自己实现。谢谢-我应该注意到这是内核附带的-我已经更新了问题哦,还尝试在编译器的命令行上指定目标体系结构和/或CPU类型(例如--march=armv7-a)。谢谢-两个lib都在那里-将它们添加到链接没有帮助。架构是ARCH=arm。如果我不使用printf,代码将链接并在目标上运行-我只需要找出要链接的库。哦,还要尝试在编译器的命令行上指定目标体系结构和/或CPU类型(例如--march=armv7-a),谢谢-两个库都在那里-将它们添加到链接中没有帮助。架构是ARCH=arm。如果我不使用printf,那么代码将链接并在目标上运行——我只需要找出要链接的库。