diff --git a/configure.ac b/configure.ac
index 6404b5fc1..78200e48c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -99,6 +99,7 @@ OVS_CHECK_PYTHON3
 OVS_CHECK_FLAKE8
 OVS_CHECK_SPHINX
 OVS_CHECK_DOT
+OVS_CHECK_STATIC_BINARIES
 OVS_CHECK_IF_PACKET
 OVS_CHECK_IF_DL
 OVS_CHECK_STRTOK_R
diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4
index 648750ab5..ebeda8450 100644
--- a/m4/openvswitch.m4
+++ b/m4/openvswitch.m4
@@ -620,3 +620,24 @@ AC_DEFUN([OVS_LIBTOOL_VERSIONS],
   AC_MSG_RESULT([libX-$OVS_MAJOR.$OVS_MINOR.so.$LT_CURRENT.0.$OVS_MICRO)])
   AC_SUBST(OVS_LTINFO)
     ])
+
+dnl Checks for --enable-static-binaries.
+AC_DEFUN([OVS_CHECK_STATIC_BINARIES],
+    [AC_ARG_ENABLE(
+     [static-binaries],
+     [AC_HELP_STRING([--enable-static-binaries],
+                     [Build binaries statically linked with openvswitch libraries.])],
+     [case "${enableval}" in
+        (yes) static_binaries=true ;;
+        (no)  static_binaries=false ;;
+        (*) AC_MSG_ERROR([bad value ${enableval} for --enable-static-binaries]) ;;
+      esac],
+     [static_binaries=false])
+    if test x$static_binaries = xtrue && test x$enable_static = xyes &&
+    test x$enable_shared = xyes; then
+      STATIC_BINARIES_LDFLAGS=-static
+    else
+      STATIC_BINARIES_LDFLAGS=
+    fi
+    AC_SUBST([STATIC_BINARIES_LDFLAGS])
+    ])
diff --git a/ovn/controller-vtep/automake.mk b/ovn/controller-vtep/automake.mk
index 0c83dc70a..89a266f88 100644
--- a/ovn/controller-vtep/automake.mk
+++ b/ovn/controller-vtep/automake.mk
@@ -9,6 +9,7 @@ ovn_controller_vtep_ovn_controller_vtep_SOURCES = \
 	ovn/controller-vtep/vtep.c \
 	ovn/controller-vtep/vtep.h
 ovn_controller_vtep_ovn_controller_vtep_LDADD = ovn/lib/libovn.la lib/libopenvswitch.la vtep/libvtep.la
+ovn_controller_vtep_ovn_controller_vtep_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 man_MANS += ovn/controller-vtep/ovn-controller-vtep.8
 EXTRA_DIST += ovn/controller-vtep/ovn-controller-vtep.8.xml
 CLEANFILES += ovn/controller-vtep/ovn-controller-vtep.8
diff --git a/ovn/controller/automake.mk b/ovn/controller/automake.mk
index 8c6a78757..ff01c0304 100644
--- a/ovn/controller/automake.mk
+++ b/ovn/controller/automake.mk
@@ -21,6 +21,7 @@ ovn_controller_ovn_controller_SOURCES = \
 	ovn/controller/physical.c \
 	ovn/controller/physical.h
 ovn_controller_ovn_controller_LDADD = ovn/lib/libovn.la lib/libopenvswitch.la
+ovn_controller_ovn_controller_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 man_MANS += ovn/controller/ovn-controller.8
 EXTRA_DIST += ovn/controller/ovn-controller.8.xml
 CLEANFILES += ovn/controller/ovn-controller.8
diff --git a/ovn/northd/automake.mk b/ovn/northd/automake.mk
index 93aebe8b1..1b3cbd833 100644
--- a/ovn/northd/automake.mk
+++ b/ovn/northd/automake.mk
@@ -5,6 +5,7 @@ ovn_northd_ovn_northd_LDADD = \
 	ovn/lib/libovn.la \
 	ovsdb/libovsdb.la \
 	lib/libopenvswitch.la
+ovn_northd_ovn_northd_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 man_MANS += ovn/northd/ovn-northd.8
 EXTRA_DIST += ovn/northd/ovn-northd.8.xml
 CLEANFILES += ovn/northd/ovn-northd.8
