206.1 - Ejercicios: Compilar e instalar desde fuentes
Pregunta 1
¿Cual es el directorio de instalacion por defecto cuando se ejecuta ./configure sin la opcion --prefix?
a) /usr
b) /opt
c) /usr/local
d) /usr/share
Respuesta
c) /usr/local
El directorio por defecto para la instalacion de software compilado desde fuentes es /usr/local. Este directorio esta reservado para software que el administrador instala manualmente, separandolo del software gestionado por el sistema de paquetes.
Pregunta 2
¿Que comando se utiliza para regenerar todos los archivos de autotools de una sola vez?
a) autoconf --regenerate
b) autoreconf -i
c) automake --rebuild-all
d) aclocal --force
Respuesta
b) autoreconf -i
El comando autoreconf -i ejecuta automaticamente aclocal, autoheader, automake --add-missing y autoconf en el orden correcto, regenerando todos los archivos necesarios del sistema autotools.
Pregunta 3
¿Que archivo genera autoconf a partir de configure.ac?
a) Makefile
b) Makefile.in
c) configure
d) config.h
Respuesta
c) configure
autoconf lee el archivo configure.ac (o el antiguo configure.in) y genera el script configure. Este script es el que se ejecuta para detectar las caracteristicas del sistema y generar el Makefile final.
Pregunta 4
Despues de instalar una nueva biblioteca compartida en /opt/custom/lib, ¿cual es la forma correcta y permanente de hacerla accesible al sistema?
a) Establecer LD_LIBRARY_PATH=/opt/custom/lib en /etc/profile
b) Crear un archivo en /etc/ld.so.conf.d/ con la ruta y ejecutar ldconfig
c) Copiar la biblioteca a /usr/lib manualmente
d) Ejecutar ldconfig /opt/custom/lib sin configuracion adicional
Respuesta
b) Crear un archivo en /etc/ld.so.conf.d/ con la ruta y ejecutar ldconfig
La forma correcta y permanente es crear un archivo .conf en /etc/ld.so.conf.d/ que contenga la ruta /opt/custom/lib y luego ejecutar sudo ldconfig para actualizar la cache. La opcion a) funciona pero no es la solucion recomendada.
Pregunta 5
¿Que comando muestra las bibliotecas compartidas que necesita un binario?
a) ldconfig -p
b) pkg-config --libs
c) ldd
d) objdump -d
Respuesta
c) ldd
El comando ldd muestra todas las bibliotecas compartidas (shared libraries) que un binario ejecutable necesita en tiempo de ejecucion, junto con las rutas donde se encuentran. Por ejemplo: ldd /usr/bin/ssh.
Pregunta 6
¿Que opcion de ./configure se utiliza para habilitar el soporte de un paquete externo como OpenSSL?
a) --enable-ssl
b) --with-ssl
c) --add-ssl
d) --include-ssl
Respuesta
b) --with-ssl
Las opciones --with-PAQUETE se usan para habilitar soporte para paquetes externos. Las opciones --enable-FEATURE se usan para activar caracteristicas internas del software. Aunque ambas pueden parecer similares, --with hace referencia a dependencias externas y --enable a funcionalidades internas.
Pregunta 7
En un proyecto que utiliza CMake, ¿cual es el procedimiento correcto de compilacion?
a) cmake . && make && make install
b) mkdir build && cd build && cmake .. && make
c) cmake --build && cmake --install
d) cmake configure && cmake make
Respuesta
b) mkdir build && cd build && cmake .. && make
La practica recomendada con CMake es crear un directorio de compilacion separado (out-of-source build), entrar en el, ejecutar cmake apuntando al directorio del codigo fuente (..), y luego ejecutar make. Esto mantiene los archivos generados separados del codigo fuente.
Pregunta 8
¿Que comando de pkg-config muestra los flags necesarios para enlazar con una biblioteca?
a) pkg-config --cflags libreria
b) pkg-config --link libreria
c) pkg-config --libs libreria
d) pkg-config --ldflags libreria
Respuesta
c) pkg-config --libs libreria
pkg-config --libs devuelve los flags de enlazado (linker flags) necesarios para compilar contra una biblioteca, como -L/ruta/lib -lnombre. Por otro lado, --cflags devuelve los flags de compilacion como rutas de inclusion de cabeceras (-I/ruta/include).
Pregunta 9
¿Que hace el comando make -j$(nproc)?
a) Ejecuta make en modo silencioso b) Compila el proyecto utilizando todos los nucleos disponibles del procesador c) Genera un reporte de compilacion en formato JSON d) Fuerza la recompilacion de todos los archivos
Respuesta
b) Compila el proyecto utilizando todos los nucleos disponibles del procesador
La opcion -j de make permite la compilacion en paralelo. $(nproc) es un comando que devuelve el numero de nucleos del procesador. Juntos, make -j$(nproc) aprovecha todos los nucleos disponibles para acelerar la compilacion.
Pregunta 10
¿Que archivo almacena la cache binaria generada por ldconfig?
a) /etc/ld.so.conf
b) /etc/ld.so.cache
c) /var/cache/ldconfig/ld.cache
d) /usr/lib/ld.cache
Respuesta
b) /etc/ld.so.cache
ldconfig lee las rutas configuradas en /etc/ld.so.conf y sus archivos incluidos, y genera una cache binaria en /etc/ld.so.cache. Esta cache es consultada por el enlazador dinamico (ld.so / ld-linux.so) para localizar rapidamente las bibliotecas compartidas en tiempo de ejecucion.
Pregunta 11
¿Que comando de make elimina los archivos generados tanto por la compilacion como por el script configure, dejando el directorio en su estado original?
a) make clean
b) make distclean
c) make realclean
d) make purge
Respuesta
b) make distclean
El comando make distclean elimina todos los archivos generados, incluyendo los objetos compilados, los binarios Y los archivos generados por ./configure (como Makefile y config.h). A diferencia de make clean, que solo elimina los archivos de compilacion, distclean deja el directorio como estaba antes de ejecutar ./configure.
Pregunta 12
¿Que variable de entorno se utiliza para especificar temporalmente directorios adicionales donde el enlazador dinamico debe buscar bibliotecas compartidas?
a) LIBRARY_PATH
b) LD_LIBRARY_PATH
c) SHARED_LIB_PATH
d) LIB_PATH
Respuesta
b) LD_LIBRARY_PATH
La variable LD_LIBRARY_PATH permite especificar directorios adicionales donde el enlazador dinamico busca bibliotecas compartidas en tiempo de ejecucion. Es una solucion temporal; la forma permanente es agregar la ruta en un archivo en /etc/ld.so.conf.d/ y ejecutar ldconfig. LIBRARY_PATH se usa en tiempo de compilacion, no en ejecucion.
Pregunta 13
¿Que herramienta de autotools genera el archivo Makefile.in a partir de Makefile.am?
a) autoconf
b) automake
c) aclocal
d) libtool
Respuesta
b) automake
automake procesa el archivo Makefile.am (escrito por el desarrollador con reglas simplificadas) y genera Makefile.in, que es una plantilla de Makefile. Posteriormente, el script configure procesa Makefile.in sustituyendo las variables detectadas del sistema para producir el Makefile final. autoconf genera configure y aclocal genera macros m4.
Pregunta 14
Al compilar software desde fuentes, ¿que opcion de ./configure se usa para desactivar una caracteristica interna del programa?
a) --without-FEATURE
b) --disable-FEATURE
c) --no-FEATURE
d) --exclude-FEATURE
Respuesta
b) --disable-FEATURE
Las opciones --enable-FEATURE y --disable-FEATURE se usan para activar o desactivar caracteristicas internas del software. Las opciones --with-PAQUETE y --without-PAQUETE se usan para habilitar o deshabilitar el soporte de paquetes o dependencias externas. Esta distincion es importante para el examen.
Pregunta 15
¿Que comando de pkg-config verifica si una biblioteca esta instalada y disponible en el sistema?
a) pkg-config --check libreria
b) pkg-config --exists libreria
c) pkg-config --installed libreria
d) pkg-config --verify libreria
Respuesta
b) pkg-config --exists libreria
El comando pkg-config --exists libreria retorna un codigo de salida 0 si la biblioteca esta disponible y un codigo diferente de 0 si no lo esta. Se usa frecuentemente en scripts de compilacion: pkg-config --exists libxml-2.0 && echo "Disponible". La informacion se obtiene de los archivos .pc en los directorios de pkg-config.
Pregunta 16
¿Que opcion de ./configure se utiliza para especificar la compilacion cruzada para una arquitectura diferente?
a) --arch=TIPO
b) --target=TIPO
c) --host=TIPO
d) --cross=TIPO
Respuesta
c) --host=TIPO
La opcion --host=TIPO indica al script configure que el binario resultante se ejecutara en una arquitectura diferente a la del sistema de compilacion. Por ejemplo, --host=arm-linux-gnueabihf compilaria para procesadores ARM desde un sistema x86. Esto es esencial para compilar software para dispositivos embebidos o arquitecturas diferentes.
Pregunta 17
¿Que extension tienen las bibliotecas estaticas en Linux?
a) .so
b) .a
c) .lib
d) .dll
Respuesta
b) .a
Las bibliotecas estaticas en Linux tienen la extension .a (archive). Se integran completamente en el binario durante la compilacion, lo que produce ejecutables mas grandes pero independientes. Las bibliotecas compartidas (dinamicas) tienen la extension .so (shared object). .lib y .dll son extensiones utilizadas en sistemas Windows.
Pregunta 18
¿Que archivo de configuracion de CMake se busca en la raiz del proyecto para definir como compilar el software?
a) CMakeConfig.txt
b) CMakeLists.txt
c) cmake.conf
d) Makefile.cmake
Respuesta
b) CMakeLists.txt
El archivo CMakeLists.txt es el archivo de configuracion principal de CMake. Define las reglas de compilacion, dependencias, opciones configurables y targets del proyecto. Se ubica en la raiz del proyecto y puede incluir subdirectorios con sus propios CMakeLists.txt. Es equivalente en proposito al Makefile.am de autotools.
Pregunta 19
Al ejecutar ldconfig -p, ¿que informacion se obtiene?
a) Las rutas configuradas en /etc/ld.so.conf
b) El contenido de la cache de bibliotecas compartidas
c) Los paquetes de desarrollo instalados
d) Las bibliotecas estaticas disponibles
Respuesta
b) El contenido de la cache de bibliotecas compartidas
El comando ldconfig -p (print cache) muestra todas las bibliotecas compartidas registradas en la cache /etc/ld.so.cache, incluyendo el nombre de la biblioteca y la ruta completa donde se encuentra. Es util para verificar si una biblioteca especifica esta disponible: ldconfig -p | grep libssl.
Pregunta 20
Un programa recien instalado desde fuentes falla al ejecutarse con el error “error while loading shared libraries: libfoo.so.1: cannot open shared object file”. ¿Cual es la solucion mas probable?
a) Recompilar el programa con make clean && make
b) Agregar la ruta de la biblioteca en /etc/ld.so.conf.d/ y ejecutar ldconfig
c) Reinstalar el compilador gcc
d) Ejecutar make install nuevamente
Respuesta
b) Agregar la ruta de la biblioteca en /etc/ld.so.conf.d/ y ejecutar ldconfig
Este error indica que el enlazador dinamico no puede encontrar la biblioteca libfoo.so.1. La solucion es agregar el directorio donde se instalo la biblioteca (normalmente /usr/local/lib) en un archivo en /etc/ld.so.conf.d/ y ejecutar sudo ldconfig para actualizar la cache. Alternativamente, se puede usar LD_LIBRARY_PATH como solucion temporal.
Pregunta 21
Escribe el comando para ver las bibliotecas compartidas que necesita el binario /usr/bin/ssh.
Respuesta
ldd /usr/bin/ssh
El comando ldd muestra todas las bibliotecas compartidas que un ejecutable necesita en tiempo de ejecucion y las rutas donde se encuentran. Si alguna biblioteca no se encuentra, mostrara “not found” junto al nombre, indicando un problema de dependencia.
Pregunta 22
Escribe el comando para actualizar la cache del enlazador dinamico despues de instalar nuevas bibliotecas compartidas.
Respuesta
ldconfig
El comando ldconfig reconstruye la cache /etc/ld.so.cache leyendo los directorios configurados en /etc/ld.so.conf y /etc/ld.so.conf.d/. Debe ejecutarse (normalmente con sudo) cada vez que se instalan o eliminan bibliotecas compartidas para que el enlazador dinamico pueda encontrarlas.
Pregunta 23
Escribe el comando para compilar un proyecto usando todos los nucleos del procesador disponibles.
Respuesta
make -j$(nproc)
La opcion -j de make habilita la compilacion en paralelo y el parametro indica el numero de tareas simultaneas. $(nproc) es un subcomando que devuelve el numero de nucleos disponibles del procesador, maximizando asi la velocidad de compilacion.
Pregunta 24
Escribe el comando para obtener los flags de enlazado (linker flags) de la biblioteca libcurl usando pkg-config.
Respuesta
pkg-config —libs libcurl
El comando pkg-config --libs libcurl devuelve los flags necesarios para enlazar con la biblioteca libcurl, como -L/ruta/lib -lcurl. Estos flags se pasan al compilador/enlazador durante la fase de enlazado. Para obtener los flags de compilacion (rutas de cabeceras) se usa --cflags.
Pregunta 25
Escribe el comando para verificar todas las opciones disponibles del script configure de un proyecto.
Respuesta
./configure —help
El comando ./configure --help muestra todas las opciones de configuracion disponibles para el proyecto, incluyendo opciones de directorios (--prefix, --bindir), caracteristicas opcionales (--enable/--disable), dependencias externas (--with/--without) y variables de entorno relevantes. Es fundamental revisarlo antes de compilar.