【问题标题】:Does static array constness affect shared library layout?静态数组常量是否会影响共享库布局?
【发布时间】:2010-09-15 02:11:04
【问题描述】:

考虑这两种 C++ 头文件:

案例一:

class Test {
  public:
    static int TEST_DATA[];
};
int Test::TEST_DATA[] = { 1, 2, 3, 4 };

案例 2:

class Test {
  public:
    static int const TEST_DATA[];
};
int const Test::TEST_DATA[] = { 1, 2, 3, 4 };

后一种情况下的 const 是否仅用于自我强加的编译时检查,还是会影响 Mac/Linux/Windows 上的共享库布局?

更新:根据答案,编译器可能将 const 内容放在只读页面上。 是否 Windows 或 GCC 上的 Visual C++ 在 Mac 或 Linux 上实际上将 const 数据放在只读页面上?也许我测试的方式错误,但在 Intel 的 Mac 上,const 版本的元素似乎是可写的。

【问题讨论】:

    标签: c++ dll linker constants


    【解决方案1】:

    编译器可能会将数据放入二进制文件的不同部分,具体取决于它是否为 const - 这完全由编译器决定。

    【讨论】:

      【解决方案2】:

      编译器(或者实际上是链接器)可以将第二个放入标记为只读的段中,以在您尝试写入时触发硬件异常。由于写入不打算写入的内容是安全攻击的载体,因此越来越多的系统正在保护其只读数据。

      【讨论】:

        【解决方案3】:

        虽然不能保证,但 const 在数组的情况下不太可能破坏二进制兼容性,因此共享库应该以相同的布局结束。

        请注意,对于单个 int,这可能不是

        struct Test
        {
            static int const TEST;
        };
        int const Test::TEST = 7;
        

        因为 TEST 是编译时常量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-23
          • 1970-01-01
          • 1970-01-01
          • 2019-09-26
          相关资源
          最近更新 更多