Manualinux
http://www.nvu.com http://www.gimp.org InicioPresentaciónActualizacionesManualesDescargasNoticiasAgradecimientoEnlaces

Entornos GráficosAplicaciones

DesarrolloEmuladoresInternetJuegosMultimediaSistema

Utilidades - TreeSize for UnixUtilidades - vRenamer

Utilidades - UPX




Utilidades - UPX




Copyright

Copyright © José Luis Lara Carrascal  2014-2024   http://manualinux.es



Sumario

Introducción
Preliminares
Instalación
Iniciamos UPX
Enlaces



 
Introducción  

UPX
es una utilidad de compresión de ejecutables, mediante la cual, podremos reducir el tamaño de aquellos ejecutables que ocupan un espacio considerable en nuestro disco duro, y no hacemos un uso intensivo de los mismos. Soporta binarios ejecutables de 32 y 64 bits, scripts de shell e imágenes del kernel de 32 y 64 bits, en formato bvmlinuz, vmlinux y vmlinuz.  

A partir de la publicación de este manual, esta utilidad será incluida de forma opcional, en aquellos manuales cuyo uso pueda resultar necesario, dado el tamaño de los ejecutables instalados. El usuario tendrá que comprobar en su sistema, las ventajas y las desventajas de su uso. 



Preliminares  

1) Comprobar que la ruta de instalación de los binarios del programa la tenemos en nuestro PATH


Abrimos una ventana de terminal y ejecutamos el siguiente comando:

[jose@Fedora-18 ~]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jose/bin

Si no aparece entre las rutas mostradas el directorio /usr/local/bin, abrimos un editor de texto y añadimos lo siguiente:

#!/bin/sh

export PATH=/usr/local/bin:$PATH

Lo guardamos con el nombre variables.sh, y lo instalamos en /etc/profile.d.

$ su -c "install -m755 variables.sh /etc/profile.d"

Tenemos que cerrar el emulador de terminal y volverlo a abrir para que la variable de entorno aplicada sea efectiva. Es conveniente guardar una copia de este script para posteriores instalaciones de nuestro sistema, teniendo en cuenta que es el que se va a utilizar a partir de ahora en todos los manuales de esta web, para establecer variables de entorno globales, excepto en aquellas que sólo afectan al usuario, en las que se utilizará el archivo de configuración personal, ~/.bashrc.

La ventaja de utilizar el directorio /etc/profile.d es que es común a todas las distribuciones y nos evita tener que editar otros archivos del sistema como por ejemplo, /etc/profile.



Instalación  

Dependencias

Herramientas de Compilación


Entre paréntesis la versión con la que se ha compilado UPX para la elaboración de este documento.

* GCC - (14.1.0) o Clang - (18.1.5)
* CMake - (3.29.3)
* Ninja - (1.12.0)



Descarga

upx-4.2.4-src.tar.xz

Optimizaciones

$ export {C,CXX}FLAGS='-O3 -march=znver3 -mtune=znver3'

Donde pone znver3 se indica el procesador respectivo de cada sistema seleccionándolo de la siguiente tabla:
Nota informativa sobre las optimizaciones para GCC
* La opción '-march=' establece el procesador mínimo con el que funcionará el programa compilado, la opción '-mtune=' el procesador específico para el que será optimizado. 

* Los valores separados por comas, son equivalentes, es decir, que lo mismo da poner '-march=k8' que '-march=athlon64'.

* En versiones de GCC 3.2 e inferiores se utiliza la opción '-mcpu=' en lugar de '-mtune='.
Nota informativa sobre las optimizaciones para Clang
* La opción '-mtune=' está soportada a partir de la versión 3.4 de Clang.

* Los valores de color azul no son compatibles con Clang.

* Las filas con el fondo de color amarillo son valores exclusivos de Clang y, por lo tanto, no son aplicables con GCC.
Valores CPU
Genéricos
Intel
AMD

Optimizaciones adicionales

Optimizaciones adicionales
GCC
Graphite
$ export {C,CXX}FLAGS+=' -ftree-loop-linear -floop-strip-mine -floop-block'
IPA
$ export {C,CXX}FLAGS+=' -fipa-pta'
LTO
$ export {C,CXX}FLAGS+=' -fuse-linker-plugin -flto=auto'
En versiones inferiores a GCC 10, sustituir auto por el número de núcleos que tenga nuestro procesador. Si sólo tiene uno, utilizar el parámetro -flto
Clang
Polly
$ export {C,CXX}FLAGS+=' -O3 -mllvm -polly -mllvm -polly-vectorizer=stripmine'
LTO
$ export {C,CXX,LD}FLAGS+=' -flto'
ThinLTO
$ export {C,CXX,LD}FLAGS+=' -flto=thin'
La aplicación de esta optimización es alternativa a la tradicional LTO, a partir de Clang 3.9 y, por lo tanto, no es combinable con la misma.
Unified LTO
LTO >> ThinLTO
$ export {C,CXX}FLAGS+=' -flto -funified-lto'
$ export LDFLAGS+=' -Wl,--lto=thin'
ThinLTO >> LTO
$ export {C,CXX}FLAGS+=' -flto=thin -funified-lto'
$ export LDFLAGS+=' -Wl,--lto=full'
La aplicación de esta optimización es aplicable, a partir de Clang 17, y sólo es combinable con LLD.

