程序可执行文件标记为只读

时间:2012-04-26 03:15:12

标签: c segmentation-fault file-permissions

我正在阅读关于分段错误的维基百科,并通过以下代码和声明来完成。

int main(void)
 {
     char *s = "hello world";
     *s = 'H';
 }
  

编译包含此代码的程序时,字符串“hello   world“被放置在标记的程序可执行文件的部分中   只读;加载时,操作系统将其与其他人放在一起   只读段内存中的字符串和常量数据。什么时候   执行时,变量s被设置为指向字符串的位置,并且   尝试通过变量写入H字符   内存,导致分段错误。编译这样的程序   使用不检查只读分配的编译器   编译时的位置。

我的问题是文件许可,即当可执行文件标记为只读和读写时  等等?

我想了解所有关于文件权限的信息。我们可以明确更改文件权限吗?

2 个答案:

答案 0 :(得分:5)

“hello world”存储在 memory 的只读部分。写入可执行文件内存的给定部分的能力与写入磁盘上可执行文件的能力无关。

答案 1 :(得分:2)

在这个问题中你有三个不相关的概念:

  • 文件属性(由某些操作系统支持,即Windows) - 其中一个是只读的。管理文件打开的正常方式,具有修改文件权限的用户可以随意更改文件属性。
  • 文件权限(大多数操作系统支持)。如果给定用户有权访问/修改,并且在某些系统中执行该文件。
  • 内存页面上的内存保护属性。大多数实现虚拟内存的操作系统都支持。每个页面(即4Kb块)的存储器获得由OS的存储器管理部分与CPU一起设置和强制执行的一组属性(即,读,写,执行)。大多数现代CPU直接使用此页面属性来验证内存操作。

即。在Windows上,您可以使用VirtualProtect函数指定在程序的地址空间中分配的内存块应具有的属性。