diff --git a/cvmfs/CMakeLists.txt b/cvmfs/CMakeLists.txt
index b6c24e90fea08893eb9b3993057445a3b302973a..fb396a96b3e72f9c92fff685b7f1836aca8dc1c8 100644
--- a/cvmfs/CMakeLists.txt
+++ b/cvmfs/CMakeLists.txt
@@ -275,7 +275,6 @@ set (CVMFS_PUBLISH_SOURCES
   ssl.cc
   statistics.cc
   upload_spooler_definition.cc
-  util/algorithm.cc
   util/exception.cc
   util/logging.cc
   util/namespace.cc
@@ -354,7 +353,6 @@ set (LIBCVMFS_SERVER_SOURCES
   upload_local.cc
   upload_s3.cc
   upload_spooler_definition.cc
-  util/algorithm.cc
   util/concurrency.cc
   util/exception.cc
   util/file_backed_buffer.cc
@@ -470,7 +468,6 @@ set (CVMFS_SWISSKNIFE_SOURCES
   upload_s3.cc
   upload_spooler_definition.cc
   url.cc
-  util/algorithm.cc
   util/concurrency.cc
   util/exception.cc
   util/file_backed_buffer.cc
@@ -638,7 +635,6 @@ if(BUILD_RECEIVER)
     upload_local.cc
     upload_s3.cc
     upload_spooler_definition.cc
-    util/algorithm.cc
     util/concurrency.cc
     util/exception.cc
     util/file_backed_buffer.cc
diff --git a/cvmfs/util/CMakeLists.txt b/cvmfs/util/CMakeLists.txt
index 68befea444577adf72520891fedfcc3dc62c3475..2a3d6b83dfd08e24488cbcff0ce94af4672c514f 100644
--- a/cvmfs/util/CMakeLists.txt
+++ b/cvmfs/util/CMakeLists.txt
@@ -2,6 +2,7 @@ if (BUILD_CVMFS OR BUILD_SERVER OR BUILD_RECEIVER OR
     BUILD_SHRINKWRAP OR BUILD_PRELOADER OR BUILD_UNITTESTS)
 
 set (LIBCVMFS_UTIL_SOURCES
+  util/algorithm.cc
   util/string.cc
 )
 
diff --git a/cvmfs/util/algorithm.h b/cvmfs/util/algorithm.h
index 4ffc329cf3356182bec60f31cc796caa5326a937..187f21b8f859ffd5224f005ac67f53de7f531279 100644
--- a/cvmfs/util/algorithm.h
+++ b/cvmfs/util/algorithm.h
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "util/atomic.h"
+#include "util/export.h"
 #include "util/murmur.hxx"
 #include "util/platform.h"
 #include "util/prng.h"
@@ -22,7 +23,7 @@ namespace CVMFS_NAMESPACE_GUARD {
 #endif
 
 
-double DiffTimeSeconds(struct timeval start, struct timeval end);
+CVMFS_EXPORT double DiffTimeSeconds(struct timeval start, struct timeval end);
 
 // Bitfield manipulation for different integer types T
 template <typename T>
@@ -107,7 +108,7 @@ struct hash_murmur {
  * watch.Stop();
  * printf("%f", watch.GetTime());
  */
-class StopWatch : SingleCopy {
+class CVMFS_EXPORT StopWatch : SingleCopy {
  public:
   StopWatch() : running_(false) {}
 
@@ -136,7 +137,7 @@ class StopWatch : SingleCopy {
  * hist.PrintLog2Histogram();
  */
 
-class Log2Histogram {
+class CVMFS_EXPORT Log2Histogram {
 friend class UTLog2Histogram;
 
  public:
@@ -194,7 +195,7 @@ class UTLog2Histogram {
 };
 
 
-class HighPrecisionTimer : SingleCopy {
+class CVMFS_EXPORT HighPrecisionTimer : SingleCopy {
  public:
   static bool g_is_enabled;  // false by default