@cryptohas

Что означает ошибка «Error: relocation ... cannot be used with -shared»?

Эта ошибка появляется и в qmake, и в CMake. Код сборки:

cmake_minimum_required(VERSION 3.5)
project(gpg VERSION 0.1 LANGUAGES CXX)
target_link_libraries(chatpgp PRIVATE Qt${QT_VERSION_MAJOR}::Widgets
    PUBLIC libassuan.a
    PUBLIC libgpgme.a
    PUBLIC libgpg-error.a)
if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(gpg)
endif()


Ответ:

:-1: error: error: relocation R_AARCH64_TLSLE_ADD_TPREL_HI12 against .LANCHOR0 cannot be used with -shared
debug.o):-1: defined in /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a(debug.o)
debug.o:-1: referenced by debug.o:(_gpgme_debug_frame_begin) in archive /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a
:-1: error: error: relocation R_AARCH64_TLSLE_ADD_TPREL_LO12_NC against .LANCHOR0 cannot be used with -shared
debug.o):-1: defined in /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a(debug.o)
debug.o:-1: referenced by debug.o:(_gpgme_debug_frame_begin) in archive /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a
:-1: error: error: relocation R_AARCH64_TLSLE_ADD_TPREL_HI12 against .LANCHOR0 cannot be used with -shared
debug.o):-1: defined in /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a(debug.o)
debug.o:-1: referenced by debug.o:(_gpgme_debug_frame_end) in archive /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a
:-1: error: error: relocation R_AARCH64_TLSLE_ADD_TPREL_LO12_NC against .LANCHOR0 cannot be used with -shared
debug.o):-1: defined in /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a(debug.o)
debug.o:-1: referenced by debug.o:(_gpgme_debug_frame_end) in archive /home/hashed/qt-android/gpgme-1.18.0/arm64-static/libgpgme.a


Что это может быть? Библиотеки скачаны с официального сайта Debian
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что означает ошибка «Error: relocation ... cannot be used with -shared»

Эта ошибка значает, что такой объектник содержит код, работа которого зависит от адреса по которому он будет размещён. Так называемый position-dependent code. Альтернатива -- position-independent code, такой, который выполняется одинаково, независимо от адреса, а все данные и константы, которые зависят от адреса, если таковые есть, вынесены из кода в отдельный изменяемый сегмент. Такой код генерируется компилятором если его вызывать с правильным флагом (например gcc -fpic). Из-за того что динамические библиотеки могут быть загружены в процесс по любому адресу существует требование, что код в них должен быть position-independent. Поэтому объектники скомпилированные как position-dependent обычно не могут быть слинкованы в динамическую библиотеку.

В данном случае запись о релокации с типом R_AARCH64_TLSLE_ADD_TPREL_HI12 говорит (частью TLSLE, где LE означает Local Executable) о том, что код объектника в котором она находится был намеренно собран с рассчётом на то, что объектник будет частью исполняемого файла, а не динамической библиотеки. Здесь можно почитать об отличиях моделей адресации TLS, в частности о модели Local Exec в разделе 4.4.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы