You answered your own question. Linux uses an ELF file format. When the ELF is loaded, the variables loaded into the DATA segment are marked as read-only pages. This, of course, will cause a write to such pages to manifest a SIGSEGV. Plan 9, however, makes no effort to do this. Objects marked into the DATA segment of the Plan 9 file format are loaded into pages that are actually RWX. So, it's really a two-pronged issue. 1) The kernel loader doesn't handle the management of page protection in the DATA, Stack, BSS, or even the TEXT. 2) The current binary format doesn't allow for specification of whether or not the DATA segment should *be* ~W. There is one main reason why you would want a W DATA. Variables that end up initialized to a value other than nil must be put in the DATA segment. Otherwise, they end up in the BSS, which is initialized to nil. Thus, global pointers to objects in the DATA (not const?) must be R|W, while the object itself (raw data) must be ~W. This is the ideal solution. This is being implemented in my work on the SPARC/SPARCv9 and AMD64 ports. I've discussed this with other members of the AMD64 port, and there've been no nay-sayers. There will be other improvements, as well. However, they are to be seen later. FYI, I'm writing the toolchain(s) from scratch, so the new binary format for these archs will look only slightly different from the current. Don (north_)