kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

commit c7893199344fdf3de97ea5730ba3b272329a92b8
parent ee162219d31c087e57d78068fb05f749ac88e35e
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Mon,  1 Jun 2026 17:14:39 -0700

rt: mark stdlib libc functions weak so host definitions can override

The string/number conversion and abs helpers (strtoull/strtoul/strtoll/strtol,
atoi/atol/atoll, strtold/strtod/strtof, abs/labs/llabs) are now weak, so when
the runtime archive is linked alongside a host libc the host definitions win
instead of producing duplicate-symbol conflicts in test links.

Diffstat:
Mrt/lib/stdlib/stdlib.c | 35++++++++++++++++++++++-------------
1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/rt/lib/stdlib/stdlib.c b/rt/lib/stdlib/stdlib.c @@ -41,7 +41,8 @@ static int cfree_match_ci(const char* s, const char* word) { return 1; } -unsigned long long strtoull(const char* nptr, char** endptr, int base) { +__attribute__((weak)) unsigned long long strtoull(const char* nptr, + char** endptr, int base) { const char* s = nptr; int neg = 0; unsigned long long value = 0; @@ -76,21 +77,29 @@ unsigned long long strtoull(const char* nptr, char** endptr, int base) { return neg ? 0 - value : value; } -unsigned long strtoul(const char* nptr, char** endptr, int base) { +__attribute__((weak)) unsigned long strtoul(const char* nptr, char** endptr, + int base) { return (unsigned long)strtoull(nptr, endptr, base); } -long long strtoll(const char* nptr, char** endptr, int base) { +__attribute__((weak)) long long strtoll(const char* nptr, char** endptr, + int base) { return (long long)strtoull(nptr, endptr, base); } -long strtol(const char* nptr, char** endptr, int base) { +__attribute__((weak)) long strtol(const char* nptr, char** endptr, int base) { return (long)strtoull(nptr, endptr, base); } -long long atoll(const char* nptr) { return strtoll(nptr, NULL, 10); } -long atol(const char* nptr) { return strtol(nptr, NULL, 10); } -int atoi(const char* nptr) { return (int)strtol(nptr, NULL, 10); } +__attribute__((weak)) long long atoll(const char* nptr) { + return strtoll(nptr, NULL, 10); +} +__attribute__((weak)) long atol(const char* nptr) { + return strtol(nptr, NULL, 10); +} +__attribute__((weak)) int atoi(const char* nptr) { + return (int)strtol(nptr, NULL, 10); +} static long double cfree_strtold_impl(const char* nptr, char** endptr) { const char* s = nptr; @@ -159,21 +168,21 @@ static long double cfree_strtold_impl(const char* nptr, char** endptr) { return neg ? -value : value; } -long double strtold(const char* nptr, char** endptr) { +__attribute__((weak)) long double strtold(const char* nptr, char** endptr) { return cfree_strtold_impl(nptr, endptr); } -double strtod(const char* nptr, char** endptr) { +__attribute__((weak)) double strtod(const char* nptr, char** endptr) { return (double)cfree_strtold_impl(nptr, endptr); } -float strtof(const char* nptr, char** endptr) { +__attribute__((weak)) float strtof(const char* nptr, char** endptr) { return (float)cfree_strtold_impl(nptr, endptr); } -int abs(int j) { return j < 0 ? -j : j; } -long labs(long j) { return j < 0 ? -j : j; } -long long llabs(long long j) { return j < 0 ? -j : j; } +__attribute__((weak)) int abs(int j) { return j < 0 ? -j : j; } +__attribute__((weak)) long labs(long j) { return j < 0 ? -j : j; } +__attribute__((weak)) long long llabs(long long j) { return j < 0 ? -j : j; } div_t div(int numer, int denom) { div_t r;