构建Linux系统下的gcc交叉编译器
交叉编译工具aarch64-linux-gnu-gcc
交叉编译⼯具aarch64-linux-gnu-gcc[root@centos7 arm]# wget https:///-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf.tar.xz--2022-03-0907:12:23-- https:///-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf.tar.xzResolving ()... 23.76.74.223Connecting to ()|23.76.74.223|:443... connected.HTTP request sent, awaiting response... 302 Moved TemporarilyLocation: https:///developer/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf.tar.xz [following]--2022-03-0907:12:24-- https:///developer/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf.tar.xzResolving ()... 52.239.137.100Connecting to ()|52.239.137.100|:443... connected.HTTP request sent, awaiting response... 200 OKLength: 93906188 (90M) [application/octet-stream]Saving to: ‘gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf.tar.xz’100%[============================================================================================================================================================================= 2022-03-0907:12:41 (5.66 MB/s) - ‘gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf.tar.xz’ saved [93906188/93906188][root@centos7 arm]# uname -aLinux centos7 4.14.0-115.el7a.0.1.aarch64 #1 SMP Sun Nov 2520:54:21 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux[root@centos7 arm]#[root@centos7 arm]# ls gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf10.3-2021.07-aarch64-aarch64-none-elf-manifest.txt aarch64-none-elf bin include lib libexec share[root@centos7 arm]# ls gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-addr2line aarch64-none-elf-c++filt aarch64-none-elf-gcc aarch64-none-elf-gcc-ranlib aarch64-none-elf-gdb aarch64-none-elf-ld aarch64-none-elf-objcopy aarch64-none-elf-sizeaarch64-none-elf-ar aarch64-none-elf-cpp aarch64-none-elf-gcc-10.3.1 aarch64-none-elf-gcov aarch64-none-elf-gdb-add-index aarch64-none-elf-ld.bfd aarch64-none-elf-objdump aarch64-none-elf-stringsaarch64-none-elf-as aarch64-none-elf-elfedit aarch64-none-elf-gcc-ar aarch64-none-elf-gcov-dump aarch64-none-elf-gfortran aarch64-none-elf-lto-dump aarch64-none-elf-ranlib aarch64-none-elf-stripaarch64-none-elf-c++ aarch64-none-elf-g++ aarch64-none-elf-gcc-nm aarch64-none-elf-gcov-tool aarch64-none-elf-gprof aarch64-none-elf-nm aarch64-none-elf-readelf[root@centos7 arm]# ls gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gaarch64-none-elf-g++ aarch64-none-elf-gcc-10.3.1 aarch64-none-elf-gcc-nm aarch64-none-elf-gcov aarch64-none-elf-gcov-tool aarch64-none-elf-gdb-add-index aarch64-none-elf-gprofaarch64-none-elf-gcc aarch64-none-elf-gcc-ar aarch64-none-elf-gcc-ranlib aarch64-none-elf-gcov-dump aarch64-none-elf-gdb aarch64-none-elf-gfortran[root@centos7 arm]# ls gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gccaarch64-none-elf-gcc aarch64-none-elf-gcc-10.3.1 aarch64-none-elf-gcc-ar aarch64-none-elf-gcc-nm aarch64-none-elf-gcc-ranlib[root@centos7 arm]# ls gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gcc -versionls: invalid option -- 'e'Try 'ls --help'for more information.[root@centos7 arm]# gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gcc -versionaarch64-none-elf-gcc: error: unrecognized command-line option '-version'aarch64-none-elf-gcc: fatal error: no input filescompilation terminated.[root@centos7 arm]# gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gcc -haarch64-none-elf-gcc: error: missing argument to '-h'aarch64-none-elf-gcc: fatal error: no input filescompilation terminated.[root@centos7 arm]# gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gcc --helpUsage: aarch64-none-elf-gcc [options] file...Options:-pass-exit-codes Exit with highest error code from a phase.--help Display this information.--target-help Display target specific command line options.--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].Display specific types of command line options.(Use '-v --help' to display command line options of sub-processes).--version Display compiler version information.-dumpspecs Display all of the built in spec strings.-dumpversion Display the version of the compiler.-dumpmachine Display the compiler's target processor.-print-search-dirs Display the directories in the compiler's search path.-print-libgcc-file-name Display the name of the compiler's companion library.-print-file-name=<lib> Display the full path to library <lib>.-print-prog-name=<prog> Display the full path to compiler component <prog>.-print-multiarch Display the target's normalized GNU triplet, used asa component in the library path.-print-multi-directory Display the root directory for versions of libgcc.-print-multi-lib Display the mapping between command line options andmultiple library search directories.-print-multi-os-directory Display the relative path to OS libraries.-print-sysroot Display the target libraries directory.-print-sysroot-headers-suffix Display the sysroot suffix used to find headers.-Wa,<options> Pass comma-separated <options> on to the assembler.-Wp,<options> Pass comma-separated <options> on to the preprocessor.-Wl,<options> Pass comma-separated <options> on to the linker.-Xassembler <arg> Pass <arg> on to the assembler.-Xpreprocessor <arg> Pass <arg> on to the preprocessor.-Xlinker <arg> Pass <arg> on to the linker.-save-temps Do not delete intermediate files.-save-temps=<arg> Do not delete intermediate files.-no-canonical-prefixes Do not canonicalize paths when building relativeprefixes to other gcc components.-pipe Use pipes rather than intermediate files.-time Time the execution of each subprocess.-specs=<file> Override built-in specs with the contents of <file>.-std=<standard> Assume that the input sources are for <standard>.--sysroot=<directory> Use <directory> as the root directory for headersand libraries.-B <directory> Add <directory> to the compiler's search paths.-v Display the programs invoked by the compiler.-### Like -v but options quoted and commands not executed.-E Preprocess only; do not compile, assemble or link.-S Compile only; do not assemble or link.-c Compile and assemble, but do not link.-o <file> Place the output into <file>.-pie Create a dynamically linked position independentexecutable.-shared Create a shared library.-x <language> Specify the language of the following input files.Permissible languages include: c c++ assembler none'none' means revert to the default behavior ofguessing the language based on the file's extension.Options starting with -g, -f, -m, -O, -W, or --param are automaticallypassed on to the various sub-processes invoked by aarch64-none-elf-gcc. In order to passother options on to these processes the -W<letter> options must be used.For bug reporting instructions, please see:<https:///>.[root@centos7 arm]# gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gcc --versionaarch64-none-elf-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621Copyright (C) 2020 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.[root@centos7 arm]#[root@centos7 step-08]# make[GCC] commands.o[GCC] kernel.o[GCC] shell.o[GCC] string.o[GCC] uart1.o[GCC] util.o[LD] kernel8.elf/root/arm/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-ld: /lib64/libc.so.6: version `GLIBC_2.27' not found (required by /root/arm/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-ld) make: *** [Makefile:43: kernel8.elf] Error 1[root@centos7 step-08]#换个操作系统root@ubuntu:~# uname -aLinux ubuntu 5.0.0-23-generic #24~18.04.1-Ubuntu SMP Mon Jul 2916:10:24 UTC 2019 aarch64 aarch64 aarch64 GNU/Linuxroot@ubuntu:~#Last login: Wed Mar 920:08:152022from192.168.116.24root@ubuntu:~# uname -aLinux ubuntu 5.0.0-23-generic #24~18.04.1-Ubuntu SMP Mon Jul 2916:10:24 UTC 2019 aarch64 aarch64 aarch64 GNU/Linuxroot@ubuntu:~# ldd --versionldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27Copyright (C) 2018 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Written by Roland McGrath and Ulrich Drepper.root@ubuntu:~# whereis libc.so.6libc.so: /lib/aarch64-linux-gnu/libc.so.6 /usr/lib/aarch64-linux-gnu/libc.soroot@ubuntu:~# strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBCGLIBC_2.17GLIBC_2.18GLIBC_2.22GLIBC_2.23GLIBC_2.24GLIBC_2.25GLIBC_2.26GLIBC_2.27GLIBC_PRIVATEGNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.3) stable release version 2.27.root@ubuntu:~#root@ubuntu:~/arm/bare-metal-aarch64# lsREADME.md step-00 step-01 step-02 step-03 step-04 step-05 step-06 step-07 step-08root@ubuntu:~/arm/bare-metal-aarch64# cd step-08root@ubuntu:~/arm/bare-metal-aarch64/step-08# lsboot.o boot.S commands.c commands.o include kernel8.ld kernel.c kernel.o Makefile README.md shell.c shell.o string.c string.o uart1.c uart1.o util.c util.oroot@ubuntu:~/arm/bare-metal-aarch64/step-08# make[LD] kernel8.elf[OBJCOPY] kernel8.imgroot@ubuntu:~/arm/bare-metal-aarch64/step-08# cat Makefile# Relative path to the prefix where the compiler was installed.COMPILER_PREFIX = ~/arm/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf# Prefix to use before all binutils, gcc and gdb commands.BINROOT = ${COMPILER_PREFIX}/bin/aarch64-none-elf-# Variable used to control the printing of commands.# Printing is disabled by default (due to the "@").# To enable command printing run "make Q= ..." instead of "make ...".Q = @# Flags passed to GCC.GCC_FLAGS = \-ffreestanding \-Wall -Wextra -Werror -pedantic \-O0 \-I ./include \-mgeneral-regs-only# Flags passed to QEMU.QEMU_FLAGS = -M raspi3 -nographic -serial null -serial mon:stdio .PHONY: allall: kernel8.imgboot.o: boot.S@echo "[AS] $@"${Q}${BINROOT}as -c $< -o $@# All header files.C_HDR = $(wildcard include/*.h) $(wildcard include/bcm2837/*.h) %.o: %.c ${C_HDR}@echo "[GCC] $@"${Q}${BINROOT}gcc ${GCC_FLAGS} -c $< -o $@# All C source files, and corresponding object files.C_SRC = $(wildcard *.c)C_OBJ = $(C_SRC:.c=.o)kernel8.elf: kernel8.ld boot.o ${C_OBJ}@echo "[LD] $@"${Q}${BINROOT}ld -T $< -o $@ $(filter-out $<,$^)kernel8.img: kernel8.elf@echo "[OBJCOPY] $@"${Q}${BINROOT}objcopy -O binary $< $@.PHONY: runrun: kernel8.img@echo "[QEMU] running with $<"@echo "(Press Ctrl-A X to exit QEMU.)"${Q}qemu-system-aarch64 ${QEMU_FLAGS} -kernel $<.PHONY: run-gdbrun-gdb: kernel8.img@echo "[QEMU] running with $< (waiting for GDB)"@echo "(Press Ctrl-A X to exit QEMU.)"${Q}qemu-system-aarch64 ${QEMU_FLAGS} -s -S -kernel $< .PHONY: gdbgdb: kernel8.elf@echo "[GDB] running with $<"${Q}${BINROOT}gdb -ex "target remote :1234" $<.PHONY: cleanclean:@rm -f *.o@rm -f kernel8.elf@rm -f kernel8.imgroot@ubuntu:~/arm/bare-metal-aarch64/step-08# make run [QEMU] running with kernel8.img(Press Ctrl-A X to exit QEMU.)********************************************* Hello, World!! *********************************************Initial value of x1: 0x0000000000000000.Initial value of x2: 0x0000000000000000.Initial value of x3: 0x0000000000000000.Initial entry point: 0x0000000000080000.Initial exception level: EL2.Current exception level: EL1.Address of the DTB: n/aEntering the interactive mode.>> hisError: unknown command "his".Use command "help" to get a list of commands.> helpList of available commands:- "help": list the available commands.- "echo": print each of its arguments.- "hexdump": dump memory starting at ARG1 for ARG2 bytes.- "inc": increment the secret counter via un hypervisor call.- "get": get the value of the secret counter via un hypervisor call. > inc>root@ubuntu:~/arm/bare-metal-aarch64/step-08# make run [QEMU] running with kernel8.img(Press Ctrl-A X to exit QEMU.)********************************************* Hello, World!! *********************************************Initial value of x1: 0x0000000000000000.Initial value of x2: 0x0000000000000000.Initial value of x3: 0x0000000000000000.Initial entry point: 0x0000000000080000.Initial exception level: EL2.Current exception level: EL1.Address of the DTB: n/aEntering the interactive mode.>> hisError: unknown command "his".Use command "help" to get a list of commands.> helpList of available commands:- "help": list the available commands.- "echo": print each of its arguments.- "hexdump": dump memory starting at ARG1 for ARG2 bytes.- "inc": increment the secret counter via un hypervisor call.- "get": get the value of the secret counter via un hypervisor call. > inc> getThe secret counter has value 1>。
linux安装配置交叉编译器arm-linux-gnueabi-gcc
linux安装配置交叉编译器arm-linux-gnueabi-gcc要使我们在x86架构下运⾏的程序迁移⾄ARM架构的开发板中运⾏时,需要通过交叉编译器将x86下编写的程序进⾏编译后,开发版才能运⾏。
在安装之前我们需要了解,什么是。
⼀、下载交叉编译器1.新版本的下载⼊⼝如下图所⽰:下载流程如下所⽰:“GNU Toolchain Integration Builds → 11.0-2021.03-1 → arm-linux-gnueabihf → gcc-linaro-11.0.1-2021.03-x86_64_arm-linux-gnueabihf.tar.xz。
”注意:随着时间的不同可能版本号有所变化,不过下载流程应给是⼀样的,除⾮⽹站的变化很⼤。
2.历史版本下载⼊⼝如下图所⽰:下载流程如下所⽰:“View Releases → components → toolchain → binaries → 6.2-2016.11 → arm-linux-gnueabihf → gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz”⼆、安装交叉编译器进⼊linux系统,在/usr/local下创建arm⽂件,将下载的交叉编译⼯具链拷贝到linux系统的/usr/local/arm路径下,并进项解压,如下图所⽰:三、设置环境变量打开/etc/profile⽂件sudo vim /etc/profile在⽂件的最后⼀⾏添加交叉编译链的路径,完成后保存退出export PATH=$PATH:/usr/local/arm/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin如下图所⽰:重新加载环境变量的配置⽂件source /etc/profile检验是否安装成功arm-linux-gnueabihf-gcc -v如果出现以下信息说明安装成功。
c 标准库 交叉编译
c 标准库交叉编译
交叉编译是一种在一种计算机体系结构上生成另一种计算机体系结构的代码的过程。
在标准库的交叉编译中,我们通常使用一个主机(例如,x86架构的PC)来编译目标机(例如,ARM架构的嵌入式设备)可以运行的代码。
以下是一个简单的步骤来说明如何在Linux环境下进行交叉编译:
1. 首先,你需要安装交叉编译器。
对于ARM架构,你可以使用GNU Arm Embedded Toolchain。
2. 然后,你需要设置环境变量,让编译器知道你要为哪种架构进行编译。
这可以通过export命令来完成。
3. 接下来,你可以像平常一样使用gcc或g++进行编译。
但是,你需要指定你的源文件和目标文件的路径。
4. 最后,你可以使用arm-linux-gnueabi-strip命令来移除生成的目标文件中的符号表信息,以减小文件的大小。
以下是一个简单的示例:
bash
# 安装交叉编译器
sudo apt-get install gcc-arm-linux-gnueabi
# 设置环境变量
export CC=arm-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++
# 编译源代码
$CC -o my_program my_program.c
# 移除符号表信息
arm-linux-gnueabi-strip my_program
在这个示例中,my_program.c是你的源代码文件,my_program 是生成的目标文件。
需要将这些名称替换为你自己的文件名。
Linux交叉编译简介
Linux交叉编译简介Linux 交叉编译简介主机,⽬标,交叉编译器主机与⽬标编译器是将源代码转换为可执⾏代码的程序。
像所有程序⼀样,编译器运⾏在特定类型的计算机上,输出的新程序也运⾏在特定类型的计算机上。
运⾏编译器的计算机称为主机,运⾏新程序的计算机称为⽬标。
当主机和⽬标是同⼀类型的机器时,编译器是本机编译器。
当宿主和⽬标不同时,编译器是交叉编译器。
为什么要交叉编译?某些设备构建程序的PC,⽤户可以获得适当的⽬标硬件(或模拟器),启动 Linux Release版,在该环境中进⾏本地编译。
这是⼀种有效的⽅法(在处理 Mac Mini时甚⾄可能是⼀个好主意),但对于 linksys 路由器,或 iPod,有⼀些突出的缺点:速度- ⽬标平台通常⽐主机慢⼀个数量级或更多。
⼤多数专⽤嵌⼊式硬件是为低成本和低功耗⽽设计的,⽽不是⾼性能。
由于在⾼性能桌⾯硬件上运⾏,现代模拟器(如 qemu)实际上⽐模拟的许多现实世界的硬件要快。
性能- 编译⾮常耗费资源。
⽬标平台通常没有台式机GB 内存和数百 GB 磁盘空间;甚⾄可能没有资源来构建“hello world”,更不⽤说⼤⽽复杂的包了。
可⽤性-未运⾏过的硬件平台上运⾏ Linux,需要交叉编译器。
即使在 Arm 或 Mips 等历史悠久的平台上,给定⽬标找到最新的全功能预构建本机环境很困难。
如果平台通常不⽤作开发⼯作站,可能没有现成的最新预构建Release版,如果有,则可能已经过时。
如果必须先为⽬标构建Release版,才能在⽬标上进⾏构建,⽆论如何都将返回交叉编译。
灵活性- 功能齐全的 Linux Release版,由数百个软件包组成,但交叉编译环境可以从⼤多数⽅⾯依赖于主机的现有Release版。
交叉编译的重点是构建要部署的⽬标包,不是花时间获取在⽬标系统上运⾏的仅构建先决条件。
⽅便-⽤户界⾯不友好,debug构建中断不⽅便。
从 CD 安装到没有 CD-ROM 驱动器的机器上,在测试环境和开发环境之间来回重新启动。
Ubuntu18.04安装arm-linux-gcc交叉编译器的两种方法(附下载地址)
Ubuntu18.04安装arm-linux-gcc交叉编译器的两种⽅法(附下载地址)⽅法⼀: 我们都知道Ubuntu有⼀个专门⽤来安装软件的⼯具apt,我们可以⽤它来全⾃动安装arm-linux-gcc。
此⽅法安装的是最新版的,但是此⽅法需要FQ,否则99%会失败,这就是为什么⽹上⼤多都⽤压缩包安装的原因: ⾸先Ctrl+Alt+T弹出终端,使⽤如下命令进⾏arm-linux-gcc的安装:sudo apt-get install gcc-arm-linux-gnueabihf 使⽤如下命令进⾏arm-linux-g++的安装:sudo apt-get install g++-arm-linux-gnueabihf 如果要卸载时使⽤如下命令进⾏移除,arm-linux-gcc的卸载:sudo apt-get remove gcc-arm-linux-gnueabihf arm-linux-g++的卸载:sudo apt-get remove g++-arm-linux-gnueabihfsudo tar -xjvf /tmp/arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 3.解压完成后,再在(/usr/local)中创建⼀个新⽬录arm,即在Terminal中输⼊以下命令:sudo mkdir /usr/local/arm 4.创建arm⽬录成功后,还需要给它解放全部权限,即在Terminal中输⼊以下命令:sudo chmod 777 /usr/local/arm 5.在解压出来的⽬录中找到并把整个arm-linux-gcc-3.4.5-glibc-2.3.6⽬录复制到刚刚建好的arm⽬录中,命令如下:sudo cp -r gcc-3.4.5-glibc-2.3.6 /usr/local/arm 6.打开(/etc/profile)配置环境变量和库变量,⽬的是以后可以在任何位置使⽤该交叉编译器,命令如下:sudo vi /etc/profile 7.⽤vi或者vim打开后,在⽂件最后添加两⾏,并输⼊以下代码:第⼀⾏是添加执⾏程序的环境变量,第⼆⾏是库⽂件的路径export PATH=$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/lib 8.使⽤source命令重新加载⽣效该配置⽂件source /etc/profile 9.检验是否安装成功,在 Terminal 输⼊以下命令输出版本信息:arm-linux-gcc -v 10.若有以下报错参考解决办法: 报错:bash: /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc-4.2.2: No such file or directory 解决sudo apt-get install libc6-i386 该库中包括ia32-libs, lib32z1, lib32ncurses5等等依赖。
基于Linux的嵌入式交叉编译环境的建立及实现
不紊 的进 行 。 iu Ln x操 作 系统 的建立 可 以选 择在 P C机
上 安装 L n x操 作 系统 或 者 在 Wid w iu n o s下 安 装 虚 拟 Ln x环 境 软件 [ 。L n x开发 环境 方案 有 以下 几种 : iu 2 iu ]
进 行 项 目开发 的 时候必 须 搭建 一 套 开发 环 境 , 包括 操
Env r n e s d o Li ux i o m ntBa e n n 刘永 林 梁 莹 王诗 琴 师 惠萍 ( 中北大 学山西省 现代 无损检 测工程 技 术研 究 中心 太原 ( 中北大 学山西省 光 电信 息与仪 器 工程技 术研 究 中心 太原 。 00 5 ) 3 0 1 0 05 ) 3 0 1
CCROSS
—ห้องสมุดไป่ตู้
⑧ 系统 头 文件 gich a e : 编译过 程 中函数声 l —edr对 b
明 , 果 缺 少 了头 文 件 , 统 功 能 的很 多 C程 式 将 无 如 系 法 编译 。
C OM PI E — a m—i u L r l x # ma e n k
me c nu onfg i
现 代嵌 入 式行 业 的交 叉 编译 环 境 多种 多样 , 多 很
都 有 各 自的特点 和使 用 的便 利性 , 入 式开 发 人 员往 嵌
往 需要 搭建 一套适 合 自己的交 叉编译 环境 。本 文根 据
硬 件 结 构 和 软 件 需 求 搭 建 了 一 套 工 具 链 , 用 采
“ no s Wid w +Vmwae虚拟 机 ( iu ) 目标 系 统 ” r Ln x + 的 结 构 模 式 , 成交 叉 编译 环 境 的构 建 , 进行 开 发 测 完 并
交叉编译环境的建立
随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来越多的进入人们的生活之中,应用范围越来越广。
在裁减和定制Linux,运用于你的嵌入式系统之前,由于一般嵌入式开发系统存储大小有限,通常你都要在你的强大的pc机上建立一个用于目标机的交叉编译环境。
这是一个由编译器、连接器和解释器组成的综合开发环境。
交叉编译工具主要由binutils、gcc 和glibc 几个部分组成。
有时出于减小libc 库大小的考虑,你也可以用别的c 库来代替glibc,例如uClibc、dietlibc 和newlib。
建立一个交叉编译工具链是一个相当复杂的过程,如果你不想自己经历复杂的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载。
下面我们将以建立针对arm的交叉编译开发环境为例来解说整个过程,其他的体系结构与这个相类似,只要作一些对应的改动。
我的开发环境是,宿主机i386-redhat-7.2,目标机arm。
这个过程如下1. 下载源文件、补丁和建立编译的目录2. 建立内核头文件3. 建立二进制工具(binutils)4. 建立初始编译器(bootstrap gcc)5. 建立c库(glibc)6. 建立全套编译器(full gcc)下载源文件、补丁和建立编译的目录1. 选定软件版本号选择软件版本号时,先看看glibc源代码中的INSTALL文件。
那里列举了该版本的glibc编译时所需的binutils 和gcc的版本号。
例如在glibc-2.2.3/INSTALL 文件中推荐gcc 用2.95以上,binutils 用2.10.1 以上版本。
我选的各个软件的版本是:linux-2.4.21+rmk2binutils-2.10.1gcc-2.95.3glibc-2.2.3glibc-linuxthreads-2.2.3如果你选的glibc的版本号低于2.2,你还要下载一个叫glibc-crypt 的文件,例如glibc-crypt-2.1.tar.gz。
arm-linux-gcc交叉编译工具链安装
arm-linux-gcc交叉编译工具链安装
陈伟
解压arm-linux-gcc-3.4.1.tar.bz2
#tar zxvf arm-linux-gcc-3.4.1.tar.bz2
1.解压过程需要一段时间,解压后的文件形成了usr/local/ 文件夹,
进入该文件夹,将arm文件夹拷贝到/usr/local/下
#cd usr/local/
#cp -rv arm /usr/local/
现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下面了
2.修改环境变量,把交叉编译器的路径加入到PATH。
修改~/.bashrc文件,编辑.bash_profile也行
#vim ~/.bashrc
在最后加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin export PATH
也可以:
#export PATH=$PATH:/usr/local/arm/3.4.1/bin
注:(这只能在当前的终端下才是有效的!)
3.立即使新的环境变量生效,不用重启电脑:
#source /root/.bashrc
4.检查是否将路径加入到PATH:
# echo $PATH
显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。
至此,交叉编译环境安装完成。
5. 测试是否安装成功
# arm-linux-gcc -v。
交叉编译工具链的介绍
交叉编译工具链的介绍
交叉编译工具链是一种由编译器、连接器和解释器组成的综合开发环境,它可以在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。
例如,在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平
台上的程序。
编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行。
虽然两个平台用的都是Linux系统,但机器指令不同,所以需要交叉编译工具链进行编译。
交叉编译工具链主要由binutils、gcc和glibc三个部分组成。
有时出于减
小libc库大小的考虑,也可以用别的c库来代替glibc,例如uClibc、dietlibc和newlib。
此外,从授权上,交叉编译工具链可以分为免费授权版和付费授权版。
免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是Codesourcery,第三是Linora。
构建交叉编译工具链通常有以下两种方法:
1. 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。
2. 通过Crosstool脚本工具来实现一次编译,生成交叉编译工具链。
该方法相对于第一种要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。
以上内容仅供参考,如需更多信息,建议查阅关于交叉编译工具链的资料或咨询专业技术人员。
mingw gcc linux 交叉编译
mingw gcc linux 交叉编译交叉编译是指在一个操作系统上编译另一个不同操作系统的可执行文件或库。
在Linux系统上使用MinGW的GCC进行交叉编译,可以编译出在Windows系统上运行的可执行文件或库。
下面将详细介绍交叉编译的过程。
首先,我们需要安装MinGW的GCC工具链。
MinGW是Minimalist GNU for Windows的缩写,是一套在Windows上开发和运行GNU软件的工具集。
GCC是GNU编译器集合的一部分,它是一个广泛使用的编译器,可以编译多种语言的程序。
安装MinGW的GCC可以通过包管理器或者从MinGW官网下载安装包进行安装。
安装完成后,我们需要设置环境变量,将MinGW的bin目录添加到系统的PATH变量中,以便在命令行中可以直接使用GCC命令。
接下来,我们需要获取目标系统的交叉编译工具链。
交叉编译工具链是一套用于在Linux上编译Windows可执行文件或库的工具,其中包括Windows的头文件、库文件和链接器等。
可以从MinGW官网下载交叉编译工具链的压缩包,或者通过包管理器安装。
安装完成后,我们需要将交叉编译工具链的bin目录添加到系统的PATH变量中,以便在命令行中可以直接使用交叉编译工具链的命令。
接下来,我们可以使用GCC进行交叉编译。
在命令行中,使用以下命令编译一个简单的C程序:$ i686-w64-mingw32-gcc hello.c -o hello.exe其中,i686-w64-mingw32-gcc是交叉编译工具链的GCC命令,hello.c 是源代码文件,-o hello.exe是编译生成的可执行文件的输出路径。
编译完成后,我们可以将生成的hello.exe文件拷贝到Windows系统中运行,即可验证交叉编译是否成功。
需要注意的是,在进行交叉编译时,可能会遇到一些问题。
例如,由于Windows和Linux的文件路径格式不同,可能需要修改代码中的文件路径相关的部分。
gcc交叉编译命令
gcc交叉编译命令一、概述GCC(GNU Compiler Collection)是一个自由软件编程语言的编译器系列,包括C、C++、Objective-C、Fortran、Ada等语言的编译器。
交叉编译是指在一台计算机上使用GCC编译生成另一种架构的目标代码,以便在另一种架构的计算机上运行。
本文将介绍GCC交叉编译命令的使用方法,包括安装交叉编译工具链、设置环境变量、配置GCC交叉编译选项等。
二、安装交叉编译工具链1. 下载工具链在进行交叉编译之前,需要先下载对应架构的交叉编译工具链。
可以从各个芯片厂商或开发板厂商的官网下载。
2. 安装工具链将下载好的压缩包解压到指定目录下即可完成安装。
例如:```$ tar -zxvf arm-linux-gcc-4.4.3.tar.gz -C /usr/local/```三、设置环境变量1. 编辑.bashrc文件打开终端并输入以下命令:```$ vi ~/.bashrc```2. 设置环境变量在.bashrc文件中添加以下内容:```export PATH=$PATH:/usr/local/arm-linux-gcc-4.4.3/bin export CROSS_COMPILE=arm-linux-```其中,第一行将交叉编译工具链的bin目录添加到PATH环境变量中,以便在终端中直接使用交叉编译工具链。
第二行设置CROSS_COMPILE环境变量为arm-linux-,以便在Makefile中使用。
3. 使环境变量生效保存并退出.bashrc文件后,执行以下命令使环境变量生效:```$ source ~/.bashrc```四、配置GCC交叉编译选项1. 编写Makefile文件在需要进行交叉编译的项目目录下新建一个名为Makefile的文件,并编辑以下内容:```CC=$(CROSS_COMPILE)gccLD=$(CROSS_COMPILE)ldOBJCOPY=$(CROSS_COMPILE)objcopyCFLAGS=-Wall -O2 -gall: main.binmain.bin: main.elf$(OBJCOPY) -O binary $< $@main.elf: main.o$(LD) -Ttext 0x10000 -o $@ $<main.o: main.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f *.o *.elf *.bin```2. 解释Makefile文件该Makefile文件定义了三个变量:CC、LD、OBJCOPY。
一步一步搭建mips-linux-gcc-4.4.0交叉编译工具
一步一步搭建mips-linux-gcc-4.4.0交叉编译工具一、准备工作:工作环境:宿主机:ubuntu10.04 linux-2.6.32-24-generic i686 gcc-4.4.3目标机:mips32软件包版本:binutils-2.19.1gcc-4.4.0glibc-2.9linux-2.6.29.1gmp-4.3.0mpfr-2.4.2glibc-2.9-libgcc_eh-1.patchglibc-ports-2.9工作目录:---home|---crosstool|---bin//存放最终的可执行文件和lib|---headers|---mips|---4.4.0|---bin|---……|---binutils//对binutils编译|---build|---binutils-2.19.1//源码|---gcc|---build|---gcc-4.4.0|---glibc|---build|---glibc-2.9|---linux|---linux-2.6.29.1|---qemu//存放模拟器二、编译步骤:1、编译binutilslsq$:cd /home/crosstool/binutils/build E OFlsq$:../binutils-2.19.1/configure --target=mips-linux --prefi x=/home/crosstool/bin/mips/4.4.0 --disable-nls--disable-werror --di s able-multilib –enable-sharedE OFlsq$:make all-gcc && make install-gcc E OFlsq$:make all-target-libgcc && make install-target-libgcc E OFDone!结果:能够在目标文件夹查看到生成的可执行文件。
交叉编译实验报告
一、实验目的本次实验旨在通过交叉编译,了解并掌握交叉编译的基本原理和操作方法,提高在嵌入式系统开发中对编译器配置和编译过程的掌握能力。
交叉编译是指在一个平台上编译生成可在另一个平台上运行的程序,这对于嵌入式系统开发尤为重要,因为嵌入式设备通常资源有限,而开发环境与运行环境可能不同。
二、实验环境1. 主机平台:Windows 102. 目标平台:Linux(假设为Raspberry Pi)3. 编译工具:GCC4. 软件包:交叉编译工具链(如交叉工具链crosstool-ng)三、实验步骤1. 安装交叉编译工具链(1)在主机上安装crosstool-ng。
```bashsudo apt-get install crosstool-ng```(2)使用crosstool-ng生成交叉编译工具链。
```bashcrosstool-NG-1.22.0/src/crosstool-NG-1.22.0/configure --toolchain-build=x86_64-build --toolchain-target=arm-linux-gnueabihf --sysroot=/path/to/raspberry-pi/rootfsmake```(3)安装交叉编译工具链。
```bashsudo make install```2. 编写测试程序(1)创建一个简单的C程序,如`hello_world.c`。
```c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```3. 交叉编译程序(1)使用交叉编译器编译程序。
```basharm-linux-gnueabihf-gcc hello_world.c -o hello_world ```(2)检查编译生成的可执行文件。
```bashls -l hello_world```4. 将可执行文件传输到目标平台(1)使用SSH将可执行文件传输到目标平台。
gcc交叉编译 mips
gcc交叉编译 mipsgcc交叉编译mips一、前言GCC(GNU Compiler Collection,GNU编译器集合)是UNIX-like 系统上一种非常强大的自由软件集,由Richard Stallman及GNU项目社区发起并开发,主要发行版GNU/Linux采用的是GCC编译器。
GCC 可以用来编译几乎所有的编程语言,而且使用GCC也是开发Linux下大多数软件的首选编译器。
GCC提供了非常强大的编译环境,可以用来编译不同架构的编程语言,很多open source的软件都是采用GCC这个编译器来实现它们的编译和链接,同时也可以用来支持特定的架构,比如:MIPS (Microprocessor without Interlocked Pipeline Stages,微处理器没有交叉管道阶段)。
二、gcc交叉编译mips的准备1、首先要确保安装了gcc编译器,编译系统为 Ubuntu 16.04 LTS,在终端下输入gcc --version来查看是否已安装,如果没有安装可以执行以下操作:sudo apt-get install gcc2、安装gcc-mips交叉编译工具:下载mips-linux-gcc-5.3.0.tar.gz并解压:tar -zxvf mips-linux-gcc-5.3.0.tar.gz然后进行安装:cd mips-linux-gcc-5.3.0./configuremakesudo make install3、配置环境变量首先找到mips-linux-gcc-5.3.0的安装目录,比如/usr/local/mipsel-linux-gnueabi/bin,然后修改~/.bashrc文件,在文件末尾添加以下内容:export PATH=$PATH:/usr/local/mipsel-linux-gnueabi/bin 然后执行:source ~/.bashrc三、gcc交叉编译mips的实现1、首先我们需要把源程序文件test.c保存到一个文件夹,比如/home/user/test2、进入该文件夹,然后使用gcc编译这个文件:mipsel-linux-gcc -static test.c -o test需要注意的是,如果编译的源文件中有头文件,比如stdio.h,则需要分别指定这些头文件的路径,比如:mipsel-linux-gcc -I/usr/local/mips-linux-gcc-5.3.0/include -static test.c -otest3、编译完成后,会在/home/user/test目录下生成可执行文件test,这个可执行文件就是交叉编译所得了,可以在MIPS架构的机器上执行该文件。
嵌入式LINUX交叉编译环境及其建立方法
5建立引导编译器(bootstrap gcc)
9cc 套 件 只包含了一个工具程序(GNU编译器),不过 它还支持一些组件,如运行时库。本阶段将建立引 导编译器。该编译器只能支持C语言。等到C链接库 编译好之后,重新编译9c。才能提供完整的C十十支 持。同样 首 先 解压源代码包: #e d / h om e /build一tools # tar zx v fge e一2.95 .3. tar .gz 这样 将 生 成一个包含包内容的gee这里需要对源代 码做一些修改,否则后面的编译会出现错误:
五、交叉编译环境的建立方法与步骤
1. 下 载 源文件、补丁,准备编译的目录 2 编译前的准备工作 3 内核头文件设置 4 建立二进制工具(binutil) 5建立引导编译器(bootstrap gcc) 6 建立C链接库(glibc) 7 建立全套编译器(fulg cc)
嵌入式LINUX交叉编译环境及 其建立方法
课题的研究内容
嵌入式LINUX交叉编译环境及其建立方法 1)描述什么是交叉编译环境; 2)描述为何ARM嵌入式系统需要交叉编译环境; 3)说明ARM Linux交叉编译工具链的功能与作用, 特点; 4)简要说明如何获得交叉编译工具链文件,有哪些 文件?各文件的功能与作用; 5)交叉编译环境的建立方法与步骤。
这里 c onf iguer指定的-一target和-一perfix选项,也 是分别用来指定目标板类型和安装目录。此外,还 有一些建立引导编译器时需要的选项。-一without一 heade。告诉配置工具交叉编译器不需要目标板的系 统头文件。-一with一newlib说明不要使用glibc,因 为glibc尚未针对目标板完成编译的动作。-一enable 一languages选项用来告诉配置命令脚本,想让产生 的编译器支持哪些程序语言。因为这是个引导编译 器,所有只需要支持C语言。
gcc linaro 交叉编译
gcc linaro 交叉编译好的,以下是一篇关于gcc linaro交叉编译的文档,希望能够帮助到您:交叉编译是一种在一种架构上编译出适用于另一种架构的程序的技术。
在嵌入式系统开发、软件移植等领域中,交叉编译是非常重要的一项技能。
Linaro是一个由许多不同厂商支持的开源组织,它致力于简化麒麟操作系统(麒麟是用于基于Linux的系统的一套容器和包管理器)的开发和构建过程。
在本篇文章中,我们将介绍如何在Linaro环境下使用gcc进行交叉编译。
一、准备工作1. 安装Linaro环境:首先,您需要安装Linaro环境,以便能够编译适用于其他架构的程序。
2. 确定目标架构:在进行交叉编译之前,您需要确定目标架构(如x86、ARM等)。
3. 安装交叉编译工具链:根据目标架构,您需要安装相应的交叉编译工具链。
二、交叉编译步骤1. 编写代码:使用适用于目标架构的编程语言编写代码。
2. 配置环境变量:确保编译器、头文件等路径被正确添加到环境变量中。
3. 编译代码:使用gcc等交叉编译工具编译代码。
例如,对于ARM架构,可以使用以下命令进行编译:`arm-linaro-gcc -ooutput_file input_file`。
4. 生成可执行文件:编译成功后,生成适用于目标架构的可执行文件。
三、注意事项1. 确保目标架构与工具链匹配:在进行交叉编译时,确保目标架构与所使用的交叉编译工具链相匹配。
2. 调试信息:如果您需要调试生成的程序,请确保在编译时启用调试信息。
3. 链接库:如果您的程序需要链接库文件,请确保已正确安装并链接到目标架构的库文件。
四、实践案例下面是一个简单的实践案例,演示如何在Linaro环境下使用gcc 进行交叉编译:1. 编写一个简单的C程序(例如hello_world.c),并在终端中打开该文件。
2. 使用以下命令进行编译:`arm-linaro-gcc -o hello_world hello_world.c`。
linux交叉编译环境搭建步骤
linux交叉编译环境搭建步骤正文:在进行Linux交叉编译之前,我们需要先搭建好相应的交叉编译环境。
下面是搭建步骤的详细说明:步骤一:安装必要的软件包首先,我们需要安装一些必要的软件包,包括GCC、binutils、glibc 以及交叉编译工具链等。
可以通过包管理器来安装这些软件包,比如在Ubuntu上可以使用apt-get命令,CentOS上可以使用yum命令。
步骤二:下载交叉编译工具链接下来,我们需要下载相应的交叉编译工具链。
可以从官方网站上下载已经编译好的工具链,也可以通过源码自行编译得到。
下载好之后,将工具链解压到一个目录下。
步骤三:配置环境变量为了方便使用交叉编译工具链,我们需要将其添加到系统的环境变量中。
可以通过编辑.bashrc文件来实现,添加类似下面的内容:```shellexport CROSS_COMPILE=/path/to/cross-compiler/bin/arm-linux-export ARCH=arm```其中,/path/to/cross-compiler是你下载的交叉编译工具链的路径。
步骤四:测试交叉编译环境在配置好环境变量之后,我们可以通过简单的测试来验证交叉编译环境是否搭建成功。
比如,可以尝试编译一个简单的Hello World程序,并在目标平台上运行。
步骤五:编译其他软件当交叉编译环境搭建成功,并且测试通过之后,我们就可以使用这个环境来编译其他的软件了。
比如,可以使用交叉编译工具链来编译Linux内核、U-Boot引导程序、驱动程序等。
总结:搭建Linux交叉编译环境是进行嵌入式开发的基础工作之一。
在搭建好环境之后,我们可以使用交叉编译工具链来编译适配于目标平台的软件,从而实现在开发主机上进行开发和调试的目的。
生成gcc交叉编译器的一般过程
生成gcc交叉编译器的一般过程一、引言GCC(GNU Compiler Collection)是一套开源的编程语言编译器,包括C、C++、Objective-C、Fortran、Ada和Go等语言的编译器。
交叉编译器是指能够在一个操作系统上生成目标代码,而该目标代码在另一个操作系统上运行。
本文将介绍生成GCC交叉编译器的一般过程。
二、准备工作在开始生成GCC交叉编译器之前,我们需要准备以下工作:1. 目标体系架构的工具链:交叉编译器的目标架构是指编译器生成的目标代码所要运行的目标平台架构,如x86、ARM等。
为了生成GCC交叉编译器,我们需要在本地系统上安装目标体系架构的工具链,以便能够编译和运行目标代码。
2. GCC源码:我们需要下载并安装GCC的源码,可以从GCC官方网站或者其他镜像站点获取。
3. 交叉编译器的配置文件:交叉编译器的配置文件包含了一些选项和参数,用于指定生成交叉编译器的目标架构、目标系统、编译选项等信息。
三、配置和编译GCC生成GCC交叉编译器的一般过程如下:1. 解压GCC源码:将下载的GCC源码解压到指定的目录中。
2. 创建一个用于构建GCC的目录:在解压的GCC源码目录外创建一个新的目录,用于构建GCC的交叉编译器。
3. 进入构建目录:使用命令行工具进入构建目录。
4. 运行configure脚本:在构建目录中运行configure脚本,该脚本将根据配置文件的选项和参数生成Makefile。
5. 编译GCC:运行make命令编译GCC,这个过程可能需要一段时间,取决于系统的性能和GCC源码的大小。
6. 安装GCC:运行make install命令安装生成的GCC交叉编译器。
四、配置环境变量在安装完GCC交叉编译器之后,我们需要配置环境变量,以便在命令行中能够直接使用交叉编译器。
具体配置方法取决于操作系统的不同,一般来说,我们需要将交叉编译器的路径添加到PATH环境变量中。
【IT专家】如何在Linux环境中交叉编译MacOS的R包?
本文由我司收集整编,推荐下载,如有疑问,请与我司联系如何在Linux环境中交叉编译MacOS的R包?如何在Linux环境中交叉编译MacOS的R包?[英]How do I cross compile R packages for MacOS from a Linux environment? I’m running Linux and trying to compile an R package for use on a Mac. I could only find Linux- Windows and MacOS- Windows cross-compiling instructions. Does anybody know what I should do to compile a MacOS binary package for R? 我正在运行Linux,并试图编译一个用于Mac的R包。
我只能找到Linux- Windows和MacOS- Windows交叉编译指令。
有人知道我应该做些什么来编译一个用于R的MacOS二进制包吗? Or, I’ll settle for I build server. Again, there’s a Windows build-server for R packages, but does anybody know of a MacOS build-server? 或者,我将满足于构建服务器。
同样,有一个用于R包的Windows构建服务器,但是有人知道MacOS构建服务器吗? 3 By first building a gcc crosscompiler -- see its documentation. 首先构建一个gcc交叉编译器——请参阅它的文档。
Available libraries may be a limiting factor, though. You’d have to rebuild everything from OS X you’d like to link against. 但是,可用的库可能是一个限制因素。
linux内核交叉编译过程详解
linux内核交叉编译过程详解交叉编译是在一个平台上生成适用于另一个平台的可执行文件的过程。
下面将详细解释在Linux下的内核交叉编译过程:1.环境搭建:o安装交叉编译工具链。
这些工具通常以静态链接的方式提供,例如gcc-arm-linux-gnueabi、binutils-arm-linux-gnueabi。
o配置本地的Makefile文件,以指定交叉编译工具链的路径。
2.获取内核源码:o从官方网站或git仓库下载目标内核的源码。
3.配置内核:o运行makemenuconfig或其他配置工具,根据目标平台的硬件和需求选择合适的配置选项。
o保存配置,生成.config文件。
4.交叉编译内核:o运行make命令开始编译过程。
由于内核很大,此过程可能需要很长时间。
o在编译过程中,内核将被编译成可在目标平台上运行的二进制文件。
5.打包编译好的内核:o内核编译完成后,需要将其打包成适合在目标平台上安装的形式。
这通常涉及到创建引导加载程序(如U-Boot)所需的映像文件。
6.测试和调试:o将编译好的内核和相关文件复制到目标板上,进行启动和测试。
o如果遇到问题,需要进行调试和修复。
7.部署:o一旦内核能够正常工作,就可以将其部署到目标设备上。
这可能包括将其集成到设备固件中,或者作为独立的操作系统运行。
8.维护和更新:o根据需要更新内核版本或进行其他更改,重复上述步骤。
在整个过程中,确保你的交叉编译环境和目标硬件的文档齐全,并遵循相应的开发指导原则。
对于复杂的项目,可能还需要进行更深入的定制和优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
构建Linux系统下的gcc交叉编译器/developerWorks目录第1节.开始之前 (2)第2节.交叉编译 (3)第3节.准备工作 (5)第4节.配置和构建 (8)第5节.安装和使用交叉编译器 (9)第6节.总结及资源 (10)第1节.开始之前关于这本指南很多时候,你所使用的开发平台和你的开发所面向的机器并不一致。
比如,你可能想在装有x86/Linux的膝上电脑上构建一个PowerPC/Linux的应用程序。
使用GNU 工具包中的gcc,gas和ld工具,可以指定并构建一个交叉编译器,使你能够在本地机器上创建面向其它目标机器的应用程序。
稍微用些功夫,你甚至可以搭建出一个环境,从而能够针对各种不同的目标而构建应用程序。
在本指南中,我描述了在系统上构建交叉编译器所需的过程。
我还讨论了构建一个完全的面向一系列目标的环境,展示了如何与distcc和ccache工具结合使用,并且描述了保持最新版本以及在新开发平台上进行更新,所需的方法。
构建交叉编译器,需要对构建一个典型的UNIX开源项目有基本的了解,具有一些基本的shell技能,还要有相当的耐心。
前提条件为了构建交叉编译器,你需要一个可以工作的C编译器(通常是gcc)。
大多数基于Linux/UNIX的操作系统都自带有C编译器。
还需要用来构建交叉编译器的各种工具的源代码。
你可以从GNU()网站上下载GNU工具(请尽量使用本地镜像)。
除了这些工具以外,你还需要有目标平台的头文件拷贝。
对于Linux系统下的目标,可以使用()的通用Linux内核头文件。
关于作者Martin C. Brown曾任职过IT主管,具有交叉平台整合经验。
作为一位热心的开发者,曾为巨头客户包括HP和Oracle,开发过动态网站,并且是的技术主管。
MC(为人熟知的名字)现在是自由作家和顾问,作为SME和微软密切合作,是LinuxWorld杂志的LAMP技术编辑,小组的核心成员,并写过许多书,涉及到微软认证,iMacs和开放源码编程等不同的主题。
除了这些出色的尝试以外,他还依然在许多平台环境方面保持着一位标准的程序员所惯有的痴迷。
关于本指南中的技术问题和评价,请和作者MC联系,,或者登陆他的网站()。
[软件仓库2]第2节.交叉编译交叉编译器的必要性我们不可能总是在同一个平台上进行编写和构建应用程序。
比如许多嵌入式环境,由于简化的存储空间通常小于256MB,甚至可能小于64MB,就不太现实。
如此小的空间是无法容下一个寻常的C编译器,及相关工具和所需的C库,就更不用说在上面运行了。
在这种环境下进行实际开发,显然异常困难。
即使假设你能通过键盘和显示器来访问、使用系统,你也无法使用功能完善的编辑器(例如,emacs)或者大型的开发环境。
许多嵌入式解决方案中甚至都没有提供访问网络的功能。
交叉编译器使你能够在一个平台(主机)上面向另一个系统(目标机)进行实际的开发,编译。
目标机器不需要存在:只要编译器能够知道怎么生成目标平台的机器代码就可以了。
在其它情况下,交叉编译器也能够很有用。
我曾经有一次需要在一个没有安装C编译器的机器上工作,并且很难获得已编译好的二进制程序。
但是,我的另一台机器装有C编译器,并且还装有GNU编译器(GCC),C库(newlib)和二进制工具包的源代码。
利用这些工具,我能够先构建一个交叉编译器,然后再构建一个本地编译器,这样我就可以直接拷贝过来使用了。
当你有一台运行很慢的机器和一台非常快的机器时,如果你想在几分钟内构建好程序,而不是花几个小时或者几天的话,你也可以使用交叉编译器来。
我就曾经用这种方法更新过一台机器上的一个软件的新版本。
在那台机器上,原本可能会花费2-3天来重新构建所有的组件,而且那台机器还正在一直担当着本已很重要的服务器任务。
在进行详细讨论构建交叉编译器之前,让我们进一步看一下编译器是如何工作的,这样就可以更好的理解交叉编译器为什么能够工作,特别是怎么工作的。
交叉编译的工作方式编译器的工作方式比较简单。
(在本参考手册里,讨论的是gcc,不过基本原理适用于任何编译器。
)几个不同的组件在一起工作,最终生成目标CPU所使用的字节码。
当能生成汇编后的字节码时,就说明你已成功的交叉编译了。
任何一个编译器的主要组件都包括:✧分析器:分析器将源语言程序代码转换为汇编语言。
因为要从一种格式转换为另一种格式(C到汇编),所以分析器需要知道目标机器的汇编语言。
✧汇编器:汇编器将汇编语言代码转换为CPU可以执行字节码。
✧连接器:连接器将汇编器生成的单独的目标文件组合成可执行的应用程序。
不同的操作系统和CPU组合,通常会使用不同的封装机制和标准。
连接器需要知道这种目标格式以便工作。
✧标准C库:核心的C函数(例如printf)都有一个主要的C库来提供。
如果在应用程序中用到了C库中的函数,这个库就会通过连接器和源代码连接来生成最终的可执行程序。
作为一个标准的,基于主机的C编译器,它的每个组件都被设计为用来生成主机本身相应的汇编代码,字节码和目标执行格式。
作为一个交叉编译器,虽然应用程序本身被构建为在主机上执行,但是汇编代码,连接器和C库都被设计为面向目标平台和处理器的。
例如,可以在一个基于Intel的Linux机器上,交叉编译一个面向基于Solaris的SPARC主机的汇编语言和最终的应用程序。
因此,构建一个交叉编译器,依赖于构建一个面向目标主机的可选版本的C编译器套件用来生成和连接应用程序。
幸运的是,因为能够编译gcc及相关的工具,所以你能够构建自己的交叉编译器。
交叉编译器的构建过程GNU工具(确切的说,GCC),包括C编译器,二进制工具和C库,有很多好处,不仅仅因为它们是免费,开源并易于编译。
其中一个比较大的好处——从交叉编译器的角度来看——是因为GCC已经被移植到许多平台上,程序代码支持多个不同的CPU和平台类型。
不过,也有一些限制。
GCC并不支持所有的处理器类型(虽然实现了大多数),同样也并不支持所有的平台。
如果遇到这种情况,在运行配置工具时,会对此发出警告。
要构建交叉编译器,需要构建GNU套件中的三大组件:✧binutils:Binutils包含基本的二进制工具,如汇编器,连接器和Size,Strip等相关工具。
二进制工具主要是一些用于构建应用程序的核心组件和用来构建、操作目标机器执行格式的工具。
例如,Strip工具用来移除目标文件或者应用程序的符号表,调试信息以及其他“无用”的信息。
不过,这些工具需要知道目标机器的格式,这样才不至于会错误地移除了信息。
✧gcc:Gcc是编译过程中的主要组件。
Gcc包括C预处理器(cpp)和翻译器,用来将C代码转换为目标CPU的汇编语言。
Gcc还在整个过程中担当着接口作用,调用相应的预处理器,翻译器,汇编器和连接器。
✧newlib/glibc:这是标准C库。
Newlib是由Redhat开发的,为了能够使用于嵌入式目标而设计,在交叉编译器中,体积小,更加友好。
也可以用GNU库(glibc),不过在本指南中,我重点介绍了使用newlib。
还需要有目标操作系统的头文件,这些是在构建应用程序时,如果要访问所有操作系统级的函数和系统调用所必需的。
对于Linux,获得头文件是相当容易的。
对于其他操作系统,可以拷贝现存的头文件。
关于头文件,我将在后面进行详细讨论。
根据个人选择,你可能还想构建GNU调试器——gdb——面向目标机器的。
是无法构建一个运行在本地主机且执行目标机代码的调试器的。
因为,那样需要有模拟器。
不过,你可以构建一个在目标机上运行的gdb[软件仓库3]。
第3节.准备工作安装路径及多版本共存在你开始配置过程之前,需要确定编译器和相关工具安装在何处。
有两种选择:或者安装在一个完全独立的目录,或者和现存的版本安装在一起。
GNU工具包有很多优点,其中之一便是安装文件的结构设计,从而使面向不同目标平台的工具组件得以共存。
软件安装上之后,在标准名字前面会有一个你配置时所提供的前缀,还会有一个目录用来存放特定目标平台的工具。
例如,下面的结构取自我在系统上安装的面向PowerPC/Linux平台的交叉编译器:drwxrwxrwx 2 root root 4096 Nov 16 16:48 bin/drwxrwxrwx 2 root root 4096 Nov 17 12:53 info/drwxrwxrwx 2 root root 4096 Nov 17 12:53 lib/drwxrwxrwx 3 root root 4096 Nov 16 16:44 man/drwxrwxrwx 4 root root 4096 Nov 16 16:48 ppc-linux/drwxrwxrwx 3 root root 4096 Nov 16 16:43 share/如果查看一下目录bin,就可以看到每一个主要的二进制工具都以构建目标名作为前缀:-rwxr-xr-x 1 root root 2108536 Nov 16 16:46 ppc-linux-addr2line*-rwxr-xr-x 2 root root 2157815 Nov 16 16:45 ppc-linux-ar*-rwxr-xr-x 2 root root 3398961 Nov 16 16:48 ppc-linux-as*-rwxr-xr-x 1 root root 2062804 Nov 16 16:47 ppc-linux-c++filt*-rwxr-xr-x 2 root root 2907348 Nov 16 16:48 ppc-linux-ld*-rwxr-xr-x 2 root root 2140893 Nov 16 16:46 ppc-linux-nm*-rwxr-xr-x 1 root root 2552661 Nov 16 16:46 ppc-linux-objcopy*-rwxr-xr-x 1 root root 2708801 Nov 16 16:45 ppc-linux-objdump*-rwxr-xr-x 2 root root 2157810 Nov 16 16:46 ppc-linux-ranlib*-rwxr-xr-x 1 root root 371010 Nov 16 16:46 ppc-linux-readelf*-rwxr-xr-x 1 root root 2008330 Nov 16 16:45 ppc-linux-size*-rwxr-xr-x 1 root root 1982880 Nov 16 16:46 ppc-linux-strings*-rwxr-xr-x 2 root root 2552660 Nov 16 16:46 ppc-linux-strip*像gcc这样的主要工具,只是对执行编译功能的后台工具的一个包装,所以,gcc 针对不同平台进行编译时能够确定应该使用哪一个工具。