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:
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;