VirtualBox

这些是我在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中普遍禁用它。
上次修改 12年前 上次修改于 2013年5月14日 09:04:29 AM
注意: 查看 TracWiki 获取使用维基的帮助。

© 2025 Oracle 支持 隐私 / 请勿出售我的信息 使用条款 商标政策 自动化访问礼仪