Linker 使用ifort和.so库更正链接顺序
我有两个第三方库A.so和B.so,因此我将与我的可执行文件.exe链接在一起。A.so包含一个由B.so解决的bug,即:Linker 使用ifort和.so库更正链接顺序,linker,shared-libraries,intel-fortran,Linker,Shared Libraries,Intel Fortran,我有两个第三方库A.so和B.so,因此我将与我的可执行文件.exe链接在一起。A.so包含一个由B.so解决的bug,即: A::subroutine1()调用时可能会因浮点异常而崩溃(FP算术错误) B::subroutine1()是一个固定的实现,应该始终调用它,而不是a::subroutine1() A和B的正确链接顺序是什么?我现在做的是: ifort <....> executable.exe <...> -lA -lB ifort executable
调用时可能会因浮点异常而崩溃(FP算术错误)A::subroutine1()
是一个固定的实现,应该始终调用它,而不是B::subroutine1()
a::subroutine1()
ifort <....> executable.exe <...> -lA -lB
ifort executable.exe-lA-lB
我仍然时不时地遇到浮点异常(错误无法准确再现,因此调试非常困难)。然而,当它崩溃时,程序让我知道A::subroutine1()是违规者——因此出于某种原因,错误版本的subroutine1()被链接进来
作为第一步,我将翻转链接顺序,但是是否有一个工具可以用来检查executable.exe,以查看在运行时将调用哪个版本的子程序1()
谢谢 如果希望调用
libB.so
中的子例程1
,则正确的链接顺序为-lB-lA
(适用于Linux和大多数其他UNIX共享库实现)
是否有一个工具可以用来检查executable.exe,以查看在运行时将调用哪个版本的子程序1()
否:该信息通常不会记录在可执行文件中。规则是:首先定义子例程1
的共享库就是要使用的库
例如,如果您链接到-lC-lB-lA
,并且在链接时libC.so
没有定义subroutine1
,但是稍后您重新构建libC.so
(不重新链接可执行文件),那么libC.so中的子例程1
将被调用
然而,请注意,也存在一些复杂情况。例如,libA.so
可能与-Bsymbolic
链接,这将导致从libA.so
内部对子例程1
的所有调用绑定到libA.so
内部的子例程1