FreeBSD just added -fcommon, but this doesn't look too bad.
Tests pass on my laptop.
Index: Makefile
===================================================================
RCS file: /cvs/ports/net/quagga/Makefile,v
retrieving revision 1.62
diff -u -p -r1.62 Makefile
--- Makefile 22 Jan 2021 15:58:13 -0000 1.62
+++ Makefile 3 Feb 2021 23:30:22 -0000
@@ -3,7 +3,7 @@
COMMENT= multi-threaded routing daemon
DISTNAME= quagga-1.2.4
-REVISION= 1
+REVISION= 2
CATEGORIES= net
.for i in ospf ospfapiclient zebra fpm_pb quagga_pb
Index: patches/patch-pimd_pim_version_h
===================================================================
RCS file: patches/patch-pimd_pim_version_h
diff -N patches/patch-pimd_pim_version_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-pimd_pim_version_h 3 Feb 2021 23:31:18 -0000
@@ -0,0 +1,15 @@
+$OpenBSD$
+
+Fix for -fno-common
+
+Index: pimd/pim_version.h
+--- pimd/pim_version.h.orig
++++ pimd/pim_version.h
+@@ -25,6 +25,6 @@
+
+ #define PIMD_VERSION_STR "0.166"
+
+-const char * const PIMD_VERSION;
++extern const char * const PIMD_VERSION;
+
+ #endif /* PIM_VERSION_H */
Index: patches/patch-pimd_pimd_c
===================================================================
RCS file: patches/patch-pimd_pimd_c
diff -N patches/patch-pimd_pimd_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-pimd_pimd_c 3 Feb 2021 23:31:26 -0000
@@ -0,0 +1,15 @@
+$OpenBSD$
+
+fix for -fno-common
+
+Index: pimd/pimd.c
+--- pimd/pimd.c.orig
++++ pimd/pimd.c
+@@ -63,6 +63,7 @@ int64_t qpim_rpf_cache_refresh_last
+ struct in_addr qpim_inaddr_any;
+ struct list *qpim_ssmpingd_list = 0;
+ struct in_addr qpim_ssmpingd_group_addr;
++struct in_addr qpim_all_pim_routers_addr;
+ int64_t qpim_scan_oil_events = 0;
+ int64_t qpim_scan_oil_last = 0;
+ int64_t qpim_mroute_add_events = 0;
Index: patches/patch-pimd_pimd_h
===================================================================
RCS file: patches/patch-pimd_pimd_h
diff -N patches/patch-pimd_pimd_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-pimd_pimd_h 3 Feb 2021 23:31:51 -0000
@@ -0,0 +1,79 @@
+$OpenBSD$
+
+Fix for -fno-common
+
+Index: pimd/pimd.h
+--- pimd/pimd.h.orig
++++ pimd/pimd.h
+@@ -68,39 +68,39 @@
+ #define PIM_MASK_PIM_J_P (1 << 12)
+ #define PIM_MASK_STATIC (1 << 13)
+
+-const char *const PIM_ALL_SYSTEMS;
+-const char *const PIM_ALL_ROUTERS;
+-const char *const PIM_ALL_PIM_ROUTERS;
+-const char *const PIM_ALL_IGMP_ROUTERS;
++extern const char *const PIM_ALL_SYSTEMS;
++extern const char *const PIM_ALL_ROUTERS;
++extern const char *const PIM_ALL_PIM_ROUTERS;
++extern const char *const PIM_ALL_IGMP_ROUTERS;
+
+-struct thread_master *master;
+-uint32_t qpim_debugs;
+-int qpim_mroute_socket_fd;
+-int64_t qpim_mroute_socket_creation; /* timestamp of
creation */
+-struct thread *qpim_mroute_socket_reader;
+-int qpim_mroute_oif_highest_vif_index;
+-struct list *qpim_channel_oil_list; /* list of struct
channel_oil */
+-struct in_addr qpim_all_pim_routers_addr;
+-int qpim_t_periodic; /* Period between Join/Prune
Messages */
+-struct list *qpim_upstream_list; /* list of struct pim_upstream
*/
+-struct zclient *qpim_zclient_update;
+-struct zclient *qpim_zclient_lookup;
+-struct pim_assert_metric qpim_infinite_assert_metric;
+-long qpim_rpf_cache_refresh_delay_msec;
+-struct thread *qpim_rpf_cache_refresher;
+-int64_t qpim_rpf_cache_refresh_requests;
+-int64_t qpim_rpf_cache_refresh_events;
+-int64_t qpim_rpf_cache_refresh_last;
+-struct in_addr qpim_inaddr_any;
+-struct list *qpim_ssmpingd_list; /* list of struct ssmpingd_sock
*/
+-struct in_addr qpim_ssmpingd_group_addr;
+-int64_t qpim_scan_oil_events;
+-int64_t qpim_scan_oil_last;
+-int64_t qpim_mroute_add_events;
+-int64_t qpim_mroute_add_last;
+-int64_t qpim_mroute_del_events;
+-int64_t qpim_mroute_del_last;
+-struct list *qpim_static_route_list; /* list of routes added
statically */
++extern struct thread_master *master;
++extern uint32_t qpim_debugs;
++extern int qpim_mroute_socket_fd;
++extern int64_t qpim_mroute_socket_creation; /* timestamp of
creation */
++extern struct thread *qpim_mroute_socket_reader;
++extern int qpim_mroute_oif_highest_vif_index;
++extern struct list *qpim_channel_oil_list; /* list of struct
channel_oil */
++extern struct in_addr qpim_all_pim_routers_addr;
++extern int qpim_t_periodic; /* Period between
Join/Prune Messages */
++extern struct list *qpim_upstream_list; /* list of struct
pim_upstream */
++extern struct zclient *qpim_zclient_update;
++extern struct zclient *qpim_zclient_lookup;
++extern struct pim_assert_metric qpim_infinite_assert_metric;
++extern long qpim_rpf_cache_refresh_delay_msec;
++extern struct thread *qpim_rpf_cache_refresher;
++extern int64_t qpim_rpf_cache_refresh_requests;
++extern int64_t qpim_rpf_cache_refresh_events;
++extern int64_t qpim_rpf_cache_refresh_last;
++extern struct in_addr qpim_inaddr_any;
++extern struct list *qpim_ssmpingd_list; /* list of struct
ssmpingd_sock */
++extern struct in_addr qpim_ssmpingd_group_addr;
++extern int64_t qpim_scan_oil_events;
++extern int64_t qpim_scan_oil_last;
++extern int64_t qpim_mroute_add_events;
++extern int64_t qpim_mroute_add_last;
++extern int64_t qpim_mroute_del_events;
++extern int64_t qpim_mroute_del_last;
++extern struct list *qpim_static_route_list; /* list of routes
added statically */
+
+ #define PIM_JP_HOLDTIME (qpim_t_periodic * 7 / 2)
+
Index: patches/patch-tests_bgp_mpath_test_c
===================================================================
RCS file: patches/patch-tests_bgp_mpath_test_c
diff -N patches/patch-tests_bgp_mpath_test_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-tests_bgp_mpath_test_c 3 Feb 2021 23:30:52 -0000
@@ -0,0 +1,16 @@
+$OpenBSD$
+
+Fix for -fno-common
+
+Index: tests/bgp_mpath_test.c
+--- tests/bgp_mpath_test.c.orig
++++ tests/bgp_mpath_test.c
+@@ -73,7 +73,7 @@ struct testcase_t__ {
+
+ /* need these to link in libbgp */
+ struct thread_master *master = NULL;
+-struct zclient *zclient;
++extern struct zclient *zclient;
+ struct zebra_privs_t bgpd_privs =
+ {
+ .user = NULL,