g++ compile error: `.rodata' can not be used when making a shared object; recompile with -fPIC

前端 未结 3 2014
既然无缘
既然无缘 2020-12-10 02:16

I am using the command:
g++ --std=c++11 -fPIC -Iincludes parser.cpp lib/main-parser.o lib/lib.a

To compile a C++ program on Debian 9. But I am gett

相关标签:
3条回答
  • 2020-12-10 03:14
    /usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' \
    can not be used when making a shared object; recompile with -fPIC
    

    This linker error is telling you that the object file csdocument.o in the static library lib/lib.a is not Position Independent Code and hence cannot be linked with your PIE program. So you need to recompile the source files of lib/lib.a with -fPIC, then rebuild the static library, then link it with your PIE program. If you don't have control of the libary sources then request a PIC build from its supplier.

    (Others have questioned why you should need to build a PIE target at all since it's not a shared library. In Debian 9, GCC produces PIE executables by default, whether programs or shared libraries. The same goes for Ubuntu as of 17.04. )

    0 讨论(0)
  • 2020-12-10 03:15

    Adding this worked for me.

    g++ --std=c++11 -no-pie
    

    I also added the -fPIC to compile flag.

    0 讨论(0)
  • 2020-12-10 03:21

    As it seems gcc is trying to produce a position-independent executable, tell it not to:

    g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a
    

    It seems that g++ produces position-independent executables by default on your system. Other systems would require -pie to do so. Using -no-pie should create a "regular" (position dependent) executable.

    0 讨论(0)
提交回复
热议问题