La comstackción falla con “reubicación R_X86_64_32 contra` .rodata.str1.8 ‘no se puede usar al hacer un objeto compartido “

Estoy intentando comstackr este código fuente del archivo MAKE en un VPS, pero no está funcionando. El VPS es un 64 Cent OS

Aquí está el error completo

# make gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o /usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC TCP-LINUX_V1.o: could not read symbols: Bad value collect2: ld returned 1 exit status make: *** [all] Error 1 

Aquí está mi archivo MAKE:

 GPP=g++ GCC=gcc OUTFILE="TCP_V1.so" COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/ all: $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp $(GPP) $(COMPILE_FLAGS) *.cpp $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o 

Alguien sabe lo que está mal?

Haga lo que el comstackdor le indique que haga, es decir, recompile 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 de GCC.

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

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

En mi caso, este error se produjo porque un comando make esperaba buscar bibliotecas compartidas (archivos *.so ) desde un directorio remoto indicado por una variable de entorno LDFLAGS . En un error, solo las bibliotecas estáticas estaban disponibles allí (archivos *.la o *.a ).

Por lo tanto, mi problema no residía en el progtwig que estaba comstackndo, sino en las bibliotecas remotas que intentaba recuperar. Por lo tanto, no necesité agregar ningún indicador (por ejemplo, -fPIC ) a la comstackción interrumpida por el error de reubicación. Más bien, volví a comstackr la biblioteca remota para que los objetos compartidos estuvieran disponibles.

Básicamente, ha sido un error de archivo no encontrado en el disfraz.

En mi caso, tuve que eliminar un conmutador --disable-shared en la invocación de configure para el progtwig requerido, ya que las bibliotecas compartidas y estáticas se construyeron como predeterminadas.


Noté que la mayoría de los progtwigs crean ambos tipos de bibliotecas al mismo tiempo, por lo que el mío es probablemente un caso de esquina. En general, es posible que tenga que habilitar bibliotecas compartidas, según los valores predeterminados.

Para inspeccionar su situación particular con interruptores de comstackción y valores predeterminados, leería el resumen que aparece con ./configure --help | less ./configure --help | less , típicamente en la sección Características 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 progtwigs de dependencia.

No siempre se trata de los indicadores de comstackción, tengo el mismo error en gentoo cuando uso distcc.

La razón es que en el servidor de distcc está utilizando un perfil no reforzado y en el cliente el perfil está reforzado. Consulte esta discusión: https://forums.gentoo.org/viewtopic-p-7463994.html

Yo tuve el mismo problema. Intente recomstackr usando el indicador -fPIC .

Un “limpio” lo resolvió para mí.

Mi proyecto es una aplicación C ++ (biblioteca no compartida) y obtuve este error al azar una vez cuando intenté comstackrlo.