VirtualBox

Mac OS X 构建说明

Mac OS X 上的先决条件

  • 在 Intel 硬件上运行的 10.10.x (Yosemite) 或更高版本(**不**支持 PowerPC 硬件,也不支持构建 X11 变体)。
  • 与您的 Mac OS X 版本匹配的 Xcode (http://developer.apple.com/tools/download/)。直到最近,官方构建都使用 Xcode 6.2 完成(您可以使用 tools/darwin.amd64/bin/xcode-6.2-extractor.sh 脚本在更高版本的 OS X 上“安装”必要的组件)。
  • 来自 MacPorts 的一些组件 (http://www.macports.org/)。
    安装 MacPorts 后,请务必确保以下两行在您的 ~/.profile~/.zprofile 文件中,并且实际加载到您正在使用的 shell 中
    export PATH=/opt/local/bin:/opt/local/sbin:$PATH
    export MANPATH=/opt/local/share/man:$MANPATH
    

然后执行以下命令

sudo port install libidl acpica yasm subversion doxygen texlive texlive-latex-extra texlive-fonts-extra x86_64-elf-gcc

Doxygen、texlive* 和 x86_64-elf-gcc 是可选的(前两者用于文档,后者用于验证工具包)。

  • 在较新版本的 OS X 上加载自建内核扩展 (kexts) 可能需要更改系统配置,除非您拥有 kext 签名证书并且运行的是 10.14 (High Sierra) 或更早版本。对于 10.11 (El Capitan) 及更高版本,请启动到恢复分区并启用未签名 kext 的加载
    csrutil enable --without kext
    
    或完全禁用 SIP
    csrutil disable
    
    对于 10.15 (Catalina) 及更高版本,您还需要禁用重启要求(同样从恢复分区操作)
    spctl kext-consent disable
    
    如果您运行的是 10.10 (Yosemite),有一个 boot-args 选项允许加载未签名 kext。运行以下命令并重启
    sudo nvram boot-args="kext-dev-mode=1"
    

构建 VirtualBox

  1. 进入源代码的根目录并执行 configure 脚本
    ./configure --disable-hardening
    
    如果出现与架构相关的问题,您可以手动设置目标架构为 --target-arch=x86amd64

如果它找到所有需要的东西,它将创建一个名为 !AutoConfig.kmk 的文件,其中包含您系统上各种工具的路径。此外,它还将创建一个名为 env.sh 的环境设置脚本。此步骤只需执行一次(如果您的构建工具设置发生更改,您可能需要重复此步骤,但请记住这两个输出文件都将被覆盖)。

  1. 每当您想构建 VirtualBox 时,您都必须打开一个 shell 并 source 生成的环境设置脚本 env.sh,即执行
    . ./env.sh
    
  1. 要构建,请键入
    kmk
    
    默认是发布版本构建,如果您希望进行调试性能分析构建,请将 BUILD_TYPE=debugBUILD_TYPE=profile 添加为 kmk 的参数,或将其作为环境变量导出到您的 shell 中。

运行 VirtualBox

  1. 加载所有内核扩展模块。这些模块位于 out/darwin.x86/release/dist 中,同时还有一个用于加载它们的小脚本 (loadall.sh)。执行并确保模块成功加载。
  2. 进入 out/darwin.x86/release/dist/VirtualBox.app/Contents/MacOS/
  3. 运行 ./VirtualBox

为分发构建 OSE 包

在创建用于再分发的包时,**切勿**禁用强化(参见上一节)。

强化需要一些额外的配置和构建后步骤。VirtualBox 的默认安装目录是 /Applications/VirtualBox.app/。如果您想更改它,例如更改为 /Applications/OpenSource/VirtualBox.app/,您需要在 LocalConfig.kmk 中添加以下内容

VBOX_PATH_APP_PRIVATE      = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS"
VBOX_PATH_APP_PRIVATE_ARCH = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS"
VBOX_PATH_SHARED_LIBS      = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS"
VBOX_PATH_APP_DOCS         = "/Applications/OpenSource/VirtualBox.app/Contents/MacOS"

禁用一些仅用于开发的内容(例如测试用例)可能也有意义。将以下内容添加到 LocalConfig.kmk

VBOX_WITH_TESTSUITE=
VBOX_WITH_TESTCASES=

从 VirtualBox 4.1 开始,会创建额外的调试符号。您可以通过将以下内容添加到 LocalConfig.kmk 来阻止此行为

kBuildGlobalDefaults_LD_DEBUG=

接下来重建 VirtualBox 并将其安装到 /Applications/OpenSource/。不支持将 VirtualBox 安装到目标目录。只需将文件复制到目标位置。现在请确保 setuid 存根具有正确的权限

sudo chown -R root:admin /Applications/OpenSource/VirtualBox.app/
sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VirtualBox
sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VirtualBoxVM
sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VBoxHeadless
sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VBoxNetAdpCtl
sudo chmod u+s /Applications/OpenSource/VirtualBox.app/Contents/MacOS/VBoxNetDHCP

强化的另一个要求是 VirtualBox.app/ 父目录的每个路径组件都归 root 所有,并且不可由 world 写入。请确保情况如此。

所用库中的相对路径与绝对路径

如果在启动 VirtualBox 时看到类似以下错误,则需要将所用库更改为使用绝对路径。

VirtualBox: supR3HardenedMainGetTrustedMain: dlopen("/Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib",) failed: \
 dlopen(/Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib, 10): Library not loaded: QtCore.framework/Versions/4/QtCore
  Referenced from: /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib
  Reason: unsafe use of relative rpath QtCore.framework/Versions/4/QtCore in /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib with restricted binary

在 Mac OS X 上,当可执行文件是 setuid 时,不允许使用相对路径的库来引用其他库。您可以通过以下命令显示所有链接的库

otool -L /Applications/VirtualBox.app/Contents/MacOS/VirtualBox.dylib

接下来,假设 Qt 已安装在 /Applications/VirtualBox.app/Contents/Frameworks/ 中,您可以使用此命令更改路径

install_name_tool -id /Applications/VirtualBox.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui \
 /Applications/VirtualBox.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui
install_name_tool -change @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore \
 /Applications/VirtualBox.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore \
 /Applications/VirtualBox.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui

第一个命令更改库本身的标识符。第二个命令更改对其他库的引用。其中,第一个路径是旧的引用路径,第二个是新路径,最后一个路径是要更改的文件(参见 man install_name_tool)。请注意,您需要对所有涉及的库重复此操作(至少包括 VirtualBox.dylibQtCoreQtGuiQtNetworkQtOpenGl)。

上次修改 4 年前 上次修改于 2021/02/03 下午 04:24:28
注意: 查看 TracWiki 获取使用维基的帮助。

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