Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Ubuntu 32位i686上针对ARMv6的LLVM的交叉编译程序_C++_Arm_Raspberry Pi_Llvm - Fatal编程技术网

C++ Ubuntu 32位i686上针对ARMv6的LLVM的交叉编译程序

C++ Ubuntu 32位i686上针对ARMv6的LLVM的交叉编译程序,c++,arm,raspberry-pi,llvm,C++,Arm,Raspberry Pi,Llvm,我几乎要受挫了。一个多星期以来,我试图在我的ubunutu 12.04 box i686 Linux机器上为一台ARMv6机器arm1176jzf-s进行交叉编译,该机器被称为Raspberry Pi,它是一个使用LLVM 3.4.2自行开发的程序。 几天后,我能够成功地编译和链接。但是当我试图在Raspberry Pi上执行代码时,我只收到了一个内存访问错误。事实证明,出现了分段错误。我已经用gdb分析过了。请参阅所附图片 基本上,我做了以下工作: I build the C and C++

我几乎要受挫了。一个多星期以来,我试图在我的ubunutu 12.04 box i686 Linux机器上为一台ARMv6机器arm1176jzf-s进行交叉编译,该机器被称为Raspberry Pi,它是一个使用LLVM 3.4.2自行开发的程序。 几天后,我能够成功地编译和链接。但是当我试图在Raspberry Pi上执行代码时,我只收到了一个内存访问错误。事实证明,出现了分段错误。我已经用gdb分析过了。请参阅所附图片

基本上,我做了以下工作:

I build the C and C++ files: @echo 'Compiling' $(1).$(2); cd $(BIN); $(4) -c $(COMPILE_FLAGS) ../$(3)/$(1).$(2) -o $(1).o $(LLVM_CONFIG_COMPILE); cd .. 
I llvm-linked it: cd $(BIN); $(LINK) -o tl.bc $(1)
Then I called the system compiler: cd $(BIN); $(LLC)  $(LINKER_FLAGS) -filetype=obj tl.thumb.opt.bc -o tl.thumb.opt.o 
 And I called the linker, i.e. the arm-linux-gnueabihf-g++: $(LD) -o bin/tl bin/tl.thumb.opt.o $(LINK_OPTION) $(THREAD_LIB_DIR) $(call INFLATE_config)
`test -f bin/tl` && echo 'Make was successful. Find Turbo Lisp in folder' $(BIN)
查看我的make文件的控制台输出:

使用操作系统GNU/Linux为i686机器构建Turbo Lisp 0.01

编译使用的\u标志:

-fno-strict-aliasing -emit-llvm -mfloat-abi=hard -mcpu=arm1176jzf-s -mfpu=vfpv3-d16    -mthumb -target arm-unknown-linux-gnueabihf -I/usr/include/arm-linux-gnueabihf/c++/4.6 -I/usr/include/arm-linux-gnueabihf/c++/4.6/arm-linux-gnueabihf -I/usr/lib/gcc/arm-linux-gnueabihf/4.6/include -I/usr/local/lib/LLVM_ARM/BOOST -ccc-gcc-name arm-linux-gnueabihf-gcc

Compiling precedence.cpp
Compiling util.cpp
Compiling ast.cpp
Compiling abstractParser.cpp
Compiling metaparser.cpp
Compiling parserLisp.cpp
Compiling parserToy.cpp
Compiling preconfiguredLanguages.cpp
Compiling handler.cpp
Compiling helper.cpp
Compiling lexer.cpp
Compiling config_reader.cpp
Compiling tl.cpp
Compiling external_functions.c
Compiling error_util.cpp
从以下位置生成二进制代码:

tl.o preconfiguredLanguages.o handler.o external_functions.o abstractParser.o parserLisp.o parserToy.o metaparser.o ast.o helper.o util.o error_util.o config_reader.o lexer.o precedence.o
链接

cd bin; <myhome>/projects/llvm-3.4.2.src/buildARMCompileX86/Release+Asserts/bin/llvm-link -o tl.bc tl.o preconfiguredLanguages.o handler.o external_functions.o abstractParser.o parserLisp.o parserToy.o metaparser.o ast.o helper.o util.o error_util.o config_reader.o lexer.o precedence.o

如果任何对ARM编译有更多了解的人都能与我分享他的知识,并指导我指出我犯下的错误,那将是非常好的。

希望发表评论,但由于声誉不高,无法发表评论

由于您几乎要失望了,我建议您尝试使用gcc而不是LLVM,因为这样更容易获得帮助。

最终,我做到了

也许你们中的许多人对gcc比对LLVM和clang更感兴趣。但我认为这里的问题更一般,而不是特定于LLVM。在我尝试为ARM编译LLVM和clang之后,我运行了另一个gdb会话。事实证明,glibc在我的raspberry 2.13和ubuntu 2.15上有不同的版本。所以我把libc从我的ARM复制到我的ubuntu系统中,但这不起作用。我收到来自gdb的消息,比如无效的机器指令。这使我更彻底地检查了clang构建的configure.log文件

是的,ubuntu的gcc交叉编译器只是针对ARMv7架构编译的,但是Raspberry是ARMv6的,带有ARM11芯片集。 因此,下一点是构建我自己的gcc工具链。首先,我尝试构建我的binutils,据称这是成功的。然后我去编译gcc linaro。这花了我好几天的时间。最后我没有完成这个任务。某些包含文件丢失或链接器问题使我无法访问

但我有一个绝妙的想法去做更多的研究,特别是用rasperry pi的关键词。当我发现crosstool ng时,这就把我推回到了正轨上。多好的工具啊!您只需要在一种菜单中配置您想要访问的平台,然后该工具下载完整工具链所需的所有文件并安装它。伟大的当我跨越这个障碍时,构建LLVM和clang非常容易。 每个人都需要管理的唯一一点是升级Raspberry Pi,即在测试阶段通过apt get升级libc和libstdc++

如果您在构建正确的gcc工具链时遇到困难,请随意忽略它或直接查看它:

cd bin; <myhome>/projects/llvm-3.4.2.src/buildARMCompileX86/Release+Asserts/bin/opt tl.bc -o tl.thumb.opt.bc -float-abi=hard -std-compile-opts 
cd bin; <myhome>/projects/llvm-3.4.2.src/buildARMCompileX86/Release+Asserts/bin/llc   -float-abi=hard -march=arm -mtriple=arm-unknown-linux-gnueabihf -filetype=obj tl.thumb.opt.bc -o tl.thumb.opt.o
arm-linux-gnueabihf-g++ -o bin/tl bin/tl.thumb.opt.o -v -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib/LLVM_ARM/BOOST -L/usr/local/lib/LLVM_ARM -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib/LLVM_ARM/BOOST -L/usr/local/lib/LLVM_ARM -lz -lpthread -lrt -ldl -lm -lLLVMInterpreter -lLLVMMCJIT -lLLVMJIT -lLLVMRuntimeDyld -lLLVMExecutionEngine -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMARMAsmParser -lLLVMMCParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMTarget -lLLVMCore -lLLVMARMAsmPrinter -lLLVMMC -lLLVMObject -lLLVMSupport -lpthread -ldl

`test -f bin/tl` && echo 'Make was successful. Find Turbo Lisp in folder' bin
Make was successful. Find Turbo Lisp in folder bin