diff --git a/libs/libgd/Makefile b/libs/libgd/Makefile
index b76f2615c..2bd12b7ef 100644
--- a/libs/libgd/Makefile
+++ b/libs/libgd/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libgd
 PKG_VERSION:=2.2.5
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://github.com/$(PKG_NAME)/$(PKG_NAME)/releases/download/gd-$(PKG_VERSION)/
@@ -86,7 +86,7 @@ endif
 
 define Package/libgd/install
 	$(INSTALL_DIR) $(1)/usr/lib
-	$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libgd.so $(1)/usr/lib/
+	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libgd.so* $(1)/usr/lib/
 endef
 
 $(eval $(call BuildPackage,libgd))
diff --git a/libs/libgd/patches/200-cmake-add-soname-info-to-libgd.so.patch b/libs/libgd/patches/200-cmake-add-soname-info-to-libgd.so.patch
new file mode 100644
index 000000000..f4af74491
--- /dev/null
+++ b/libs/libgd/patches/200-cmake-add-soname-info-to-libgd.so.patch
@@ -0,0 +1,135 @@
+From 5ebbd50cffc013a7dd0f3b1eaaa83d199e8e47fd Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Sun, 24 Jul 2016 00:14:20 +0530
+Subject: [PATCH] cmake: add soname info to libgd.so
+
+Pull out the library versioning info out of configure and into a common
+script that both cmake & autotools can run.  This way we have a single
+source of truth for the versioning info.
+---
+ CMakeLists.txt     | 11 +++++++++++
+ config/getlib.sh   | 42 ++++++++++++++++++++++++++++++++++++++++++
+ configure.ac       | 25 +++++++++++--------------
+ src/CMakeLists.txt |  2 ++
+ 4 files changed, 66 insertions(+), 14 deletions(-)
+ create mode 100755 config/getlib.sh
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 7c8ad34b..9fe2eb4e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -78,6 +78,17 @@ else (USE_EXT_GD)
+ 
+ 	SET(GD_VERSION_INT "2020555")
+ 
++	MACRO(GV_LT VER VAR)
++		execute_process(
++			COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/config/getlib.sh ${VER}
++			OUTPUT_VARIABLE ${VAR}
++		)
++	ENDMACRO(GV_LT)
++
++	GV_LT(SONAME GDLIB_LIB_SOVERSION)
++	GV_LT(VERSION GDLIB_LIB_VERSION)
++	MESSAGE(STATUS "gd shared lib version ${GDLIB_LIB_SOVERSION} (${GDLIB_LIB_VERSION})")
++
+ 	SET(CMAKE_REQUIRED_INCLUDES "/usr/include" "/usr/local/include")
+ 
+ 	include(CheckIncludeFiles)
+diff --git a/config/getlib.sh b/config/getlib.sh
+new file mode 100755
+index 00000000..4835cf6c
+--- /dev/null
++++ b/config/getlib.sh
+@@ -0,0 +1,42 @@
++#!/bin/sh
++
++GETVER="${0%/*}/getver.pl"
++GDLIB_MAJOR=$("${GETVER}" MAJOR)
++GDLIB_MINOR=$("${GETVER}" MINOR)
++GDLIB_REVISION=$("${GETVER}" RELEASE)
++
++# Dynamic library version information
++# See http://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
++
++GDLIB_LT_CURRENT=3
++# This is the version where the soname (current above) changes.  We use it
++# to reset the revision base back to zero.  It's a bit of a pain, but some
++# systems restrict the revision range below to [0..255] (like OS X).
++GDLIB_PREV_MAJOR=2
++GDLIB_PREV_MINOR=2
++# This isn't 100% correct, but it tends to be a close enough approximation
++# for how we manage the codebase.  It's rare to do a release that doesn't
++# modify the library since this project is centered around the library.
++GDLIB_LT_REVISION=$(( ((GDLIB_MAJOR - GDLIB_PREV_MAJOR) << 6) | ((GDLIB_MINOR - GDLIB_PREV_MINOR) << 3) | GDLIB_REVISION ))
++GDLIB_LT_AGE=0
++
++# The first three fields we feed into libtool and the OS target determines how
++# they get used.  The last two fields we feed into cmake.  We use the same rules
++# as Linux SONAME versioning in libtool, but cmake should handle it for us.
++case $1 in
++CURRENT)
++	printf '%s' "${GDLIB_LT_CURRENT}"
++	;;
++REVISION)
++	printf '%s' "${GDLIB_LT_REVISION}"
++	;;
++AGE)
++	printf '%s' "${GDLIB_LT_AGE}"
++	;;
++VERSION)
++	printf '%s' "$(( GDLIB_LT_CURRENT - GDLIB_LT_AGE )).${GDLIB_LT_AGE}.${GDLIB_LT_REVISION}"
++	;;
++SONAME)
++	printf '%s' "$(( GDLIB_LT_CURRENT - GDLIB_LT_AGE ))"
++	;;
++esac
+diff --git a/configure.ac b/configure.ac
+index 91643bd6..c3fb034e 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -34,20 +34,17 @@ AC_SUBST(GDLIB_REVISION)
+ AC_SUBST(GDLIB_EXTRA)
+ AC_SUBST(GDLIB_VERSION)
+ 
+-# Dynamic library version information
+-# See http://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
+-
+-GDLIB_LT_CURRENT=3
+-dnl This is the version where the soname (current above) changes.  We use it
+-dnl to reset the revision base back to zero.  It's a bit of a pain, but some
+-dnl systems restrict the revision range below to [0..255] (like OS X).
+-GDLIB_PREV_MAJOR=2
+-GDLIB_PREV_MINOR=2
+-dnl This isn't 100% correct, but it tends to be a close enough approximation
+-dnl for how we manage the codebase.  It's rare to do a release that doesn't
+-dnl modify the library since this project is centered around the library.
+-GDLIB_LT_REVISION=$(( ((GDLIB_MAJOR - GDLIB_PREV_MAJOR) << 6) | ((GDLIB_MINOR - GDLIB_PREV_MINOR) << 3) | GDLIB_REVISION ))
+-GDLIB_LT_AGE=0
++dnl Keep the libtool version details in an external script so cmake can
++dnl access the values too.
++define([lt_gv], [config/getlib.sh ]$1)
++m4_define([gd_LT_CURRENT], esyscmd(lt_gv(CURRENT)))
++m4_define([gd_LT_REVISION], esyscmd(lt_gv(REVISION)))
++m4_define([gd_LT_AGE], esyscmd(lt_gv(AGE)))
++
++GDLIB_LT_CURRENT=gd_LT_CURRENT
++GDLIB_LT_REVISION=gd_LT_REVISION
++GDLIB_LT_AGE=gd_LT_AGE
++
+ AC_SUBST(GDLIB_LT_CURRENT)
+ AC_SUBST(GDLIB_LT_REVISION)
+ AC_SUBST(GDLIB_LT_AGE)
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 08fd6991..a621fe1e 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -76,6 +76,8 @@ include(GNUInstallDirs)
+ if (BUILD_SHARED_LIBS)
+ 	add_library(${GD_LIB} ${LIBGD_SRC_FILES})
+ 	set_target_properties(${GD_LIB} PROPERTIES
++		SOVERSION ${GDLIB_LIB_SOVERSION}
++		VERSION ${GDLIB_LIB_VERSION}
+ 		C_VISIBILITY_PRESET hidden
+ 		CXX_VISIBILITY_PRESET hidden
+ 	)
diff --git a/libs/libgd/patches/210-generate-install-gdlib.pc-for-cmake-builds-too-164.patch b/libs/libgd/patches/210-generate-install-gdlib.pc-for-cmake-builds-too-164.patch
new file mode 100644
index 000000000..78a1988ed
--- /dev/null
+++ b/libs/libgd/patches/210-generate-install-gdlib.pc-for-cmake-builds-too-164.patch
@@ -0,0 +1,37 @@
+From dd76e8fcf2a2d7e122110444695ad20f2549420e Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Wed, 10 Jan 2018 01:56:10 -0500
+Subject: [PATCH] generate & install gdlib.pc for cmake builds too #164
+
+---
+ config/gdlib.pc.cmake | 9 +++++++++
+ src/CMakeLists.txt    | 3 +++
+ 2 files changed, 12 insertions(+)
+ create mode 100644 config/gdlib.pc.cmake
+
+diff --git a/config/gdlib.pc.cmake b/config/gdlib.pc.cmake
+new file mode 100644
+index 00000000..fb828882
+--- /dev/null
++++ b/config/gdlib.pc.cmake
+@@ -0,0 +1,9 @@
++libdir=@CMAKE_INSTALL_FULL_LIBDIR@
++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
++
++Name: gd
++Description: GD graphics library
++Version: @GDLIB_VERSION@
++Cflags: -I${includedir}
++Libs.private: @LIBGD_DEP_LIBS@
++Libs: -L${libdir} -lgd
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index a621fe1e..38fc9c42 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -174,3 +174,6 @@ install(FILES
+ 	gdfontt.h
+ 	gdfx.h
+ 	DESTINATION include)
++
++CONFIGURE_FILE(../config/gdlib.pc.cmake gdlib.pc @ONLY)
++INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/gdlib.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")