When I use the function getenv()
from the Standard C Library, my program inherit the environment variables from its parent.
Example:
$ export FOO=42
$ <<< 'int main() {printf("%s\n", getenv("FOO"));}' gcc -w -xc - && ./a.exe
42
In libc, the environ
variable is declared into environ.c
. I am expecting it to be empty at the execution, but I get 42
.
Going a bit further getenv
can be simplified as follow:
char * getenv (const char *name)
{
size_t len = strlen (name);
char **ep;
uint16_t name_start;
name_start = *(const uint16_t *) name;
len -= 2;
name += 2;
for (ep = __environ; *ep != NULL; ++ep)
{
uint16_t ep_start = *(uint16_t *) *ep;
if (name_start == ep_start && !strncmp (*ep + 2, name, len)
&& (*ep)[len + 2] == '=')
return &(*ep)[len + 3];
}
return NULL;
}
libc_hidden_def (getenv)
Here I will just get the content of the __environ
variable. However I never initialized it.
So I get confused because environ
is supposed to be NULL
unless my main function is not the real entry point of my program. Perhaps gcc
is ticking me by adding an _init
function that is part of the standard C library.
Where is environ
initialized?