DynamicLoader/LibC: lazy malloc environ
This allows DynamicLoader to just set the value of global environ symbol without libc needing to malloc it at startup
This commit is contained in:
@@ -16,31 +16,12 @@
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
char** __environ;
|
||||
extern char** environ __attribute__((weak, alias("__environ")));
|
||||
extern "C" char** environ;
|
||||
|
||||
extern "C" void _init_libc(char** _environ)
|
||||
{
|
||||
static bool is_initialized = false;
|
||||
if (is_initialized)
|
||||
return;
|
||||
is_initialized = true;
|
||||
|
||||
if (!_environ)
|
||||
return;
|
||||
|
||||
size_t env_count = 0;
|
||||
while (_environ[env_count])
|
||||
env_count++;
|
||||
|
||||
environ = (char**)malloc(sizeof(char*) * env_count + 1);
|
||||
for (size_t i = 0; i < env_count; i++)
|
||||
{
|
||||
size_t bytes = strlen(_environ[i]) + 1;
|
||||
environ[i] = (char*)malloc(bytes);
|
||||
memcpy(environ[i], _environ[i], bytes);
|
||||
}
|
||||
environ[env_count] = nullptr;
|
||||
if (::environ == nullptr)
|
||||
::environ = environ;
|
||||
}
|
||||
|
||||
void _exit(int status)
|
||||
|
||||
Reference in New Issue
Block a user