问题标签 [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.

0 投票
1 回答
1308 浏览

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?

0 投票
0 回答
54 浏览

windows - IMAGE_COMDAT_SELECT_NODUPLICATES 的用途

带有 /Gy 选项的 Microsoft C++ 会将每个函数放在不同的部分中,以便链接器可以省略未使用的函数,这可能会减小可执行文件的大小。

除了将每个函数放在不同的部分之外,它还使用选择 IMAGE_COMDAT_SELECT_NODUPLICATES 标记每个部分 COMDAT。COMDAT 的目的是允许在多个位置定义某些内容(链接器选择一个定义并丢弃其他定义),但该选择值不允许多个定义,这似乎只是取消了效果。

IMAGE_COMDAT_SELECT_NODUPLICATES 的目的到底是什么?或者为什么带有 /Gy 的 Microsoft C++ 将代码段标记为 COMDAT?

0 投票
4 回答
2684 浏览

c++ - 不同的函数有不同的地址吗?

考虑这两个函数:

可以保证&foo != &bar吗?

相似地,

可以保证&foo<int> != &foo<double>吗?


我知道有两个链接器将函数定义放在一起。

MSVC 积极地 COMDAT 折叠函数,因此具有相同实现的两个函数可以变成一个函数。作为副作用,这两个函数共享相同的地址。我的印象是这是非法的,但我无法在标准中找到它是非法的。

Gold 链接器还折叠函数,包括 asafeall设置。 safe意思是如果一个函数地址被取了,它不会被折叠,而all即使地址被取了也会折叠。所以黄金的折叠safe表现得好像函数有不同的地址。

虽然折叠可能是出乎意料的,并且有些代码依赖于具有不同地址的不同(相同实现)函数(因此折叠可能很危险),但在当前的 C++ 标准下它实际上是非法的吗?(此时为 C++14)(自然好像safe折叠是合法的)

0 投票
2 回答
687 浏览

visual-c++ - 用于 COMDAT 折叠的 MSVC 编译器和链接器选项之间的关系

这个问题有一些关于 SO 的答案,但我的略有不同。在标记为重复之前,请试一试。

MSVC 一直提供 /Gy编译器选项,以使相同的函数能够折叠到 COMDAT 部分中。同时,链接器还提供了 /OPT:ICF 选项。我的理解是否正确,这两个选项必须结合使用?也就是说,虽然前者将功能打包到 COMDAT 中,但后者消除了多余的 COMDAT。那是对的吗?

如果是,那么我们要么都使用,要么都关闭?

0 投票
1 回答
871 浏览

c++ - 有什么方法可以为函数指针比较生成警告?

我花了很长时间才发现我的代码中有一个错误被触发/OPT:ICF

因为/OPT:ICF 会导致将相同的地址分配给不同的函数或只读数据成员(使用 /Gy 编译的 const 变量),它可能会破坏依赖于函数或只读数据成员的唯一地址的程序.

(我一直在存储和比较函数指针是否相等,当链接器丢弃相同的函数时它会中断。)

现在我需要找到我可能做过这种事情的每个地方。

测试用例当然是微不足道的:

我试过-Wall, -Wextra, -Weverything,-pedantic等,但没有一个会产生警告。

是否有任何编译器选项或工具(无论是 Visual C++、GCC、Clang 或其他的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?

0 投票
0 回答
66 浏览

c++ - 编译器可以省略那些被地址获取但从未被调用的函数体吗?

背景资料


考虑这个简化的实现std::any(省略不相关的部分)和一些使用它的代码:

如果优化编译器可以证明std::details::dummy_function<T>在整个程序中从未以任何方式调用过,那么编译器是否允许在编译结果中不包含 any 的函数体std::details::dummy_function<T>(以及由此未引用__PRETTY_FUNCTION__的 s)T(甚至可能使它们的地址任意指针大小的整数只能保证是不同的,否则甚至可能不是有效的内存地址)?

(或者甚至不能保证不同的地址是不同T的,这很遗憾意味着我的实现一开始就不正确?)