【问题标题】:correct linking order with ifort and .so libraries与 ifort 和 .so 库的正确链接顺序
【发布时间】:2023-04-01 20:20:02
【问题描述】:

我有两个第 3 方库 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() 的错误版本由于某种原因被链接。

我将把链接顺序作为第一个 stab 进行翻转,但是有没有一种工具可以用来检查 executable.exe 以查看运行时将调用哪个版本的 subroutine1()?

谢谢!

【问题讨论】:

    标签: linker shared-libraries intel-fortran


    【解决方案1】:

    如果您希望从libB.so 调用subroutine1,则正确的链接顺序是-lB -lA(适用于Linux 和大多数其他UNIX 共享库实现)。

    有什么工具可以用来检查executable.exe,看看运行时会调用哪个版本的subroutine1()

    否:该信息通常不记录在可执行文件中。规则是:首先定义subroutine1 的共享库将被使用。

    例如,如果您使用-lC -lB -lA 链接,并且在链接时libC.so 是否没有定义subroutine1,但稍后您重建libC.so没有 重新链接可执行文件)这样做,然后将调用来自libC.sosubroutine1

    但请注意,存在并发症。例如,libA.so 可能与-Bsymbolic 链接,这将导致从libA.so 内部对subroutine1 的所有调用绑定到libA.so 自身内部的subroutine1

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      相关资源
      最近更新 更多