在只读部分“.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。我安装了 OpenSUSE 64bit,使用该库的应用程序也是 64bit。在另一个 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 中

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)