summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKacper <kacper@mail.openlinux.dev>2025-12-16 12:55:34 +0100
committerKacper <kacper@mail.openlinux.dev>2025-12-16 12:55:34 +0100
commit0e832a9329cc4d4647e1ce529846073f21e66991 (patch)
tree8e73a766ab5f8d8c7d6c35227756f50bc61156d9 /lib
parent383b4ca16cfd6d99de7335facad9a9f8eaf43341 (diff)
Fix several segv issues and improve x86_64 startup code
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/arch/x86_64/_start.c2
-rw-r--r--lib/libc/internal/Kbuild1
-rw-r--r--lib/libc/internal/init/Kbuild1
-rw-r--r--lib/libc/internal/init/init.c (renamed from lib/libc/internal/libc_main.c)4
-rw-r--r--lib/libc/internal/init/vdso.c5
-rw-r--r--lib/libc/thread/thrd_current.c2
6 files changed, 10 insertions, 5 deletions
diff --git a/lib/libc/arch/x86_64/_start.c b/lib/libc/arch/x86_64/_start.c
index 52b5c774..f3f4fef2 100644
--- a/lib/libc/arch/x86_64/_start.c
+++ b/lib/libc/arch/x86_64/_start.c
@@ -4,5 +4,5 @@
__dead __naked void _start(void)
{
__asm__ __volatile__("mov %rsp, %rdi\n"
- "call __libc_main\n");
+ "call __init\n");
}
diff --git a/lib/libc/internal/Kbuild b/lib/libc/internal/Kbuild
index 5015f987..01daa04b 100644
--- a/lib/libc/internal/Kbuild
+++ b/lib/libc/internal/Kbuild
@@ -1,2 +1 @@
obj-y += init/
-obj-y += libc_main.o
diff --git a/lib/libc/internal/init/Kbuild b/lib/libc/internal/init/Kbuild
index dd27261a..7941a53c 100644
--- a/lib/libc/internal/init/Kbuild
+++ b/lib/libc/internal/init/Kbuild
@@ -1 +1,2 @@
+obj-y += init.o
obj-y += vdso.o
diff --git a/lib/libc/internal/libc_main.c b/lib/libc/internal/init/init.c
index 7ac15ab4..36e66ee4 100644
--- a/lib/libc/internal/libc_main.c
+++ b/lib/libc/internal/init/init.c
@@ -6,13 +6,13 @@
extern void __init_vdso(void);
-struct libc __libc;
+struct libc __libc = { 0 };
char **environ;
char *__progname;
extern int main(int, char **, char **);
-__used void __libc_main(uintptr_t *rsp)
+__used void __init(uintptr_t *rsp)
{
char **argv;
size_t *auxv;
diff --git a/lib/libc/internal/init/vdso.c b/lib/libc/internal/init/vdso.c
index f94401f6..de8d0e2f 100644
--- a/lib/libc/internal/init/vdso.c
+++ b/lib/libc/internal/init/vdso.c
@@ -6,6 +6,11 @@
void __init_vdso(void)
{
Elf64_Ehdr *ehdr = (Elf64_Ehdr *)getauxval(AT_SYSINFO_EHDR);
+
+ if (ehdr == NULL) {
+ return;
+ }
+
Elf64_Phdr *phdr = (Elf64_Phdr *)(ehdr + ehdr->e_phoff);
for (int i = 0; i < ehdr->e_phnum; i++) {
diff --git a/lib/libc/thread/thrd_current.c b/lib/libc/thread/thrd_current.c
index 86a814da..69a99723 100644
--- a/lib/libc/thread/thrd_current.c
+++ b/lib/libc/thread/thrd_current.c
@@ -3,6 +3,6 @@
thrd_t thrd_current(void)
{
- static _Thread_local struct __thread_self self = { 0 };
+ static struct __thread_self self = { 0 };
return &self;
}