Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jul 2007 17:37:53 -0700
From:      Chuck Swiger <cswiger@mac.com>
To:        youshi10@u.washington.edu
Cc:        current@freebsd.org
Subject:   Re: HEADS UP:  getenv() and family API change
Message-ID:  <94B3BCF3-D490-48A5-8488-2E931E30C07B@mac.com>
In-Reply-To: <Pine.LNX.4.43.0707101705130.4029@hymn07.u.washington.edu>
References:  <Pine.LNX.4.43.0707101705130.4029@hymn07.u.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Jul 10, 2007, at 5:05 PM, youshi10@u.washington.edu wrote:
> On Wed, 11 Jul 2007, Erik Trulsson wrote:
>> Not the pointer, but the string it points to can be put into read- 
>> only
>> memory.
>>
>> Example:
>>
>> static char *s = "PATH=/bin";
>> static char *t = "PATH=/bin";
>>
>>
>> Here both 's', and 't' can point into read-only memory where the  
>> string
>> "PATH=/bin" has been placed.  Not only that, they may point to the  
>> same
>> place, i.e. there need only be one copy of the string "PATH=/bin" in
>> the program (but there may be two distinct copies if the compiler  
>> does not
>> coalesce identical string constants.)
>>
>>
>> If on the other hand you use
>>
>> static char s[] = "PATH=/bin";
>> static char t[] = "PATH=/bin";
>>
>>
>> Then 's' and 't' are no longer pointers to a string constant, but  
>> arrays
>> that are initialized with the string "PATH=/bin".  These arrays are
>> modifiable and distinct - i.e. there will be (at least) two copies  
>> of the
>> string "PATH=/bin" in memory.
>>
>>
>>
>>
>> --
>> <Insert your favourite quote here.>
>> Erik Trulsson
>> ertr1013@student.uu.se
>
> I'm confused what you're referring to as RO memory -- I thought  
> that only const applied in this case:

It means that the string can be placed in a section of the executable  
file which is loaded with read-only memory protection set so that  
attempts to write to it fail; ELF calls this .rodata in contrast to  
the normal .bss and .data sections which contain (respectively) zero- 
filled memory and preinitialized but writable data.

> #include <stdio.h>
>
> int main () {
>
>     static char *s = "PATH=/bin";
>     s = "PATH=/sbin";
>
>     printf("%s\n", s);
>
>     return 0;
>
> }
>
> filc9175[409]% gcc -o try try.c
> filc9175[410]% ./try
> PATH=/sbin
>
>       Doesn't static (in terms of variables) only state that the  
> memory address and values are not to be released to the heap again  
> after the function scope exits?

static implies that the variables are held in memory address space  
which is made permanently available, either from pages mapped in from  
the executable file (that's the .data segment) or from zero-filled  
heap pages (.bss), rather than going away after the enclosing  
function has returned.  The default automatic scope actually  
typically uses the stack, not the heap...

-- 
-Chuck




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?94B3BCF3-D490-48A5-8488-2E931E30C07B>