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:
2025-04-15 22:16:02 +03:00
parent 3721dadd72
commit 4f49d60e4a
3 changed files with 52 additions and 50 deletions

View File

@@ -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)