Con la llegada del software de código abierto y la aceptación de estas soluciones en la creación de sistemas complejos, la capacidad de desarrollar aplicaciones que puedan ejecutarse sin problemas en múltiples plataformas de hardware se vuelve inherentemente importante. Existe una necesidad constante de desarrollar el software en una arquitectura pero tener la capacidad de ejecutarlo en otras arquitecturas objetivo. Una técnica común para lograr esto es la compilación cruzada de la aplicación para la arquitectura objetivo.
La compilación cruzada es significativa en sistemas embebidos donde la intención es ejecutar aplicaciones en hardware especializado como placas ARM y PowerPC. Estos sistemas tienen limitaciones de recursos y, por lo tanto, la compilación directa no es una opción. Por lo tanto, los desarrolladores aprovecharán la arquitectura común x86 como anfitrión y utilizarán cadenas de herramientas específicas para el hardware de destino, generando binarios compatibles con el hardware de destino.
Este artículo cubre un estudio de caso donde se realizó la compilación cruzada de un paquete de código abierto para PowerPC. El artículo cubrirá los detalles de las herramientas y cadenas de herramientas utilizadas y un tutorial paso a paso sobre cómo se logró la compilación cruzada para esta arquitectura.
The Declaración del problema
Dado un tablero de destino con arquitectura PowerPC, se pretendía agregar capacidades de enrutamiento L3 a este tablero. Con este propósito, se consideró un popular conjunto de protocolos de enrutamiento de código abierto, FRRouting (FRR).
FRR es un conjunto de protocolos que permite que cualquier máquina Linux se comporte como un enrutador completo. Está empaquetado para amd64, arm64, armhf, e i386 pero no para PowerPC. Esto necesitó la compilación cruzada de FRR.
Build host | target host | |
---|---|---|
Arquitectura de CPU |
x86_64 |
Powerpc(32-bit) |
Sistema Operativo |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12GB |
1GB |
TTabla 1. Diferencia en la plataforma de construcción y la plataforma objetivo
TEl viaje de la compilación cruzada
Hay dos etapas principales en la compilación cruzada:
Configuración del entorno de compilación y herramientas precompiladas
1. Instalar las herramientas de compilación requeridas en el entorno. Las herramientas comunes de compilación incluyen autoconf, make, cmake, build-essential, pkg-config, libtool, etc.
2. Configurar la herramienta precompilada específica para el entorno del host de destino. Los proveedores de CPU/Board ofrecen sus propias herramientas específicas de arquitectura. La herramienta específica para la placa de destino se obtuvo del sitio web del producto del proveedor.
3. La herramienta viene con un archivo de entorno, que se utiliza para configurar las variables de entorno como CC, GCC, PKG_CONFIG_PATH, etc., que son necesarias para la compilación cruzada. Edite el archivo de entorno /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
y actualice la ruta de las variables con respecto a la ruta del directorio de la herramienta.
export SDKTARGETSYSROOT=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux
export PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-qoriq/2.0/site-config-ppce5500-fsl-linux
export PYTHONHOME=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr unset command_not_found_handle
export CC="powerpc-fsl-linux-gcc -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CXX="powerpc-fsl-linux-g++ -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CPP="powerpc-fsl-linux-gcc -E -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export AS="powerpc-fsl-linux-as "
export LD="powerpc-fsl-linux-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=powerpc-fsl-linux-gdb
export STRIP=powerpc-fsl-linux-strip
export RANLIB=powerpc-fsl-linux-ranlib
export OBJCOPY=powerpc-fsl-linux-objcopy
export OBJDUMP=powerpc-fsl-linux-objdump
export AR=powerpc-fsl-linux-ar
export NM=powerpc-fsl-linux-nm
export M4=m4
export TARGET_PREFIX=powerpc-fsl-linux-
export CONFIGURE_FLAGS="--target=powerpc-fsl-linux --host=powerpc-fsl-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="2.0"
export OECORE_SDK_VERSION="2.0"
export ARCH=powerpc
export CROSS_COMPILE=powerpc-fsl-linux-
Resolviendo Dependencias en Herramientas Precompiladas
Cada software tiene su propio conjunto de dependencias (herramientas/bibliotecas), que deben ser resueltas antes de la compilación cruzada.
Dependiendo de la disponibilidad de paquetes de estas herramientas/bibliotecas en la arquitectura de destino, hay dos opciones para resolverlas. Instalarlas directamente desde los paquetes disponibles o compilarlas cruzadamente también desde la fuente.
Específicamente para la compilación de FRR, las bibliotecas libpcre2, libyang, clippy, libelf y json-c deben ser construidas desde la fuente. Aparte de estas, los paquetes de bibliotecas protobuf y libcap estaban disponibles para la arquitectura PPC (PowerPC), los cuales pueden ser instalados directamente en la herramienta de compilación.
1. Instalando Bibliotecas desde Paquetes
Los paquetes de bibliotecas disponibles para la arquitectura de destino pueden ser instalados en el sysroot de la herramienta utilizando dos métodos:
- La primera forma utiliza la herramienta
dpkg-deb
basada en Ubuntu/Debian para instalar directamente paquetes Debian como se menciona a continuación:Shell$ dpkg-deb -x <pkg_name>.deb <toolchain_directory_path>
#Ejemplo de libcap:
$ wget http://launchpadlibrarian.net/222364908/libcap-dev_2.24-12_powerpc.deb
$ dpkg-deb -x libcap-dev_2.24-12_powerpc.deb /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/
Nota:
- Descarga todos los paquetes de dependencias e instálalos en orden.
- Es posible que los paquetes de bibliotecas se instalen en una estructura de directorios diferente. Copia esos archivos de biblioteca en los directorios correctos según la herramienta utilizada.
- De la segunda forma, se extraen los paquetes debian/rpm y se colocan manualmente en la ruta del directorio de la cadena de herramientas como se menciona a continuación:
Para extraer el paquete debian, use las herramientas
ar
ytar
como se menciona a continuación:Texto plano$ ar -x <paquete>.deb
$ tar -xJf data.tar.xz
Nota: Este método es útil para sistemas sin soporte para
dpkg-deb
.Para la extracción del paquete rpm, utilice la herramienta
rpm2cpio
con el siguiente comando:Texto plano$ rpm2cpio <paquete>.rpm | cpio -idmv
-
Ejemplo de extracción de paquetes y colocación de archivos con libcap:
Shell# Extraer paquete .deb
$ ar -x libcap-dev_2.24-12_powerpc.deb
# Se extraerán tres archivos (control.tar.gz, data.tar.xz, debian-binary)
$ ls
control.tar.gz data.tar.xz debian-binary libcap-dev_2.24-12_powerpc.deb
# data.tar.xz contiene los archivos del programa del paquete
# control.tar.gz contiene metadatos del paquete
# debian-binary contiene la versión del formato de archivo deb
# Descomprima data.tar.xz para extraer los archivos del programa del paquete.
$ tar -xJf data.tar.xz
# NOTA: rpm2cpio <paquete>.rpm extraerá directamente los archivos del programa.
# Haga lo mismo para todos los paquetes debian o rpm dependientes en la misma ruta, esto extraerá todos los archivos de programas y enlaces simbólicos requeridos en la misma estructura de directorios.
# Los archivos extraídos en los directorios usr/lib, usr/include y usr/bin deben copiarse al directorio de la ruta del directorio de herramientas /usr, junto con los archivos existentes ya presentes.
$ cp usr/include/sys/capability.h /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/usr/include/sys/
-
Para verificar si los paquetes/bibliotecas se instalaron correctamente, ejecute el siguiente comando:
Shell# Asegúrese de exportar la variable PKG_CONFIG_PATH desde el archivo de entorno de la cadena de herramientas
$ pkg-config --list-all | grep <nombre_biblioteca_paquete>
Nota: Instale
pkg-config
si aún no está instalado.
2. Compilación Cruzada de Bibliotecas
Los paquetes de biblioteca no están disponibles para la arquitectura de destino y se compilan desde la fuente. Antes de comenzar la compilación, cargue el archivo de entorno empaquetado con la cadena de herramientas para configurar todos los parámetros necesarios requeridos para la compilación cruzada.
$ source <env_file_path>
Siga los pasos de compilación indicados en el archivo README de la biblioteca. Además, configure los siguientes parámetros en los pasos del procedimiento de construcción:
- Establezca el parámetro
--host
al ejecutar el script./configure
Shell
$ ./configure –host=<target_host_parameter>
# Example:
$ ./configure –host=powerpc-fsl-linuxNota:
<target_host_parameter> es el sistema para el cual se está construyendo la biblioteca/herramienta. Se puede encontrar en el archivo de entorno de la cadena de herramientas. Es un prefijo común que se encuentra en $CC, $LD, etc.
Habrá dos tipos de bibliotecas dependientes. Uno es solo necesario para el proceso de compilación, y el otro es un requisito de dependencia para la ejecución en el host de destino. Establezca el parámetro--host
en consecuencia. - Al usar “make install” para compilar bibliotecas dependientes, establezca DESTDIR en el directorio raíz de la cadena de herramientas.
Shell
$ make DESTDIR=<ruta_del_directorio_de_la_cadena_de_herramientas> install
Ejemplo:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
Conclusión
Las diferencias en arquitecturas de sistemas, bibliotecas, dependencias y cadenas de herramientas hacen que la compilación cruzada sea una técnica compleja de ejecutar. Para facilitar las complejidades, este artículo desvela las fases de la compilación cruzada. Se tomaron FRR y PowerPC como ejemplos del software deseado y el hardware objetivo, respectivamente. Sin embargo, los pasos cubiertos en este artículo proporcionan una estrategia razonable para la compilación cruzada de cualquier software en un hardware específico. La configuración del entorno, la cadena de herramientas y las dependencias variarán según los requisitos.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation