diff --git a/main/c-ares/APKBUILD b/main/c-ares/APKBUILD
index 074b189c992f626e0ae5c998e6bbf99ea522ec3d..ceec48b135a6f6cca37f816807c351b0f56b788b 100644
--- a/main/c-ares/APKBUILD
+++ b/main/c-ares/APKBUILD
@@ -1,14 +1,17 @@
 # Contributor: Carlo Landmeter <clandmeter@alpinelinux.org>
 # Maintainer: Carlo Landmeter <clandmeter@alpinelinux.org>
 pkgname=c-ares
-pkgver=1.23.0
+pkgver=1.24.0
 pkgrel=0
 pkgdesc="Asynchronous DNS/names resolver library"
 url="https://c-ares.org/"
 arch="all"
 license="MIT"
+makedepends="gtest-dev"
 subpackages="$pkgname-doc $pkgname-static $pkgname-dev $pkgname-utils::noarch"
-source="https://c-ares.haxx.se/download/c-ares-$pkgver.tar.gz"
+source="https://c-ares.haxx.se/download/c-ares-$pkgver.tar.gz
+	fix-tests-symbol-hiding.patch
+	"
 
 # secfixes:
 #   1.17.2-r0:
@@ -41,5 +44,6 @@ utils() {
 }
 
 sha512sums="
-0302fe809118bc81310c4f5ca4bbea3e2aee262da2c44ad6266d9da05e9326452f274508685974ff8aa6fce8332a2862008c12fbbc2917af258daa90b69567f0  c-ares-1.23.0.tar.gz
+3701853e263de94daf19734185ad913848c19b825e0738926b418a54b0628ee1ac95a49ebfaa2ddf3eed74a7ef209e1a0a8f573df3e507ef1f11fcc53fc5eb68  c-ares-1.24.0.tar.gz
+136b4e7a1988709e2ec96638e0ca546b1a3100cd0047d9ffb35344b7e1a4486fc7e0df2faee1096d51bf2056701d0e21b6786ea2662fca1de4f264b29939949c  fix-tests-symbol-hiding.patch
 "
diff --git a/main/c-ares/fix-tests-symbol-hiding.patch b/main/c-ares/fix-tests-symbol-hiding.patch
new file mode 100644
index 0000000000000000000000000000000000000000..015f37a3d2371ce6527c6de88d6063d1d235efe5
--- /dev/null
+++ b/main/c-ares/fix-tests-symbol-hiding.patch
@@ -0,0 +1,108 @@
+Patch-Source: https://github.com/c-ares/c-ares/commit/7dd384a99cc385e408e64c3e0af4e0e2136ed034.patch
+--
+From 7dd384a99cc385e408e64c3e0af4e0e2136ed034 Mon Sep 17 00:00:00 2001
+From: Brad House <brad@brad-house.com>
+Date: Sun, 17 Dec 2023 08:16:24 -0500
+Subject: [PATCH] fix test building with symbol hiding
+
+New test cases depend on internal symbols for calculating timeouts.
+Disable those test features if symbol hiding is enabled.
+
+Fixes Bug: #664
+Fix By: Brad House (@bradh352)
+---
+ test/ares-test-mock-ai.cc |  2 ++
+ test/ares-test-mock.cc    |  4 ++--
+ test/ares-test.cc         | 12 ++++++++++++
+ 3 files changed, 16 insertions(+), 2 deletions(-)
+
+diff --git a/test/ares-test-mock-ai.cc b/test/ares-test-mock-ai.cc
+index c55676f6c..57b9d5ee2 100644
+--- a/test/ares-test-mock-ai.cc
++++ b/test/ares-test-mock-ai.cc
+@@ -442,6 +442,7 @@ TEST_P(MockChannelTestAI, FamilyV6) {
+   EXPECT_THAT(result.ai_, IncludesV6Address("2121:0000:0000:0000:0000:0000:0000:0303"));
+ }
+ 
++#ifndef CARES_SYMBOL_HIDING
+ // Test case for Issue #662
+ TEST_P(MockChannelTestAI, PartialQueryCancel) {
+   std::vector<byte> nothing;
+@@ -469,6 +470,7 @@ TEST_P(MockChannelTestAI, PartialQueryCancel) {
+   EXPECT_TRUE(result.done_);
+   EXPECT_EQ(ARES_ECANCELLED, result.status_);
+ }
++#endif
+ 
+ TEST_P(MockChannelTestAI, FamilyV4) {
+   DNSPacket rsp4;
+diff --git a/test/ares-test-mock.cc b/test/ares-test-mock.cc
+index 6afa8f989..849eb6980 100644
+--- a/test/ares-test-mock.cc
++++ b/test/ares-test-mock.cc
+@@ -826,7 +826,7 @@ TEST_P(MockChannelTest, V4WorksV6Timeout) {
+   EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
+ }
+ 
+-
++#ifndef CARES_SYMBOL_HIDING
+ // Test case for Issue #662
+ TEST_P(MockChannelTest, PartialQueryCancel) {
+   std::vector<byte> nothing;
+@@ -849,7 +849,7 @@ TEST_P(MockChannelTest, PartialQueryCancel) {
+   EXPECT_TRUE(result.done_);
+   EXPECT_EQ(ARES_ECANCELLED, result.status_);
+ }
+-
++#endif
+ 
+ TEST_P(MockChannelTest, UnspecifiedFamilyV6) {
+   DNSPacket rsp6;
+diff --git a/test/ares-test.cc b/test/ares-test.cc
+index faad01486..3a55b73d3 100644
+--- a/test/ares-test.cc
++++ b/test/ares-test.cc
+@@ -105,6 +105,8 @@ void ProcessWork(ares_channel_t *channel,
+                  unsigned int cancel_ms) {
+   int nfds, count;
+   fd_set readers, writers;
++
++#ifndef CARES_SYMBOL_HIDING
+   struct timeval tv_begin  = ares__tvnow();
+   struct timeval tv_cancel = tv_begin;
+ 
+@@ -113,10 +115,18 @@ void ProcessWork(ares_channel_t *channel,
+     tv_cancel.tv_sec  += (cancel_ms / 1000);
+     tv_cancel.tv_usec += ((cancel_ms % 1000) * 1000);
+   }
++#else
++  if (cancel_ms) {
++    std::cerr << "library built with symbol hiding, can't test with cancel support" << std::endl;
++    return;
++  }
++#endif
+ 
+   while (true) {
++#ifndef CARES_SYMBOL_HIDING
+     struct timeval  tv_now = ares__tvnow();
+     struct timeval  tv_remaining;
++#endif
+     struct timeval  tv;
+     struct timeval *tv_select;
+ 
+@@ -142,6 +152,7 @@ void ProcessWork(ares_channel_t *channel,
+     if (tv_select == NULL)
+       return;
+ 
++#ifndef CARES_SYMBOL_HIDING
+     if (cancel_ms) {
+       unsigned int remaining_ms;
+       ares__timeval_remaining(&tv_remaining,
+@@ -157,6 +168,7 @@ void ProcessWork(ares_channel_t *channel,
+         tv_select = ares_timeout(channel, &tv_remaining, &tv);
+       }
+     }
++#endif
+ 
+     count = select(nfds, &readers, &writers, nullptr, tv_select);
+     if (count < 0) {