DynamicLoader: Fix dynamic TLS init order

This commit is contained in:
2026-05-20 05:03:20 +03:00
parent aa8be130f9
commit e9d6431728

View File

@@ -1245,6 +1245,28 @@ static MasterTLS initialize_master_tls()
module_count++; module_count++;
} }
{
const sys_mmap_t mmap_args {
.addr = nullptr,
.len = sizeof(_dynamic_tls_t) + s_max_loaded_files * sizeof(_dynamic_tls_entry_t),
.prot = PROT_READ | PROT_WRITE,
.flags = MAP_ANONYMOUS | MAP_PRIVATE,
.fildes = -1,
.off = 0,
};
const auto ret = syscall(SYS_MMAP, &mmap_args);
if (ret < 0)
print_error_and_exit("failed to allocate dynamic TLS", ret);
s_dynamic_tls = reinterpret_cast<_dynamic_tls_t*>(ret);
*s_dynamic_tls = {
.lock = 0,
.entry_count = 0,
.entries = reinterpret_cast<_dynamic_tls_entry_t*>(s_dynamic_tls + 1),
};
}
if (module_count == 0) if (module_count == 0)
return { .addr = nullptr, .size = 0, .module_count = 0 }; return { .addr = nullptr, .size = 0, .module_count = 0 };
@@ -1295,28 +1317,6 @@ static MasterTLS initialize_master_tls()
elf.tls_offset = tls_offset; elf.tls_offset = tls_offset;
} }
{
const sys_mmap_t mmap_args {
.addr = nullptr,
.len = sizeof(_dynamic_tls_t) + s_max_loaded_files * sizeof(_dynamic_tls_entry_t),
.prot = PROT_READ | PROT_WRITE,
.flags = MAP_ANONYMOUS | MAP_PRIVATE,
.fildes = -1,
.off = 0,
};
const auto ret = syscall(SYS_MMAP, &mmap_args);
if (ret < 0)
print_error_and_exit("failed to allocate dynamic TLS", ret);
s_dynamic_tls = reinterpret_cast<_dynamic_tls_t*>(ret);
*s_dynamic_tls = {
.lock = 0,
.entry_count = 0,
.entries = reinterpret_cast<_dynamic_tls_entry_t*>(s_dynamic_tls + 1),
};
}
return { return {
.addr = master_tls_addr, .addr = master_tls_addr,
.size = master_tls_size, .size = master_tls_size,