diff --git a/ovn/utilities/automake.mk b/ovn/utilities/automake.mk
index b96f9bf6a..9921c8793 100644
--- a/ovn/utilities/automake.mk
+++ b/ovn/utilities/automake.mk
@@ -41,15 +41,18 @@ CLEANFILES += \
 bin_PROGRAMS += ovn/utilities/ovn-nbctl
 ovn_utilities_ovn_nbctl_SOURCES = ovn/utilities/ovn-nbctl.c
 ovn_utilities_ovn_nbctl_LDADD = ovn/lib/libovn.la ovsdb/libovsdb.la lib/libopenvswitch.la
+ovn_utilities_ovn_nbctl_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 # ovn-sbctl
 bin_PROGRAMS += ovn/utilities/ovn-sbctl
 ovn_utilities_ovn_sbctl_SOURCES = ovn/utilities/ovn-sbctl.c
 ovn_utilities_ovn_sbctl_LDADD = ovn/lib/libovn.la ovsdb/libovsdb.la lib/libopenvswitch.la
+ovn_utilities_ovn_sbctl_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 # ovn-trace
 bin_PROGRAMS += ovn/utilities/ovn-trace
 ovn_utilities_ovn_trace_SOURCES = ovn/utilities/ovn-trace.c
 ovn_utilities_ovn_trace_LDADD = ovn/lib/libovn.la ovsdb/libovsdb.la lib/libopenvswitch.la
+ovn_utilities_ovn_trace_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 include ovn/utilities/bugtool/automake.mk
diff --git a/ovsdb/automake.mk b/ovsdb/automake.mk
index 50e5ab367..87799c5dd 100644
--- a/ovsdb/automake.mk
+++ b/ovsdb/automake.mk
@@ -60,6 +60,7 @@ EXTRA_DIST += \
 bin_PROGRAMS += ovsdb/ovsdb-tool
 ovsdb_ovsdb_tool_SOURCES = ovsdb/ovsdb-tool.c
 ovsdb_ovsdb_tool_LDADD = ovsdb/libovsdb.la lib/libopenvswitch.la
+ovsdb_ovsdb_tool_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 # ovsdb-tool.1
 man_MANS += ovsdb/ovsdb-tool.1
 CLEANFILES += ovsdb/ovsdb-tool.1
@@ -69,6 +70,7 @@ MAN_ROOTS += ovsdb/ovsdb-tool.1.in
 bin_PROGRAMS += ovsdb/ovsdb-client
 ovsdb_ovsdb_client_SOURCES = ovsdb/ovsdb-client.c
 ovsdb_ovsdb_client_LDADD = ovsdb/libovsdb.la lib/libopenvswitch.la
+ovsdb_ovsdb_client_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 # ovsdb-client.1
 man_MANS += ovsdb/ovsdb-client.1
 CLEANFILES += ovsdb/ovsdb-client.1
@@ -78,6 +80,7 @@ MAN_ROOTS += ovsdb/ovsdb-client.1.in
 sbin_PROGRAMS += ovsdb/ovsdb-server
 ovsdb_ovsdb_server_SOURCES = ovsdb/ovsdb-server.c
 ovsdb_ovsdb_server_LDADD = ovsdb/libovsdb.la lib/libopenvswitch.la
+ovsdb_ovsdb_server_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 # ovsdb-server.1
 man_MANS += ovsdb/ovsdb-server.1
 CLEANFILES += ovsdb/ovsdb-server.1
diff --git a/tests/automake.mk b/tests/automake.mk
index a13b55e47..a7f9d6ebf 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -286,11 +286,13 @@ tests_test_ovsdb_SOURCES = tests/test-ovsdb.c
 nodist_tests_test_ovsdb_SOURCES = tests/idltest.c tests/idltest.h
 EXTRA_DIST += tests/uuidfilt.pl tests/ovsdb-monitor-sort.pl
 tests_test_ovsdb_LDADD = ovsdb/libovsdb.la lib/libopenvswitch.la
