在只读部分“.text”中针对 xxx 重定位 - SUSE 中的编译器或 linux 设置错误?

新手上路,请多包涵

我不是 Linux 的常客,我认为我做错了什么。

这是我正在生成的测试动态库“.so”的代码。

 class InternalClass
{
public:
    int Function(){ return 10; }
};

extern "C"
{
    int WrapperFunctionSimple() { return 10; }
    void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }
}

编译失败并出现以下错误:

 g++ -Wall -fexceptions -O2  -c /home/lidia/compartida/TestLibrary/TestLibrary/main.cpp -o obj/Release/main.o
g++ -shared  obj/Release/main.o  -o bin/Release/libTestLibrary.so -s
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: warning: relocation against `_Znwm@@GLIBCXX_3.4' in read-only section `.text'
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: relocation R_X86_64_PC32 against symbol `_Znwm@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status

我按照建议尝试使用 -fPIC 并编译。但是当使用这个库时,当我添加最后一个函数时它无法加载:

 void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }

问题是使用 InternalClass,没有这个功能一切正常。


我正在使用 VirtualBox。我安装的是 64 位的 OpenSUSE,使用该库的应用程序也是 64 位的。在另一个 linux 发行版 (Mint) 中,具有完全相同的项目和设置(没有 fPIC),它可以被编译。当我使用该库 (.so) 时,它可以在 SUSE 中使用。

我也在使用:

  • gcc (SUSE Linux) 7.5.0
  • g++ (SUSE Linux) 7.5.0
  • 我的 IDE 是 Code::Blocks 20(最新版本)。除 -m64 标志外,设置为空。

我究竟做错了什么?这似乎是高级 Linux 用户可以帮助我理解的东西。

编辑:要添加更多信息,这可以在 Ubuntu 中使用相同的设置进行编译。不在 SUSE 中

原文由 Darkgaze 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

对我来说,如果一个库 (A) 依赖于另一个库 (B),并且库 A 在库 B 之前链接。解决方案是先链接库 B,然后再链接 A。

原文由 nee6AGag 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题