Distribución de programas en Linux. Construcción estática

La comodidad de instalar la mayoría de los programas «localmente» (con herramientas tipo apt, yum, zypper…) nos hace olvidar uno de los puntos débiles de Linux: la distribución de programas.

Cuando el código fuente está disponible y las dependencias son pocas, lo normal es que el programa se compile sin demasiados dolores de cabeza.

En otro caso, la cosa se complica. Lo habitual es compilar el programa para las distribuciones más comunes, y ofrecerlo para descarga en el formato de paquete correspondiente (.deb, .rpm…) O bien, montar un repositorio público que se pueda añadir a la lista de orígenes de paquetes.

En estos tiempos de tiendas de aplicaciones para todos, comienza a sonar raro lo de querer instalar un programa «a mano», pero es algo que al menos en Linux sigue siendo necesario. Por ejemplo, cuando careces de privilegios en un servidor remoto. Si el servidor tiene un entorno más o menos propicio a la compilación, suele bastar con bajarse el código y crear los binarios.

En este sentido, hay que reconocerle a Windows el mérito de soportar binarios de versiones antiguas (incluyendo bastante de la época MS-DOS). Siempre que no se recurriese a enlace dinámico (que lleva al famoso «dll hell»)

Algunas referencias para los valientes que quieran penetrar el mundillo de los binarios Linux portables:

# Origen: http://insanecoding.blogspot.in/2012/07/creating-portable-linux-binaries.html
ldd app
objdump -T app | grep GLIBC_
# enlace estático curl, ssl, crypto; dinámico zlib, dl, threads, rt
gcc -o app *.o -static-libgcc -Wl,-Bstatic -lcurl -lssl -lcrypto -Wl,-Bdynamic -lz -ldl -lpthread -lrt 

# Origen: http://askubuntu.com/questions/315907/libc-so-6-version-glibc-2-16-not-found
/catbed/ld-linux.so.3 --library-path=/catbed:/whatever-else /usr/bin/python -python-args
# como especificar parametros enlace estático en cmake
# origen: http://cmake.3232098.n2.nabble.com/Howto-compile-static-executable-td5580269.html
  set(CMAKE_EXE_LINKER_FLAGS -static)
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
    set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)       # remove -Wl,-Bdynamic
    set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
    set(CMAKE_SHARED_LIBRARY_C_FLAGS)         # remove -fPIC
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS)
    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)    # remove -rdynamic
    set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) 

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *