6.2 Compilación de Software
6.2 Compilación de Software
Sección titulada “6.2 Compilación de Software"Cómo sobrevivir cuando APT te abandona
Sección titulada “Cómo sobrevivir cuando APT te abandona"tutorial.getReady
- Entenderás por qué compilar a pelo es la última (y peligrosa) frontera del Sysadmin.
- Sabrás cómo extraer los infames “Tarball” fuente (
.tar.gzo.tar.bz2). - Seguirás la Santísima Trinidad de GNU:
./configure,make,make install. - Sabrás utilizar
lddpara hacer autopsias a ejecutables descubriendo qué.dlls /.soles faltan. - Conocerás las mejores prácticas y peligros de la compilación manual.
- Aprenderás a resolver problemas comunes durante el proceso de compilación.
Introducción: El Arte de la Compilación Manual
Sección titulada “Introducción: El Arte de la Compilación Manual"Te contratan en una empresa que utiliza un software matemático propietario diseñado en 1999. Es la espina dorsal del negocio, pero el software es tan antiguo u oscuro que nunca ha existido en un repositorio de Debian. Si ejecutas apt search mi-software-raro, te devolverá cero resultados. Estás solo.
El creador solo te proporciona un archivo comprimido que contiene texto puro: el código fuente (generalmente escrito en lenguaje C). Para que el procesador lo entienda y Linux gane un comando nuevo, serás tú el responsable absoluto de construir y ensamblar los engranajes transformando textos legibles en binarios mecánicos. Eso es compilar.
¿Por qué compilar manualmente?
Sección titulada “¿Por qué compilar manualmente?"Existen varias razones por las que podrías necesitar compilar software desde el código fuente:
- Software no disponible en repositorios: Como en el caso de nuestro software matemático de 1999.
- Necesidad de optimizaciones específicas: Compilar para tu arquitectura exacta puede mejorar el rendimiento.
- Funcionalidades experimentales: Versiones de desarrollo que aún no están empaquetadas.
- Control total de dependencias: Evitar conflictos con versiones específicas de bibliotecas.
- Auditoría de seguridad: Revisar el código fuente antes de compilarlo.
Los riesgos de compilar manualmente
Sección titulada “Los riesgos de compilar manualmente"Advertencia importante: Compilar software manualmente no es un proceso trivial y conlleva riesgos significativos:
- Problemas de seguridad: El software compilado manualmente no recibirá actualizaciones automáticas de seguridad.
- Conflictos con el sistema: Puedes sobrescribir archivos del sistema o crear dependencias rotas.
- Dificultad de mantenimiento: No podrás usar
apt update/upgradepara actualizar este software. - Falta de integración: El software no aparecerá en las herramientas de gestión de paquetes.
- Posibles incompatibilidades: Las bibliotecas compiladas pueden no ser compatibles con futuras actualizaciones del sistema.
Siempre que sea posible, prioriza el uso de repositorios oficiales o alternativas como Flatpak, Snap o AppImage antes de compilar manualmente.
1. Desempaquetar el Tarball
Sección titulada “1. Desempaquetar el Tarball"El código fuente suele venir empaquetado y ultra-comprimido en lo que los informáticos más maduros denominan “Tarball” (pelota de alquitrán, usualmente .tar.gz). Debemos descomprimir la carpeta fuente a nuestro disco duro de trabajo (suele ser /usr/local/src o /opt).
Tipos de compresión comunes
Sección titulada “Tipos de compresión comunes"| Extensión | Comando de descompresión | Descripción |
|---|---|---|
.tar.gz o .tgz | tar -xzf archivo.tar.gz | Compresión gzip (más común) |
.tar.bz2 | tar -xjf archivo.tar.bz2 | Compresión bzip2 (mejor compresión) |
.tar.xz | tar -xJf archivo.tar.xz | Compresión xz (la mejor compresión) |
.zip | unzip archivo.zip | Formato ZIP de Windows |
.tar | tar -xf archivo.tar | Sin compresión, solo empaquetado |
Ejemplo práctico de desempaquetado
Sección titulada “Ejemplo práctico de desempaquetado"# Crear la zona de extracciones y navegar a ellasudo mkdir -p /usr/local/srccd /usr/local/src
# Descargar el tarball (ejemplo con wget)wget https://example.com/software_oscuro-1.0.tar.gz
# Desempaquetar extrayendo (eXtract) e imprimiendo la Verbosa (V) vista de Archivos (F)# La opción -z indica que está comprimido con gzipsudo tar -xzvf software_oscuro-1.0.tar.gz
# Verificar que se creó la carpetals -la
# Entramos en la carpeta que acaba de dar a luzcd software_oscuro-1.0/
# Listar el contenido para ver qué tenemosls -laArchivos críticos que debes buscar
Sección titulada “Archivos críticos que debes buscar"Dentro del directorio descomprimido, presta especial atención a estos archivos:
- README o README.md: Contiene información general, requisitos y notas importantes.
- INSTALL: Instrucciones específicas de instalación.
- COPYING o LICENSE: Información sobre la licencia del software.
- CHANGELOG: Historial de cambios y versiones.
- AUTHORS: Créditos de los desarrolladores.
Siempre lee el README y el INSTALL antes de continuar. Pueden contener instrucciones específicas que difieran del proceso estándar.
Estructura típica del código fuente
Sección titulada “Estructura típica del código fuente"software-1.0/├── README # Información general├── INSTALL # Instrucciones de instalación├── COPYING # Licencia├── Makefile.am # Configuración de Make (para automake)├── configure.ac # Configuración de autoconf├── src/ # Código fuente principal│ ├── main.c│ ├── funciones.c│ └── header.h├── include/ # Archivos de cabecera públicos├── lib/ # Bibliotecas auxiliares├── doc/ # Documentación└── tests/ # Pruebas unitarias2. La Santísima Trinidad (GNU Build System)
Sección titulada “2. La Santísima Trinidad (GNU Build System)"Salvo que el README indique instrucciones raras, el 90% del código en C/C++ de la historia de Unix se compila ejecutando secuencialmente estos tres pasos inexcusables dentro de la carpeta fuente.
El Arquitecto (./configure)
Sección titulada “El Arquitecto (./configure)"El código fuente no está listo para tu PC exacto. Al ejecutar este pequeño script que viene en la carpeta, el Arquitecto escaneará tu sistema:
- Qué compilador tienes (gcc, clang, etc.)
- Qué bibliotecas están instaladas
- Qué arquitectura de procesador (x86_64, ARM, etc.)
- Dónde están los archivos de cabecera
- Qué características del sistema están disponibles
Anatomía del script ./configure
Sección titulada “Anatomía del script ./configure"El script configure es generado por herramientas como Autoconf y Automake, que forman parte del GNU Build System. Este script:
- Verifica la presencia de un compilador C/C++ funcional.
- Busca bibliotecas requeridas (como OpenSSL, libxml2, etc.).
- Detecta características del sistema operativo.
- Genera el
Makefilepersonalizado para tu sistema. - Crea archivos de configuración con los valores detectados.
Opciones comunes de ./configure
Sección titulada “Opciones comunes de ./configure"# Ver todas las opciones disponibles./configure --help
# Opciones más comunes:./configure --prefix=/usr/local # Directorio de instalación./configure --with-openssl # Habilitar soporte OpenSSL./configure --without-x11 # Deshabilitar soporte X11./configure --enable-debug # Compilar con símbolos de depuración./configure --disable-shared # No compilar bibliotecas compartidas./configure --with-python=/usr/bin/python3 # Especificar ruta de PythonErrores comunes de ./configure
Sección titulada “Errores comunes de ./configure"Error: gcc compiler not found
# Solución: Instalar el paquete de herramientas de compilaciónsudo apt updatesudo apt install build-essentialError: missing libssl
# Solución: Instalar las bibliotecas de desarrollosudo apt install libssl-devError: missing libxml2
# Solución: Instalar las bibliotecas de desarrollosudo apt install libxml2-devError: configure: error: C compiler cannot create executables
Este error es más grave y puede deberse a:
- Permisos incorrectos en el directorio de trabajo.
- Problemas con el compilador (versión incompatible).
- Falta de bibliotecas estándar (libc-dev).
# Diagnóstico: Verificar el compiladorgcc --version
# Reinstalar herramientas basesudo apt install --reinstall build-essentialError: configure: error: cannot run C compiled programs
Indica que el compilador no puede crear ejecutables funcionales. Puede ocurrir en sistemas con arquitecturas cruzadas o entornos de compilación restringidos.
# Verificar que el compilador funciona correctamenteecho 'int main(){return 0;}' > test.cgcc test.c -o test./testecho $? # Debe devolver 0Nota: Los archivos de configuración generados por ./configure suelen guardarse en archivos como config.log que contienen información detallada de los errores. Siempre revisa config.log cuando ./configure falle.
Ejemplo completo de ./configure
Sección titulada “Ejemplo completo de ./configure"# Verificar que tenemos los requisitos necesarios./configure --prefix=/usr/local --with-openssl
# El script generará un Makefile personalizado# La salida típica muestra:# checking for gcc... gcc# checking whether the C compiler works... yes# checking for OpenSSL... found# checking for library containing sqrt... -lm# configure: creating ./config.status# config.status: creating MakefileLos Obreros Ciegos (make)
Sección titulada “Los Obreros Ciegos (make)"Ahora que tenemos los planos (Makefile), le mandamos a las herramientas constructoras genuinas que empiecen a forjar el acero usando el código. Construirán el ejecutable binario, lo cual dependiendo del tamaño del software podría tardar segundos o catorce horas.
¿Qué es realmente make?
Sección titulada “¿Qué es realmente make?"make es una herramienta de automatización que:
- Lee el Makefile generado por
./configure. - Determina qué archivos necesitan ser compilados (basándose en dependencias).
- Ejecuta el compilador (
gcc,g++, etc.) para cada archivo fuente. - Enlaza los objetos compilados en binarios ejecutables y bibliotecas.
Comandos make útiles
Sección titulada “Comandos make útiles"# Compilación normal (usando un núcleo)make
# Compilación paralela (usa múltiples núcleos)make -j4 # Usar 4 núcleosmake -j$(nproc) # Usar todos los núcleos disponiblesmake -j$(nproc) --load-average=2.0 # No sobrecargar el sistema
# Compilación con salida detalladamake V=1 # Mostrar todos los comandos ejecutados
# Opciones adicionalesmake -k # Continuar aunque haya errores (útil para pruebas)make -n # Simular la ejecución (dry-run)make --debug # Mostrar información de depuraciónGestión de recursos durante make
Sección titulada “Gestión de recursos durante make"Para compilaciones grandes, considera:
-
Usar
nicepara reducir la prioridad del proceso:ventana terminal nice -n 19 make -j$(nproc) -
Limitar el uso de memoria:
ventana terminal # Para compiladores como GCCexport CFLAGS="-pipe -O2 -march=native"make -j$(nproc) -
Monitorear el progreso:
ventana terminal # Instalar y usar 'progress' para ver el avancemake -j$(nproc) 2>&1 | pv -l -s $(find . -name "*.c" | wc -l) > /dev/null
Compilación en segundo plano
Sección titulada “Compilación en segundo plano"# Compilar en segundo plano y guardar el logmake -j$(nproc) > build.log 2>&1 &tail -f build.log # Seguir el progresoErrores comunes de make
Sección titulada “Errores comunes de make"Error: make: *** No targets specified and no makefile found. Stop.
Causa: Ejecutaste make sin haber ejecutado ./configure primero.
Error: undefined reference to 'function_name'
Causa: Falta enlazar una biblioteca o el código fuente está incompleto.
Solución: Verificar las dependencias y asegurarse de que ./configure encontró todo.
Error: fatal error: header.h: No such file or directory
Causa: Faltan archivos de cabecera (header files).
Solución: Instalar el paquete de desarrollo correspondiente (ej: libxml2-dev).
Error: memory exhausted o internal compiler error
Causa: El compilador se queda sin memoria RAM.
Solución: Cerrar otros programas o compilar con menos núcleos: make -j2.
Entendiendo el proceso de compilación
Sección titulada “Entendiendo el proceso de compilación"El proceso de compilación en C/C++ se divide en varias etapas:
- Preprocesamiento: Procesa directivas
#include,#define, etc. - Compilación: Convierte el código C en código ensamblador.
- Ensamblado: Convierte el código ensamblador en código objeto (
.o). - Enlazado (Linking): Combina los objetos en un ejecutable o biblioteca.
make orquesta todas estas etapas automáticamente.
El Instalador Oficial (make install)
Sección titulada “El Instalador Oficial (make install)"El paso 2 forjó exitosamente el programa, pero el programa está secuestrado dentro de su carpeta actual en /usr/local/src/. Debemos darle la orden de despiojar sus ejecutables finalizados y mandarlos estandarizadamente a la carpeta genuina del sistema donde Linux busca todos los comandos (usualmente de local a /usr/local/bin). Como esto toca el corazón del sistema, requiere credenciales divinas.
sudo make install¿Qué hace exactamente make install?
Sección titulada “¿Qué hace exactamente make install?"- Copia los binarios a
/usr/local/bin(o el directorio configurado en--prefix). - Copia bibliotecas a
/usr/local/lib(si las hay). - Copia archivos de cabecera a
/usr/local/include(si es una biblioteca). - Copia documentación a
/usr/local/share/doc. - Copia archivos de configuración a
/usr/local/etc. - Crea los directorios necesarios en el sistema.
Estructura de instalación estándar (FHS)
Sección titulada “Estructura de instalación estándar (FHS)"| Directorio | Contenido |
|---|---|
/usr/local/bin | Binarios ejecutables |
/usr/local/lib | Bibliotecas compartidas |
/usr/local/include | Archivos de cabecera |
/usr/local/share | Archivos independientes de arquitectura |
/usr/local/etc | Archivos de configuración |
/usr/local/man | Páginas de manual |
Opciones de instalación avanzadas
Sección titulada “Opciones de instalación avanzadas"# Instalar en un directorio específico (staging)make install DESTDIR=/tmp/paquete
# No instalar documentaciónmake install INSTALL_DOC=no
# Instalar solo los binarios (no bibliotecas)make install-binDesinstalación (cuando es posible)
Sección titulada “Desinstalación (cuando es posible)"Algunos paquetes incluyen una regla para desinstalar:
sudo make uninstall # No todos los paquetes lo soportanSi no existe uninstall, tendrás que eliminar manualmente los archivos:
# Ver qué archivos se instalaronmake install --dry-run # Simular instalación
# Eliminar manualmente (ejemplo)sudo rm -f /usr/local/bin/software_oscuro¡Felicidades!
Sección titulada “¡Felicidades!"¡Felicidades! Ahora podrás teclear software_oscuro en cualquier parte de tu terminal y funcionará, escapando para siempre de la ignorancia de apt.
3. Autopsia Dinámica de Librerías (ldd)
Sección titulada “3. Autopsia Dinámica de Librerías (ldd)"El software compilado ha funcionado meses… pero de repente el servidor se actualiza con apt upgrade ayer, y hoy programas oscuros caseros lanzan este horror:
error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file
¿Qué son las bibliotecas compartidas?
Sección titulada “¿Qué son las bibliotecas compartidas?"En Linux, los binarios no siempre vienen con todo incluido. Toman “prestado” de otras librerías del sistema en caliente. (Lo que en Windows se llamaría .dll, en Linux se llama ficheros .so de Shared Object).
Las ventajas de usar bibliotecas compartidas:
- Ahorro de espacio: Una sola copia para múltiples programas.
- Actualización centralizada: Se actualiza la biblioteca y todos los programas se benefician.
- Memoria compartida: Múltiples procesos pueden usar la misma biblioteca en memoria.
El inconveniente: Los programas dependen de versiones específicas de bibliotecas.
Los peligros de las bibliotecas dinámicas
Sección titulada “Los peligros de las bibliotecas dinámicas"- Actualizaciones de sistema: Una actualización puede cambiar las bibliotecas.
- Versiones incompatibles: Un programa puede esperar una versión anterior.
- Bibliotecas faltantes: El paquete correspondiente no está instalado.
- Rutas incorrectas: La biblioteca está en una ubicación diferente.
La herramienta ldd
Sección titulada “La herramienta ldd"Si un programa compilado u oscuro no arranca sin explicar claramente qué le falta, utiliza tu bisturí List Dynamic Dependencies (ldd) sobre el binario enfermo para examinar sus enlaces rotos:
# Sintaxis básicaldd /usr/local/bin/software_oscuro
# También funciona con bibliotecasldd /usr/local/lib/liboscura.so.1Interpretación de la salida de ldd
Sección titulada “Interpretación de la salida de ldd"$ ldd /usr/bin/ls linux-vdso.so.1 (0x00007ffe5a3e2000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8a2c300000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a2c100000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f8a2c080000) /lib64/ld-linux-x86-64.so.2 (0x00007f8a2c360000)Cada línea muestra:
- Nombre de la biblioteca (ej:
libc.so.6). - Resolución (
=>seguido de la ruta) onot foundsi falta. - Dirección de carga en memoria (entre paréntesis).
Ejemplo de bibliotecas faltantes
Sección titulada “Ejemplo de bibliotecas faltantes"$ ldd /usr/local/bin/mi-programa linux-vdso.so.1 (0x00007ffe5a3e2000) libcrypto.so.1.1 => not found libssl.so.1.1 => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a2c100000)En este caso, faltan libcrypto.so.1.1 y libssl.so.1.1.
Solución de problemas con ldd
Sección titulada “Solución de problemas con ldd"Paso 1: Identificar la biblioteca faltante
ldd /usr/local/bin/mi-programa | grep "not found"Paso 2: Buscar el paquete que la contiene
# En Debian/Ubuntuapt-file search libcrypto.so.1.1
# En RHEL/CentOS/Fedorayum provides libcrypto.so.1.1# odnf provides libcrypto.so.1.1
# En Archpkgfile libcrypto.so.1.1Paso 3: Instalar el paquete faltante
# Debian/Ubuntusudo apt install libssl1.1
# RHEL/CentOS/Fedorasudo yum install openssl-libs
# Archsudo pacman -S opensslPaso 4: Verificar que se resolvió
ldd /usr/local/bin/mi-programaHerramientas avanzadas para dependencias
Sección titulada “Herramientas avanzadas para dependencias"readelf: Para examinar binarios ELF (Formato Ejecutable y Enlazable):
# Ver secciones y encabezadosreadelf -h /usr/local/bin/mi-programa
# Ver dependencias dinámicasreadelf -d /usr/local/bin/mi-programa | grep NEEDED
# Ver información de enlacesreadelf -s /usr/local/bin/mi-programaobjdump: Información detallada de objetos:
# Ver dependenciasobjdump -p /usr/local/bin/mi-programa | grep NEEDED
# Ver tabla de símbolosobjdump -T /usr/local/bin/mi-programanm: Listar símbolos en objetos:
# Ver símbolos exportadosnm -D /usr/local/lib/liboscura.soVariables de entorno para dependencias
Sección titulada “Variables de entorno para dependencias"LD_LIBRARY_PATH: Forzar búsqueda en directorios específicos:
# Agregar directorio a la ruta de búsquedaexport LD_LIBRARY_PATH=/opt/software/lib:$LD_LIBRARY_PATH./mi-programaLD_PRELOAD: Precargar bibliotecas:
# Precargar una biblioteca específicaLD_PRELOAD=/opt/software/lib/libcustom.so ./mi-programaLD_DEBUG: Depurar el proceso de enlace:
# Ver todos los enlaces en tiempo realLD_DEBUG=libs ./mi-programa
# Ver símbolos resueltosLD_DEBUG=symbols ./mi-programaCrear enlaces simbólicos para compatibilidad
Sección titulada “Crear enlaces simbólicos para compatibilidad"A veces tienes una versión diferente de la biblioteca y necesitas crear un enlace:
# Ejemplo: el programa espera libcrypto.so.1.1 pero tienes libcrypto.so.3sudo ln -s /usr/lib/libcrypto.so.3 /usr/lib/libcrypto.so.1.1
# Verificar que funcionaldd /usr/local/bin/mi-programaAdvertencia: Crear enlaces entre versiones diferentes puede causar problemas de compatibilidad. Siempre prueba exhaustivamente.
4. Mejores Prácticas y Consejos Avanzados
Sección titulada “4. Mejores Prácticas y Consejos Avanzados"Usar stow para gestionar instalaciones manuales
Sección titulada “Usar stow para gestionar instalaciones manuales"stow permite organizar paquetes compilados en directorios separados y crear enlaces simbólicos:
# Instalar stowsudo apt install stow
# Compilar con un prefijo específico./configure --prefix=/usr/local/stow/mi-software-1.0makesudo make install
# Crear los enlaces simbólicoscd /usr/local/stowsudo stow mi-software-1.0
# Desinstalar fácilmentesudo stow -D mi-software-1.0Crear paquetes .deb (o .rpm) desde el código fuente
Sección titulada “Crear paquetes .deb (o .rpm) desde el código fuente"Convertir una compilación manual en un paquete manejable:
# Usar checkinstall (Debian/Ubuntu)sudo apt install checkinstallsudo checkinstall
# Usar fpm (crea .deb, .rpm, etc.)sudo gem install fpmfpm -s dir -t deb -n mi-software -v 1.0 /usr/local/bin/mi-programaAuditoría de seguridad antes de compilar
Sección titulada “Auditoría de seguridad antes de compilar"- Revisar el código fuente: Buscar código malicioso o vulnerabilidades.
- Verificar sumas de comprobación: Usar
sha256sumpara verificar integridad. - Verificar firmas PGP: Si el proyecto proporciona firmas.
- Analizar dependencias: Verificar que todas son confiables.
Documentación de la instalación
Sección titulada “Documentación de la instalación"Mantén un registro de lo que instalaste:
# Crear un archivo de registroecho "mi-software-1.0 installed on $(date)" >> /usr/local/src/install-log.txtecho "Compiled with: $(gcc --version | head -n1)" >> /usr/local/src/install-log.txtScript de instalación completa
Sección titulada “Script de instalación completa"Crea un script para automatizar el proceso:
#!/bin/bash# install-software.sh - Instalación automática de software oscuro
set -e # Salir si hay error
SOFTWARE="software_oscuro"VERSION="1.0"URL="https://example.com/${SOFTWARE}-${VERSION}.tar.gz"
echo "=== Instalando ${SOFTWARE} ${VERSION} ==="
# Instalar dependenciassudo apt updatesudo apt install -y build-essential libssl-dev libxml2-dev
# Descargar y extraercd /usr/local/srcwget ${URL}tar -xzf ${SOFTWARE}-${VERSION}.tar.gzcd ${SOFTWARE}-${VERSION}
# Compilar e instalar./configure --prefix=/usr/localmake -j$(nproc)sudo make install
# Verificarecho "=== Verificación ==="which ${SOFTWARE} || echo "ERROR: ${SOFTWARE} no encontrado en PATH"ldd $(which ${SOFTWARE}) || echo "ERROR: Dependencias faltantes"
echo "=== INSTALACIÓN COMPLETADA ==="5. Casos Especiales
Sección titulada “5. Casos Especiales"Compilación cruzada
Sección titulada “Compilación cruzada"Compilar para una arquitectura diferente:
# Ejemplo: Compilar para ARM desde x86_64export CROSS_COMPILE=arm-linux-gnueabihf-export CC=${CROSS_COMPILE}gcc./configure --host=arm-linux-gnueabihfmakeCompilación con soporte de depuración
Sección titulada “Compilación con soporte de depuración"Para depurar problemas:
export CFLAGS="-g -O0 -DDEBUG"./configure --enable-debugmakeCompilación estática (todo en un solo binario)
Sección titulada “Compilación estática (todo en un solo binario)"Evita dependencias externas:
./configure --enable-static --disable-sharedmake LDFLAGS="-static"Ventaja: No hay dependencias de bibliotecas. Desventaja: Binarios más grandes y no aprovechan actualizaciones de bibliotecas.
6. Caso Práctico: Compilación de OpenSSL desde Fuente
Sección titulada “6. Caso Práctico: Compilación de OpenSSL desde Fuente"Vamos a ver un ejemplo completo con OpenSSL (un software común que a veces se compila manualmente por necesidades de seguridad específicas):
# 1. Descargar y extraercd /usr/local/srcwget https://www.openssl.org/source/openssl-3.0.0.tar.gztar -xzf openssl-3.0.0.tar.gzcd openssl-3.0.0
# 2. Verificar la integridad (si hay firma disponible)# wget https://www.openssl.org/source/openssl-3.0.0.tar.gz.asc# gpg --verify openssl-3.0.0.tar.gz.asc openssl-3.0.0.tar.gz
# 3. Configurar con opciones específicas./Configure linux-x86_64 \ --prefix=/usr/local/openssl-3.0.0 \ --openssldir=/etc/ssl \ enable-ec_nistp_64_gcc_128 \ enable-tls1_3 \ enable-crypto-mdebug
# 4. Compilarmake -j$(nproc)
# 5. Ejecutar pruebas (¡importante!)make test
# 6. Instalarsudo make install
# 7. Configurar para usar la nueva versiónsudo update-alternatives --install /usr/bin/openssl openssl /usr/local/openssl-3.0.0/bin/openssl 1
# 8. Verificaropenssl versionEjemplo Resumido
Sección titulada “Ejemplo Resumido"# 1. Obtener el código fuentewget https://example.com/software-1.0.tar.gztar -xzf software-1.0.tar.gzcd software-1.0/
# 2. configure — El arquitecto# Lee el sistema, comprueba dependencias, genera el Makefile./configure --prefix=/usr/local
# 3. make — Los obreros# Lee el Makefile y compila el código fuente en binariosmake -j$(nproc) # -j = paralelo, nproc = número de CPUs
# 4. make install — El instalador# Copia los binarios compilados al sistema (necesita root)sudo make install
# 5. Verificaciónwhich softwareldd $(which software)Comprueba tus conocimientos
Sección titulada “Comprueba tus conocimientos"-
Estás ante el proceso de instalación manual más duro GNU y estás harto de estar adivinando. Has tirado
./configurepero el programa acaba su ciclo emitiendo un terrorífico mensaje:Configure Error: C compiler cannot create executables. Sin un compilador universal, no puedes avanzar al pasomakeporque no hay nadie forjando el acero de ‘C’. ¿Qué mega-paquete legendario del repositorio de Debian se exige a todo Sysadmin tener preparado instalado por defecto precisamente para solventar estos dolores en entornos crudos sin compilador habilitado? -
Acabas de entrar a tu flamante directorio fuente descargado
/opt/utilidad-v5.0/. Como estás furioso tiras directamentemakeesperando que los obreros fundan el ejecutable. Pero obtienes instantáneamente el rechazo colosal de bash:make: *** No targets specified and no makefile found. Stop.. ¿A qué se debe esto estructuralmente en el formato GNU? -
Un desarrollador de tu backend te envía un software mágico autocompilado
.exede UNIX. Lo pones en/usr/bin/miscripte intentas ejecutarlo tirando en el shell./miscript. Obtienes un lacónico error invisible de “Archivos u Objetos Compartidos no Encontrados”. Necesitáis hacerle una radiografía a esa caja negra empaquetada binaria hoy mismo para deducir ciegamente a qué librerías está queriendo enlazar dentro de tu servidor y cuáles están faltantes. ¿Cuál de estos es un paso estándar para este fin?
-
Has seguido todos los pasos de la compilación, pero al intentar ejecutar tu programa recién instalado obtienes:
error while loading shared libraries: libcustom.so.1: cannot open shared object file. Has verificado quelibcustom.so.1está en/opt/mi-software/lib. ¿Cuáles son dos formas válidas de solucionar este problema? -
Has compilado exitosamente un software que instala archivos en
/usr/local/bin. Después de unos meses, quieres desinstalarlo porque ya no lo necesitas. El paquete no tienemake uninstall. ¿Cuál es la forma más segura de proceder? -
Durante la compilación de un software grande (como el kernel de Linux), te das cuenta de que el proceso está usando demasiada memoria RAM y el sistema se vuelve lento. Quieres limitar el uso de recursos. ¿Qué opción de
makey qué variables de entorno podrías usar? -
Estás compilando un software que requiere
libxml2, y./configurefalla indicando que no la encuentra. Has verificado quelibxml2está instalado en el sistema. ¿Cuál podría ser el problema y cómo lo solucionarías? -
Después de instalar un software compilado manualmente, notas que otros programas del sistema han dejado de funcionar correctamente. ¿Cuál es la causa más probable y cómo deberías proceder?
-
Has compilado un programa que incluye un binario llamado
myappy varias bibliotecas.so. Quieres que otros usuarios puedan ejecutarlo sin configurarLD_LIBRARY_PATHcada vez. ¿Qué enfoque es el más recomendado? -
El comando
./configurete muestra el mensaje:configure: WARNING: unrecognized options: --with-custom-flag. A pesar de la advertencia, el proceso continúa y completas la compilación. ¿Deberías preocuparte?
Resumen de Comandos Esenciales
Sección titulada “Resumen de Comandos Esenciales"| Comando | Función |
|---|---|
tar -xzvf archivo.tar.gz | Extraer tarball comprimido con gzip |
tar -xjvf archivo.tar.bz2 | Extraer tarball comprimido con bzip2 |
./configure —prefix=/usr/local | Preparar la compilación para el sistema actual |
make -j$(nproc) | Compilar usando todos los núcleos disponibles |
sudo make install | Instalar el software en el sistema |
ldd /ruta/binario | Ver dependencias dinámicas del binario |
sudo ldconfig | Actualizar el caché de bibliotecas del sistema |
export LD_LIBRARY_PATH=/ruta:$LD_LIBRARY_PATH | Añadir directorio a la ruta de bibliotecas |
objdump -p /ruta/binario | grep NEEDED | Ver bibliotecas necesarias (alternativa a ldd) |
readelf -d /ruta/binario | Ver dependencias dinámicas en formato ELF |