❶ 在makefile中判断是cygwin还是Linux系统
交叉编译工具链作为嵌入式Linux开发的基础,直接影响到嵌入式开发的项目进度和完成质量。由于目前大多数开发人员使用Windows作为嵌入式开发的宿主机,在Windows中通过安装VMware等虚拟机软件来进行嵌入式Linux开发,这样对宿主机的性能要求极高。Cygwin直接作为Windows下的软件完全能满足嵌入式Linux的开发工作,对硬件的要求低及方便快捷的特点成为嵌入式开发的最佳选择。 目前网络上Cygwin下直接可用的交叉编译器寥寥无几且版本都比较低,不能满足开源软件对编译器版本依赖性的要求(如低版本工具链编译U-Boot出现软浮点问题等);Crosstool等交叉工具链制作工具也是更新跟不上自由软件版本的进度;同时系统介绍Cygwin下制作交叉编译器方面的资料很少。针对上述情况,基于最新版gcc等自由软件构建Cygwin下的交叉编译器显得尤为迫切和重要。 构建前准备工作 首先Cygwin下必须保证基本工具比如make}gcc等来构建bootstrap-gcc编译器,这可以在安装Cygwin时选择安装。参照gcc等安装说明文档来在Cygwin下查看是否已经安装,如输入gcc --v等。 源码下载 gcc-4.5.0的编译需mpc的支持,而mpc又依赖gmp和mpfr库。从各个项目官方网站上下载的最新的源码: binutils-2.20. l .tar.bz2 gmp-S.O. l .tar.bz2 mpc-0.8.2.tar.gz mpfr-3.O.O.tar.bz2 gcc-4.S.O.tar.bz2 linux-2.6.34.tar.bz2 glibc-2.11.2.tar.bz2 glibc-ports-2. l l .tar.bz2 gdb-7. l.tar.bz2 设置环境变量 HOST:工具链要运行的目标机器;BUILD:用来建立工具链的机器;TARGET工具链编译产生的二进制代码可以运行的机器。 BUILD=i686-pc-cygwin HOST=i686-pc-cygwin TARGET=arm-linux SYSROOT指定根目录,$PREFIX指定安装目录。目标系统的头文件、库文件、运行时对象都将被限定在其中,这在交叉编译中有时很重要,可以防止使用宿主机的头文件和库文件。本文首选$SYSROOT为安装目录,$PREFIX主要作为glibc库安装目录。 SYSROOT=/cross-root PREFIX=/cross-root/arm-linux 由于GCC-4.5.0需要mpfr,gmp,mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录。 TEMP_PREFIX=/build-temp 控制某些程序的本地化的环境变量: LC ALL=POSIX 设置环境变量: PATH=$SYSROOT/bin:儿in:/usr/bin 设置编译时的线程数f31减少编译时间: PROCS=2 定义各个软件版本: BINUTILS V=2.20.1 GCC V=4.5.0 GMP V=5.0.1 MPFR V=3.0.0 MPC V二0.8.2 LINUX V二2.6.34 GLIBC V=2.11.2 GLIBC-PORTS V=2.11 GDB V=7.1 构建过程详解 鉴于手工编译费时费力,统一把构建过程写到Makefile脚本文件中,把其同源码包放在同一目录下,执行make或顺次执行每个命令即可进行无人值守的编译安装交叉工具 链。以下主要以Makefile执行过程为主线进行讲解。 执行“make”命令实现全速运行 可在Cygwin的Shell环境下执行“make>make.log 2>&1”命令把编译过程及出现的错误都输出到make.log中,便于查找: all:prerequest install-deps install-cross-stage-one install- cross-stage-two 预处理操作 "make prerequest',命令实现单步执行的第一步,实现输出变量、建立目录及解压源码包等操作。0'set十h”关闭bash的Hash功能,使要运行程序的时候,shell将总是搜索PATH里的目录[4]。这样新工具一旦编译好,shell就可以在$(SYSROOT)/bin目录里找到: prerequest: set +h&&mkdir -p $(SYSROOT)/bin&& mkdir -p $(PREFIX)/include&& mkdir -p $(TEMP一REFIX)&& export PATH LCes ALL&& tar -xvf gmp-$(GMP_V).tar.bz2&& tar -xvf mpfr-$(MPFR_V).tar.bz2&& tar -xvf mpc-$(MPC_V).tar.gz&& tar -xvf binutils-$(BINUTILS_V).tar.bz2&& tar -xvf gcc-$(GCC_V).tar.bz2&& tar -xvf linux-$(LINUX_V).tar.bz2&& tar -xvf glibc-$(GLIBC_V).tar.bz2&& tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&& my glibc-ports-$(GLIBC-PORTS_V) glibc-$(GLIBC_V)/ports&& tar -xvf gdb-$(GDB V).tar.bz2 非交叉编译安装gcc支持包mpc 00make install-deps”命令实现单步执行的第二步,实现mpc本地编译,mpc依赖于gmp和mpfr install-deps:gmp mpfr mpc gmp:gmp-$(GMP_V) mkdir -p build/gmp&&cd build/gmp&& ../../gmp-*/configure --disable-shared --prefix=$(TEMP_PREFIX)&& $(MAKE)一$(PROCS)&&$(MAKE) install mpfr:mpfr-$(MPFR_V) mkdir -p b-uild/mpfr&&cd build/mpfr&& ../..//mpfr-*/configure LDF'LAGS="-Wl,-search_paths_first”--disable-shared --with-gmp=$(TEMP_PREFIX) --prefix=$(TEMP_PREFIX)&& $(MAKE)一$(PROCS) all&&$(MAKE) install mpc: mpc-$(MPC_V) gmp mpfr mkdir -p build/mpc&&cd build/mpc&& ../../mpc-*/configure --with-mpfr=$(TEMP PREFIX) --with-gmp=$(TEMP_PREFIX) --prefix=$(TEMP_PREFIX)&& $(MAKE)一$(PROCS)&&$(MAKE) install 交叉编译第一阶段 "make install-cross-stage-one',命令实现单步执行的第三步,编译安装binutils,bootstrap-gcc和获取Linux内核头文件: install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers 编译安装binutils cross-binutils: binutils-$(BINUTILS_ V) mkdir -p build/binutils&&cd build/binutils&& ../..//binutils-*/configure --prefix=$(SYSROOT) --target=$(TARGET)--disable-nls&& $(MAKE)j$(PROCS)&&$(MAKE) install 编译安装bootstrap-gcc。使用一disable-shared参数的意思是不编译和安装libgcc_ eh.a文件。glibc软件包依赖这个库,因为它使用其内部的一lgcc_eh来创建系统[6]。这种依赖 性,可通过建立一个指向libgcc.a符号链接得到满足,因为该文件最终将含有通常在libgcc- eh.a中的对象(也可通过补丁文件实现)。 cross-gcc:gcc-$(GCC_V) mkdir -p build/gcc&&cd build/gcc&& 二//gcc-*/configure --target=$(TARGET)--prefix=$(SYSROOT) --disable-nls --disable-shared --disable-multilib --disable-decimal-float--disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --enable-languages=c --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX)&& $(MAKE) -j$(PROCS)&&$(MAICE) install&& In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I sed's/libgcc/& eh/'} 获取Linux内核头文件: get-kernel-headersainux-$(LINUX_V) cd linux-$(LINUX_V)&& $(MAICE) mrproper&&$(MAKE) headers check&& $(MAKE) ARCH=arm&& INSTALLes HDR_ PATH=dest headers_ install&& find dest/include (-name .install一。-name ..installNaNd)-delete&& cp -rv desdinclude/* $(PREFIX)/include 交叉编译第二阶段 编译安装glibc、重新编译安装binutils、完整编译安装gcc和编译安装gdb o "make install-cross-stage-two',命令实现单步执行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb 编译安装glibca glib。的安装路径特意选为$(PREFIX),与gcc更好找到动态链接库也有关系,选在$(SYSROOT)提示找不到crti.o; glibc已经不再支持i386; glibc对ARM等的处理器的支持主要通过glibc-ports包来实现;正确认识大小写敏感(Case Sensitive)和大小写不敏感(CaseInsensitive)系统,大小写敏感问题主要影响到glibc,是交叉编译glibc成功的关键:Cygwin帮助手册中可知Cygwin是默认大小写不敏感的n},但是UNIX系统是大小写敏感的,这也是Cygwin和UNIX类系统的一个区别。通过作者自行参考制作的glibc-2.11.2-cygwin.patch补T使glibc变为Case-Insensitive,此补丁主要是对大小写敏感问题改名来实现。 交叉编译过程中安装的链接器,在安装完Glibc以前都无法使用。也就是说这个配置的forced unwind支持测试会失败,因为它依赖运行中的链接器。设置libc_ cvforced unwind=yes这个选项是为了通知configure支持force-unwind,而不需要进行测试。libc cv_c_cleanup=yes类似的,在configure脚本中使用libc_cv_c cleanup=yes,以便配置成跳过测试而支持C语言清理处理。 cross-glibc:glibc-$(GLIBC_V) cd glibc-$(GLIBC_V)&& patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&& cd..&&mkdir -p build/glibc&& cd build/glibc&& echo"libc cv_forcedes unwind=yes">config.cache&& echo "libc cv_c_cleanup=yes">>config.cache&& echo "libc cv_arm_tls=yes">>config.cache&& ../../glibc-*/configure --host=$(TARGET) --build=$(../OneScheme/glibc-2.11.2/scripts/config.guess) --prefix=$(PREFIX)--disable-profile --enable-add-ons --enable-kernel=2.6.22.5 --with-headers=$(PREFIX)/include --cache-file=config.cache&& $(MAKE)&&$(MAKE) install 重新编译安装binutils。编译之前要调整工具链,使其 指向新生成的动态连接器。 调整工具链: SPECS= 'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs arm-linux-gcc -mpspecs sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}" >$SPECS echo "New specs file is: $SPECS" unset SPECS 测试调整后工具链: echo 'main(川’>mmy.c arm-linux-gcc -B/cross-root/arm-linux/lib mmy.c readelf -1 a.out I grep’:/cross-roobarm-linux' 调整正确的输出结果: [Requesting program interpreter: /tools/lib/ld-linux.so.2j 一切正确后删除测试程序: rm -v mmy.c a.out 重新编译binutils。指定--host,--build及--target,否则配置不成功,其config.guess识别能力不如gcc做的好。 cross-rebinutils: binutils-$(BINUTILS_V) mkdir -p build/rebinutils&& cd build/rebinutils&&CC="$(TARGET)-gcc -B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&& RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure --host=$(HOST)--build=$(BUILD)--target=$(TARGET) --prefix=$(SYSROOT)--disable-nls --with-lib-path=$(PREFIX)/lib&& $(MAKE)--$(PROCS)&&$(MAKE) install 高于4.3版的gcc把这个编译当作一个重置的编译器,并且禁止在被一prefix指定的位置搜索startfiles。因为这次不是重置的编译器,并且$(SYSROOT)目录中的startfiles对于创 建一个链接到$$(SYSROOT)目录库的工作编译器很重要,所以我们使用下面的补丁,它可以部分还原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch 在正常条件下,运行gcc的fixincludes脚本,是为了修复可能损坏的头文件。它会把宿主系统中已修复的头文件安装到gcc专属头文件目录里,通过执行下面的命令,可以抑 制fixincludes脚本的运行[9](此时目录为/gcc-4.5.0)。 cp -v gcc/Makefile.in{,.orig} sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in 下面更改gcc的默认动态链接器的位置,使用已安装在/cross-root/ann-linux目录下的链接器,这样确保在gcc真实的编译过程中使用新的动态链接器。即在编译过程中创建的所有 二进制文件,都会链接到新的glibc文件 for file in $(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h) do cp -uv $file{,.orig} sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g’-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo‘ #undef STANDARD INCLUDE DIR #define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include" #define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib" #define STANDARD_ STARTFILE_ PREFIX_ 2””’>>$file touch $file.orig done 完整编译安装gcc。最好通过指定--libexecdir更改libexecdir到atm-linux目录下。--with-local-prefix选项指定gcc本地包含文件的安装路径此处设为$$(PREFIX),安装后就会在内核头文件的路径下。路径前指定$(Pwd)则以当前路径为基点,不指定则默认以/home路径为基点,这点要注意。 cross-g++:gcc-$(GCC-) mkdir -p build/g十+&&cd build/g++&& CC="$(TARGET)-gcc AR=$(TARGET)-ar&& -B/cross-roodarm-linux/lib/"&& RANLIB=$(TARGET)-ranlib&& ..//gcc-*/configure --host=$(HOST)--build=$(BUILD)--target=$(TARGET) --prefix=$(SYSROOT)--with-local-prefix=$(PREFIX) --enable-clocale=gnu --enable-shared --enable-threads=posix --enable -cxa_atexit --enable-languages=c,c++--enable-c99 --enable-long-long --disable-libstdcxx-pch --disable-libunwind-exceptions --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX)&& $(MAKE) LD_IBRARY_ATH= $(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&& $(MAKE) install 编译安装gdb,至此完成整个工具链的制作。 cross-gdb: gdb-$(GDB V) mkdir -p build/gdb&&cd build/gdb&& ../../gdb-*/configure --prefix=$(SYSROOT) --target=$(TARGET)--disable-werror&& $(MAKE)-j$(PROCS)&&$(MAKE) install “make clean”命令清除编译生成的文件和创建解压的文件夹 .PHONY:clean dean: rm -fr $(TEMP_PREFIX) build binutils-$(BINUTIL,S_V) gcc-$(GCC_V) glibc-$(NEWL.IB_V) gdb-$(GDB_V) gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V) 工具链测试 命令行中输入以下内容: echo 'main(){}’>mmy.c arm-linux-gcc -o mmy.exe mmy.c file mmy.exe 运行正常的结果: mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.
❷ cygwin 中如何安装arm-linux-gcc交叉编译器
交叉编译工具链作为嵌入式Linux开发的基础,直接影响到嵌入式开发的项目进度和完成质量。由于目前大多数开发人员使用Windows作为嵌入式开发的宿主机,在Windows中通过安装VMware等虚拟机软件来进行嵌入式Linux开发,这样对宿主机的性能要求极高。Cygwin直接作为Windows下的软件完全能满足嵌入式Linux的开发工作,对硬件的要求低及方便快捷的特点成为嵌入式开发的最佳选择。
目前网络上Cygwin下直接可用的交叉编译器寥寥无几且版本都比较低,不能满足开源软件对编译器版本依赖性的要求(如低版本工具链编译U-Boot出现软浮点问题等);Crosstool等交叉工具链制作工具也是更新跟不上自由软件版本的进度;同时系统介绍Cygwin下制作交叉编译器方面的资料很少。针对上述情况,基于最新版gcc等自由软件构建Cygwin下的交叉编译器显得尤为迫切和重要。
构建前准备工作
首先Cygwin下必须保证基本工具比如make}gcc等来构建bootstrap-gcc编译器,这可以在安装Cygwin时选择安装。参照gcc等安装说明文档来在Cygwin下查看是否已经安装,如输入gcc --v等。
源码下载
gcc-4.5.0的编译需mpc的支持,而mpc又依赖gmp和mpfr库。从各个项目官方网站上下载的最新的源码:
binutils-2.20. l .tar.bz2
gmp-S.O. l .tar.bz2
mpc-0.8.2.tar.gz
mpfr-3.O.O.tar.bz2
gcc-4.S.O.tar.bz2
linux-2.6.34.tar.bz2
glibc-2.11.2.tar.bz2
glibc-ports-2. l l .tar.bz2
gdb-7. l.tar.bz2
设置环境变量
HOST:工具链要运行的目标机器;BUILD:用来建立工具链的机器;TARGET工具链编译产生的二进制代码可以运行的机器。
BUILD=i686-pc-cygwin
HOST=i686-pc-cygwin TARGET=arm-linux
SYSROOT指定根目录,$PREFIX指定安装目录。目标系统的头文件、库文件、运行时对象都将被限定在其中,这在交叉编译中有时很重要,可以防止使用宿主机的头文件和库文件。本文首选$SYSROOT为安装目录,$PREFIX主要作为glibc库安装目录。
SYSROOT=/cross-root
PREFIX=/cross-root/arm-linux
由于GCC-4.5.0需要mpfr,gmp,mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录。
TEMP_PREFIX=/build-temp
控制某些程序的本地化的环境变量:
LC ALL=POSIX
设置环境变量:
PATH=$SYSROOT/bin:儿in:/usr/bin
设置编译时的线程数f31减少编译时间:
PROCS=2
定义各个软件版本:
BINUTILS V=2.20.1
GCC V=4.5.0
GMP V=5.0.1
MPFR V=3.0.0
MPC V二0.8.2
LINUX V二2.6.34
GLIBC V=2.11.2
GLIBC-PORTS V=2.11
GDB V=7.1
构建过程详解
鉴于手工编译费时费力,统一把构建过程写到Makefile脚本文件中,把其同源码包放在同一目录下,执行make或顺次执行每个命令即可进行无人值守的编译安装交叉工具
链。以下主要以Makefile执行过程为主线进行讲解。
执行“make”命令实现全速运行
可在Cygwin的Shell环境下执行“make>make.log 2>&1”命令把编译过程及出现的错误都输出到make.log中,便于查找:
all:prerequest install-deps install-cross-stage-one install-
cross-stage-two
预处理操作
"make prerequest',命令实现单步执行的第一步,实现输出变量、建立目录及解压源码包等操作。0'set十h”关闭bash的Hash功能,使要运行程序的时候,shell将总是搜索PATH里的目录[4]。这样新工具一旦编译好,shell就可以在$(SYSROOT)/bin目录里找到: prerequest:
set +h&&mkdir -p $(SYSROOT)/bin&&
mkdir -p $(PREFIX)/include&&
mkdir -p $(TEMP一REFIX)&&
export PATH LCes ALL&&
tar -xvf gmp-$(GMP_V).tar.bz2&&
tar -xvf mpfr-$(MPFR_V).tar.bz2&&
tar -xvf mpc-$(MPC_V).tar.gz&&
tar -xvf binutils-$(BINUTILS_V).tar.bz2&&
tar -xvf gcc-$(GCC_V).tar.bz2&&
tar -xvf linux-$(LINUX_V).tar.bz2&&
tar -xvf glibc-$(GLIBC_V).tar.bz2&&
tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&&
my glibc-ports-$(GLIBC-PORTS_V)
glibc-$(GLIBC_V)/ports&&
tar -xvf gdb-$(GDB V).tar.bz2
非交叉编译安装gcc支持包mpc
00make install-deps”命令实现单步执行的第二步,实现mpc本地编译,mpc依赖于gmp和mpfr
install-deps:gmp mpfr mpc
gmp:gmp-$(GMP_V)
mkdir -p build/gmp&&cd build/gmp&&
../../gmp-*/configure
--disable-shared --prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
mpfr:mpfr-$(MPFR_V)
mkdir -p b-uild/mpfr&&cd build/mpfr&&
../..//mpfr-*/configure
LDF'LAGS="-Wl,-search_paths_first”--disable-shared
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS) all&&$(MAKE) install
mpc: mpc-$(MPC_V) gmp mpfr
mkdir -p build/mpc&&cd build/mpc&&
../../mpc-*/configure
--with-mpfr=$(TEMP PREFIX)
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
交叉编译第一阶段
"make install-cross-stage-one',命令实现单步执行的第三步,编译安装binutils,bootstrap-gcc和获取Linux内核头文件:
install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers
编译安装binutils
cross-binutils: binutils-$(BINUTILS_ V)
mkdir -p build/binutils&&cd build/binutils&&
../..//binutils-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-nls&&
$(MAKE)j$(PROCS)&&$(MAKE) install
编译安装bootstrap-gcc。使用一disable-shared参数的意思是不编译和安装libgcc_ eh.a文件。glibc软件包依赖这个库,因为它使用其内部的一lgcc_eh来创建系统[6]。这种依赖
性,可通过建立一个指向libgcc.a符号链接得到满足,因为该文件最终将含有通常在libgcc- eh.a中的对象(也可通过补丁文件实现)。
cross-gcc:gcc-$(GCC_V)
mkdir -p build/gcc&&cd build/gcc&&
二//gcc-*/configure
--target=$(TARGET)--prefix=$(SYSROOT)
--disable-nls --disable-shared --disable-multilib
--disable-decimal-float--disable-threads
--disable-libmudflap --disable-libssp
--disable-libgomp --enable-languages=c
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) -j$(PROCS)&&$(MAICE) install&&
In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I
sed's/libgcc/& eh/'}
获取Linux内核头文件:
get-kernel-headersainux-$(LINUX_V)
cd linux-$(LINUX_V)&&
$(MAICE) mrproper&&$(MAKE) headers check&&
$(MAKE) ARCH=arm&&
INSTALLes HDR_ PATH=dest headers_ install&&
find dest/include
(-name .install一。-name ..installNaNd)-delete&&
cp -rv desdinclude/* $(PREFIX)/include
交叉编译第二阶段
编译安装glibc、重新编译安装binutils、完整编译安装gcc和编译安装gdb o "make install-cross-stage-two',命令实现单步执行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb
编译安装glibca glib。的安装路径特意选为$(PREFIX),与gcc更好找到动态链接库也有关系,选在$(SYSROOT)提示找不到crti.o; glibc已经不再支持i386; glibc对ARM等的处理器的支持主要通过glibc-ports包来实现;正确认识大小写敏感(Case Sensitive)和大小写不敏感(CaseInsensitive)系统,大小写敏感问题主要影响到glibc,是交叉编译glibc成功的关键:Cygwin帮助手册中可知Cygwin是默认大小写不敏感的n},但是UNIX系统是大小写敏感的,这也是Cygwin和UNIX类系统的一个区别。通过作者自行参考制作的glibc-2.11.2-cygwin.patch补T使glibc变为Case-Insensitive,此补丁主要是对大小写敏感问题改名来实现。
交叉编译过程中安装的链接器,在安装完Glibc以前都无法使用。也就是说这个配置的forced unwind支持测试会失败,因为它依赖运行中的链接器。设置libc_ cvforced unwind=yes这个选项是为了通知configure支持force-unwind,而不需要进行测试。libc cv_c_cleanup=yes类似的,在configure脚本中使用libc_cv_c cleanup=yes,以便配置成跳过测试而支持C语言清理处理。
cross-glibc:glibc-$(GLIBC_V)
cd glibc-$(GLIBC_V)&&
patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&&
cd..&&mkdir -p build/glibc&&
cd build/glibc&&
echo"libc cv_forcedes unwind=yes">config.cache&&
echo "libc cv_c_cleanup=yes">>config.cache&&
echo "libc cv_arm_tls=yes">>config.cache&&
../../glibc-*/configure --host=$(TARGET)
--build=$(../OneScheme/glibc-2.11.2/scripts/config.guess)
--prefix=$(PREFIX)--disable-profile
--enable-add-ons --enable-kernel=2.6.22.5
--with-headers=$(PREFIX)/include
--cache-file=config.cache&&
$(MAKE)&&$(MAKE) install
重新编译安装binutils。编译之前要调整工具链,使其
指向新生成的动态连接器。
调整工具链:
SPECS=
'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs
arm-linux-gcc -mpspecs
sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}"
>$SPECS
echo "New specs file is: $SPECS"
unset SPECS
测试调整后工具链:
echo 'main(川’>mmy.c
arm-linux-gcc
-B/cross-root/arm-linux/lib mmy.c
readelf -1 a.out I grep’:/cross-roobarm-linux'
调整正确的输出结果:
[Requesting program interpreter: /tools/lib/ld-linux.so.2j
一切正确后删除测试程序:
rm -v mmy.c a.out
重新编译binutils。指定--host,--build及--target,否则配置不成功,其config.guess识别能力不如gcc做的好。
cross-rebinutils: binutils-$(BINUTILS_V)
mkdir -p build/rebinutils&&
cd build/rebinutils&&CC="$(TARGET)-gcc
-B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&&
RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--disable-nls
--with-lib-path=$(PREFIX)/lib&&
$(MAKE)--$(PROCS)&&$(MAKE) install
高于4.3版的gcc把这个编译当作一个重置的编译器,并且禁止在被一prefix指定的位置搜索startfiles。因为这次不是重置的编译器,并且$(SYSROOT)目录中的startfiles对于创
建一个链接到$$(SYSROOT)目录库的工作编译器很重要,所以我们使用下面的补丁,它可以部分还原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch
在正常条件下,运行gcc的fixincludes脚本,是为了修复可能损坏的头文件。它会把宿主系统中已修复的头文件安装到gcc专属头文件目录里,通过执行下面的命令,可以抑
制fixincludes脚本的运行[9](此时目录为/gcc-4.5.0)。
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@'
gcc/Makefile.in.orig > gcc/Makefile.in
下面更改gcc的默认动态链接器的位置,使用已安装在/cross-root/ann-linux目录下的链接器,这样确保在gcc真实的编译过程中使用新的动态链接器。即在编译过程中创建的所有
二进制文件,都会链接到新的glibc文件
for file in
$(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h)
do cp -uv $file{,.orig}
sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g’-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo‘
#undef STANDARD INCLUDE DIR
#define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include"
#define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib"
#define STANDARD_ STARTFILE_ PREFIX_ 2””’>>$file
touch $file.orig done
完整编译安装gcc。最好通过指定--libexecdir更改libexecdir到atm-linux目录下。--with-local-prefix选项指定gcc本地包含文件的安装路径此处设为$$(PREFIX),安装后就会在内核头文件的路径下。路径前指定$(Pwd)则以当前路径为基点,不指定则默认以/home路径为基点,这点要注意。
cross-g++:gcc-$(GCC-)
mkdir -p build/g十+&&cd build/g++&&
CC="$(TARGET)-gcc AR=$(TARGET)-ar&&
-B/cross-roodarm-linux/lib/"&&
RANLIB=$(TARGET)-ranlib&&
..//gcc-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--with-local-prefix=$(PREFIX)
--enable-clocale=gnu --enable-shared
--enable-threads=posix --enable -cxa_atexit
--enable-languages=c,c++--enable-c99
--enable-long-long --disable-libstdcxx-pch
--disable-libunwind-exceptions
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) LD_IBRARY_ATH=
$(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&&
$(MAKE) install
编译安装gdb,至此完成整个工具链的制作。
cross-gdb: gdb-$(GDB V)
mkdir -p build/gdb&&cd build/gdb&&
../../gdb-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-werror&&
$(MAKE)-j$(PROCS)&&$(MAKE) install
“make clean”命令清除编译生成的文件和创建解压的文件夹
.PHONY:clean
dean:
rm -fr $(TEMP_PREFIX) build
binutils-$(BINUTIL,S_V) gcc-$(GCC_V)
glibc-$(NEWL.IB_V) gdb-$(GDB_V)
gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V)
工具链测试
命令行中输入以下内容:
echo 'main(){}’>mmy.c
arm-linux-gcc -o mmy.exe mmy.c
file mmy.exe
运行正常的结果:
mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.
❸ 传奇服务端脚本命令
1、常用命令
#IF ;如果
#SAY ;输出字符串
#ACT ;执行命令
break ;结束命令
close ;结束对话
2、人物条件命令
CHECKITEM 物品名 数量 ;检测当前人物所带物品及数量
CHECKGOLD 数量 ;检测当前人物所带金币数量
CHECKLEVELEX (>,<,=) 等级数 ;检测当前人物等级
CHECKCREDITPOINT (>,<,=) 声望数 ;检测当前人物声望
CHECKJOB (Warrior,Wizard,Taoist) ;检测当前人物所属职业
CHECKHUM 地图名 数量 ;检测指定地图的玩家数量
CHECKITEMW 物品名 数量 ;检测当前人物是否佩带指定物品
CHECKDURAEVA 物品名 数值 ;检测当前人物所带矿物等物品的品质
CHECKBAGGAGE ;检测当前人物的背包是否已满
ONLINELONGMIN (>,<,=) 时长 ;检测当前人物在线时长
CHECKCASTLEDOOR (损坏,开启,关闭) ;检测沙城城门状态
CASTLEWARAY (>,<,=) 天数 ;检测上次攻城到现在的天数
CASTLECHANGEDAY (>,<,=) 天数 ;检测沙巴克占领天数
CHECKOFGUILD 行会名称 ;检测当前人物行会名称
CHECKNAMELIST 角色名列表.txt ;检测当前人物角色名是否在列表中
CHECKGUILDLIST 行会列表.txt ;检测当前人物行会是否在列表中
CHECKACCOUNTLIST 帐号列表.txt ;检测当前人物帐号是否在列表中
CHECKIPLIST IP列表.txt ;检测当前人物IP是否在列表中
CHECKACCOUNTIPLIST 帐号和IP列表.txt ;检测当前人物登录帐号与IP是否与列表中匹配
CHECKNAMEIPLIST 角色名和IP列表.txt ;检测当前人物角色名称与IP是否与列表中匹配
ISADMIN ;检测当前人物是否为管理员
HAVEGUILD ;检测当前人物是否加入行会
ISCASTLEGUILD ;检测当前人物是否为沙城成员
ISCASTLEMASTER ;检测当前人物是否为沙城老大
ISGUILDMASTER ;检测当前人物是否为行会老大
ISNEWHUMAN ;检测当前人物是否为新人
CHECKSLAVECOUNT (>,<,=) 数量 ;检测传奇私服人物所带宠物的数量
CHECKSLAVELEVEL (>,<,=) 等级数(7) ;检测当前人物所带宠物的等级
CHECKEXP (>,<,=) 经验值 ;检测当前人物经验值
CHECKPOSELEVEL (>,<,=) 等级数 ;检测当前人物对面人物的等级
CHECKPOSEGENDER 性别(男,女) ;检测当前人物对面人物的性别
CHECKMEMBERLEVEL 类型 (>,<,=) 等级数 ;检测当前人物的会员等级
CHECKMEMBERTYPE (=,>,<) 类型数 ;检测当前人物的会员类型
CHECKRENEWLEVEL (=,>,<) 转生次数 ;检测当前人物的转生次数
CheckBagSize 数量 ;检测当前人物背包空格数
CHECKDC (=,>,<) 攻击下限 (=,>,<) 攻击上限 ;检测当前人物攻击力的上限及下限值
CHECKMC (=,>,<) 魔法下限 (=,>,<) 魔法上限 ;检测当前人物魔法力的上限及下限值
CHECKSC (=,>,<) 道术下限 (=,>,<) 道术上限 ;检测当前人物道术力的上限及下限值
CHECKHP (=,>,<) HP下限 (=,>,<) HP上限 ;检测当前人物HP值的上限及下限值
CHECKMP (=,>,<) MP下限 (=,>,<) MP上限 ;检测当前人物MP值的上限及下限值
CHECKUSEITEM 物品位置 ;检测当前人物身上指定位置是否戴物品
CHECKITEMTYPE 物品位置 物品类型 ;检测当前人物身上指定位置戴的物品是否为指定类型
CHECKGAMEPOINT 活力值 ;检测当前人物活力值
ISLOCKPASSWORD ;检测当前人物的仓库是否解锁
PASSWORDERRORCOUNT (=,>,<) 次数 ;检测当前人物输入仓库密码错误次数
CheckRangeMonCount 地图号 X Y 范围 (=,>,<) 数量 ;检测一个坐标范围内怪物数量
CheckMonMap 地图号 数量 ;检测一个指定地图内的怪物数量
CHECKMON 数量 ;检测私服人物所在地图内的怪物数量
CHECKSKILL 技能名称 (=,>,<) 修炼等级 ;检测当前人物已学技能
3、地图功能命令
MAP 地图名 ;将当前人物移动到指定地图
MOVEMAP 地图名 X Y ;将当前人物移动到指定地图的指定坐标
TIMERECALL 时间值 ;指定当前人物到达多少时间后被传回这里
BREAKTIMERECALL ;中断指定人物达多少时间后被传回这里
RECALLMOB 怪物名称 宝宝等级(最高为 7) 叛变时间(分钟) 是否自动变色(0、1)固定颜色(1-7);给予当前人物指定怪物为宝宝
setautogetexp 命令 时间 经验 是否安全区(0为任何地方) 地图号(任何地图请不用填);指定当前人物在线泡经验(直接得到经验)
GAMEGOLD (=,+,-) 数量 ;调整当前人物的元宝数量
SETRANKLEVELNAME 封号 ;调整当前人物的封号
ADDGUILDLIST 行会列表.txt ;将当前人物行会名加入列表
DELGUILDLIST 行会列表.txt ;将当前人物行会名从列表删除
ADLNAMELIST 角色名列表.txt ;将当前人物角色名加入列表
DELNAMELIST 角色名列表.txt ;将当前人物角色名从列表删除
CLEARNAMELIST 列表.txt ;清除列表内的所有信息
HAIRSTYLE 数值 ;调整当前人物的发型
CHANGENAMECOLOR 数值 ;调整当前人物的名字颜色
CHANGEJOB 职业名称(Warrior,Wizard,Taoist) ;调整当前人物的所属职业
CHANGEGENDER 数值 ;调整重庆市人物的所属性别
ADDSKILL 技能名称 技能等级 ;给予当前人物添加指定技能
DELSKILL 技能名称 ;删除当前人物的指定技能
SKILLLEVEL 技能名称 (=,+,-) 技能等级 ;调整当前人物的指定技能为指定等级
DELNOJOBSKILL ;删除当前人物非本职业的所有技能
CLEARSKILL ;删除当前人物的所有技能
GAMEPOINT (=,+,-) 数量 ;调整当前人物的活力值
CREDITPOINT (=,+,-) 数量 ;调整当前人物的声望点数
SETMEMBERLEVEL (=,+,-) 等级数 ;调整当前人物的会员等级
SETMEMBERTYPE (=,+,-) 等级数 ;调整当前人物的会员类型
CHANGELEVEL (=,+,-) 等级数 ;调整当前人物的等级
CHANGEPKPOINT (=,+,-) 点数 ;调整当前人物的PK点数
CHANGEEXP (=,+,-) 经验值 ;调整当前人物的经验值
CHANGEMODE 模式类型(1管理模式、2无敌模式、3隐身模式) 开关(1为开,0为关) ;调整当前人物的游戏模式
CHANGEPERMISSION 权限等级 ;调整当前人物的权限等级
KILLMONEXPRATE 倍率 有效时间 ;调整当前人物的杀怪经验倍率
POWERRATE 倍率 有效时间 ;调整当前人物的攻击力倍率
KICK ;将当前人物踢下线
KILL 数值 ;将当前传奇私服人物杀死,并设置杀死类型
KILLSLAVE ;将当前人物的宝宝全部杀死
CLEARPASSWORD ;清除当前人物的仓库密码
RestRenewLevel ;将人物的转生次数复位为零,即未转生
DELMARRY ;清除当前人物的结婚信息
DELMASTER ;清除当前人物的拜师信息
RENEWLEVEL 转次数 转后等级 0 ;将当前人物转生,并设置转生次数以及转生后人物等级跳到多少级
SENDMSG 信息类型代码 %s信息内容%d ;发送文字信息
CLEARMAPMON 地图号 ;清除指定地图的所有怪物
RESTBONUSPOINT ;清楚当前人物的属性点
PARAM1 地图 ;NPC指定刷怪地图
PARAM2 横坐标 ;NPC刷怪X坐标
PARAM3 纵坐标 ;NPC刷怪Y坐标
MONGEN 怪物名称 数量 时间 ;NPC刷怪命令+怪物+数量+时间
takew可以取走身上装备的物品)
mapmove 移动地图(例如:mapmove 0 634 612)
map 移动地图(不需要具体坐标.例如:map 0)
timerecall 在规定时间内召回(timerecall 5 在5分钟之内召唤回原地图)
takecheckitem 收取checkitem过的物品(不加任何参数)
monclear 清空地图怪物(monclear 0 清空0地图上的所有怪物)
exchangemap 互换地图(exchangemap 地图代码)
recallmap 把某地图的人召唤过来(recallmap 地图代码)
batchmove 3 (此3个连用可以瞬移地图用于赌场)
3、定义变量
RANDOM 随机数 ;一般用在#IF语句中作为触发#IF机率,
EQUAL 变量名 数值 ;检测变量是否等于指定数值
LARGE 变量名 数值 ;检测变量是否大于指定数值
SMALL 变量名 数值 ;检测变量是否小于指定数值
MOV 变量名 数值 ;给予变量赋于指定值
INC 变量名 数值 ;给予变量加上指定值
DEC 变量名 数值 ;给予变量减去指定值
SUM 变量名A 变量名B ;将两个变量相加
MOVR 数值 ;变量赋予小于指定数值的随机非负数
<$STR(变量)> ;把变量转为字符串
SET [变量名] 数值 ;定义变量
RESET [变量名] 连续数字 ;连续将变量清零
CHECK [变量数值] 数值 ;检测变量是否等于指定数值
(3)服务器phony导入脚本命令扩展阅读
传奇服务器脚本命令常见错误
1、错误一:
#if
RANDOM 3
#act
goto 1
break
#if
RANDOM 3
#act
goto 2
break
#if
RANDOM 3
#act
goto 3
break
很多人认为random的具体运行是首先在3以下随机取一个值,然后该脚本内的random 3都不再取值了。那样理解的时候goto 1、2、3的几率是相等的,都是1/3。
这是一个理解上的错误,实际这里运行的操作是这样的,到达1的几率为1/3,到达2的几率为先2/3然后1/3就是2/9。而到达3的几率则为2/3然后2/3然后1/3实际几率为4/27!
2、错误二:
#if
RANDOM 3
#act
goto 1
break
#if
RANDOM 2
#act
goto 2
break
#if
RANDOM 1
#act
goto 3
break
有人认为在第一个random的时候会给一个隐藏的值在3以下做一个赋值。然后以后的random就是检测是否自己的random值和这个隐藏值相同,如果相同则#act。
这个也是一种错误理解,虽然同是对random理解错误造成的,但是该错误与错误一理解上是不同的。但是这种随机的设计方式是提倡的,利用P变量的随机取值是可以完成的。