GNU/Linux >> Tutoriales Linux >  >> Linux

La compilación falla con la reubicación R_X86_64_32 contra `.rodata.str1.8' no se puede usar al crear un objeto compartido

Haz lo que el compilador te dice que hagas, es decir, vuelve a compilar con -fPIC . Para saber qué hace esta bandera y por qué la necesita en este caso, consulte Opciones de generación de código. del manual GCC.

En resumen, el término código independiente de posición (PIC) se refiere al código de máquina generado que es independiente de la dirección de memoria, es decir, no hace ninguna suposición sobre dónde se cargó en la RAM. Se supone que solo el código independiente de la posición debe incluirse en los objetos compartidos (SO), ya que deberían tener la capacidad de cambiar dinámicamente su ubicación en la RAM.

Finalmente, puedes leer sobre esto en Wikipedia también.


En mi caso este error ocurrió porque un make el comando esperaba obtener bibliotecas compartidas (*.so archivos) desde un directorio remoto indicado por un LDFLAGS Variable ambiental. En un error, solo las bibliotecas estáticas estaban disponibles allí (*.la o *.a archivos).

Por lo tanto, mi problema no residía en el programa que estaba compilando, sino en las bibliotecas remotas que intentaba recuperar. Por lo tanto, no necesitaba agregar ninguna bandera (digamos, -fPIC ) a la compilación interrumpida por el error de reubicación. Más bien, volví a compilar la biblioteca remota para que los objetos compartidos estuvieran disponibles.

Básicamente, ha sido un error de archivo no encontrado disfrazado.

En mi caso tuve que quitar un --disable-shared fuera de lugar cambiar en el configure invocación para el programa requerido, ya que las bibliotecas compartidas y estáticas se crearon de forma predeterminada.

Me di cuenta de que la mayoría de los programas crean ambos tipos de bibliotecas al mismo tiempo, por lo que el mío es probablemente un caso de esquina. En general, puede darse el caso de que prefiera habilitar las bibliotecas compartidas, según los valores predeterminados.

Para inspeccionar su situación particular con los cambios de compilación y los valores predeterminados, leería el resumen que aparece con ./configure --help | less , normalmente en la sección Funciones opcionales. A menudo descubrí que esta lectura es más confiable que las guías de instalación que no se actualizan mientras evolucionan los programas de dependencia.


Lo arreglé con -no-pie opción en la etapa del enlazador:

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...

Linux
  1. Ssh Inside Ssh falla con "stdin:Is Not A Tty"?

  2. El comando lvremove falla con el error "LVM:no se puede eliminar el volumen lógico abierto"

  3. Error de Linux al cargar bibliotecas compartidas:no se puede abrir el archivo de objeto compartido:no existe tal archivo o directorio

  4. dynamic_cast falla cuando se usa con dlopen/dlsym

  5. ¿Cómo saber que la biblioteca compartida dada está construida con símbolos de depuración o no?

Detecte bibliotecas compartidas obsoletas en la memoria con UChecker

Cómo enumerar las bibliotecas compartidas utilizadas por los ejecutables en Linux

Bash Beginner Series #7:Toma de decisiones con sentencias If Else y Case

docker compose:error al cargar bibliotecas compartidas:libz.so.1:no se pudo asignar el segmento del objeto compartido:operación no permitida

Puede hacer ping/ssh a través de LAN pero no con Wi-Fi

¿Puede el malware de Windows dañar una computadora con Linux cuando se ejecuta con Wine?