A su vez: alta versión de gcc para compilar un programa que se ejecuta en una máquina de glibc versión más baja

Autor: chnmagnus
enlace: https: //www.jianshu.com/p/77d7f7dc93b3
Fuente: libros de Jane

 

Por ejemplo, podemos utilizar gcc 9.3.0 compilador, pero la necesidad de publicar la versión de gcc 4.8.5 máquinas, ¿cómo hacer?

Se podría pensar de los métodos siguientes

  1. compilado estáticamente
  2. la liberación de contenedores
  3. Empaquetada de manera dependiente, por lo que ejecutar un programa utilizando locales

1. compilador estático (la mayoría de las escenas no de trabajo)

En la que el compilador estático no trabajo, libstdc ++ se compila de forma estática, pero no proporcionó función libc en esta área, incluso si usted es el programa CPP, siendo una alta probabilidad depende libc.so
por nm <bin> | grep GLIBC_si el glibc dependiente de determinar su programa, si no se se puede considerar directa libstdc ++ compilado estáticamente.

2. La descarga de envases (parte de la escena pueden ser utilizados)

Usar un entorno gcc9.3.0 editor llevar recipiente, es posible. Pero en algunos casos no hay recipientes y sin privilegios sudo, aún no es muy amable.

3. liberación de modo dependiente de empaquetado (plan general)

Este método, aunque no suena muy elegante, pero en realidad si tiene algún conocimiento del fichero ELF, es una manera buena. En virtud de los siguientes métodos específicos dicho.

3.1 Modo 1 es conjunto rpath y enlazador dinámico en tiempo de compilación

Cuando se obtiene un código fuente del programa condicional, y pueden recompilarse, puede especificar los parámetros directamente en tiempo de compilación para resolver.
me deja tiempo de compilación para agregar parámetros:

# 绝对路径
gcc -Wl,-rpath='/my/lib',-dynamic-linker='/my/lib/ld-linux.so.2' 

parámetros gcc

-Wl, opción
opción Pass como una opción para el enlazador.

parámetros ld

-rpath = dir
Añadir un directorio a la ruta de búsqueda de biblioteca en tiempo de ejecución. Esto se usa cuando se enlaza un ejecutable ELF con objetos compartidos.
--dynamic-enlazador = Archivo de
establecer el nombre del enlazador dinámico.

archivo ELF estos dos parámetros se proporcionan en los campos de interpretación y rPath.

rpath
nombre completo run-time search path, es un archivo ELF en un campo que especifica la ubicación de la búsqueda por lo que la primera prioridad cuando se ejecuta un archivo ejecutable, el compilador general por defecto deja el campo vacío. archivo ELF también tiene un campo de RUNPATH similares, su papel y rpath similar, pero ligeramente más baja prioridad de búsqueda. Buscar Prioridad:

rpath > LD_LIBRARY_PATH > runpath > ldconfig缓存 > 默认的/lib,/usr/lib等 

Si necesita especificar una carpeta de ruta lib relativa, se puede utilizar el ORIGEN variables, ld ORIGEN interpreta como ruta de acceso al archivo ejecutable se encuentra.

gcc -Wl,-rpath='$ORIGIN/../lib' 

intérprete
nombre completo elf interpreter, que se utiliza para cargar el archivo ELF. El campo en el enlace le ayudará a configurar de forma automática, el programa de 64 bits en general /lib64/ld-linux-x86-64.so.2. Este es también uno de los boxes tan lleno, mucha gente (como yo) para encontrar el programa depende de manera por LDD, empaquetado en el equipo de destino o modificar puntos rpath LD_LIBRARY_PATH en el directorio lib local, pero el programa LDD, buscar / lib64 / ld- Linux-x86-64.so.2 este punto, el sistema aún así, así. La razón es que el campo se codifica en el archivo elf, no sujeto a LD_LIBRARY_PATH afectada.

Llevar estos dos parámetros al compilar el programa siguiente depende sólo tiene que empacar por lo que una copia puede ser publicado con el programa.

3.2 Modo 2 modificar directamente rPath y de interpretación binarios

Cuando no se puede compilar el programa, también puede modificar rpath e intérprete por otros medios. Este caso requiere el uso de una herramienta patchelf, a través de dnf install patchelfla instalación. Puede modificar rpath y archivo ELF intérprete a través de él:

patchelf --set-rpath /my/lib your_program
patchelf --set-interpreter /my/lib/ld-linux.so.2 your_program

Además de la ruta absoluta, de una manera más común es el uso de pre-despliegue pwdpara obtener la ruta actual, utilizando una ruta relativa al directorio lib local.

patchelf --set-rpath `pwd`/../lib your_program
patchelf --set-interpreter `pwd`/../lib/ld-linux-x86-64.so.2 ./your_program
 
 

Supongo que te gusta

Origin www.cnblogs.com/water-bear/p/12607475.html
Recomendado
Clasificación