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?
 
     
     
     
     
     
    