HEADS UP: getenv() and family API change
Chuck Swiger
cswiger at mac.com
Wed Jul 11 00:37:54 UTC 2007
On Jul 10, 2007, at 5:05 PM, youshi10 at 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 at 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
More information about the freebsd-current
mailing list