+tests_test_ovsdb_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 noinst_PROGRAMS += tests/test-lib
 tests_test_lib_SOURCES = \
 	tests/test-lib.c
 tests_test_lib_LDADD = lib/libopenvswitch.la
+tests_test_lib_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 # idltest schema and IDL
 OVSIDL_BUILT += tests/idltest.c tests/idltest.h tests/idltest.ovsidl
@@ -362,6 +364,7 @@ tests_ovstest_SOURCES += \
 endif
 
 tests_ovstest_LDADD = lib/libopenvswitch.la ovn/lib/libovn.la
+tests_ovstest_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 dist_check_SCRIPTS = tests/flowgen.pl
 
 noinst_PROGRAMS += tests/test-strtok_r
diff --git a/utilities/automake.mk b/utilities/automake.mk
index 1636cb93e..9a6a8812d 100644
--- a/utilities/automake.mk
+++ b/utilities/automake.mk
@@ -119,29 +119,36 @@ man_MANS += \
 
 utilities_ovs_appctl_SOURCES = utilities/ovs-appctl.c
 utilities_ovs_appctl_LDADD = lib/libopenvswitch.la
+utilities_ovs_appctl_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 utilities_ovs_testcontroller_SOURCES = utilities/ovs-testcontroller.c
 utilities_ovs_testcontroller_LDADD = lib/libopenvswitch.la $(SSL_LIBS)
+utilities_ovs_testcontroller_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 utilities_ovs_dpctl_SOURCES = utilities/ovs-dpctl.c
 utilities_ovs_dpctl_LDADD = lib/libopenvswitch.la
+utilities_ovs_dpctl_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 utilities_ovs_ofctl_SOURCES = utilities/ovs-ofctl.c
 utilities_ovs_ofctl_LDADD = \
 	ofproto/libofproto.la \
 	lib/libopenvswitch.la
+utilities_ovs_ofctl_LDLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 utilities_ovs_vsctl_SOURCES = utilities/ovs-vsctl.c
 utilities_ovs_vsctl_LDADD = lib/libopenvswitch.la
+utilities_ovs_vsctl_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 if LINUX
 sbin_PROGRAMS += utilities/ovs-vlan-bug-workaround
 utilities_ovs_vlan_bug_workaround_SOURCES = utilities/ovs-vlan-bug-workaround.c
 utilities_ovs_vlan_bug_workaround_LDADD = lib/libopenvswitch.la
+utilities_ovs_vlan_bug_workaround_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 noinst_PROGRAMS += utilities/nlmon
 utilities_nlmon_SOURCES = utilities/nlmon.c
 utilities_nlmon_LDADD = lib/libopenvswitch.la
+utilities_nlmon_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 endif
 
 FLAKE8_PYFILES += utilities/ovs-pcap.in \
diff --git a/vswitchd/automake.mk b/vswitchd/automake.mk
index aa4224561..ffd66ce89 100644
--- a/vswitchd/automake.mk
+++ b/vswitchd/automake.mk
@@ -15,7 +15,7 @@ vswitchd_ovs_vswitchd_LDADD = \
 	ofproto/libofproto.la \
 	lib/libsflow.la \
 	lib/libopenvswitch.la
-vswitchd_ovs_vswitchd_LDFLAGS = $(AM_LDFLAGS) $(DPDK_vswitchd_LDFLAGS)
+vswitchd_ovs_vswitchd_LDFLAGS = $(AM_LDFLAGS) $(DPDK_vswitchd_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 MAN_ROOTS += vswitchd/ovs-vswitchd.8.in
 
 # vswitch schema and IDL
diff --git a/vtep/automake.mk b/vtep/automake.mk
index 6bcb03188..a31463e20 100644
--- a/vtep/automake.mk
+++ b/vtep/automake.mk
@@ -35,6 +35,7 @@ man_MANS += \
 
 vtep_vtep_ctl_SOURCES = vtep/vtep-ctl.c
 vtep_vtep_ctl_LDADD = vtep/libvtep.la lib/libopenvswitch.la
+vtep_vtep_ctl_LDFLAGS = $(AM_LDFLAGS) $(STATIC_BINARIES_LDFLAGS)
 
 # ovs-vtep
 scripts_SCRIPTS += \
