3

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

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

谢谢!

4

1 回答 1

1

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

有没有一种工具可以用来检查executable.exe,以查看运行时将调用哪个版本的subroutine1()

否:该信息通常不记录在可执行文件中。规则是:无论哪个共享库定义了subroutine1第一个,都会被使用。

例如,如果您链​​接-lC -lB -lA, 并且在链接时libC.so没有定义,后来您重建(而不重新链接可执行文件)所以它这样做了,那么from将被调用。subroutine1libC.sosubroutine1libC.so

但是请注意,有一些并发症。例如,libA.so可以与 链接-Bsymbolic,这将导致对subroutine1from inside的所有调用libA.so绑定到其自身。subroutine1libA.so

于 2011-10-12T07:11:58.287 回答