MSVS 链接器在静态 const 字符串之间添加数据

Posted

技术标签:

【中文标题】MSVS 链接器在静态 const 字符串之间添加数据【英文标题】:MSVS linker adding data between static const strings 【发布时间】:2013-11-22 12:27:24 【问题描述】:

我正在查看 msvs 2008 链接器生成的可执行文件中的数据部分,我看到它在 const 静态字符串之间插入了某种标记:

我查看了其他一些可执行文件,并且看到了相同的模式。实际字节值虽然不同,但仍插入字符串之间。 我查看了生成的映射文件,它看起来不像是内存对齐措施(一些地址以 0xc 结尾,这意味着对齐到 4,但为什么要在其间添加这么多填充零),即使是这样,为什么会这样持续增加价值?用于检测内存损坏的某种保护序列或我不知道的其他原因? 对于任何反馈,我们都表示感谢。谢谢!

【问题讨论】:

【参考方案1】:

你确定那些是静态字符串吗?对我来说,它们看起来像 RTTI 数据块,可读的字符串是类型名称,这表明其他字节是更多类型信息。

【讨论】:

好吧,我认为你是对的。由于名称修改,在映射文件中找到确切的行有点棘手,所以我假设这些是来自 std 和 boost 内部的静态字符串。我不知道 MSVS 上 RTTI 实现的细节,所以假设所有这些数据都来自实际代码,而不是编译器隐式添加的。我认为这是来自静态的另一个原因,因为这些值遵循我的一个 const 静态数组,因此我开始了搜索。 所以如果有人对 VC++ 中 RTTI 实现的内部结构感兴趣,这里有一些信息:openrce.org/articles/full_view/23 在我的例子中,这些确实是 RTTI 表(参见添加的“?AU”和“?AV”前缀)。

以上是关于MSVS 链接器在静态 const 字符串之间添加数据的主要内容,如果未能解决你的问题,请参考以下文章

Linux库函数

链接过程

MSVS2012 中的 QCustomPlot

C语言学习笔记--动态库和静态库的使用

第20课 链接过程简介

为啥在 cpp 文件中定义了非 int const 静态变量?