From 1b0c4e817b4ed91a97b2d0e4abf1d2166b234fd7 Mon Sep 17 00:00:00 2001 From: 3443e <3443p@proton.me> Date: Thu, 14 May 2026 21:37:18 +0100 Subject: [PATCH] gcc compatibility - Rename sched_policy member to sched_policy_val to avoid collision with enum class name (now a hard error in GCC) - Rename ai_flags member to ai_flags_val for the same reason - Update all usages in network.cpp and pthreads.cpp accordingly - Fix pthread_condattr_init to use correct field names instead of brace-init - Add generic T* constructor to shimmed_symbol for GCC 16 template deduction - Replace vector brace-init block with emplace_back calls - Wrap index/rindex in lambdas since they are builtins with multiple overloads --- include/libc_shim.h | 3 ++ src/common.cpp | 127 +++++++++++++++++++++----------------------- src/network.cpp | 4 +- src/network.h | 2 +- src/pthreads.cpp | 3 +- src/pthreads.h | 2 +- 6 files changed, 70 insertions(+), 71 deletions(-) diff --git a/include/libc_shim.h b/include/libc_shim.h index 41cf63b..7ec8bf6 100644 --- a/include/libc_shim.h +++ b/include/libc_shim.h @@ -20,6 +20,9 @@ namespace shim { template shimmed_symbol(const char *name, Ret (*ptr)(Args..., ...)) : name(name), value((void*) ptr) {} + template + shimmed_symbol(const char *name, T *ptr) + : name(name), value((void*) ptr) {} }; std::vector get_shimmed_symbols(); diff --git a/src/common.cpp b/src/common.cpp index 2ef6d95..17dbc6f 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -865,72 +865,67 @@ void shim::add_signal_shimmed_symbols(std::vector &list) { } void shim::add_string_shimmed_symbols(std::vector &list) { - list.insert(list.end(), { - /* string.h */ - {"memccpy", ::memccpy}, - {"memchr", (void *(*)(void *, int, size_t)) ::memchr}, - {"memcmp", (int (*)(const void *, const void *, size_t)) ::memcmp}, - {"memcpy", ::memcpy}, - {"__memcpy_chk", __memcpy_chk}, - {"memmove", ::memmove}, - {"__memmove_chk", __memmove_chk}, - {"memset", ::memset}, - {"__memset_chk", ::__memset_chk}, - {"memmem", ::memmem}, -#if LIBC_SHIM_DEFINE_VARIADIC - {"__vsprintf_chk", __vsprintf_chk}, -#endif - {"strchr", (char *(*)(char *, int)) ::strchr}, - {"strrchr", (char *(*)(char *, int)) ::strrchr}, - {"strlen", ::strlen}, - {"__strlen_chk", strlen_chk}, - {"__strchr_chk", strchr_chk}, - {"__strrchr_chk", strrchr_chk}, - {"strcmp", ::strcmp}, - {"strcpy", ::strcpy}, - {"__strcpy_chk", __strcpy_chk}, - {"strcat", ::strcat}, - {"strdup", ::strdup}, - {"strstr", (char *(*)(char *, const char *)) ::strstr}, - {"strtok", ::strtok}, - {"strtok_r", ::strtok_r}, - {"strerror", strerror}, - {"strerror_r", strerror_r}, - {"strnlen", ::strnlen}, - {"strncat", ::strncat}, - {"strndup", ::strndup}, - {"strncmp", ::strncmp}, - {"strncpy", ::strncpy}, - {"__strcat_chk", __strcat_chk}, - {"__strncat_chk", __strncat_chk}, - {"__strncpy_chk", __strncpy_chk}, - {"__strncpy_chk2", __strncpy_chk2}, - {"__strlcpy_chk", __strlcpy_chk}, - {"strlcpy", bionic::strlcpy}, - {"strcspn", ::strcspn}, - {"strpbrk", (char *(*)(char *, const char *)) ::strpbrk}, - {"strsep", ::strsep}, - {"strspn", ::strspn}, - {"strsignal", ::strsignal}, - {"strcoll", ::strcoll}, - {"strxfrm", ::strxfrm}, - {"strcoll_l", ::strcoll_l}, - {"strxfrm_l", ::strxfrm_l}, - {"islower_l", ::islower_l}, - {"isupper_l", ::isupper_l}, - {"tolower_l", ::tolower_l}, - {"toupper_l", ::toupper_l}, - - /* strings.h */ - {"bcmp", ::bcmp}, - {"bcopy", ::bcopy}, - {"bzero", ::bzero}, - {"ffs", ::ffs}, - {"index", ::index}, - {"rindex", ::rindex}, - {"strcasecmp", ::strcasecmp}, - {"strncasecmp", ::strncasecmp}, - }); + std::vector extra; + extra.emplace_back("memccpy", ::memccpy); + extra.emplace_back("memchr", (void *(*)(void *, int, size_t)) ::memchr); + extra.emplace_back("memcmp", (int (*)(const void *, const void *, size_t)) ::memcmp); + extra.emplace_back("memcpy", ::memcpy); + extra.emplace_back("__memcpy_chk", __memcpy_chk); + extra.emplace_back("memmove", ::memmove); + extra.emplace_back("__memmove_chk", __memmove_chk); + extra.emplace_back("memset", ::memset); + extra.emplace_back("__memset_chk", ::__memset_chk); + extra.emplace_back("memmem", ::memmem); + extra.emplace_back("__vsprintf_chk", __vsprintf_chk); + extra.emplace_back("strchr", (char *(*)(char *, int)) ::strchr); + extra.emplace_back("strrchr", (char *(*)(char *, int)) ::strrchr); + extra.emplace_back("strlen", ::strlen); + extra.emplace_back("__strlen_chk", strlen_chk); + extra.emplace_back("__strchr_chk", strchr_chk); + extra.emplace_back("__strrchr_chk", strrchr_chk); + extra.emplace_back("strcmp", ::strcmp); + extra.emplace_back("strcpy", ::strcpy); + extra.emplace_back("__strcpy_chk", __strcpy_chk); + extra.emplace_back("strcat", ::strcat); + extra.emplace_back("strdup", ::strdup); + extra.emplace_back("strstr", (char *(*)(char *, const char *)) ::strstr); + extra.emplace_back("strtok", ::strtok); + extra.emplace_back("strtok_r", ::strtok_r); + extra.emplace_back("strerror", strerror); + extra.emplace_back("strerror_r", strerror_r); + extra.emplace_back("strnlen", ::strnlen); + extra.emplace_back("strncat", ::strncat); + extra.emplace_back("strndup", ::strndup); + extra.emplace_back("strncmp", ::strncmp); + extra.emplace_back("strncpy", ::strncpy); + extra.emplace_back("__strcat_chk", __strcat_chk); + extra.emplace_back("__strncat_chk", __strncat_chk); + extra.emplace_back("__strncpy_chk", __strncpy_chk); + extra.emplace_back("__strncpy_chk2", __strncpy_chk2); + extra.emplace_back("__strlcpy_chk", __strlcpy_chk); + extra.emplace_back("strlcpy", bionic::strlcpy); + extra.emplace_back("strcspn", ::strcspn); + extra.emplace_back("strpbrk", (char *(*)(char *, const char *)) ::strpbrk); + extra.emplace_back("strsep", ::strsep); + extra.emplace_back("strspn", ::strspn); + extra.emplace_back("strsignal", ::strsignal); + extra.emplace_back("strcoll", ::strcoll); + extra.emplace_back("strxfrm", ::strxfrm); + extra.emplace_back("strcoll_l", ::strcoll_l); + extra.emplace_back("strxfrm_l", ::strxfrm_l); + extra.emplace_back("islower_l", ::islower_l); + extra.emplace_back("isupper_l", ::isupper_l); + extra.emplace_back("tolower_l", ::tolower_l); + extra.emplace_back("toupper_l", ::toupper_l); + extra.emplace_back("bcmp", ::bcmp); + extra.emplace_back("bcopy", ::bcopy); + extra.emplace_back("bzero", ::bzero); + extra.emplace_back("ffs", ::ffs); + extra.emplace_back("index", (void*)+[](const char *s, int c) -> const char* { return ::index(s, c); }); + extra.emplace_back("rindex", (void*)+[](const char *s, int c) -> const char* { return ::rindex(s, c); }); + extra.emplace_back("strcasecmp", ::strcasecmp); + extra.emplace_back("strncasecmp", ::strncasecmp); + list.insert(list.end(), extra.begin(), extra.end()); } void shim::add_socket_shimmed_symbols(std::vector &list) { diff --git a/src/network.cpp b/src/network.cpp index 6576534..2c11f2d 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -192,7 +192,7 @@ bionic::addrinfo* bionic::from_host_alloc(const ::addrinfo *in) { auto out = new addrinfo; try { - out->ai_flags = from_host_ai_flags(in->ai_flags); + out->ai_flags_val = from_host_ai_flags(in->ai_flags); out->ai_family = from_host_af_family(in->ai_family); out->ai_socktype = from_host_socktype(in->ai_socktype); out->ai_protocol = from_host_ipproto(in->ai_protocol); @@ -232,7 +232,7 @@ ::addrinfo* bionic::to_host_alloc(const bionic::addrinfo *in) { return nullptr; auto out = new ::addrinfo; - out->ai_flags = to_host_ai_flags(in->ai_flags); + out->ai_flags = to_host_ai_flags(in->ai_flags_val); out->ai_family = to_host_af_family(in->ai_family); // ai_socktype == 0 is only allowed here, see man getaddrinfo out->ai_socktype = in->ai_socktype != (bionic::socktype)0 ? to_host_socktype(in->ai_socktype) : 0; diff --git a/src/network.h b/src/network.h index 255df74..a9e1db2 100644 --- a/src/network.h +++ b/src/network.h @@ -91,7 +91,7 @@ namespace shim { size_t get_bionic_len(const ::sockaddr *in); struct addrinfo { - ai_flags ai_flags; + ai_flags ai_flags_val; af_family ai_family; socktype ai_socktype; ipproto ai_protocol; diff --git a/src/pthreads.cpp b/src/pthreads.cpp index eaf28fe..7d6da39 100644 --- a/src/pthreads.cpp +++ b/src/pthreads.cpp @@ -407,7 +407,8 @@ int shim::pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, c } int shim::pthread_condattr_init(pthread_condattr_t *attr) { - *attr = {false, bionic::clock_type::MONOTONIC}; + attr->shared = false; + attr->clock = bionic::clock_type::MONOTONIC; return 0; } diff --git a/src/pthreads.h b/src/pthreads.h index ab1a023..249f26e 100644 --- a/src/pthreads.h +++ b/src/pthreads.h @@ -147,7 +147,7 @@ namespace shim { void* stack_base; size_t stack_size; size_t guard_size; - sched_policy sched_policy; + sched_policy sched_policy_val; int sched_priority; #if defined(__LP64__) int64_t priv[2];