#linker #shared-libraries #intel-fortran
#компоновщик #разделяемые библиотеки #intel-fortran
Вопрос:
У меня есть две сторонние библиотеки A.so и B.so что я связываю вместе с моим исполняемым файлом executable.exe . A.so содержит ошибку, которая устраняется B.so , то есть, скажем:
A::subroutine1()
при вызове может произойти сбой с исключением с плавающей запятой (ошибка арифметики FP)B::subroutine1()
это фиксированная реализация, которую всегда следует вызывать вместоA::subroutine1()
.
Каков правильный порядок компоновки для A и B? То, что я делаю сейчас, это:
ifort <....> executable.exe <...> -lA -lB
Я все еще время от времени получаю исключение с плавающей запятой (ошибка не воспроизводится точно, поэтому ее довольно сложно отлаживать). Однако, когда происходит сбой, программа сообщает мне, что нарушителем является A::subroutine1(), поэтому по какой-то причине привязывается неправильная версия subroutine1() .
Я переверну порядок компоновки в качестве первого шага, но есть ли инструмент, который я могу использовать для проверки executable.exe чтобы узнать, какая версия subroutine1() будет вызываться во время выполнения?
Спасибо!
Ответ №1:
Если вы хотите subroutine1
libB.so
, чтобы вызывался from , тогда правильный порядок ссылок -lB -lA
(для Linux и большинства других реализаций разделяемых библиотек UNIX).
есть ли инструмент, который я могу использовать для проверки executable.exe чтобы узнать, какая версия subroutine1() будет вызвана во время выполнения
Нет: эта информация обычно не записывается в исполняемый файл. Правило таково: какая бы разделяемая библиотека ни определяла subroutine1
первую, она будет использоваться.
Например, если вы связываетесь с -lC -lB -lA
, и во время компоновки libC.so
не определяется subroutine1
, но позже вы перестраиваете libC.so
(без повторной привязки исполняемого файла), чтобы это произошло, тогда subroutine1
libC.so
будет вызван from .
Однако обратите внимание, что есть сложности. Например, libA.so
может быть связан с -Bsymbolic
, что приведет к тому, что все вызовы subroutine1
изнутри libA.so
будут привязываться к subroutine1
самому libA.so
себе.