Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ kernel/generic/src/main/kinit.c	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -86,5 +86,5 @@
 
 #ifdef CONFIG_KCONSOLE
-static char alive[ALIVE_CHARS] = "-\\|/";
+static char alive[ALIVE_CHARS] __attribute__((nonstring)) = "-\\|/";
 #endif
 
Index: tools/toolchain.sh
===================================================================
--- tools/toolchain.sh	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ tools/toolchain.sh	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -31,10 +31,10 @@
 BINUTILS_GDB_GIT="https://github.com/HelenOS/binutils-gdb.git"
 
-BINUTILS_BRANCH="binutils-2_43-helenos"
-BINUTILS_VERSION="2.43"
+BINUTILS_BRANCH="binutils-2_45-helenos"
+BINUTILS_VERSION="2.45"
 
 GCC_GIT="https://github.com/HelenOS/gcc.git"
-GCC_BRANCH="14_2_0-helenos"
-GCC_VERSION="14.2"
+GCC_BRANCH="15_2_0-helenos"
+GCC_VERSION="15.2"
 
 BASEDIR="$PWD"
Index: uspace/drv/bus/usb/vhc/conndev.c
===================================================================
--- uspace/drv/bus/usb/vhc/conndev.c	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ uspace/drv/bus/usb/vhc/conndev.c	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -43,7 +43,26 @@
 #include "vhcd.h"
 
+#define PLUGGED_DEVICE_NAME_MAXLEN 256
+
 static fibril_local uintptr_t plugged_device_handle = 0;
-#define PLUGGED_DEVICE_NAME_MAXLEN 256
-static fibril_local char plugged_device_name[PLUGGED_DEVICE_NAME_MAXLEN + 1] = "<unknown>";
+
+/*
+ * The explicit "initial-exec" TLS model attribute is a temporary workaround
+ * for a bug in GCC (observed in 14.2 and 15.2) that manifests in combination
+ * with the binutils 2.45 linker on MIPS.
+ *
+ * Without the attribute, the linker reports the following error:
+ *
+ *  can't find matching LO16 reloc against `plugged_device_name' for
+ *  R_MIPS_TLS_TPREL_HI16 at 0x238 in section
+ *  `.text.default_connection_handler'
+ *
+ * The immediate cause is a missing R_MIPS_TLS_TPREL_LO16 relocation that
+ * matches the R_MIPS_TLS_TPREL_HI16 relocation. The root cause is probably
+ * an aggressive optimization in the compiler that removes the relocation
+ * despite being needed.
+ */
+static fibril_local char plugged_device_name[PLUGGED_DEVICE_NAME_MAXLEN + 1]
+    __attribute__((tls_model("initial-exec"))) = "<unknown>";
 
 /** Receive device name.
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -166,5 +166,5 @@
 					speeds[psiv].major = major;
 					speeds[psiv].minor = minor;
-					str_ncpy(speeds[psiv].name, 4, name.str, 4);
+					memcpy(speeds[psiv].name, name.str, 4);
 					speeds[psiv].usb_speed = USB_SPEED_MAX;
 
Index: uspace/drv/bus/usb/xhci/hw_struct/regs.h
===================================================================
--- uspace/drv/bus/usb/xhci/hw_struct/regs.h	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ uspace/drv/bus/usb/xhci/hw_struct/regs.h	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -551,5 +551,5 @@
 
 typedef union {
-	char str [4];
+	char str[4] __attribute__((nonstring));
 	uint32_t packed;
 } xhci_sp_name_t;
Index: uspace/drv/bus/usb/xhci/rh.h
===================================================================
--- uspace/drv/bus/usb/xhci/rh.h	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ uspace/drv/bus/usb/xhci/rh.h	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -51,5 +51,5 @@
  */
 typedef struct xhci_port_speed {
-	char name [4];
+	char name[4] __attribute__((nonstring));
 	uint8_t major, minor;
 	uint64_t rx_bps, tx_bps;
Index: uspace/lib/cpp/include/__bits/adt/bitset.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/adt/bitset.hpp	(revision 2e9f28483e3e3832adf6f08bb34a173e2fbf6a40)
+++ uspace/lib/cpp/include/__bits/adt/bitset.hpp	(revision a36c4aa60172d48878363da38c12f612d1b71d17)
@@ -42,4 +42,13 @@
     class bitset
     {
+        private:
+            /**
+             * While this might be a bit more wasteful
+             * than using unsigned or unsigned long,
+             * it will make parts of out code easier
+             * to read.
+             */
+            using data_type = unsigned long long;
+
         public:
             class reference
@@ -365,12 +374,4 @@
 
         private:
-            /**
-             * While this might be a bit more wasteful
-             * than using unsigned or unsigned long,
-             * it will make parts of out code easier
-             * to read.
-             */
-            using data_type = unsigned long long;
-
             static constexpr size_t bits_in_data_type_ = sizeof(data_type) * 8;
             static constexpr size_t data_size_ = N / bits_in_data_type_ + 1;
