Reubicación R_X86_64_32S contra `.rodata '... Mientras se compila en una plataforma de 64 bits
Frecuentes
Visto 51,201 veces
28
Así que he estado codificando algo en 32 bits y ayer necesitaba construir un dll y tuve un par de problemas con eso. De todos modos los resolvi aquí.
Desafortunadamente, incluso si pensaba que todo funcionaba después de todo, descubrí que ese no era el caso cuando moví mi programa y el archivo MAKE a otra computadora que se ejecuta en 64 bits, como pueden adivinar lo que sucedió...
Entonces mi problema está relacionado con la reubicación debido a 64 bits
/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value
y aquí está mi makefile
MyProgram: main.o chkopts
-${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
${RM} main.o
export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH
LibMyProgram.so: MyClass.o chkopts
-${CLINKER} -shared -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
mv ${VERS} ${LIBADD}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}
Intenté agregar -fPIC en CFLAGS, CPPFLAGS e incluso LDFLAGS. También intenté agregar -fPIC antes y después de la bandera compartida.
-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
Pero obtendré el mismo error que antes.
Si uso CFLAGS = -fPIC, obtendré el mismo tipo de error, que es:
.../petsc/petsc-3.2-p6/arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.
He leído sobre todos los temas que son remotamente similares a mi problema, pero no he podido resolver esto.
8 Respuestas
10
Encontré el mismo problema cuando intento crear una biblioteca compartida que necesita vincular una biblioteca estática.
Resolví el problema agregando -fPIC a CXXFLAGS para compilar archivos .o que están archivados en la biblioteca estática.
contestado el 07 de mayo de 14 a las 19:05
7
La solución fue compilar todo con -fPIC
y vincular objetos compartidos con -shared
.
Añada -fPIC
a CFLAGS
or CXXFLAGS
para proyectos basados en make.
contestado el 30 de mayo de 15 a las 14:05
¿Qué quieres decir con todas las bibliotecas? Tengo el mismo problema :(, ¿por favor ayúdenme? He usado la etiqueta compartida en el comando que crea el archivo .so, ¿debería usar eso en otro lugar?!?! - Farzad Salimi Jazi
Yo tampoco entiendo la respuesta. Por favor, ¡clarifícalo! :( - Jorge Suárez de Lis
Aclara esta respuesta por favor - edef
4
Al tratar de compilar xmlrpc-c-1.06.41 en CentOS 6.5, encontré el mismo problema de vinculación, que se resolvió de la siguiente manera: en ./src/cpp, modifiqué Makefile: línea 142 para
CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC
Se puede encontrar más información sobre las banderas. aquí
contestado el 26 de mayo de 14 a las 19:05
El problema que tuve fue muy similar, /usr/bin/ld: XmlRpcCpp.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC XmlRpcCpp.o: could not read symbols: Bad value
- Saeed
A veces, lo que sucede es que cuando está ejecutando -fPIC, arrojará este error nuevamente para algún archivo de subobjeto. Simplemente haga una copia de seguridad de ese archivo de objeto y ejecute make nuevamente. Ejemplo. está ejecutando para TotalSum.cpp y tiene referencia a otro archivo CalculateSum.o. Ahora, aparece el error en CalculateSum.o. Por lo tanto, haga una copia de seguridad de CalculateSum.o y ejecute -fPIC. el error desaparecerá. - bgth
4
Si este problema persiste después de agregar "-fPIC", intente limpiar todos los archivos .o y vuelva a ejecutar
contestado el 16 de mayo de 17 a las 09:05
1
También me encuentro con este problema. Como intento usar @Mare y @user2391685 dijo, puede funcionar bien:
Usar -fPIC
cuando comepile a .o
archivo: Por ejemplo:
gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/
Entonces puedes construir un .so
expediente :
gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/
Respondido el 23 de diciembre de 15 a las 07:12
0
este trabajo como un encanto. para quien no sabe aun esta facil de usar
un archivo abierto llamado Makefile.am or Makefile. Solo hasta tu configuración.
mira el codigo de esto _a_CXXFLAGS = o solo CXXBANDERAS =
agregar después de esos archivos -compartido -fPIC
este ejemplo
antes
crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIC_FLAGS) $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD)
después de
crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIC_FLAGS) $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC
estos errores hacen que no pongamos archivos compartidos o que necesitemos cadenas/etiquetas -fPIC.
Nota: Experimento para construir mi cadena de bloques. y esta causa agregó este crypto/sph_sha2big.c
respondido 27 mar '20, 02:03
0
En primera de línea de comandos:
cmake -DCMAKE_EXE_LINKER_FLAGS="-no-pie"
O en el CMakeList.txt:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie")
contestado el 13 de mayo de 21 a las 05:05
0
La reubicación de R_X86_64_PC32 contra un símbolo indefinido, generalmente ocurre cuando los LDFLAGS se configuran con endurecimiento y los CFLAGS no. Suele ocurrir cuando configure.ac anula todos los indicadores del sistema con CFLAGS="algo", necesita cambiarlo a CFLAGS+="algo"
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
Respondido 31 ago 21, 22:08
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ g++ 32bit-64bit or haz tu propia pregunta.
Muchas gracias por preguntar y responder la pregunta. Ahora, si alguien pudiera explicar por qué agregar "-shared" lo resolvió... - cmo
Posible duplicado de ¿Qué significa la reubicación de R_X86_64_32S y R_X86_64_64? - jww