Linux 交叉编译与ARM的链接问题
我正在尝试为ARM目标编译一个“Hello World”应用程序。我正在Ubuntu/VMWare上使用gcc进行交叉编译。如果我为主机编译,它可以正常工作。为目标编译时,会出现以下错误: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'
/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,那么代码将链接并在目标上运行——我只需要找出要链接的库。