适用于Ubuntu 32位i686上ARMv6的LLVM的交叉编译程序

时间:2014-09-17 18:07:22

标签: c++ arm raspberry-pi llvm

我接近沮丧;-)。一个多星期以来,我尝试在我的ubunutu 12.04盒子i686 Linux机器上交叉编译ARMv6机器(arm1176jzf-s - 称为Raspberry Pi),这是一个自己开发的LLVM 3.4.2程序。 几天后,我能够成功编译和链接。但是当我尝试在Raspberry Pi上执行我的代码时,我只收到了内存访问错误。事实证明,引发了分段错误。我用gdb分析了它。请参阅随附的图片。

The executable on ARM analyzed with 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

使用了COMPILE_FLAGS:

-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

优化...

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

如果有人对ARM的编译有更多了解,可以与我分享他的知识并指导我做出错误的观点,那将是非常好的。

2 个答案:

答案 0 :(得分:0)

最终,我做到了!

也许很多人对gcc比对LLVM和clang更感兴趣。但我认为这里的问题更多一般,而不是LLVM特有的。在我尝试为ARM编译LLVM和clang后,我运行了另一个gdb会话。事实证明,glibc在我的覆盆子(2.13)和我的ubuntu(2.15)上有不同的版本。所以我将libc从我的ARM复制到了我的ubuntu系统,但这并没有奏效。我收到了来自我的gdb的消息,例如&#34;无效的机器指令&#34;。这使我更彻底地检查了clang构建的configure.log文件。

而且,是的,ubuntu的gcc交叉编译器只是为 ARMv7 架构编译,但Raspberry是ARMv6(带有ARM11芯片组)。 所以,下一点是建立我自己的gcc工具链。首先,我尝试建立我的binutils,据称是成功的。然后我开始编译gcc linaro。这花费了我几天。最后,我还没有完成这项任务。有些包含文件丢失或者链接器问题已经阻止了我。

但是我有一个很棒的想法可以进行更多的研究,尤其是关于rasperry pi的关键词。然后,当我发现了crosstool-ng时,这又让我重回正轨。多棒的工具啊!您只需要在某种菜单中配置您想要解决的平台,然后使用此工具下载所有必需的文件以获得完整的工具链并进行安装。大!当我设置这个障碍时,构建LLVM和clang非常容易。 每个人需要管理的唯一要点是升级Raspberry Pi,即通过apt-get使用&#34;测试&#34;升级libc和libstdc ++。阶段。

如果您在构建正确的gcc工具链时也遇到麻烦,请随意忽略它或者查看它:Tutorial to setup crosstool-ng for RPi

答案 1 :(得分:-1)

想评论但不能因为“声誉”低......

由于你“接近沮丧”,我建议尝试使用gcc而不是LLVM,因为这样可能更容易获得帮助。