【问题标题】:Crosscompile program for LLVM for ARMv6 on Ubuntu 32bit i686在 Ubuntu 32 位 i686 上为 ARMv6 的 LLVM 交叉编译程序
【发布时间】:2014-09-17 18:07:22
【问题描述】:

我快要沮丧了 ;-)。一个多星期以来,我尝试在我的 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

使用的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 编译的知识,可以与我分享他的知识并指导我指出我犯了这么大的错误,那就太好了。

【问题讨论】:

标签: c++ arm raspberry-pi llvm


【解决方案1】:

想发表评论,但由于“声誉”低而无法发表评论......

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

【讨论】:

    【解决方案2】:

    最终,我做到了!

    也许你们中的许多人对 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。这让我花了好几天的时间。最后我没有完成这个使命。某些包含文件丢失或链接器问题阻止了我。

    但我有一个绝妙的主意,可以进行更多研究,尤其是使用树莓派的关键字。当我发现 crosstool-ng 时,这让我回到了正轨。多么棒的工具!您只需要在一种菜单中配置您想要解决的平台,然后此工具会下载完整工具链所需的所有文件并安装它。伟大的!当我遇到这个障碍时,构建 LLVM 和 clang 非常容易。 每个人都需要管理的唯一一点是升级树莓派,即在“测试”阶段通过 apt-get 升级 libc 和 libstdc++。

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

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多