правильный порядок компоновки с библиотеками ifort и .so

#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 себе.