导航:首页 > 源码编译 > 交叉编译的过程编写

交叉编译的过程编写

发布时间:2024-03-20 19:00:19

❶ 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的,这时请暂时忘记度娘吧

编译过程:

  1. configure,configure的时候指定参数,不知道的话configure --help自己看,看不懂的参数查一下, multilib这个属性会造成很多麻烦,但是如果你要编个能出64包的32gcc就需要关注,不能简单粗暴的disable的(网上多少坑爹的告诉的--disable-multilib,然后出不了64的so有木有),这里需要确保configure的都ok,有问题可以看config.log,接下来就是make,make install

  2. 最痛苦是make~开源软件很多bug有木有,编译一次半小时一小时没了有木有,error时~请google之,很多国外开源论坛之类能搜到patch的,这个patch一般就是一坨代码,告诉你怎么改源码~在你的gcc源码找到他,改之~然后一般出错出个4、5次,一般就编译通过的

  3. make install,完工~

阅读全文

与交叉编译的过程编写相关的资料

热点内容
爬山算法相关题目 浏览:720
vc编程大全 浏览:114
excel表格单列数据加密 浏览:646
给同事的解压话语 浏览:990
linux关闭网卡命令行 浏览:452
史上最漂亮程序员 浏览:768
java实现excel的导入 浏览:758
光遇账号如何转移安卓 浏览:266
5分之13除以26的算法 浏览:342
兰州安宁区买解压包子 浏览:641
php接收图片代码 浏览:668
hci命令 浏览:662
福建服务器大区云空间 浏览:840
笔杆子程序员 浏览:745
手机软件易验证加密 浏览:589
文档加密只读模式也不能看到 浏览:431
把jpg转换成pdf的软件 浏览:874
linuxeth0mac 浏览:192
windows编程知乎 浏览:442
压缩工期超过40 浏览:249