Перемещение по xxx в разделе «.text» только для чтения – неправильный компилятор или настройка Linux в SUSE?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перемещение по xxx в разделе «.text» только для чтения – неправильный компилятор или настройка Linux в SUSE?

Сообщение Anonymous »

Я не часто пользуюсь Linux и думаю, что сделал что-то не так.
Это код для тестовой динамической библиотеки ".so", которую я создаю.< /p>

Код: Выделить всё

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
  • Моя среда разработки — Code::Blocks 20 (последняя версия). В настройках пусто, кроме флага -m64.
Что я делаю не так? Кажется, это могут помочь мне понять опытные пользователи Linux.
РЕДАКТИРОВАТЬ:
Чтобы добавить больше информации, это можно скомпилировать в Ubuntu с теми же настройками. Нет в SUSE

Подробнее здесь: https://stackoverflow.com/questions/654 ... r-linux-se
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»