❶ Impala中 LLVM 的交叉編譯、調用過程
[TOC]
Impala 使用的 LLVM JIT,首先通過 Clang 將源碼編譯成了 LLVM IR 文件,然後通過腳本將 IR 文件裝成可載入的二進制文件,BE 進程在運行過程中,通過 LLVM 的載入介面,把二進制文件載入進來使用。
待編譯的文件通過codegen/ impala-ir.cpp 指定
impala-ir.cpp 文件主要的作用就是把需要產生 LLVM IR 的文件包含進來。
確定了哪些文件需要產生 LLVM IR 之後,就開始生成 IR 的二進制文件了。大致流程如下:
這個階段生成最初始的bc文件,使用的是 CLang 的編譯工具。命令可見codegen/CMakeFiles.txt
生成的結果是 impala-sse-tmp.bc 文件。
使用LLVM 優化工具,對原始的 bc 文件進行優化。命令可見codegen/CMakeFiles.txt
生成的結果就是impala-sse.bc。
這一步使用的是Impala 自定義的一個腳本 file2array.sh ,將優化後的 bc 文件轉換為可載入的二進制c 文件。命令可見codegen/CMakeFiles.txt。
生成的結果是impala-sse-ir.cc。這個文件內部就是用一個數組存放二進制的值。
be 進程就是通過讀取 impala_sse_llvm_ir 數組,把 LLVM IR載入到進程中。
file2array.sh 腳本其實就是使用 xxd -i < impala-sse-ir.cc 命令把bc 文件內容轉成 c 語言的二進制形式。
LlvmCodeGen 類通過 CreateImpalaCodegen 介面實例化 codegen 對象。 CreateImpalaCodegen 最終會調用 CreateFromMemory ,在 CreateFromMemory 中就是將上文中生成的 impala_sse_llvm_ir 數組通過 LLVM 介面載入進來。
完成載入後,就可以通過 GetFunction 獲取指定的 IR 函數了。
所有的函數名及描述,定義在 impala-ir-names.h 和 impala-ir-functions.h ,這兩個文件是有對應關系的,都是通過gen_ir_descriptions.py生成。
impala-ir-names.h 定義了數組 FN_MAPPINGS ,存儲函數名和枚舉值的映射關系,如下:
impala-ir-functions.h定義了所有函數的枚舉值,如下:
通過 GetFunction 獲取函數的時候,因為有了 FN_MAPPINGS 存儲的映射關系,可以通過傳入枚舉值或者字元串符號查找函數。
在 InitializeLlvm 方法中會使用 FN_MAPPINGS ,對載入的 llvm 函數進行校驗。
❷ mySQL能用在ARM板上面嗎,使用起來方不方便因為需要在windows上生成mySQL資料庫文件然後傳到ARM上使用
1、mysql允許交叉編譯,可以用arm編譯器編譯,在網路文庫中有篇文章是寫移植到ARM平台的:《Ubuntu下編譯ARM平台QtEmbedded的MySQL和MySQL插件》
2、我用mips交叉編譯器編譯過mysql-5.1.34,遇到的情況和那篇文章差不多。
3、我的編譯過程:
1)先編譯一份x86版本的mysql(因為交叉編譯過程中要用到一個x86版本的工具gen_lex_hash sql)
2)配置交叉編譯環境,用以下選項和參數:
ac_cv_sys_restartable_syscalls='no'
--host=mipsel-linux
--with-named-curses-libs=<你的 交叉編譯器中libncurses.a的全路徑>
3)make到gen_lex_hash錯誤時,將x86編譯結果中的gen_lex_hash拷過來
4)再啟動make,到sql_parse.cc錯誤時,修改這個文件:
vi ../sql/sql_parse.cc
將那個出錯的宏定義一下:
#define STACK_DIRECTION 1
5)再make就可以了。
❸ 如何製作arm-linux-gcc編譯工具
一、下載源文件
源代碼文件及其版本:
binutils-2.19.tar.bz2, gcc-core-4.4.4.tar.bz2 gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6.25.tar.bz2 (由於我在編譯出錯的過程中,根據出錯的信息修改了相關的C代碼,故而沒有下載相應的補丁)
一般一個完整的交叉編譯器涉及到多個軟體,主要包括bilinguals、cc、glibc等。其中,binutils主要生成一些輔助工具;gcc是用來生成交叉編譯器,主要生成arm-linux-gcc交叉編譯工具,而glibc主要提供用戶程序所需要的一些基本函數庫。
二、建立工作目錄
編譯所用主機型號 fc14.i686,虛擬機選的是VM7.0,Linux發行版選的是Fedora9,
第一次編譯時用的是root用戶(第二次用一般用戶yyz), 所有的工作目錄都在/home/yyz/cross下面建立完成,首先在/home/yyz目錄下建立cross目錄,然後進入工作目錄,查看當前目錄。命令如下:
創建工具鏈文件夾:
[root@localhost cross]# mkdir embedded-toolchains
下面在此文件夾下建立如下幾個目錄:
setup-dir:存放下載的壓縮包;
src-dir:存放binutils、gcc、glibc解壓之後的源文件;
Kernel:存放內核文件,對內核的配置和編譯工作也在此完成;
build-dir :編譯src-dir下面的源文件,這是GNU推薦的源文件目錄與編譯目錄分離的做法;
tool-chain:交叉編譯工具鏈的安裝位;
program:存放編寫程序;
doc:說明文檔和腳本文件;
下面建立目錄,並拷貝源文件。
[root@localhost cross] #cd embedded- toolchains
[root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost embedded- toolchains] #cd setup-dir
拷貝源文件:
這里我們採用直接拷貝源文件的方法,首先應該修改setup-dir的許可權
[root@localhost embedded- toolchains] #chmod 777 setup-dir
然後直接拷貝/home/yyz目錄下的源文件到setup-dir目錄中,如下圖:
建立編譯目錄:
[root@localhost setup-dir] #cd ../build-dir
[root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc
三、輸出環境變數
輸出如下的環境變數方便我們編譯。
為簡化操作過程。下面就建立shell命令腳本environment-variables:
[root@localhost build -dir] #cd ../doc
[root@localhost doc] #mkdir scripts
[root@localhost doc] #cd scripts
用編輯器vi編輯環境變數腳本envionment-variables:[root@localhost scripts]
#vi envionment-variables
export PRJROOT=/home/yyz/cross/embedded-toolchains
export TARGET=arm-linux
export PREFIX=$PRJROOT/tool-chain
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
截圖如下:
執行如下語句使環境變數生效:
[root@localhost scripts]# source ./environment-variables
四、建立二進制工具(binutils)
下面將分步介紹安裝binutils-2.19.1的過程。
[root@localhost script] # cd $PRJROOT/src-dir
[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2.19.1.tar.bz2
[root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils
創建Makefile:
[root@localhost build-binutils] #../../src-dir/binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX
在build-binutils目錄下面生成Makefile文件,然後執行make,make install,此過程比較緩慢,大約需要一個15分鍾左右。完成後可以在$PREFIX/bin下面看到我們的新的binutil。
輸入如下命令
[root@localhost build-binutils]#ls $PREFIX/bin
❹ 怎樣交叉編譯一個QT應用程序
?
為此我寫下我在工作中的一點小經驗,希望對曾經像我一樣困惑的新手們有點幫助,同時也希望能得到大家的指正,
首先得把我們在X86機上調好的程序進行交叉編譯,如果在X86上都沒有通過的話。。那就不用交叉編譯了,(肯定是通不過的),還是到正題吧,
設置好環境變數,我們用以用echo
來查看環境變數,echo
$TMAKEPATH
,如果返回的不是.../qws/linux-arm-g++
的字元的話,我們一定得從新設置,
export
TMAKEPATH=/tmake
的安裝路徑/qws/linux-arm-g++
,同時QTDIR一定得要指定QTE的安裝路徑,設置過程如下:
export
QTDIR=...../qt-2.3.7
以上環境設置好後,我們可以使用tmake來生成Makefile,注意這里我們是用tmake,而不是用qmake(注意),tmake工具在tmake包裡面。
具體做法,我們可以在命令行下打:
tmake
-o
Makefile
工程名.pro
這樣我們就新生成了一個Makefile文件,下一步,我們要打開這個文件,做一些小的修改
1:
將LINK=arm-linux-gcc
改為:LINK=arm-linux-g++
2:將LIBS=$(SUBLIBS)
-L$(QTDIR)/lib
-lm
-lqte這句話改為:
LIBS=$(SUBLIBS)
-L/opt/gcc-2.3.2-glibc-3.3.2/lib
-L$(QTDIR)/lib
-lm
-lqte
加上你的交叉編譯的庫。。。最後我們可以make了,一個可以在您的板子上可以運行的二進制文件產生了。
至於怎樣加到qtopia上去呢。。。待續。。。。。。。。。。。。。。
❺ redhat9.0如何安裝arm-linux-gcc交叉編譯器
gcc交叉編譯。。。真折騰~
編譯先決條件:安裝gmp mpfr mpc,版本需要和gcc對應,不對應gcc在make時也會提示
安裝gmake和redhat9自帶的gcc,安裝盤沒有yum一下也行~
有個能上google的好網路,gcc編譯一定會發現bug的,這時請暫時忘記度娘吧
編譯過程:
configure,configure的時候指定參數,不知道的話configure --help自己看,看不懂的參數查一下, multilib這個屬性會造成很多麻煩,但是如果你要編個能出64包的32gcc就需要關注,不能簡單粗暴的disable的(網上多少坑爹的告訴的--disable-multilib,然後出不了64的so有木有),這里需要確保configure的都ok,有問題可以看config.log,接下來就是make,make install
最痛苦是make~開源軟體很多bug有木有,編譯一次半小時一小時沒了有木有,error時~請google之,很多國外開源論壇之類能搜到patch的,這個patch一般就是一坨代碼,告訴你怎麼改源碼~在你的gcc源碼找到他,改之~然後一般出錯出個4、5次,一般就編譯通過的
make install,完工~