From 26362d5068a01ca73e022956197757f1bc6b47ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateo=20Acu=C3=B1a?= <86583661+matteac@users.noreply.github.com> Date: Mon, 17 Feb 2025 20:30:54 -0300 Subject: [PATCH] Improve `crtbegin.o` Lookup for Linux Targets (#1975) * refactor linux crtbegin lookup to use architecture-specific glob paths * Fixed incorrect function call to `get_linux_crt_begin_glob_path` (`get_linux_crt_begin_arch_glob`) * Formatting --------- Co-authored-by: Christoffer Lerno --- src/compiler/linker.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/compiler/linker.c b/src/compiler/linker.c index 1e6f12db0..a65b64bdd 100644 --- a/src/compiler/linker.c +++ b/src/compiler/linker.c @@ -327,6 +327,24 @@ static const char *find_arch_glob_path(const char *glob_path, int file_len) #endif return NULL; } + +static const char *get_linux_crt_begin_arch_glob(void) +{ + switch (compiler.build.arch_os_target) + { + case LINUX_X64: + return "/usr/lib/gcc/x86_64*linux*/*/crtbegin.o"; + case LINUX_X86: + return "/usr/lib/gcc/i686*linux*/*/crtbegin.o"; + case LINUX_AARCH64: + return "/usr/lib/gcc/aarch64*linux*/*/crtbegin.o"; + case LINUX_RISCV32: + case LINUX_RISCV64: + default: + return "/usr/lib/gcc/*/*/crtbegin.o"; + } +} + static const char *find_linux_crt(void) { if (compiler.build.linuxpaths.crt) return compiler.build.linuxpaths.crt; @@ -350,7 +368,8 @@ static const char *find_linux_crt(void) static const char *find_linux_crt_begin(void) { if (compiler.build.linuxpaths.crtbegin) return compiler.build.linuxpaths.crtbegin; - const char *path = find_arch_glob_path("/usr/lib/gcc/*/*/crtbegin.o", 10); + const char *arch_glob_path = get_linux_crt_begin_arch_glob(); + const char *path = find_arch_glob_path(arch_glob_path, 10); if (!path) { INFO_LOG("No crtbegin in /usr/lib/gcc/*/*/");