Parámetros adicionales

Parámetros adicionales de eliminación de avisos en el proceso de compilación
$ export {C,CXX}FLAGS+=' -w'

Establecer la ruta de búsqueda de directorios de librerías en sistemas de 64 bits multiarquitectura
$ export LDFLAGS+=" -L/usr/lib64 -L/usr/local/lib64 -L/opt/gcc14/lib64"
Cada usuario tendrá que establecer la ruta de búsqueda de directorios, en función de la distribución que utilice.

Establecer el uso de librería estándar de C++ para Libc++
Clang
$ export CXXFLAGS+=" -stdlib=libc++ -I$(llvm-config --includedir)/c++/v1"
$ export LDFLAGS+=" -L$(llvm-config --libdir)"

Establecer el uso de enlazador dinámico para Mold
$ export LDFLAGS+=' -fuse-ld=mold'

Establecer el uso de enlazador dinámico para LLD
Clang
$ export LDFLAGS+=' -fuse-ld=lld'
Optimizaciones complementarias LTO/ThinLTO de LLD
$ export LDFLAGS+=' -Wl,--lto-aa-pipeline=globals-aa -Wl,--lto-newpm-passes=memcpyopt'
Optimizaciones complementarias LTO de LLD
$ export LDFLAGS+=" -Wl,--lto-partitions=$(expr $(nproc) / 2)"
Optimizaciones complementarias ThinLTO de LLD
$ export LDFLAGS+=" -Wl,--thinlto-jobs=$(expr $(nproc) / 2)"

Establecer la variable de entorno de uso de compilador para Clang
$ export CC=clang CXX=clang++

Extracción  Bloc de Notas Información general sobre el uso de los comandos

$ tar Jxvf upx-4.2.4-src.tar.xz
$ cd upx-4.2.4-src
$ sed -i '204,211d' CMakeLists.txt
$ cmake -S . -B build -DBUILD_TESTING=OFF \
-DUPX_CONFIG_DISABLE_{WERROR,SANITIZE,GITREV}=OFF -G Ninja

Explicación de los comandos

sed -i '204,211d' CMakeLists.txt : Borra opciones de configuración del paquete, que sobrescriben el nivel de optimización establecido en el manual.

-S . -B build : Establece el directorio del código fuente y crea de forma automática el directorio de compilación.

-DBUILD_TESTING=OFF : Desactiva la compilación de los tests del paquete.

-DUPX_CONFIG_DISABLE_{WERROR,SANITIZE,GITREV}=OFF : Evita que los avisos sean tratados como errores, desactiva las opciones del compilador relativas a incluir en el binario ejecutable, soporte de detección de errores de memoria y, por último, no incluye la última revisión git del paquete, en la versión del programa.

-G Ninja : Utiliza Ninja en lugar de GNU Make para compilar el paquete (opcional).


Compilación

$ ninja -C build

Parámetros de compilación opcionales

-v : Muestra más información en el proceso de compilación.

-j$(nproc) : Establece el número de procesos de compilación en paralelo, en función del número de núcleos e hilos que tenga nuestro procesador, tomando como referencia la información mostrada por el sistema con el comando correspondiente. Si nuestro procesador es mononúcleo de un solo hilo, no añadir esta opción.

Instalación como root

$ su -c "ninja -C build install/strip"

Estadísticas de Compilación e Instalación de UPX

Estadísticas de Compilación e Instalación de UPX
CPU AMD Ryzen 5 5500
MHz 3600 (BoostMax=4457)
RAM 32 GB
Sistema de archivos XFS
Versión del Kernel 6.8.9-ml SMP PREEMPT_DYNAMIC x86_64
Modo de frecuencia de la CPU powersave (balance performance)
Planificador de CPU BMQ
Versión de Glibc 2.39
Librería estándar de C++ Libc++ 18.1.5
Enlazador dinámico LLD 18.1.5
Compilador Clang 18.1.5
Parámetros de optimización -03 -march=znver3 -mtune=znver3 -mllvm -polly -mllvm -polly-vectorizer=stripmine -flto -funified-lto -Wl,--lto=thin -Wl,--thinlto-jobs=6 -Wl,--lto-aa-pipeline=globals-aa -Wl,--lto-newpm-passes=memcpyopt
Parámetros de compilación -v -j12
Tiempo de compilación 9"
Archivos instalados 9
Mostrar/Ocultar la lista de archivos instalados
Ocupación de espacio en disco 2,5 MB

Desinstalación como root

1) MODO TRADICIONAL

***********************

2) MODO MANUALINUX

upx-4.2.4-scripts.tar.gz

