Reubicación R_X86_64_32S contra `.rodata '... Mientras se compila en una plataforma de 64 bits

So I've been coding something on 32-bit and yesterday I needed to build a dll and I had a couple of problems with that. Anyway I solved them aquí.

Unfortunately even if I thought that everything was working after all I found that wasn't the case when I moved my program and makefile on other computer what runs on 64bit, as you can guess what happened...

So my problem is related to relocation because of 64bit

/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

and here is my makefile

MyProgram: main.o chkopts
    -${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
    ${RM} main.o

    export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH 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}

I've tried to add -fPIC in CFLAGS, CPPFLAGS and even LDFLAGS. I've also tried add -fPIC before and after -shared flag.

-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

But I'll just get a same error as previously.

If I use CFLAGS = -fPIC I'll get a bit same kind of error which is:

.../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.

I've read about all the topics what are even remotely similar with my problem but I've been unable to figure this out.

preguntado el 09 de marzo de 12 a las 16:03

Thank you so much for asking and answering the question. Now if only somebody could explain why adding "-shared" resolved it... -

8 Respuestas

I encountered the same problem when I try to create a shared library which need to link a static library.

I solved the problem by adding -fPIC to CXXFLAGS to compile .o files which are archived in the static library.

contestado el 07 de mayo de 14 a las 19:05

The solution was to compile everything with -fPIC, and link shared objects with -shared.

Agregar -fPIC a CFLAGS or CXXFLAGS for make-based projects.

contestado el 30 de mayo de 15 a las 14:05

what do you mean all libraries ? I have same problem :(, pls help me ? I have used -shared tag in the command that create .so file , should I use that somewhere else ?!?! - Farzad Salimi Jazi

I don't understand the answer either. Please clarify it! :( - Jorge Suárez de Lis

Clarify this answer please - edef

Trying to compile xmlrpc-c-1.06.41 in CentOS 6.5, I have encountered same linking problem, which was solved by the following: In ./src/cpp, I have modified Makefile: line 142 to


More info regarding the flags can be found enlace

contestado el 26 de mayo de 14 a las 19:05

The problem I had was very 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

If this problem still exist after adding "-fPIC",try clean all the .o files,and run again

contestado el 16 de mayo de 17 a las 09:05

I also meet this problem. As I try using @Mare and @user2391685 said, it can work well :

Usar -fPIC when comepile to .o file : For example:

gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/

Then you can build a .so expediente :

gcc -Wall -rdynamic -shared -o 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

this work as a charm. for who not know yet this easy used

an open file called or Makefile. Just up to your config.

look the code at this _a_CXXFLAGS = o solo CXXFLAGS =

add after that files -shared -fPIC

este ejemplo



después de

crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIC_FLAGS) $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC

these bugs cause we not put shared for the files or need -fPIC strings/tags.

Note: I experience on to build my blockchain. and this cause added this crypto/sph_sha2big.c

respondido 27 mar '20, 02:03

En los de línea de comandos:

cmake -DCMAKE_EXE_LINKER_FLAGS="-no-pie"

O en el CMakeList.txt:


contestado el 13 de mayo de 21 a las 05:05

Relocation R_X86_64_PC32 against undefined symbol , usually happens when LDFLAGS are set with hardening and CFLAGS not . An usually happens when override all system flags with CFLAGS="something" you need change it to CFLAGS+="something"

Respondido 31 ago 21, 22:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.