diff --git a/mongoose.c b/mongoose.c
index 1549f117df6d87e572e5a02464d607c8335ad279..42c3ae791a1002cb4246e28c54e84e38c5cf211e 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -222,7 +222,6 @@ void cs_log_set_level(enum cs_log_level level);
 #if CS_ENABLE_STDIO
 
 void cs_log_set_file(FILE *file);
-
 extern enum cs_log_level cs_log_level;
 void cs_log_print_prefix(const char *func);
 void cs_log_printf(const char *fmt, ...);
@@ -278,7 +277,7 @@ void cs_log_printf(const char *fmt, ...);
 
 /* Amalgamated: #include "common/cs_time.h" */
 
-enum cs_log_level cs_log_level =
+enum cs_log_level cs_log_level WEAK =
 #if CS_ENABLE_DEBUG
     LL_VERBOSE_DEBUG;
 #else
@@ -287,12 +286,13 @@ enum cs_log_level cs_log_level =
 
 #if CS_ENABLE_STDIO
 
-FILE *cs_log_file = NULL;
+FILE *cs_log_file WEAK = NULL;
 
 #if CS_LOG_ENABLE_TS_DIFF
-double cs_log_ts;
+double cs_log_ts WEAK;
 #endif
 
+void cs_log_print_prefix(const char *func) WEAK;
 void cs_log_print_prefix(const char *func) {
   if (cs_log_file == NULL) cs_log_file = stderr;
   fprintf(cs_log_file, "%-20s ", func);
@@ -305,6 +305,7 @@ void cs_log_print_prefix(const char *func) {
 #endif
 }
 
+void cs_log_printf(const char *fmt, ...) WEAK;
 void cs_log_printf(const char *fmt, ...) {
   va_list ap;
   va_start(ap, fmt);
@@ -314,12 +315,14 @@ void cs_log_printf(const char *fmt, ...) {
   fflush(cs_log_file);
 }
 
+void cs_log_set_file(FILE *file) WEAK;
 void cs_log_set_file(FILE *file) {
   cs_log_file = file;
 }
 
 #endif /* CS_ENABLE_STDIO */
 
+void cs_log_set_level(enum cs_log_level level) WEAK;
 void cs_log_set_level(enum cs_log_level level) {
   cs_log_level = level;
 #if CS_LOG_ENABLE_TS_DIFF && CS_ENABLE_STDIO
@@ -755,6 +758,7 @@ typedef int cs_dirent_dummy;
 #include <windows.h>
 #endif
 
+double cs_time(void) WEAK;
 double cs_time(void) {
   double now;
 #ifndef _WIN32
@@ -1065,12 +1069,14 @@ char *cs_md5(char buf[33], ...) {
 #define MBUF_FREE free
 #endif
 
+void mbuf_init(struct mbuf *mbuf, size_t initial_size) WEAK;
 void mbuf_init(struct mbuf *mbuf, size_t initial_size) {
   mbuf->len = mbuf->size = 0;
   mbuf->buf = NULL;
   mbuf_resize(mbuf, initial_size);
 }
 
+void mbuf_free(struct mbuf *mbuf) WEAK;
 void mbuf_free(struct mbuf *mbuf) {
   if (mbuf->buf != NULL) {
     MBUF_FREE(mbuf->buf);
@@ -1078,6 +1084,7 @@ void mbuf_free(struct mbuf *mbuf) {
   }
 }
 
+void mbuf_resize(struct mbuf *a, size_t new_size) WEAK;
 void mbuf_resize(struct mbuf *a, size_t new_size) {
   if (new_size > a->size || (new_size < a->size && new_size >= a->len)) {
     char *buf = (char *) MBUF_REALLOC(a->buf, new_size);
@@ -1092,10 +1099,12 @@ void mbuf_resize(struct mbuf *a, size_t new_size) {
   }
 }
 
+void mbuf_trim(struct mbuf *mbuf) WEAK;
 void mbuf_trim(struct mbuf *mbuf) {
   mbuf_resize(mbuf, mbuf->len);
 }
 
+size_t mbuf_insert(struct mbuf *a, size_t off, const void *buf, size_t) WEAK;
 size_t mbuf_insert(struct mbuf *a, size_t off, const void *buf, size_t len) {
   char *p = NULL;
 
@@ -1128,10 +1137,12 @@ size_t mbuf_insert(struct mbuf *a, size_t off, const void *buf, size_t len) {
   return len;
 }
 
+size_t mbuf_append(struct mbuf *a, const void *buf, size_t len) WEAK;
 size_t mbuf_append(struct mbuf *a, const void *buf, size_t len) {
   return mbuf_insert(a, a->len, buf, len);
 }
 
+void mbuf_remove(struct mbuf *mb, size_t n) WEAK;
 void mbuf_remove(struct mbuf *mb, size_t n) {
   if (n > 0 && n <= mb->len) {
     memmove(mb->buf, mb->buf + n, mb->len - n);
@@ -1153,19 +1164,22 @@ void mbuf_remove(struct mbuf *mb, size_t n) {
 #include <stdlib.h>
 #include <string.h>
 
-int mg_ncasecmp(const char *s1, const char *s2, size_t len);
+int mg_ncasecmp(const char *s1, const char *s2, size_t len) WEAK;
 
+struct mg_str mg_mk_str(const char *s) WEAK;
 struct mg_str mg_mk_str(const char *s) {
   struct mg_str ret = {s, 0};
   if (s != NULL) ret.len = strlen(s);
   return ret;
 }
 
+struct mg_str mg_mk_str_n(const char *s, size_t len) WEAK;
 struct mg_str mg_mk_str_n(const char *s, size_t len) {
   struct mg_str ret = {s, len};
   return ret;
 }
 
+int mg_vcmp(const struct mg_str *str1, const char *str2) WEAK;
 int mg_vcmp(const struct mg_str *str1, const char *str2) {
   size_t n2 = strlen(str2), n1 = str1->len;
   int r = memcmp(str1->p, str2, (n1 < n2) ? n1 : n2);
@@ -1175,6 +1189,7 @@ int mg_vcmp(const struct mg_str *str1, const char *str2) {
   return r;
 }
 
+int mg_vcasecmp(const struct mg_str *str1, const char *str2) WEAK;
 int mg_vcasecmp(const struct mg_str *str1, const char *str2) {
   size_t n2 = strlen(str2), n1 = str1->len;
   int r = mg_ncasecmp(str1->p, str2, (n1 < n2) ? n1 : n2);
@@ -1184,6 +1199,7 @@ int mg_vcasecmp(const struct mg_str *str1, const char *str2) {
   return r;
 }
 
+struct mg_str mg_strdup(const struct mg_str s) WEAK;
 struct mg_str mg_strdup(const struct mg_str s) {
   struct mg_str r = {NULL, 0};
   if (s.len > 0 && s.p != NULL) {
@@ -1196,6 +1212,7 @@ struct mg_str mg_strdup(const struct mg_str s) {
   return r;
 }
 
+int mg_strcmp(const struct mg_str str1, const struct mg_str str2) WEAK;
 int mg_strcmp(const struct mg_str str1, const struct mg_str str2) {
   size_t i = 0;
   while (i < str1.len && i < str2.len) {
@@ -1208,6 +1225,7 @@ int mg_strcmp(const struct mg_str str1, const struct mg_str str2) {
   return 0;
 }
 
+int mg_strncmp(const struct mg_str, const struct mg_str, size_t n) WEAK;
 int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_t n) {
   struct mg_str s1 = str1;
   struct mg_str s2 = str2;
@@ -1501,6 +1519,7 @@ void cs_hmac_sha1(const unsigned char *key, size_t keylen,
 #define MG_FREE free
 #endif
 
+size_t c_strnlen(const char *s, size_t maxlen) WEAK;
 size_t c_strnlen(const char *s, size_t maxlen) {
   size_t l = 0;
   for (; l < maxlen && s[l] != '\0'; l++) {
@@ -1517,6 +1536,7 @@ size_t c_strnlen(const char *s, size_t maxlen) {
 #define C_SNPRINTF_FLAG_ZERO 1
 
 #if C_DISABLE_BUILTIN_SNPRINTF
+int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) WEAK;
 int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) {
   return vsnprintf(buf, buf_size, fmt, ap);
 }
@@ -1562,6 +1582,7 @@ static int c_itoa(char *buf, size_t buf_size, int64_t num, int base, int flags,
   return i;
 }
 
+int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) WEAK;
 int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) {
   int ch, i = 0, len_mod, flags, precision, field_width;
 
@@ -1699,6 +1720,7 @@ int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) {
 }
 #endif
 
+int c_snprintf(char *buf, size_t buf_size, const char *fmt, ...) WEAK;
 int c_snprintf(char *buf, size_t buf_size, const char *fmt, ...) {
   int result;
   va_list ap;
@@ -1739,6 +1761,7 @@ int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {
 #endif /* _WIN32 */
 
 /* The simplest O(mn) algorithm. Better implementation are GPLed */
+const char *c_strnstr(const char *s, const char *find, size_t slen) WEAK;
 const char *c_strnstr(const char *s, const char *find, size_t slen) {
   size_t find_length = strlen(find);
   size_t i;
@@ -1757,6 +1780,7 @@ const char *c_strnstr(const char *s, const char *find, size_t slen) {
 }
 
 #if CS_ENABLE_STRDUP
+char *strdup(const char *src) WEAK;
 char *strdup(const char *src) {
   size_t len = strlen(src) + 1;
   char *ret = malloc(len);
@@ -1767,6 +1791,7 @@ char *strdup(const char *src) {
 }
 #endif
 
+void cs_to_hex(char *to, const unsigned char *p, size_t len) WEAK;
 void cs_to_hex(char *to, const unsigned char *p, size_t len) {
   static const char *hex = "0123456789abcdef";
 
@@ -1788,6 +1813,7 @@ static int fourbit(int ch) {
   return 0;
 }
 
+void cs_from_hex(char *to, const char *p, size_t len) WEAK;
 void cs_from_hex(char *to, const char *p, size_t len) {
   size_t i;
 
@@ -1798,6 +1824,7 @@ void cs_from_hex(char *to, const char *p, size_t len) {
 }
 
 #if CS_ENABLE_TO64
+int64_t cs_to64(const char *s) WEAK;
 int64_t cs_to64(const char *s) {
   int64_t result = 0;
   int64_t neg = 1;
@@ -1819,6 +1846,7 @@ static int str_util_lowercase(const char *s) {
   return tolower(*(const unsigned char *) s);
 }
 
+int mg_ncasecmp(const char *s1, const char *s2, size_t len) WEAK;
 int mg_ncasecmp(const char *s1, const char *s2, size_t len) {
   int diff = 0;
 
@@ -1829,10 +1857,12 @@ int mg_ncasecmp(const char *s1, const char *s2, size_t len) {
   return diff;
 }
 
+int mg_casecmp(const char *s1, const char *s2) WEAK;
 int mg_casecmp(const char *s1, const char *s2) {
   return mg_ncasecmp(s1, s2, (size_t) ~0);
 }
 
+int mg_asprintf(char **buf, size_t size, const char *fmt, ...) WEAK;
 int mg_asprintf(char **buf, size_t size, const char *fmt, ...) {
   int ret;
   va_list ap;
@@ -1842,6 +1872,7 @@ int mg_asprintf(char **buf, size_t size, const char *fmt, ...) {
   return ret;
 }
 
+int mg_avprintf(char **buf, size_t size, const char *fmt, va_list ap) WEAK;
 int mg_avprintf(char **buf, size_t size, const char *fmt, va_list ap) {
   va_list ap_copy;
   int len;
diff --git a/mongoose.h b/mongoose.h
index 61890d474577625ff835e62cff007b6eef87d3a9..2ed8fdb6a24fd7ef2ba5b181a8f462460e54752f 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -116,6 +116,12 @@
 
 /* Common stuff */
 
+#if (defined(__GNUC__) || defined(__TI_COMPILER_VERSION__)) && !defined(_WIN32)
+#define WEAK __attribute__((weak))
+#else
+#define WEAK
+#endif
+
 #ifdef __GNUC__
 #define NORETURN __attribute__((noreturn))
 #define NOINLINE __attribute__((noinline))
@@ -666,7 +672,8 @@ struct dirent *readdir(DIR *dir);
 #define MG_FS_SLFS
 #endif
 
-#if (defined(CC3200_FS_SPIFFS) || defined(CC3200_FS_SLFS)) && !defined(MG_ENABLE_FILESYSTEM)
+#if (defined(CC3200_FS_SPIFFS) || defined(CC3200_FS_SLFS)) && \
+    !defined(MG_ENABLE_FILESYSTEM)
 #define MG_ENABLE_FILESYSTEM 1
 #endif
 
@@ -1514,6 +1521,8 @@ void mg_lwip_set_keepalive_params(struct mg_connection *nc, int idle,
 #ifndef CS_COMMON_CS_TIME_H_
 #define CS_COMMON_CS_TIME_H_
 
+/* Amalgamated: #include "common/platform.h" */
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -1539,6 +1548,8 @@ double cs_time(void);
 
 #include <stddef.h>
 
+/* Amalgamated: #include "common/platform.h" */
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -1607,6 +1618,8 @@ extern "C" {
 
 #include <stdlib.h>
 
+/* Amalgamated: #include "common/platform.h" */
+
 #ifndef MBUF_SIZE_MULTIPLIER
 #define MBUF_SIZE_MULTIPLIER 1.5
 #endif
@@ -1813,6 +1826,8 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst, int *dec_len);
 #include <stdarg.h>
 #include <stdlib.h>
 
+/* Amalgamated: #include "common/platform.h" */
+
 #ifndef CS_ENABLE_STRDUP
 #define CS_ENABLE_STRDUP 0
 #endif