Introducción
Es un hecho bien conocido para muchos usuarios de la versión de Windows de VirtualBox (de ahora en adelante,
VB ; no debe confundirse con Visual Basic) que a partir de 4.3.14 los desarrolladores agregaron el llamado "endurecimiento" diseñado para prevenir inyecciones maliciosas en VB. Aunque las intenciones fueron buenas, la implementación causó numerosos conflictos con productos totalmente legítimos, como antivirus, módulos criptográficos e incluso algunas actualizaciones de Windows, y cuando se produce dicho conflicto, VB simplemente deja de funcionar. Los usuarios tienen que esperar al menos un mes hasta que se lance la nueva versión VB con las exclusiones adecuadas agregadas. El peor de los casos es que la aplicación o actualización en conflicto tiene que ser desinstalada, o VB en sí debe ser degradado a la versión 4.3.12, que fue la última sin endurecerse. Numerosas solicitudes para agregar una lista de exclusión controlada por el usuario, o una opción para deshabilitar el endurecimiento, quedan sin respuesta. La única respuesta de los desarrolladores suena como "si no quiere que lo construya usted mismo a partir del código fuente". Bueno, parece que tendremos que hacerlo.
Aunque las instrucciones de compilación se
describen en el Wiki oficial del proyecto, están incompletas y algo desactualizadas, mientras que el procedimiento de compilación a menudo falla con mensajes de error vagos. Entonces, cuando, al final, lo puse a trabajar, pensé que valía la pena documentarlo en detalle en un artículo separado. Esta instrucción se actualiza periódicamente y, por el momento, está adaptada para compilar la versión 6.0.4 de VB. Sin embargo, si necesita información sobre la creación de versiones anteriores de VB o bibliotecas auxiliares, siempre puede obtenerla del
historial de cambios .
Tabla de contenidos
» Declaración del problema
» Una palabra de advertencia
» Preparación del entorno de construcción
» Aplicaciones Quirks de instalación
» Toques finales
» Construyendo VirtualBox
» Epílogo
» Enmiendas
Declaración del problema
Al principio, quería simplificarlo simplemente reconstruyendo los componentes binarios y copiándolos encima de la versión instalada desde la distribución oficial. Sin embargo, eso estuvo lejos de ser simple porque la instalación se basa en una API oscura del sistema y requiere la instalación de controladores y el registro de componentes COM. Me preguntaba si era viable aprender cómo funcionaba todo esto y escribir un guión para automatizar estas tareas, pero después de considerarlo decidí ir a lo grande y construir una distribución completa que fuera lo más cercana posible a la oficial, solo sin endurecimiento
Tengo que decir que esta tarea resultó ser muy difícil y no pude cumplirla al 100%. Me he topado con las adiciones de invitados que se proporcionan para Windows (32 y 64 bits), OS / 2, Linux y algunos otros sistemas * NIX. Los comentarios en el Makefile correspondiente mencionan que todos están construidos en diferentes máquinas remotas, y definitivamente no estaba ansioso por administrar una fábrica de este tipo. Entonces, mi solución final fue construir todo a partir de códigos fuente, excepto las Adiciones, pero tomar la imagen ISO oficial con ellos y simplemente ponerlo en mi distribución tal como está. No he comprobado si las Adiciones tienen el mismo mecanismo de endurecimiento, pero incluso si lo tienen, nunca he escuchado ninguna queja al respecto.
Una palabra de advertencia
• Consideraciones de seguridad
El endurecimiento no se agregó por capricho, fue una solución para cerrar una vulnerabilidad en VB. Desafortunadamente, Oracle se niega a proporcionar la descripción detallada del problema, a pesar de que se solucionó hace muchos años. En general, tiene algo que ver con el mecanismo de inyección de DLL en Windows que, en el caso de VB, puede conducir a una elevación de privilegios no autorizada en la computadora host, y hay vulnerabilidades de trabajo para esta vulnerabilidad. Así que ten cuidado si decides usar una versión sin endurecimiento de todos modos.
• Firma de conductores
Comenzando con Vista, en las versiones de Windows de 64 bits, los usuarios ya no pueden cargar controladores arbitrarios. Los controladores deben estar firmados por un certificado con una cadena de certificados cruzados que llegue a la CA raíz de Microsoft (y en Windows 10 con Secure Boot habilitado, los controladores deben estar firmados por Microsoft). Antes de emprender el viaje de construcción de VB, debe decidir cómo resolver este problema. Puede gastar algo de dinero y comprar su propio certificado, o intentar ponerse en contacto con algunas compañías externas que brindan servicios de firma para proyectos de código abierto (si aceptan firmar controladores vulnerables), o configurar su Windows en el modo de prueba que permite cargar controladores firmado con un certificado de prueba generado localmente.
En el artículo implicaré principalmente el último escenario, pero mencionaré cómo cambia el procedimiento si tiene un certificado comercial "completo".
Preparación del entorno de construcción
La guía oficial recomienda usar Windows 7 a 10 como sistema de compilación. Hice todo el trabajo en Windows 7 SP1 x64, y no creo que la versión del sistema operativo afecte mucho al procedimiento. Por favor, tenga en cuenta que la máquina (real o virtual) que utilizará para construir VB debe tener conexión a Internet.
El entorno de construcción requiere bastantes herramientas. Si algún programa tiene una versión portátil, prefiero tomarla en lugar de usar el instalador.
Ahora, los siguientes programas solo se pueden obtener como distribuciones instalables (al menos, oficialmente). Para Visual Studio y SDK / WDK, es importante seguir el orden de instalación como se especifica a continuación. Una vez que haya terminado con ellos, le recomiendo ejecutar Windows Update y obtener las últimas actualizaciones para todos los productos de Microsoft.
Los otros programas se descargan como archivos portátiles o códigos fuente:
También necesitará los siguientes archivos:
¿Para qué deberías querer todo esto?Si no desea crear exactamente el mismo paquete que yo, es posible que pueda deshacerse de algunas de las herramientas mencionadas anteriormente. Así que aquí daré algunos detalles para su propósito en el proceso de compilación.
- SDK 8.1
La compilación real se realiza usando SDK 7.1, pero necesitará el programa SignTool de 8.1, porque el de 7.1 no puede realizar la firma dual SHA-1 / SHA-256. Si tiene SDK 8.1 instalado en otro lugar, simplemente puede copiar signtool.exe
con todas sus dependencias desde allí y especificar la ruta en el archivo LocalConfig.kmk
(ver más abajo ). - WiX
Este es el marco para crear paquetes MSI. Aunque la distribución final de VB es un EXE, contiene dos archivos MSI en su interior, por lo que necesita WiX para construirlos. Sin embargo, si solo tiene la intención de construir los archivos binarios VB sin empaquetarlos, puede hacerlo sin WiX. - Sdl
Esta biblioteca se usa para un VBoxSDL.exe
frontal simplista adicional que se puede usar en lugar de VirtualBox.exe
. En teoría, si no necesita ese componente, debería poder ejecutar la compilación sin tener SDL, pero no lo he intentado. - gSOAP
Esta biblioteca se utiliza para crear VBoxWebSrv.exe
, servicio de administración remota de VB. Si no tiene gSOAP, este componente se omitirá silenciosamente durante la compilación. - libvpx , libopus
Estos son los códecs de video y audio utilizados para grabar la pantalla de VM. Si no los tiene, la construcción aún finalizará con éxito, y VB todavía tendrá todas las opciones para la captura de video, pero estas opciones serán ignoradas (a pesar de que se reproducirá la animación de captura, no se guardará ninguna grabación real) . - Cygwin
Necesario para construir libvpx. - MiKTeX
MiKTeX se utiliza para compilar la documentación en PDF ( doc\UserManual.pdf
). Sin este programa, el PDF se omitirá silenciosamente de la construcción y el embalaje. - NASM
El ensamblador utilizado durante la construcción de OpenSSL. También puede compilarlo sin usar el ensamblador, pero aún así recomiendo usarlo para generar un código más optimizado.
Aquí está el resumen de todas las herramientas y bibliotecas que estoy usando, incluidas sus versiones exactas (cuando sea posible) y las rutas de instalación que elegí en mi sistema de compilación. La designación "
{x32|x64}
" se utiliza para ubicaciones separadas de instalación de versiones de 32 y 64 bits.
Programa / herramienta | Versión | Ruta de instalación |
---|
Estudio visual | Profesional 2010 | C:\Program Files (x86)\Microsoft Visual Studio 10.0\ |
SDK | 7.1 | C:\Program Files\Microsoft SDKs\Windows\v7.1\ |
SDK | 8.1 | C:\Programs\DevKits\8.1\ |
Wdk | 7.1.0 | C:\WinDDK\7600.16385.1\ |
Activeperl | 5.26.1 Build 2601 x64 | C:\Programs\Perl\ |
ActivePython | 2.7.14.2717 x64 | C:\Programs\Python\ |
WiX | 3.11.1.2318 | C:\Programs\WiX\ |
Qt | 5.6.3 | C:\Programs\Qt\5.6.3-{x32|x64}\ |
MinGW-32 | 4.5.4 | C:\Programs\mingw32\ |
MinGW-64 | 4.5.4 | C:\Programs\mingw64\ |
Cygwin | - | C:\Programs\cygwin64\ |
Sdl | 1.2.15 | C:\Programs\SDL\{x32|x64}\ |
rizo | 7.64.1 | C:\Programs\curl\{x32|x64}\ |
Openssl | 1.1.1b | C:\Programs\OpenSSL\{x32|x64}\ |
gSOAP | 2.8.82 | C:\Programs\gSOAP\ |
libvpx | 1.7.0 | C:\Programs\libvpx\ |
libopus | 1.3 | C:\Programs\libopus\ |
MiKTeX Portable | 2.9.6942 | C:\Programs\MiKTeX\ |
NASM | 2.14.02 x64 | C:\Programs\nasm\ |
DocBook XML DTD | 4.5 4.5 | C:\Programs\DocBook\xml\ |
Hojas de estilo DocBook XSL | 1.69.1 | C:\Programs\DocBook\xsl\ |
Aplicaciones Instalación Quirks
Aquí proporciono algunas instrucciones sobre la instalación de algunas de las herramientas antes mencionadas donde el procedimiento no es obvio o requiere acciones adicionales.
• Windows SDK v7.1
La instalación de este SDK probablemente fallará porque incluye las versiones obsoletas del compilador y las bibliotecas de tiempo de ejecución. Después de instalar VS 2010, hay versiones más nuevas de las presentes en el sistema, por lo que las más antiguas no se instalan y el instalador principal lo considera un error crítico. Para solucionar este problema, debe desmarcar las casillas de verificación correspondientes o, antes de instalar el SDK, desinstalar los paquetes nombrados como
"Microsoft Visual C ++ 2010 <arch> Redistributable" ,
"Microsoft Visual C ++ 2010 <arch> Runtime" ,
"Microsoft Compiladores de Visual C ++ ... " Deje que el SDK instale las versiones anteriores de esos y luego ejecute Windows Update para obtener las últimas versiones disponibles.
Cuando instale el SDK, asegúrese de verificar los ejemplos del programa (Windows Native Code Development -> Samples): contienen algunos scripts utilizados por las reglas de compilación de VB. Sin ellos, no podrá compilar los paquetes de MSI.
• Windows SDK v8.1
Solo necesita instalar el componente "Kit de desarrollo de software de Windows".
• WDK v7.1
Solo necesita instalar el componente "Construir entornos".
• Qt 5.6.3
Comenzando con Qt 5.7.0, para compilarlo necesita Visual Studio 2012 o posterior, por lo que estamos atascados con 5.6.x.
Como no hay compilaciones oficiales para Visual Studio 2010, tendremos que compilar Qt a partir del código fuente nosotros mismos.
- Descomprima el archivo de código fuente Qt en
C:\Programs\Qt\
y cambie el nombre del directorio qt-everywhere-opensource-src-5.6.3
a 5.6.3-src
. - Al lado, cree un directorio
build-x32
donde tendrá lugar la compilación. - Abra la consola y ejecute los siguientes comandos para preparar el entorno:
cd /d C:\Programs\Qt\build-x32 SET QTVER=5.6.3 "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 SET QTDIR=C:\Programs\Qt\%QTVER%-x32 SET PATH=%QTDIR%\bin;%PATH% SET QMAKESPEC=win32-msvc2010
El comando de color
es opcional, elimina el color verde establecido por el script SetEnv.Cmd
. - Ahora necesitamos ejecutar el script
configure.bat
desde 5.6.3-src
. VB no utiliza la mayor parte de lo que Qt incluye, por lo que podemos reducir significativamente el tiempo de compilación al deshabilitar varios componentes, pero tenga en cuenta que algunas opciones son cruciales para VB. Particularmente, he descubierto que:- OpenGL ES 2 no es compatible (al compilar VB, el compilador no puede encontrar algunos archivos de encabezado).
- El soporte de FreeType debe estar habilitado (de lo contrario, el complemento
qoffscreen
no se qoffscreen
y es necesario para VB).
Esta es la línea de comando completa con la que terminé: ..\5.6.3-src\configure.bat -prefix c:\Programs\Qt\5.6.3-x32 -mp -opensource -confirm-license -nomake tests -nomake examples -no-compile-examples -release -shared -pch -no-ltcg -accessibility -no-sql-sqlite -opengl desktop -no-openvg -no-nis -no-iconv -no-evdev -no-mtdev -no-inotify -no-eventfd -largefile -no-system-proxies -qt-zlib -qt-pcre -no-icu -qt-libpng -qt-libjpeg -qt-freetype -no-fontconfig -qt-harfbuzz -no-angle -incredibuild-xge -no-plugin-manifests -qmake -qreal double -rtti -strip -no-ssl -no-openssl -no-libproxy -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug -no-direct2d -directwrite -no-style-fusion -native-gestures -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdeclarative -skip qtdoc -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns
- La ruta de instalación de Qt especificada aquí (en la opción
-prefix
) está codificada en los archivos de código fuente intermedio por el script de configuración, por lo que los archivos binarios también lo recordarán. Cualquier aplicación basada en Qt creada con esta biblioteca buscará primero los complementos necesarios en esa ruta, y solo si no se pueden encontrar, usará su propia ubicación actual. En la mayoría de los casos esto está bien, pero supongamos que en la computadora donde está instalado nuestro VB, hay otra compilación de Qt ubicada en c:\Programs\Qt\5.6.3-x32
, pero compilada con diferentes opciones o por un compilador diferente. Entonces VB intentará cargar esos complementos (incompatibles) y bloquearse.
Hay dos formas posibles de evitar este problema. Primero se agrega a la instalación un archivo adicional llamado qt.conf
con el siguiente texto: [Paths] Plugins=.
La otra es arreglar esa ruta de instalación guardada antes de construir Qt, de modo que apunte al directorio de la aplicación. Decidí seguir el último camino, no me gustaba la idea de tener archivos adicionales a los que tenía la distribución Oracle VB. C:\Programs\Qt\build-x32\qtbase\src\corelib\global\qconfig.cpp
abrir el archivo C:\Programs\Qt\build-x32\qtbase\src\corelib\global\qconfig.cpp
creado por el script de configuración, busque la siguiente línea: static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=c:/Programs/Qt/5.6.3-x32";
y reemplace la ruta con un solo punto, para que esta línea se vea así: static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=.";
Este cambio solo afectará el comportamiento de tiempo de ejecución de VB. El paso de instalación de Qt usará la ruta original, porque ahora está almacenada en los Makefiles que no modificamos. - A continuación, ejecute la compilación con el comando
nmake
- E instale la biblioteca construida usando
nmake install
Ahora abra una nueva ventana de consola y haga lo mismo para la versión de 64 bits. Deberá reemplazar “x32” con “x64” en todas las rutas, y los comandos de preparación del entorno se verán así:
md C:\Programs\Qt\build-x64 cd /d C:\Programs\Qt\build-x64 SET QTVER=5.6.3 "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 SET QTDIR=C:\Programs\Qt\%QTVER%-x64 SET PATH=%QTDIR%\bin;%PATH% SET QMAKESPEC=win32-msvc2010
Una vez que haya terminado con la instalación, se pueden eliminar los directorios
build-x32
,
build-x64
y
5.6.3-src
.
• MinGW
Simplemente descomprima los archivos de 32 y 64 bits en sus respectivos directorios de instalación.
• Cygwin
Durante la instalación, debe elegir los paquetes
make
y
yasm
.
• SDL
- Descomprima el archivo SDL dos veces en rutas separadas:
C:\Programs\SDL\x32\
y C:\Programs\SDL\x64\
. - Mueva todos los contenidos del subdirectorio
C:\Programs\SDL\x64\lib\x64\
a su directorio padre (es decir, a C:\Programs\SDL\x64\lib\
), luego elimine los subdirectorios C:\Programs\SDL\x64\lib\x86
y x64
. - Haga lo mismo para la versión de 32 bits: mueva el contenido de
C:\Programs\SDL\x32\lib\x86\
a C:\Programs\SDL\x32\lib\
, luego elimine C:\Programs\SDL\x64\lib\x86
y x64
.
• NASM
Descomprima el archivo
nasm-2.14.02-win64.zip
en
C:\Programs\
, luego cambie el nombre del directorio resultante
nasm-2.14.02
como
nasm
.
• OpenSSL
- Descomprima el archivo OpenSSL en
C:\Programs\OpenSSL\
dos veces, renombrando las copias del directorio openssl-1.1.1b
como openssl-1.1.1b-x32
y openssl-1.1.1b-x64
. - Abra la consola, compile e instale la versión de 32 bits ejecutando:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 set PATH=%PATH%;C:\Programs\nasm cd /d C:\Programs\OpenSSL\openssl-1.1.1b-x32\ perl Configure VC-WIN32 no-shared --prefix=C:\Programs\OpenSSL\x32 --openssldir=C:\Programs\OpenSSL\x32\ssl nmake nmake test nmake install
Si el paso de configuración genera una advertencia aterradora sobre un compilador faltante, por favor, ignore este mensaje, está mintiendo escandalosamente.
Si no desea utilizar NASM, simplemente omita el comando con la modificación PATH
y, para el script Configure
especifique el parámetro adicional no-asm
. - Ahora abra una nueva ventana de consola y haga lo mismo para la versión de 64 bits:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 set PATH=%PATH%;C:\Programs\nasm cd /d C:\Programs\OpenSSL\openssl-1.1.1b-x64\ perl Configure VC-WIN64A no-shared --prefix=C:\Programs\OpenSSL\x64 --openssldir=C:\Programs\OpenSSL\x64\ssl nmake nmake test nmake install
Deshabilitar NASM es lo mismo que en 32 bits. - Ahora puede eliminar los directorios
C:\Programs\OpenSSL\openssl-1.1.1b-x32
y openssl-1.1.1b-x64
.
• cURL
- Desempaquete el archivo cURL en
C:\Programs\curl\
y cambie el nombre del subdirectorio resultante curl-7.64.1
a curl-7.64.1-x32
. - Abra el archivo
C:\Programs\curl\curl-7.64.1-x32\winbuild\MakefileBuild.vc
en un editor de texto y busque el siguiente bloque de código (alrededor de las líneas No.61–69): !IF "$(VC)"=="6" CC_NODEBUG = $(CC) /O2 /DNDEBUG CC_DEBUG = $(CC) /Od /Gm /Zi /D_DEBUG /GZ CFLAGS = /I. /I../lib /I../include /nologo /W4 /wd4127 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL !ELSE CC_NODEBUG = $(CC) /O2 /DNDEBUG CC_DEBUG = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd CFLAGS = /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL !ENDIF
Después de estas líneas agregue la nueva directiva: CFLAGS = $(CFLAGS) /DCURL_DISABLE_LDAP
Si no lo hace, la compilación de VB fallará con errores de enlace. - Ahora abra el archivo
C:\Programs\curl\curl-7.64.1-x32\winbuild\gen_resp_file.bat
, y después de la primera línea ( @echo OFF
) inserte este comando: cd .
No hace nada, excepto restablecer el código ERRORLEVEL
. El script es tan simple que es posible que se complete sin ejecutar ningún comando que cambie el código de error. Entonces, si ese código no es cero antes de comenzar el script, mantendrá su valor en la salida del script, y nmake
pensaría que fue el script el que devolvió este código de error y finalizará la compilación con un error. Agregar ese cd
falso soluciona el problema. - Ahora haga una copia completa de
curl-7.64.1-x32
bajo el nombre curl-7.64.1-x64
. - Abra la consola, cree la versión de 32 bits y copie los archivos que necesitamos:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 cd /d C:\Programs\curl\curl-7.64.1-x32\winbuild md C:\Programs\curl\x32 nmake /f Makefile.vc mode=static WITH_SSL=static DEBUG=no MACHINE=x86 SSL_PATH=C:\Programs\OpenSSL\x32 ENABLE_SSPI=no ENABLE_WINSSL=no ENABLE_IDN=no copy ..\builds\libcurl-vc-x86-release-static-ssl-static-ipv6\lib\libcurl_a.lib ..\..\x32\libcurl.lib xcopy /E ..\builds\libcurl-vc-x86-release-static-ssl-static-ipv6\include\curl ..\..\x32\include\curl\
- Abra otra ventana de consola y cree la versión de 64 bits:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 cd /d C:\Programs\curl\curl-7.64.1-x64\winbuild md C:\Programs\curl\x64 nmake /f Makefile.vc mode=static WITH_SSL=static DEBUG=no MACHINE=x64 SSL_PATH=C:\Programs\OpenSSL\x64 ENABLE_SSPI=no ENABLE_WINSSL=no ENABLE_IDN=no copy ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\lib\libcurl_a.lib ..\..\x64\libcurl.lib xcopy /E ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\include\curl ..\..\x64\include\curl\ copy ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\bin\curl.exe ..\..\x64\curl.exe
Tenga en cuenta que, además de lo que hicimos para la versión de 32 bits, aquí también copiamos el archivo curl.exe
. Lo usaremos más tarde, para descargar la imagen de adiciones de invitados. - Los directorios
C:\Programs\curl\curl-7.64.1-x32
y curl-7.64.1-x64
ya no son necesarios y pueden eliminarse.
• libvpx
- Descomprima el archivo libvpx en
C:\Programs\libvpx-build\
. - Inicie el terminal Cygwin, la construcción se realizará allí. Nuestra plataforma objetivo es Visual Studio 2010; el sistema de compilación lo admite solo parcialmente: intentará ejecutar la compilación real usando
msbuild.exe
pero no funciona por alguna razón; No pude averiguar por qué. En cambio, simplemente podemos ejecutar Visual Studio y usarlo para construir el proyecto. Afortunadamente, puede usarse desde la línea de comandos, por lo que no es necesario iniciar el IDE real (aunque puede hacerlo si lo desea, en cuyo caso deberá modificar la variable PATH
y agregar la ruta C:\Programs\cygwin64\bin
a él, o de cualquier otra manera, permita que VS encuentre yasm.exe
ubicado allí y requerido para la compilación). Entonces, para realizar la construcción de ambas arquitecturas, ejecute los siguientes comandos en el terminal Cygwin: mkdir -p /cygdrive/c/Programs/libvpx-build/build32 cd /cygdrive/c/Programs/libvpx-build/build32 ../libvpx-1.7.0/configure --target=x86-win32-vs10 --disable-install-bins --disable-examples --disable-tools --disable-docs --prefix=../../libvpx make "/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/devenv.com" vpx.sln /Project vpx.vcxproj /Rebuild "Release|Win32" make install mkdir -p /cygdrive/c/Programs/libvpx-build/build64 cd /cygdrive/c/Programs/libvpx-build/build64 ../libvpx-1.7.0/configure --target=x86_64-win64-vs10 --disable-install-bins --disable-examples --disable-tools --disable-docs --prefix=../../libvpx make "/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/devenv.com" vpx.sln /Project vpx.vcxproj /Rebuild "Release|x64" make install
- Cierra Cygwin, ya no la necesitaremos. El directorio
C:\Programs\libvpx-build
se puede eliminar.
• libopus
- Descomprima el archivo opus en
C:\Programs\libopus-build\
, vaya al subdirectorio opus-1.3\win32\VS2015
. - Este proyecto está diseñado para la versión más nueva de Visual Studio, por lo que debemos modificarlo para que se compile en nuestra versión 2010. Puede hacerlo utilizando el IDE o un editor de texto sin formato. Elegí el último. Abra el archivo
opus.vcxproj
y haga lo siguiente:- Encuentra todas las líneas que contienen el texto
<PlatformToolset>v140</PlatformToolset>
y reemplazar v140
con v100
. Si está utilizando IDE, esta es la opción de configuración "Platrofm Toolset" ubicada en la página Propiedades de configuración -> General. No se olvide de los selectores de Configuración y Plataforma en la parte superior del cuadro de diálogo. - A continuación, busque este bloque de código:
<ItemDefinitionGroup> <ClCompile>
y agregue una nueva etiqueta dentro de ella: <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
En el IDE puede hacerlo abriendo la página Propiedades de configuración -> C / C ++ -> General y configurando "Formato de información de depuración" en "ProgramDatabase (/ Zi)". En realidad, puede establecerlo en cualquier otro valor válido, no necesitamos la base de datos de depuración en absoluto, pero con un valor no válido, el proyecto no se podrá construir.
- Ahora construyamos la versión Release para ambas plataformas (usando VS IDE o la línea de comando) y
opus.lib
la biblioteca opus.lib
y el subdirectorio include\
en nuestra ruta de destino: cd /d C:\Programs\libopus-build\opus-1.3\win32\VS2015 md C:\Programs\libopus\lib\x64 md C:\Programs\libopus\lib\Win32 xcopy /EC:\Programs\libopus-build\opus-1.3\include C:\Programs\libopus\include\ "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" opus.sln /Project opus.vcxproj /Rebuild "Release|x64" copy x64\Release\opus.lib C:\Programs\libopus\lib\x64\ "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" opus.sln /Project opus.vcxproj /Rebuild "Release|Win32" copy Win32\Release\opus.lib C:\Programs\libopus\lib\Win32\
- El directorio
C:\Programs\libopus-build
se puede eliminar.
• gSOAP
Abra el archivo, vaya al subdirectorio
gsoap-2.8\gsoap
y descomprima su contenido en
C:\Programs\gSOAP\
. OpenSSL 1.1.x requiere gSOAP versión 2.8.41 o superior. Si por alguna razón desea utilizar una versión anterior, deberá aplicar el
parche creado por
Mattias Ellert . La aplicación de un parche se puede hacer manualmente (el formato es fácil: abra los archivos mencionados, elimine las líneas marcadas con menos, agregue líneas marcadas con más; el resto es contexto) u obtenga la herramienta de
patch
portada para Windows y úsela.
• MiKTeX
- Descomprima el archivo en
C:\Programs\MiKTeX\
. - Abra la consola e instale módulos adicionales:
"C:\Programs\MiKTeX\texmfs\install\miktex\bin\mpm.exe" --verbose --install=koma-script --install=ucs --install=tabulary --install=url --install=fancybox --install=fancyvrb --install=bera --install=charter --install=mptopdf
• DocBook
Para XML DTD, debe crear un directorio y descomprimir el contenido del archivo allí. Para las hojas de estilo XSL, todo el contenido ya está en un solo directorio, por lo que debe extraerlo y cambiarle el nombre después.
Toques finales
El entorno de construcción está casi listo, solo se necesitan unos pocos pasos más. Descargue el archivo de código fuente de VirtualBox (si aún no lo ha hecho) y descomprímalo donde desee trabajar. Elegí
C:\Devel\
para ese propósito, puse allí los códigos fuente desempaquetados y renombré el subdirectorio a
VirtualBox-src
.
• Agregar certificados
Si no tiene un certificado pagado, le recomiendo que cree al menos uno personal autofirmado: es más fácil hacer que Windows cargue controladores autofirmados que los no firmados. Para hacerlo, abra la consola con privilegios elevados y ejecute los siguientes comandos que agregarán dos certificados (SHA-1 y SHA-256) e impórtelos a su almacenamiento personal:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 makecert.exe -a sha1 -r -pe -ss my -n "CN=Roga and Kopyta Ltd" C:\Devel\testcert_1.cer makecert.exe -a sha256 -r -pe -ss my -n "CN=Roga and Kopyta Ltd" C:\Devel\testcert_256.cer certmgr.exe -add C:\Devel\testcert_1.cer -s -r localMachine root certmgr.exe -add C:\Devel\testcert_256.cer -s -r localMachine root
Por supuesto, puede elegir su propio nombre para los certificados en lugar de "Roga and Kopyta Ltd", y la ruta para almacenar los archivos. Ahora necesitamos obtener las huellas digitales de los certificados generados. Abra la consola de administración de Certificados (ejecutando
certmgr.msc
) y navegue al Almacenamiento personal. Verá los dos nuevos certificados llamados "Roga y Kopyta Ltd" allí. Haga doble clic en el primero; en el cuadro de diálogo que aparece, vaya a la pestaña
Detalles . El campo "Algoritmo de firma" contiene el nombre del algoritmo: sha256RSA o sha1RSA. Desplácese hacia abajo para el campo "Huella digital" que contiene la secuencia de números hexadecimales. Copie este valor completo y escríbalo en alguna parte. Haga lo mismo para el segundo certificado; no olvide marcar qué huella digital fue para SHA-1 y cuál para SHA-256.
• Construyendo xmllint
Uno de los pasos de compilación necesitará el programa
xmllint
. No lo puse en la lista de requisitos de compilación porque sus fuentes están incluidas en el archivo de VirtualBox. Pero aún tendrá que construirlo usted mismo, porque las reglas de compilación de VB no lo hacen. Elegí
C:\Programs\xmllint
como directorio de destino.
- Copie el directorio
C:\Devel\VirtualBox-src\src\libs\libxml2-2.9.4
en C:\Programs\
para asegurarse de que su compilación no afecte a VB de ninguna manera. - Abra la consola y ejecute los siguientes comandos:
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 cd /d C:\Programs\libxml2-2.9.4\win32 cscript.exe configure.js cruntime=/MT prefix=C:\Programs\xmllint iconv=no nmake /f Makefile.msvc nmake /f Makefile.msvc install
- Elimine el directorio
C:\Programs\libxml2-2.9.4
.
• Modificaciones de archivos VB
Antes de comenzar la compilación, también debemos introducir algunos cambios en el código fuente de VB. El conjunto completo de ellos se presenta aquí como un archivo de parche descargable que se puede aplicar de forma manual o mediante la herramienta de
patch
(que debe descargar por separado):
»
Vbox_build.patchSi no hubo problemas al aplicar el parche, puede saltar al
siguiente paso . Sin embargo, si tuvo algunos problemas y necesita más información sobre cambios particulares, o si simplemente quiere entender qué se está cambiando y por qué, puede continuar y leer los detalles que se proporcionan a continuación. Tenga en cuenta que los cambios vienen aquí en un orden diferente en comparación con el archivo de revisión. Las rutas a los archivos se especifican en relación con el directorio de código fuente de VB
C:\Devel\VirtualBox-src
.
- Archivo
configure.vbs
:- La línea de código:
if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then
se reemplaza por: if Shell(DosSlashes(strPathVC & "/bin/cl.exe") & " /?", True) <> 0 then
Esta línea realiza la comprobación del compilador, pero olvida que cl.exe
sin ningún argumento devuelve un error y, por lo tanto, se considera un compilador no válido. Agregar el " /?
"El argumento hace que envíe la ayuda y salga con el código 0 sin error. - Ahora pasemos a la función
CheckForMinGW32Sub
. Como su nombre lo indica, verifica la validez del MinGW de 32 bits. Sin embargo, está diseñado para la versión 3.3.3, mientras estoy usando 4.5.4 que tiene una estructura de archivo / directorio diferente, por lo que he reemplazado toda la función con el siguiente código (que es básicamente una copia de CheckForMinGWw64Sub
adaptado para el Variante de 32 bits): function CheckForMinGW32Sub(strPathMingW32, strPathW32API) g_strSubOutput = "" if strPathW32API = "" then strPathW32API = strPathMingW32 LogPrint "trying: strPathMingW32=" &strPathMingW32 & " strPathW32API=" & strPathW32API if LogFileExists(strPathMingW32, "bin/gcc.exe") _ And LogFileExists(strPathMingW32, "bin/ld.exe") _ And LogFileExists(strPathMingW32, "bin/objdump.exe") _ And LogFileExists(strPathMingW32, "bin/dllwrap.exe") _ And LogFileExists(strPathMingW32, "bin/dlltool.exe") _ And LogFileExists(strPathMingW32, "bin/as.exe") _ And LogFileExists(strPathMingW32, "include/bfd.h") _ And LogFileExists(strPathMingW32, "lib32/libgcc_s.a") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/dllcrt1.o") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/dllcrt2.o") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/libmsvcrt.a") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/libmsvcr100.a") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/include/_mingw.h") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/include/stdint.h") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/include/windows.h") _ then if Shell(DosSlashes(strPathMingW32 & "/bin/gcc.exe") & " -dumpversion", True) = 0 then dim offVer, iMajor, iMinor, iPatch, strVer
- Nuestra siguiente función es
CheckForCurlSub
, y el bloque de código a editar es: if LogFileExists(strPathCurl, "include/curl/curl.h") _ And LogFindFile(strPathCurl, "libcurl.dll") <> "" _ And LogFindFile(strPathCurl, "libcurl.lib") <> "" _
Comprueba la validez de libcurl, pero requiere una versión vinculada dinámicamente y falla si no se puede encontrar un archivo DLL. Estamos utilizando una versión vinculada estáticamente, por lo que la comprobación de la DLL lamentablemente tiene que irse y dejarnos con: if LogFileExists(strPathCurl, "include/curl/curl.h") _ And LogFindFile(strPathCurl, "libcurl.lib") <> "" _
- Ahora ingrese a la función
CheckForPython
donde se genera la variable VBOX_BLD_PYTHON
: CfgPrint "VBOX_BLD_PYTHON := " & strPathPython & "\python.exe"
La barra diagonal inversa frente a python.exe
debe reemplazarse por la siguiente: "/python.exe"
(sin esta solución, algunas comprobaciones durante el proceso de compilación fallarán; no he notado ningún otro efecto negativo, pero es más bonito sin mensajes de error, y en cualquier caso más vale prevenir que curar). - La versión de Windows del script de configuración no es compatible con libvpx y libopus, así que los agregué yo mismo. Por supuesto, la forma más simple era simplemente codificar rutas de acceso a las bibliotecas, pero preferí implementarlo al igual que el resto de los componentes, pasando la ruta en la línea de comando y comprobaciones de validez adecuadas. El código principal para esto consiste en las dos funciones de verificación:
El usage
función se utiliza para imprimir la lista de argumentos de la línea de comandos; agregue nuestros dos nuevos argumentos allí: Print " --with-libvpx=PATH " Print " --with-libopus=PATH "
Al comienzo de la función Main
muchas variables se definen para almacenar rutas a los componentes, necesitamos agregar dos nuevas allí: strOptVpx = "" strOptOpus = ""
Un poco más abajo va el bloque de select-case
que procesa los argumentos y completa las variables; agregando nuestra contribución: case "--with-libvpx" strOptVpx = strPath case "--with-libopus" strOptOpus = strPath
Y, finalmente, casi al final del archivo está la cadena de todas esas llamadas de función de verificación, aquí es donde agregamos la llamada de nuestras dos nuevas funciones: CheckForVpx strOptVpx CheckForOpus strOptOpus
- El siguiente archivo es
src\VBox\Runtime\Makefile.kmk
. Necesitamos encontrar las definiciones de las variables VBoxRT_LIBS.win
y VBoxRT-x86_LIBS.win
, y agregarles dos nuevas bibliotecas, crypt32.lib
y bcrypt.lib
. Entonces el siguiente código: VBoxRT_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib
se convierte en: VBoxRT_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/crypt32.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/bcrypt.lib
(¡no te pierdas la barra diagonal inversa posterior después de delayimp.lib
!); y, respectivamente, este bloque: VBoxRT-x86_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/delayimp.lib
se convierte en: VBoxRT-x86_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/delayimp.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/crypt32.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/bcrypt.lib
Este cambio es necesario para un enlace exitoso de VBoxRT.dll
. No estoy 100% seguro de por qué es así, la versión de Oracle no tiene la dependencia del tiempo de carga en crypt32.dll
, se carga en tiempo de ejecución, por lo que el archivo LIB no debería ser necesario. Sin embargo, sin él, el enlazador no puede encontrar algunas funciones y falla. Sospecho que podría estar relacionado con las opciones de compilación de OpenSSL, pero no lo he comprobado, agregar la dependencia es más fácil. Y la segunda dependencia, bcrypt.dll
, es un requisito para el nuevo OpenSSL 1.1.1. - Si tiene gSOAP de la versión 2.8.79 o superior, tendrá que editar el archivo
src\VBox\Runtime\r3\win\VBoxRT-openssl-1.1plus.def
y agregar las siguientes líneas a la lista de exportaciones: OpenSSL_version_num DH_generate_parameters_ex DH_new ASN1_STRING_get0_data
Esta lista define qué funciones exporta la biblioteca VBoxRT.dll
(que contiene OpenSSL en su interior). Cuando se VBoxWebSrv.exe
herramienta VBoxWebSrv.exe
, dependiendo de la versión de gSOAP, puede requerir funciones adicionales de OpenSSL. Dado que faltan en la lista de exportaciones, el vinculador agrega OpenSSL e inmediatamente se queja de toneladas de conflictos entre este OpenSSL externo y su propia copia ya integrada en VBoxRT
. Agregar las exportaciones antes mencionadas soluciona el problema. - Como mencioné al principio, no construyo las adiciones de invitados, pero necesito tener su imagen ISO como parte de la distribución. Las reglas de compilación están diseñadas para este escenario, pero esperan que la imagen ISO lista aparezca mágicamente en el lugar correcto en el momento correcto. He agregado esta magia en el archivo
src\VBox\Makefile.kmk
. Busque el siguiente código: ifdef VBOX_WITH_ADDITIONS include $(PATH_SUB_CURRENT)/Additions/Makefile.kmk endif
y justo debajo va la regla para la descarga automática del archivo de imagen: ifndef VBOX_WITHOUT_ADDITIONS_ISO $(VBOX_PATH_ADDITIONS_ISO)/VBoxGuestAdditions.iso: $(QUIET)$(MKDIR) -p $(@D) $(VBOX_RETRY) $(TOOL_CURL_FETCH) http://download.virtualbox.org/virtualbox/$(VBOX_VERSION_STRING_RAW)/VBoxGuestAdditions_$(VBOX_VERSION_STRING_RAW).iso -o $@ endif
Si edita los archivos manualmente en lugar de aplicar el parche, tenga en cuenta que los comandos de la regla deben comenzar con el carácter de tabulación. - Antes de la versión 6.0, la documentación era uno de los subsistemas que se construyó con éxito sin ningún cambio. No sé qué estaba mal con eso, pero fue significativamente rediseñado de tal manera que ya no funciona en mi sistema de compilación. No tengo idea de cómo los propios Oracle compilan la documentación (tal vez en un sistema * NIX), pero para mí las reglas de compilación seguían perdiendo barras en las rutas o agregando un exceso de ellas, y como resultado no pudieron encontrar los archivos de destino debido a desajustes en los archivos de catálogo. Finalmente logré combinar algunos cambios que permitieron construir la documentación sin errores. En primer lugar, faltaba uno de los directorios de destino, por lo que no se pudieron crear algunos de los archivos intermedios. Este problema se soluciona en el archivo
doc\manual\Makefile.kmk
, dentro del siguiente bloque de código: define def_vbox_refentry_to_user_sect1 $$(VBOX_PATH_MANUAL_OUTBASE)/$(1)/user_$(2): $(3) \ $$(VBOX_PATH_MANUAL_SRC)/docbook-refentry-to-manual-sect1.xsl \ $$(VBOX_XML_CATALOG) $$(VBOX_XML_CATALOG_DOCBOOK) $$(VBOX_XML_CATALOG_MANUAL) \ $$(VBOX_VERSION_STAMP) | $$(dir $$@) $$(call MSG_TOOL,xsltproc $$(notdir $$(filter %.xsl,$$^)),,$$(filter %.xml,$$^),$$@) $$(QUIET)$$(RM) -f "$$@" $$(QUIET)$$(call VBOX_XSLTPROC_WITH_CAT) --output $$@ $$(VBOX_PATH_MANUAL_SRC)/docbook-refentry-to-manual-sect1.xsl $$< endef
Justo después del $$(RM)
he agregado un comando para crear el directorio que falta: $$(QUIET)$$(MKDIR) -p "$$(@D)"
En cuanto a las barras, las correcciones se encuentran en el archivo doc\manual\Config.kmk
. No pude encontrar una solución "normal" para eso, pero hay una solución lo suficientemente buena para fines prácticos, lo que implica duplicar las reglas de sustitución de ruta para las rutas incorrectas. Primero, debajo de la línea: VBOX_FILE_URL_MAYBE_SLASH = $(if $(eq $(KBUILD_HOST),win),/,)
I've created two new variables which basically contain the same paths as their origins, but with triple slash after the disk letter instead of a single slash: VBOX_PATH_MANUAL_SRC_SLASHED = $(subst :/,:///,$(VBOX_PATH_MANUAL_SRC)) VBOX_PATH_MANUAL_OUTBASE_SLASHED = $(subst :/,:///,$(VBOX_PATH_MANUAL_OUTBASE))
A little bit below that, there is a rule for creating the catalog file: $(VBOX_XML_CATALOG): $(MAKEFILE_CURRENT) | $$(dir $$@) $(call MSG_L1,Creating catalog $@) $(QUIET)$(APPEND) -tn "$@" \ '<?xml version="1.0"?>' \ '<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">' \ '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \ ' <delegatePublic publicIdStartString="-//OASIS/ENTITIES DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegatePublic publicIdStartString="-//OASIS/DTD DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateURI uriStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ '</catalog>'
For each line which contains the variable VBOX_PATH_MANUAL_SRC
or VBOX_PATH_MANUAL_OUTBASE
(except for the line with the file://
prefix), I've appended the copy of the whole line, but with the variable replaced with its triple-slash counterpart. The result looks like this: $(VBOX_XML_CATALOG): $(MAKEFILE_CURRENT) | $$(dir $$@) $(call MSG_L1,Creating catalog $@) $(QUIET)$(APPEND) -tn "$@" \ '<?xml version="1.0"?>' \ '<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">' \ '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \ ' <delegatePublic publicIdStartString="-//OASIS/ENTITIES DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegatePublic publicIdStartString="-//OASIS/DTD DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateURI uriStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ '</catalog>'
Even further down, there is another rule for creating an auxiliary catalog file; the starting line is: $(VBOX_XML_CATALOG_MANUAL): $(MAKEFILE_CURRENT) | $$(dir $$@)
Here I'm doing the same operation as above. In addition, in the beginning of the generated file there are several lines defining the entries in the common/
subdirectory: ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-accessibility-en.xml" uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-support-en.xml" uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \
With these we have the opposite problem: triple slash after the file
is replaced with a single slash. I worked this around by getting rid of the file
protocol altogether and replacing those URIs with direct file system paths in the target address (the uri
attribute). The result for these lines looks like this (including the aforementioned fix): ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-accessibility-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-accessibility-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-support-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-support-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \
- When VB is built with signing, most of its binaries receive the integrity check flag (the linker option
/IntegrityCheck
) which forces Windows to check digital signatures and forbids launching applications which are signed incorrectly. If you have a valid paid certificate that's not a problem; however with a self-signed certificate VB will refuse to start, even if Windows is booted in the test mode. I've modified the file Config.kmk
in such a way that this flag is only added when you have a full-grown certificate (the criterion of that is presence of a cross-certificate in LocalConfig.kmk
; see below ). The changes look like this:- A new variable
VBOX_INTEGRITY_CHECK
is added, which contains the desired value of the option: if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE) VBOX_INTEGRITY_CHECK := /IntegrityCheck else VBOX_INTEGRITY_CHECK := /IntegrityCheck:NO endif
- Below that there is the
editbin
call: $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \ "$@"
Here I've replaced the unconditional /IntegrityCheck
with the new variable $(VBOX_INTEGRITY_CHECK)
. - Next, look for the blocks of the following kinds:
ifdef VBOX_SIGNING_MODE TEMPLATE_XXXXXX_LDFLAGS += -IntegrityCheck endif
o if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) TEMPLATE_XXXXXX_LDFLAGS += -IntegrityCheck endif
where « XXXXXX
» stands for various component names. There are 6 such blocks in total, 3 of each kind. Here I've modified the condition by adding a check for cross-certificate. The first line then turns into, respectively: if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE)
o if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE) && defined(VBOX_WITH_HARDENING)
- Two more files modified by me do not take immediate part in building of VB:
src\VBox\Installer\win\Scripts\PackDriversForSubmission.cmd
and UnpackBlessedDrivers.cmd
. These auxiliary scripts can be used if you intend to send the drivers into Microsoft for Windows 10 signing. The first script prepares a CAB archive for sending; the second one unpacks the resultant ZIP archive with the signed drivers and verifies the signatures. In the packing script all I did was just fixing several typos. In the unpacking script I added ability to specify path to the signtool
program, and got rid of the unzip
tool by replacing it with a small Perl script. The signing procedure is described below. If you don't plan to get the Microsoft signature you can simply ignore all these changes in the scripts.
• VB build configuration file
Ahora necesitamos crear el archivo LocalConfig.kmk
en el directorio de fuentes de VB y escribir allí todas las rutas y parámetros de compilación. Puede usar el siguiente texto como plantilla: VBOX_WITH_HARDENING := VBOX_PATH_WIX := C:\Programs\WiX VBOX_GSOAP_INSTALLED := 1 VBOX_PATH_GSOAP := C:\Programs\gSOAP VBOX_WITH_COMBINED_PACKAGE := 1 VBOX_WITH_QT_PAYLOAD := 1 VBOX_WITH_QTGUI_V5 := 1 VBOX_SIGNING_MODE := release VBOX_CERTIFICATE_SUBJECT_NAME := Roga and Kopyta Ltd VBOX_CERTIFICATE_FINGERPRINT := XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX VBOX_CERTIFICATE_SHA2_SUBJECT_NAME := Roga and Kopyta Ltd VBOX_CERTIFICATE_SHA2_FINGERPRINT := XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX VBOX_TSA_URL := http://timestamp.digicert.com VBOX_TSA_SHA2_URL := http://timestamp.digicert.com VBOX_TSA_URL_ARGS := /t "$(VBOX_TSA_URL)" VBOX_TSA_SHA2_URL_ARGS := /tr "$(VBOX_TSA_SHA2_URL)" /td sha256 VBOX_CROSS_CERTIFICATE_FILE := VBOX_CROSS_CERTIFICATE_FILE_ARGS := VBOX_CROSS_CERTIFICATE_SHA2_FILE := VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS := VBOX_PATH_SIGN_TOOLS := C:\Programs\DevKits\8.1\bin\x64 VBOX_PATH_SELFSIGN := C:\WinDDK\7600.16385.1\bin\selfsign VBOX_PATH_WISUMINFO := "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSumInf.vbs" VBOX_PATH_WISUBSTG := "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSubStg.vbs" VBOX_WITH_DOCS := 1 VBOX_WITH_DOCS_CHM := 1 VBOX_WITH_DOCS_PACKING := 1 VBOX_WITH_ADDITIONS := VBOX_WITH_ADDITIONS_PACKING := 1 VBOX_HAVE_XMLLINT := 1 VBOX_XMLLINT := C:\Programs\xmllint\bin\xmllint.exe VBOX_PATH_DOCBOOK := C:/Programs/DocBook/xsl VBOX_PATH_DOCBOOK_DTD := C:/Programs/DocBook/xml VBOX_PATH_HTML_HELP_WORKSHOP := "C:\Program Files (x86)\HTML Help Workshop" VBOX_PDFLATEX := C:\Programs\MiKTeX\texmfs\install\miktex\bin\pdflatex.exe VBOX_PDFLATEX_CMD := $(VBOX_PDFLATEX) -halt-on-error -interaction batchmode TOOL_CURL_FETCH := C:\Programs\curl\x64\curl.exe PATH_TOOL_NASM := C:/Programs/nasm VBOX_INSTALLER_LANGUAGES := en_US VBOX_WITH_TESTCASES := VBOX_WITH_VALIDATIONKIT := VBOX_WITH_VBOX_IMG := 1 VBOX_WITH_RECORDING := 1 VBOX_WITH_AUDIO_RECORDING := 1 SDK_VBOX_VPX := 1 VBOX_WITH_LIBVPX := 1 SDK_VBOX_OPUS := 1 VBOX_WITH_LIBOPUS := 1 VBOX_BUILD_PUBLISHER := _OSE
Deberá editar esta plantilla:- Las variables
VBOX_CERTIFICATE_SUBJECT_NAME
y VBOX_CERTIFICATE_SHA2_SUBJECT_NAME
deben contener los nombres de los certificados SHA-1 y SHA-256, respectivamente. - Las variables
VBOX_CERTIFICATE_FINGERPRINT
y VBOX_CERTIFICATE_SHA2_FINGERPRINT
deben contener las huellas digitales de esos certificados; los ha copiado anteriormente desde la consola de administración de Certificados. - If you have a paid certificate you should delete the lines defining the variables
VBOX_CROSS_CERTIFICATE_FILE_ARGS
and VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS
, then in the variables VBOX_CROSS_CERTIFICATE_FILE
and VBOX_CROSS_CERTIFICATE_SHA2_FILE
(without « _ARGS
») put the full path to the cross-certificate (without it the drivers will not be accepted). You can download it from the web site of the company that issued the certificate, or from Microsoft . - You can fine-tune the signing process using various additional variables and macros to redefine the certificate storage, timestamp server, or even construct a full command line for the
signtool
program. You can take a look into the file Config.kmk
below the comment «Code Signing», there you'll find which variables are defined and how they are used. - If you've installed some of the programs into paths different from mine, you need to fix those paths in the template. It's strongly recommended to keep the path style for each variable (forward/backward slashes), sometimes it's critical for successful build.
- Fox WiX you need to specify the path to its binaries. With the portable version, it is just the directory where you unpacked it; if you used the installer, the binaries will be located in the subdirectory
bin
. Please, note, that the path must not contain spaces! If it does you have to convert it into the 8.3 format (you can use dir /x
for that). Unfortunately, enclosing the path in quotes does not work with this variable. - La variable
VBOX_BUILD_PUBLISHER
especifica el sufijo de marca en el número de versión. Por defecto es "_OSE" (es decir, la versión completa del producto es "6.0.4_OSE"). Puede especificar cualquier otro sufijo aquí, o configurarlo como vacío para deshacerse de él por completo. Pero si elimina la variable por completo, usará el predeterminado "_OSE".
El resto de las variables se utilizan principalmente para declarar qué componentes se construirán. Y, por supuesto, la declaración principal llega a la cima: apaga el endurecimiento.
Construyendo virtualbox
Finally, we can now start building VirtualBox itself. If you normally prefer to build for different platforms in parallel you will have to do without it for now, or use two separate source tree copies, because VB has a common configuration file which is generated before the build and contains platform-dependent data. It would not be nice to the compiler to suddenly throw it from the 64-bit build environment into the 32-bit one in the middle of the build process.
If you need Windows 10 compatible driver signatures, please, refer to the information provided after the main procedure description.
- Let's start with the 64-bit version. Open the console and run the following commands:
cd /d C:\Devel\VirtualBox-src "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 set BUILD_TARGET_ARCH=amd64 cscript configure.vbs --with-DDK=C:\WinDDK\7600.16385.1 --with-MinGW-w64=C:\Programs\mingw64 --with-MinGW32=C:\Programs\mingw32 --with-libSDL=C:\Programs\SDL\x64 --with-openssl=C:\Programs\OpenSSL\x64 --with-openssl32=C:\Programs\OpenSSL\x32 --with-libcurl=C:\Programs\curl\x64 --with-libcurl32=C:\Programs\curl\x32 --with-Qt5=C:\Programs\Qt\5.6.3-x64 --with-libvpx=C:\Programs\libvpx --with-libopus=C:\Programs\libopus --with-python=C:/Programs/Python env.bat kmk kmk C:/Devel/VirtualBox-src/out/win.x86/release/obj/Installer/VirtualBox-6.0.4_OSE-r128164-MultiArch_amd64.msi
The configure.vbs
script verifies the environment and generates configuration files ( AutoConfig.kmk
and env.bat
). The first kmk
command builds the binaries and collect them into out\win.amd64\bin\
. And the last command packs them all into the intermediate MSI package. Important notes:- You must use forward slashes in the last command. With backslashes,
kmk
would fail to find the build rules. - Even though we are building the 64-bit version, the target package is located in
out\win.x86\…
, because the final stage of the build will be performed from the 32-bit build environment. - If you've changed the branding suffix you need to change the name of the target package by replacing the «_OSE» with what you specified in the variable
VBOX_BUILD_PUBLISHER
. - The revision number in the MSI package name (128164) can be found in the file
Config.kmk
inside the VBOX_SVN_REV_FALLBACK
variable definition. Please, note, that this value may be different from revisions of the official distribution (for instance, the version 6.0.4 has release number 128413). Unfortunately, I have no idea why.
- Now we need to build the 32-bit version and pack everything together. For that, open a new console window, and run the following commands:
cd /d C:\Devel\VirtualBox-src "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 set BUILD_TARGET_ARCH=x86 cscript configure.vbs --with-DDK=C:\WinDDK\7600.16385.1 --with-MinGW-w64=C:\Programs\mingw64 --with-MinGW32=C:\Programs\mingw32 --with-libSDL=C:\Programs\SDL\x32 --with-openssl=C:\Programs\OpenSSL\x32 --with-libcurl=C:\Programs\curl\x32 --with-Qt5=C:\Programs\Qt\5.6.3-x32 --with-libvpx=C:\Programs\libvpx --with-libopus=C:\Programs\libopus --with-python=C:/Programs/Python env.bat kmk kmk C:/Devel/VirtualBox-src/out/win.x86/release/bin/VirtualBox-6.0.4_OSE-r128164-MultiArch.exe
Same as with the 64-bit, you need to replace the «_OSE» suffix with what you have.
Notice how in the last command we are building an EXE
, and not an MSI
. This is the final installer which will cause the 32-bit package to be built automatically, from dependencies. - Even if you have a paid certificate you will find that you cannot install this distribution into Windows 10 booted with Secure Boot enabled. This OS has stricter requirements, and the drivers must be signed by none other than Microsoft themselves. The procedure is explained in details on various Internet resources and is unrelated to this article, so I'm not going to go deep into this topic. Instead I'll outline the main steps you need to take for integrating this task with the VB build procedure.
If neither of us has messed anything up, all this long chain should bring you a shiny new VirtualBox installer which differs from the Oracle one only by its icon, the About picture, and, of course, the profound lack of hardening. It's not hard to replace also the icon and the picture, but I won't go into this topic here.
For convenience I've created a
single batch file which automates the full build of VB. You can use it if you need to build the complete installer regularly.
Solo unas pocas palabras más sobre la instalación de la distribución resultante si está utilizando un certificado autofirmado. Como se descubrió repentinamente, en Windows 8/10 no es suficiente arrancar en modo de prueba, la instalación aún falla alegando que las firmas del controlador no son válidas. Puede solucionar este problema agregando los certificados al almacenamiento raíz de CA:- Abra el cuadro de diálogo Propiedades del instalador de VB haciendo clic con el botón derecho y seleccionando Propiedades , luego cambie a la pestaña Firmas digitales . Encontrará dos firmas allí, ambas llamadas "Roga y Kopyta Ltd", una es sha1, la otra sha256. Seleccione el primero, haga clic en Detalles .
- Aparece otro cuadro de diálogo en el que debe hacer clic en el botón Ver certificado .
- One more dialog, click Install Certificate .
- In the Import wizard, select the location «Local Machine», click Next . After UAC confirmation (if needed), there's the certificate store selection. Select «Place all certificates in the following store», then click Browse and choose the store named «Trusted Root Certification Authorities». Then Next , Finish . You're done, the certificate is installed.
- Close all the dialogs but the very first one, select the second signature (sha256) and repeat the steps 2 to 4 for it too.
- Close all the dialogs, run the installer. Now it should work fine.
Epilogue
When I finished writing the article I was myself surprized by its volume. At first I was planning to go into many details on reasons for choosing this or that way of solving each problem, explain what the problem is, exactly, and what alternative solutions might be applicable. But very soon it became clear that, if loaded with all these particulars, the text would be monstrously huge. I have to apologize, then, for the recipes looking like «just do this and ask no questions». I have a strong dislike for those myself, but I just couldn't find any other way. Occasionally I still tried to outline what was going on, to soften the impression.
A vast amount of details about VB build system had to remain behind the scene; for I have both felt reluctant to bloat the text, and, sometimes, was too lazy to go look for a different, more efficient approach of solving a problem. After all, my main aim, initially, was to get myself a working build of the current VirtualBox version. 4.3.12 had already been way outdated by that time, but I could not risk updating one of my most actively used tool to the hardened version which might simply stop working at any moment. Although, from time to time I do get back and, having found something new, add it to this article.
I do hope this article will find its audience. If you are interested to see and analyze the final result but don't want to set up all the pile of programs, you can get my version of the distribution from here:
versión 6.0.4 . Todos los controladores (y otros archivos) están firmados con un certificado autofirmado no confiable, por lo que para instalarlo en la versión de Windows de 64 bits tendrá que reiniciar en el modo de prueba. Si tiene alguna pregunta, sugerencia, recomendación, por favor, siéntase libre de escribirme aquí, ya sea en comentarios o mediante mensajes personales. ¡Que el código abierto te acompañe!
Enmiendas
Archivo• Artículo ruso publicado el 21/01/2016
- VirtualBox 5.0.12.
• Actualización del 24/05/2016
- El artículo se actualiza para VB 5.0.20, uno de los principales cambios es la firma dual SHA-1 / SHA-256.
- Se inhabilitó la comprobación de firmas forzadas si se utilizan certificados autofirmados.
- Se agregó información sobre la solución alternativa para la falla de instalación de la distribución autofirmada.
- Se actualizaron las versiones de la biblioteca.
- Deshabilitó algunos componentes no utilizados para acelerar el proceso de compilación.
- Pequeñas correcciones y mejoras.
• Actualización del 29/07/2016
- The article is updated for VB 5.1.2; the most important change is upgrading to Qt5. The differences from VB 5.0.x procedure are specified where applicable.
- Library versions were updated.
- The full build batch was updated to check error codes after each operation.
- Minor fixes and improvements.
• Update of 15.09.2016
- The article is updated for VB 5.1.6.
- Library versions were updated.
- Added NASM for building OpenSSL.
- Added OpenSSL into cURL; this fixes the broken function of checking for updates and downloading the Extension Pack.
- The full build batch now reads the VB version automatically.
- Various minor fixes and improvements.
• Update of 30.11.2016
- The article is updated for VB 5.1.10.
- Library versions were updated; particularly OpenSSL was upgraded to version 1.1.x.
- Fixed some installation errors:
- path to the Qt plugins now points to the installation directory;
- added forgotten OpenSSL libraries to the 32-bit components of the 64-bit VB version.
- The article no longer contains information about building older VB versions. If needed, the previous versions of it are available in the GitHub project .
• Update of 2.12.2016
- Switched to using statically linked OpenSSL.
• Update of 20.06.2017
- The article is updated for VB 5.1.22.
- cURL, OpenSSL, and gSOAP were updated; adapted the build instructions for cURL, gSOAP and VB.
• Update of 1.12.2017
- The article is updated for VB 5.2.2.
- Switched from MinGW-32 3.3.3 to 4.5.4.
- Qt, cURL, OpenSSL, gSOAP, and some build tools were updated; adapted the build instructions for cURL, gSOAP and VB.
- Switched to using local archives of DocBook XML/XSL instead of online versions.
- Using cURL program instead of wget for downloading the Guest Additions ISO image.
- Various minor fixes and improvements.
• Update of 4.12.2017
- The libxml version was fixed in the build instructions.
• Update of 4.09.2018
- The article is updated for VB 5.2.18.
- cURL, OpenSSL, gSOAP and some build tools were updated; adapted the build instructions for cURL.
• Update of 12.12.2018
- The article is updated for VB 5.2.22.
- Enabled screen recording functionality which is disabled in OSE version by default; added libraries libopus and libvpx for encoding.
- cURL, OpenSSL, and gSOAP were updated.
- The full set of VirtualBox source code changes is now published as a single patch file for easier application.
• Actualización del 25/01/2019
- El artículo está actualizado para VB 6.0.2.
- Mejora deshabilitando la construcción de Adiciones de invitados.
- cURL y gSOAP fueron actualizados; Las hojas de estilo DocBook XSL se degradaron a la versión 1.69.1 (la documentación se adapta mejor a esa versión).
- El lote de compilación completo se dividió del texto del artículo en un archivo descargable.
• Actualización del 08/04/2019
- The article has been translated into English for the first time. Also numerous minor changes were introduced into the Russian version.
- Added information about drivers signing for Windows 10.
- The article is updated for VB 6.0.4.
- cURL, OpenSSL, gSOAP, and some tools were updated.
- The full build batch no longer has to be placed at the specific path. Also, it now contains the basic template for automated Windows 10 drivers signing.