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>