$ su
# tar zxvf upx-4.2.4-scripts.tar.gz
# cd upx-4.2.4-scripts
# ./Desinstalar_upx-4.2.4

Copia de Seguridad como root

$ su
# tar zxvf upx-4.2.4-scripts.tar.gz
# cd upx-4.2.4-scripts
# ./Respaldar_upx-4.2.4

Restaurar la Copia de Seguridad como root

$ su
# cd /var/copibin/restaurar_copias
# ./Restaurar_upx-4.2.4



Iniciamos UPX  

Antes de utilizar este programa, tendremos que tener en cuenta una máxima aplicable al mismo: "El espacio que ganemos en el disco al comprimir un ejecutable, lo perderemos en proporciones mayores, en la memoria, a la hora de ejecutarlo comprimido". Ya que UPX utiliza ésta para descomprimir el ejecutable, además de la carga de CPU que supone el proceso de descompresión. Aunque esto último en los ordenadores actuales es absolutamente irrelevante, y el retardo es practicamente inexistente en el proceso de ejecución.

UPX soporta 3 formatos diferentes de ejecutables: Ejecutables en formato ELF (Linux/elf386), scripts de shell (Linux/sh386) y, por último, uno genérico que abarca a cualquier archivo ejecutable que tengamos en nuestro sistema (Linux/i386). En el caso del formato Linux/i386, los ejecutables se descomprimen siempre en el directorio temporal /tmp. Pero como bien es sabido, si tenemos montado este directorio con el sistema de archivos tmpfs, significa que estos ejecutables tambíén se descomprimirán en la memoria, en este caso, en la física.

UPX soporta 9 niveles de compresión, siendo el nivel -8, el predefinido para los archivos menores de 512 KB, y el nivel -7 para el resto. Si utilizamos el parámetro --best, UPX utilizará el mejor ratio de compresión posible, requiriendo bastante tiempo de proceso en archivos grandes.

En versiones recientes del programa, se han añadido los parámetros --brute--ultrabrute, que van más allá del ya de por sí lento, --best.

Todos los binarios ejecutables comprimidos con UPX, a efectos del sistema, son tratados como binarios estáticos, lo que impide que, por ejemplo, no podamos utilizar el comando ldd, para comprobar las librerías compartidas contra las que está enlazado un determinado binario que hayamos comprimido con este programa.

Ejemplos de uso

1) Comprimir el binario ejecutable de MAME con el nivel predefinido de compresión

[root@localhost /]# upx /usr/games/mame
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2022
UPX 4.0.0        Markus Oberhumer, Laszlo Molnar & John Reiser   Oct 28th 2022

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
 306923568 ->  90410272   29.46%   linux/amd64   mame

Packed 1 file.

Estadísticas de Compresión de UPX
Ejecutable mame
Tamaño original
292,7 MB
Tamaño comprimido
86,2 MB
Ratio de compresión 29.46 %
Tiempo de compresión
22,1"

2) Comprimir el binario ejecutable de MAME con el mejor nivel de compresión posible

[root@localhost /]# upx --best /usr/games/mame
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2022
UPX 4.0.0        Markus Oberhumer, Laszlo Molnar & John Reiser   Oct 28th 2022

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
 306923568 ->  86700328   28.25%   linux/amd64   mame

Packed 1 file.

Estadísticas de Compresión de UPX
Ejecutable mame
Tamaño original
292,7 MB
Tamaño comprimido
82,7 MB
Ratio de compresión 28.25 %
Tiempo de compresión
26' 05"

Como se puede comprobar, el uso del mejor nivel de compresión, resulta una pérdida de tiempo en este caso particular, con el añadido de que el programa no aprovecha la capacidad de los procesadores multinúcleo.

3) Comprobar el estado del archivo comprimido del binario ejecutable de MAME

[root@localhost /]# upx -t /usr/games/mame
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2022
UPX 4.0.0        Markus Oberhumer, Laszlo Molnar & John Reiser   Oct 28th 2022

testing /usr/games/mame [OK]

Tested 1 file.

4) Obtener información sobre el contenido del archivo comprimido del binario ejecutable de MAME

[root@localhost /]# upx -l /usr/games/mame
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2022
UPX 4.0.0        Markus Oberhumer, Laszlo Molnar & John Reiser   Oct 28th 2022

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
 306923568 ->  90410272   29.46%   linux/amd64   mame


5) Devolver el archivo comprimido del binario ejecutable de MAME a su estado original

[root@localhost /]# upx -d /usr/games/mame
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2022
UPX 4.0.0        Markus Oberhumer, Laszlo Molnar & John Reiser   Oct 28th 2022

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
 306923568 ->  90410272   29.46%   linux/amd64   mame


Unpacked 1 file.



Enlaces  


https://upx.github.io >> La web de UPX.


Foro Galería Blog


Actualizado el 09-05-2024

Utilidades - UPX

Utilidades - TreeSize for UnixUtilidades - vRenamer