【问题标题】:Relocation R_X86_64_32S against `.rodata' ... While compiling on 64-bit platform针对“.rodata”重定位 R_X86_64_32S ...在 64 位平台上编译时
【发布时间】:2012-03-09 16:28:37
【问题描述】:

所以我一直在 32 位上编写一些东西,昨天我需要构建一个 dll,但我遇到了一些问题。无论如何我解决了他们here

不幸的是,即使我认为一切正常,但当我将程序和 makefile 移到其他运行 64 位的计算机上时发现情况并非如此,你可以猜到发生了什么......

所以我的问题与搬迁有关,因为 64 位

/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

这是我的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}

我尝试在 CFLAGS、CPPFLAGS 甚至 LDFLAGS 中添加 -fPIC。我也尝试在 -shared 标志之前和之后添加 -fPIC。

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

但我会得到与以前相同的错误。

如果我使用 CFLAGS = -fPIC,我会遇到类似的错误:

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

我已经阅读了所有与我的问题非常相似的主题,但我一直无法弄清楚。

【问题讨论】:

标签: c++ g++ 32bit-64bit


【解决方案1】:

我在尝试创建需要链接静态库的共享库时遇到了同样的问题。

我通过将 -fPIC 添加到 CXXFLAGS 以编译归档在静态库中的 .o 文件解决了这个问题。

【讨论】:

    【解决方案2】:

    解决方案是使用-fPIC 编译所有内容,并使用-shared 链接共享对象。

    -fPIC 添加到CFLAGSCXXFLAGS 对于基于make 的项目。

    【讨论】:

    • 所有库是什么意思?我有同样的问题:(,请帮助我?我在创建 .so 文件的命令中使用了 -shared 标签,我应该在其他地方使用它吗?!?!
    • 我也不明白答案。请澄清! :(
    • 请澄清这个答案
    【解决方案3】:

    尝试在CentOS 6.5下编译xmlrpc-c-1.06.41,遇到同样的链接问题,解决方法如下: 在 ./src/cpp 中,我已将 Makefile: line 142 修改为

    CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC
    

    有关标志的更多信息可以找到link

    【讨论】:

    • 我遇到的问题很相似,/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
    • 有时当你运行 -fPIC 时,它会为某些子目标文件再次抛出此错误。只需备份该目标文件并再次运行 make 即可。例子。您正在运行 TotalSum.cpp,它引用了另一个文件 CalculateSum.o。现在,错误出现在CalculateSum.o 上。因此,还要备份CalculateSum.o 并运行-fPIC。错误将消失。
    【解决方案4】:

    如果添加“-fPIC”后仍然存在此问题,请尝试清理所有.o文件,然后再次运行

    【讨论】:

      【解决方案5】:

      我也遇到了这个问题。 正如我尝试使用@Mare 和@user2391685 所说,它可以很好地工作:

      编译到.o文件时使用-fPIC: 例如:

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

      然后你可以建立一个.so 文件:

      gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/
      

      【讨论】:

        【解决方案6】:

        这项工作很有魅力。对于谁还不知道这个容易使用

        一个名为 Makefile.amMakefile 的打开文件。取决于您的配置。

        看看这个 _a_CXXFLAGS = 的代码或只是 CXXFLAGS =

        在文件之后添加 -shared -fPIC

        这个例子

        之前

        crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIC_FLAGS) $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD)

        之后

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

        这些错误导致我们没有为文件设置共享或需要 -fPIC 字符串/标签。

        注意:我体验过构建我的区块链。这个原因添加了这个 crypto/sph_sha2big.c

        【讨论】:

          【解决方案7】:

          命令行

          cmake -DCMAKE_EXE_LINKER_FLAGS="-no-pie"
          

          或者在CMakeList.txt中:

          set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie")
          

          【讨论】:

            【解决方案8】:

            针对未定义符号重定位 R_X86_64_PC32,通常发生在 LDFLAGS 设置为硬化而 CFLAGS 未设置时。 当 configure.ac 使用 CFLAGS="something" 覆盖所有系统标志时,通常会发生这种情况,您需要将其更改为 CFLAGS+="something"

            https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-30
              • 2018-06-19
              • 2019-05-25
              • 2011-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多