Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jul 2007 18:21:33 -0700 (PDT)
From:      youshi10@u.washington.edu
To:        current@freebsd.org
Subject:   Re: HEADS UP:  getenv() and family API change
Message-ID:  <Pine.LNX.4.43.0707101821330.4029@hymn07.u.washington.edu>
In-Reply-To: <94B3BCF3-D490-48A5-8488-2E931E30C07B@mac.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 10 Jul 2007, Chuck Swiger wrote:

> 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.

Ok, thanks for the explanation :).

>> #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

Ok :).

-Garrett




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.LNX.4.43.0707101821330.4029>