当 ld link 同一个库的不同版本时会发生什么
What happens when ld link different versions of the same library
假设我有 libA.so 版本 1.1 和 1.2,它们都定义了相同的符号。
如果 myApp 需要来自 libA 的符号但错误地链接了两个版本,会发生什么情况:
ld -o myApp -Lpath -lA_1_1 -lA_1_2
我说得对吗,只要它能找到,它就会使用第一个符号中的符号?
Am I right it will use symbols from the first one as long as it can find it?
是的,一般来说。这可能不是你想要的。
如果 libA_1_2
中的函数 foo()
调用库中的另一个 public 函数 bar()
,那么它将使用 libA_1_1
中的符号,这可能会做错事(例如,如果库的 v1.2 已更改,因此 foo()
期望 bar()
释放一些内存,但 bar()
的 v1.1 版本不会不要那样做)。
假设我有 libA.so 版本 1.1 和 1.2,它们都定义了相同的符号。
如果 myApp 需要来自 libA 的符号但错误地链接了两个版本,会发生什么情况:
ld -o myApp -Lpath -lA_1_1 -lA_1_2
我说得对吗,只要它能找到,它就会使用第一个符号中的符号?
Am I right it will use symbols from the first one as long as it can find it?
是的,一般来说。这可能不是你想要的。
如果 libA_1_2
中的函数 foo()
调用库中的另一个 public 函数 bar()
,那么它将使用 libA_1_1
中的符号,这可能会做错事(例如,如果库的 v1.2 已更改,因此 foo()
期望 bar()
释放一些内存,但 bar()
的 v1.1 版本不会不要那样做)。