这些是我在Linux主机上设置交叉编译器以构建Solaris Additions的笔记。我使用了binutils软件包的2.19版本和gcc的4.3.6版本(未修改的3.4.3无法为Solaris构建64位目标文件,而4.4及更高版本与Solaris 11头文件不兼容)。首先创建安装目录
$ TARGET=$HOME/cross # Where the tool chain will be installed to $ SYSROOT=$TARGET/sysroot # Where the Solaris headers and libraries will be installed to $ mkdir $TARGET $ mkdir $SYSROOT
并将Solaris 11系统上已安装VirtualBox构建先决条件的/lib
、/usr/lib
、/usr/include
和/usr/platform
复制到$SYSROOT
(即$SYSROOT/lib
等)。现在构建binutils。请注意,binutils和gcc要求您在构建之前自行创建输出目录——如果您在源目录中构建,它将对目录树造成不可逆的更改。
$ mkdir binutils-out $ cd binutils-out $ ../binutils-2.19.1/configure --target=i386-pc-solaris2.11 --prefix=$TARGET \ --with-sysroot=$SYSROOT -v $ make CFLAGS="-Os -w" # The -w is because the build produces fatal warnings otherwise $ make install
现在构建gcc。
$ mkdir gcc-out $ cd gcc-out $ PATH=$TARGET/bin:$PATH ../gcc-4.3.6/configure --target=i386-pc-solaris2.11 \ --with-gnu-as --with-gnu-ld --prefix=$TARGET --with-sysroot=$SYSROOT \ --disable-libgcj --enable-languages=c,c++ --enable-shared --enable-multilib -v $ PATH=$TARGET/bin:$PATH make CFLAGS=-Os $ PATH=$TARGET/bin:$PATH make install
Solaris打包工具可在Linux上以heirloom-pkgtools
的形式获取,并可以tarball形式从http://heirloom.cvs.sourceforge.net/heirloom/heirloom-pkgtools/下载。我必须
- 修复
libpkg/pkgtrans.c
第1013行的open调用(改为open(tmp_file, O_RDWR, O_CREAT)
) - 修复
libpkg/pkgtrans.c
的第1151、1164、1595和1827行中的cpio命令行,删除“-D” - 修复
libpkg/runcmd.c
第180行的execl调用,使用“/bin/sh” - 将libpkg/verify.c第328行的
sizeof (unsigned long)
替换为常量4(变为ucp += 4;
)。有人没有考虑到64位系统。 - 安装
flex
要构建这些工具,请执行
$ mkdir -p $TARGET/var/spool/pkg $ make SHELL=/bin/sh INSTALL=/usr/bin/install ROOT=$TARGET/ VAR=$TARGET/var \ BINDIR=/bin SBINDIR=/sbin ETCDIR=$TARGET/etc MANDIR=/usr/share/man $ make SHELL=/bin/sh INSTALL=/usr/bin/install ROOT=$TARGET/ VAR=$TARGET/var \ BINDIR=/bin SBINDIR=/sbin ETCDIR=$TARGET/etc MANDIR=/usr/share/man install
现在构建VirtualBox(此命令行只构建Additions)。
$ . ./env.sh $ GCC_EXEC_PREFIX=$TARGET/lib/gcc/ \ PATH=$TARGET/i386-pc-solaris2.11/bin:$TARGET/bin:$PATH \ kmk VBOX_ONLY_ADDITIONS=1 KBUILD_TARGET=solaris KBUILD_TARGET_ARCH=amd64 \ VBOX_SOLARIS_SYS_INCS:="$SYSROOT/usr/platform/i86pc/include $SYSROOT/usr/include" \ VBOX_SOL_PKG_DEV=/home/michael/cross/var/spool/pkg \ "TEMPLATE_VBOXR3EXE_LDFLAGS=-Wl,-rpath=/usr/sfw/lib -Wl,-rpath=/usr/sfw/lib/64"
要构建Additions包,请像往常一样在Additions构建命令末尾加上“packing”并重新运行。
注意事项
- GNU库的runpath必须在命令行中设置(参见上面命令中的“TEMPLATE_VBOXR3EXE_LDFLAGS=...”)。
- heirloom-pkgtools似乎有很多bug,需要进行一些修补才能正常工作。实际上,我们使用它们的目的只是1)复制文件并通过稍微sed处理另一个文件来创建ASCII文件(pkgmap)并添加校验和,以及2)创建实际的包文件,它只是两个cpio归档文件,附加了非常基本的自定义头,并粘合在一起。因此,完全不使用pkgtools来完成相同的事情会非常简单。
- Additions构建成功,但在构建主机代码时,我遇到了栈保护已启用但Solaris C库不支持的问题。这里有各种可能的修复方法(包括在构建VBox代码时注入-fno-stack-protector),但我不知道如何在我们构建的gcc中普遍禁用它。
注意: 查看 TracWiki 获取使用维基的帮助。