gpt4 book ai didi

c++ - 弱链接与使用 COMDAT 部分有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:44 26 4
gpt4 key购买 nike

假设我有一个对象的多个定义,这些定义跨不同的对象文件定义,并且我想将它们链接在一起。似乎有两种方法可以选择在将这些目标文件链接在一起时使用哪个定义:将符号标记为弱,或将其放在它自己的 COMDAT 部分(在每个目标文件中)。

根据我的理解(这可能是错误的),弱链接允许通过符号的一个定义覆盖另一个取决于链接顺序的定义。 COMDAT 通过将符号放在唯一的 COMDAT 部分并在链接时选择要使用的部分来允许多个定义。

有人告诉我这些是彼此正交的概念,但不确定为什么要同时使用两者而不是只使用其中一个。对于一个更具体的例子,我相信 c++ 中没有键函数的虚拟表在它们使用的所有模块中都定义了,并且这些模块可以链接在一起,因为 vtable 本身被声明为弱的并且在它自己的 COMDAT 中。

最佳答案

but wasn't sure why one would use both instead of just one of them.

当一个函数有不同(即不等同)可能的实现时,最常使用弱链接。

例如,libc.a 可以提供 pthread_mutex_lock定义,它什么都不做,而 libpthread.a 将提供一个 strong 相同函数的定义,该函数实际上确实锁定了互斥量。

用户代码(main.o)可以盲目调用pthread_mutex_lock,正确的事情会发生取决于libpthread.a是否是链接与否。

如果链接器可以自由选择 pthread_mutex_lock(如果它们都是 COMDAT 符号就会发生这种情况),这显然是行不通的。

关于c++ - 弱链接与使用 COMDAT 部分有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57378828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com