问题标签 [comdat-folding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - COMDAT section name
I'm writing a linker for Windows binaries, and currently working on implementing COMDAT. I think I understand most of the specification, except that of the three records for a COMDAT section (the section header, section symbols and auxiliary symbol), the specification doesn't seem to mention the common name being stored in any of them.
In other words, when I run dumpbin on such an object, it gives output like:
Where does that last item sym= cosl
come from? Or if it's just a regular symbol that points to the section, what happens if there are several different such symbols pointing to it?
windows - IMAGE_COMDAT_SELECT_NODUPLICATES 的用途
带有 /Gy 选项的 Microsoft C++ 会将每个函数放在不同的部分中,以便链接器可以省略未使用的函数,这可能会减小可执行文件的大小。
除了将每个函数放在不同的部分之外,它还使用选择 IMAGE_COMDAT_SELECT_NODUPLICATES 标记每个部分 COMDAT。COMDAT 的目的是允许在多个位置定义某些内容(链接器选择一个定义并丢弃其他定义),但该选择值不允许多个定义,这似乎只是取消了效果。
IMAGE_COMDAT_SELECT_NODUPLICATES 的目的到底是什么?或者为什么带有 /Gy 的 Microsoft C++ 将代码段标记为 COMDAT?
c++ - 不同的函数有不同的地址吗?
考虑这两个函数:
可以保证&foo != &bar
吗?
相似地,
可以保证&foo<int> != &foo<double>
吗?
我知道有两个链接器将函数定义放在一起。
MSVC 积极地 COMDAT 折叠函数,因此具有相同实现的两个函数可以变成一个函数。作为副作用,这两个函数共享相同的地址。我的印象是这是非法的,但我无法在标准中找到它是非法的。
Gold 链接器还折叠函数,包括 asafe
和all
设置。 safe
意思是如果一个函数地址被取了,它不会被折叠,而all
即使地址被取了也会折叠。所以黄金的折叠safe
表现得好像函数有不同的地址。
虽然折叠可能是出乎意料的,并且有些代码依赖于具有不同地址的不同(相同实现)函数(因此折叠可能很危险),但在当前的 C++ 标准下它实际上是非法的吗?(此时为 C++14)(自然好像safe
折叠是合法的)
visual-c++ - 用于 COMDAT 折叠的 MSVC 编译器和链接器选项之间的关系
这个问题有一些关于 SO 的答案,但我的略有不同。在标记为重复之前,请试一试。
MSVC 一直提供 /Gy编译器选项,以使相同的函数能够折叠到 COMDAT 部分中。同时,链接器还提供了 /OPT:ICF 选项。我的理解是否正确,这两个选项必须结合使用?也就是说,虽然前者将功能打包到 COMDAT 中,但后者消除了多余的 COMDAT。那是对的吗?
如果是,那么我们要么都使用,要么都关闭?
c++ - 有什么方法可以为函数指针比较生成警告?
我花了很长时间才发现我的代码中有一个错误被触发/OPT:ICF
:
因为/OPT:ICF 会导致将相同的地址分配给不同的函数或只读数据成员(使用 /Gy 编译的 const 变量),它可能会破坏依赖于函数或只读数据成员的唯一地址的程序.
(我一直在存储和比较函数指针是否相等,当链接器丢弃相同的函数时它会中断。)
现在我需要找到我可能做过这种事情的每个地方。
测试用例当然是微不足道的:
我试过-Wall
, -Wextra
, -Weverything
,-pedantic
等,但没有一个会产生警告。
是否有任何编译器选项或工具(无论是 Visual C++、GCC、Clang 或其他的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?
c++ - 编译器可以省略那些被地址获取但从未被调用的函数体吗?
考虑这个简化的实现std::any
(省略不相关的部分)和一些使用它的代码:
如果优化编译器可以证明std::details::dummy_function<T>
在整个程序中从未以任何方式调用过,那么编译器是否允许在编译结果中不包含 any 的函数体std::details::dummy_function<T>
(以及由此未引用__PRETTY_FUNCTION__
的 s)T
(甚至可能使它们的地址任意指针大小的整数只能保证是不同的,否则甚至可能不是有效的内存地址)?
(或者甚至不能保证不同的地址是不同T
的,这很遗憾意味着我的实现一开始就不正确?)