C ++ Статически связанная разделяемая библиотека

У меня есть разделяемая библиотека, используемая другим приложением вне моего контроля, которое требует объектов * .so. Моя библиотека использует sqlite3, который должен быть статически связан с ним (мне абсолютно нужен автономный двоичный файл).

Когда я пытаюсь скомпилировать и скомпилировать свою библиотеку:

-fpic -flto -pthread -m64
-flto -static -shared

, я получаю следующую ошибку:

/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

Что такое перекомпилируйте с -fPIC , относящимся к? Мой код или CRT?

Я уже пытался скомпилировать свой объект с -fPIC с тем же результатом.

Спасибо.

РЕДАКТИРОВАТЬ:

проблема, похоже, не связана с SQLite3.

Я написал простую однострочную библиотеку, которая ничего не делает, которая компилируется и связывается следующим образом:

g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o

но не так:

g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o

Проблема, похоже, связана с CRT (crtbeginT.o). Могу ли я перекомпилировать GCC --with-pic или что-то еще?

26
задан Petr 9 July 2011 в 19:06
поделиться

1 ответ

Любой код, который каким-то образом попадет в динамическую библиотеку, должен быть перемещаемым. Это означает, что все, что связано с вашим .so, независимо от того, статически или динамически, должно быть скомпилировано с -fPIC. В частности, статическая библиотека sqlite также должна быть скомпилирована с -fPIC.

Подробности того, что означает PIC, приведены здесь: http://en.wikipedia.org/wiki/Position-independent_code

.
8
ответ дан 28 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: