Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

将只读数据移动到文本中

应该使用 const 声明将只读数据元素移动到文本段中。例如,以下字符串位于 .data 节中,此节属于可写数据段。

        char *rdstr = "this is a read-only string";

相反,以下字符串位于 .rodata 节中,此节是文本段中的只读数据节。

        const char *rdstr = "this is a read-only string";

通过将只读元素移动到文本段中来减小数据段是一种极好的方法。但是,移动需要重定位的数据元素可能会达不到预期目标。例如,请查看以下字符串数组。

        char *rdstrs[] = { "this is a read-only string",
                           "this is another read-only string" };

较好的定义可能会使用以下定义。

        const char *const rdstrs[] = { .... };

此定义可确保将字符串以及指向这些字符串的指针数组放在 .rodata 节中。遗憾的是,虽然用户将地址数组视为只读,但是在运行时必须重定位这些地址。因此,此定义会导致创建文本重定位。将此定义表示为:

        const char *rdstrs[] = { .... };

将确保在可重定位数组指针的可写数据段中维护这些指针。数组字符串将在只读文本段中维护。


注 - 某些编译器在生成与位置无关的代码时可以检测到会导致运行时重定位的只读指定。这些编译器会安排将此类项放在可写段中。例如,.picdata