DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
@ 2014-12-20 21:01 Neil Horman
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (14 more replies)
  0 siblings, 15 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

GI: [PATCH 1/4] compat: Add infrastructure to support symbol versioninBI
develops and changes quickly, which makes it difficult for
applications to keep up with the latest version of the library, especially when
it (the DPDK) is built as a set of shared objects, as applications may be built
against an older version of the library.

To mitigate this, this patch series introduces support for library and symbol
versioning when the DPDK is built as a DSO.  Specifically, it does 4 things:

1) Adds initial support for library versioning.  Each library now has a version
map that explicitly calls out what symbols are exported to using applications,
and assigns version(s) to them

2) Adds support macros so that when libraries create incompatible ABI's,
multiple versions may be supported so that applications linked against older
DPDK releases can continue to function

3) Adds library soname versioning suffixes so that when ABI's must be broken in
a fashion that requires a rebuild of older applications, they will break at load
time, rather than cause unexpected issues at run time.

4) Adds documentation for ABI policy, and provides space to document deprecated
ABI versions, so that applications might be warned of impending changes.

With these elements in place the DPDK has some support to allow for the extended
maintenence of older API's while still allowing the freedom to develop new and
improved API's.

Implementing this feature will require some additional effort on the part of
developers and reviewers.  When reviewing patches, must be checked against
existing exports to ensure that the function prototypes are not changing.  If
they are, the versioning macros must be used, and the library export map should
be updated to reflect the new version of the function.

When data structures change, if those structures are application accessible,
apis that accept or return instances of those data structures should have new
versions created so that users of the old data structure version might co-exist
at the same time.

Note it was requested that this series be delayed until DPDK 2.0, so this is a
repost, now that DPDK 1.8 has been tagged.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Robert Love" <robert.w.love@intel.com>

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
@ 2014-12-20 21:01 ` Neil Horman
  2014-12-22 14:01   ` Gonzalez Monroy, Sergio
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  6 +++
 4 files changed, 141 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..3415c7b
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..2299cbe 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
@@ -161,7 +165,9 @@ endif
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
+ifneq ($(LIB),)
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+endif
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH 2/4] Provide initial versioning for all DPDK libraries
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-20 21:01 ` Neil Horman
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

Add linker version script files to each DPDK library to put a stake in the
ground from which we can start cleaning up API's

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 lib/librte_acl/Makefile                            |   2 +
 lib/librte_acl/rte_acl_version.map                 |  21 ++++
 lib/librte_cfgfile/Makefile                        |   2 +
 lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
 lib/librte_cmdline/Makefile                        |   2 +
 lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
 lib/librte_distributor/Makefile                    |   2 +
 lib/librte_distributor/rte_distributor_version.map |  16 +++
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
 lib/librte_ether/Makefile                          |   2 +
 lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
 lib/librte_hash/Makefile                           |   2 +
 lib/librte_hash/rte_hash_version.map               |  18 ++++
 lib/librte_ip_frag/Makefile                        |   2 +
 lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
 lib/librte_ivshmem/Makefile                        |   2 +
 lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
 lib/librte_kni/Makefile                            |   2 +
 lib/librte_kni/rte_kni_version.map                 |  20 ++++
 lib/librte_kvargs/Makefile                         |   2 +
 lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
 lib/librte_lpm/Makefile                            |   2 +
 lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
 lib/librte_malloc/Makefile                         |   2 +
 lib/librte_malloc/rte_malloc_version.map           |  19 ++++
 lib/librte_mbuf/Makefile                           |   2 +
 lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
 lib/librte_mempool/Makefile                        |   2 +
 lib/librte_mempool/rte_mempool_version.map         |  18 ++++
 lib/librte_meter/Makefile                          |   2 +
 lib/librte_meter/rte_meter_version.map             |  13 +++
 lib/librte_pipeline/Makefile                       |   2 +
 lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
 lib/librte_pmd_af_packet/Makefile                  |   2 +
 .../rte_pmd_af_packet_version.map                  |   7 ++
 lib/librte_pmd_bond/Makefile                       |   2 +
 lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
 lib/librte_pmd_e1000/Makefile                      |   2 +
 lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
 lib/librte_pmd_enic/Makefile                       |   2 +
 lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
 lib/librte_pmd_i40e/Makefile                       |   2 +
 lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
 lib/librte_pmd_ixgbe/Makefile                      |   2 +
 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
 lib/librte_pmd_pcap/Makefile                       |   2 +
 lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
 lib/librte_pmd_ring/Makefile                       |   2 +
 lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
 lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
 lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
 lib/librte_pmd_virtio/Makefile                     |   1 +
 lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
 lib/librte_pmd_vmxnet3/Makefile                    |   2 +
 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
 lib/librte_pmd_xenvirt/Makefile                    |   2 +
 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
 lib/librte_port/Makefile                           |   2 +
 lib/librte_port/rte_port_version.map               |  18 ++++
 lib/librte_power/Makefile                          |   2 +
 lib/librte_power/rte_power_version.map             |  18 ++++
 lib/librte_ring/Makefile                           |   2 +
 lib/librte_ring/rte_ring_version.map               |  12 +++
 lib/librte_sched/Makefile                          |   2 +
 lib/librte_sched/rte_sched_version.map             |  22 ++++
 lib/librte_table/Makefile                          |   2 +
 lib/librte_table/rte_table_version.map             |  22 ++++
 lib/librte_timer/Makefile                          |   2 +
 lib/librte_timer/rte_timer_version.map             |  16 +++
 lib/librte_vhost/Makefile                          |   2 +
 lib/librte_vhost/rte_vhost_version.map             |  14 +++
 74 files changed, 874 insertions(+), 7 deletions(-)
 create mode 100644 lib/librte_acl/rte_acl_version.map
 create mode 100644 lib/librte_cfgfile/rte_cfgfile_version.map
 create mode 100644 lib/librte_cmdline/rte_cmdline_version.map
 create mode 100644 lib/librte_distributor/rte_distributor_version.map
 create mode 100644 lib/librte_eal/bsdapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_eal/linuxapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_ether/rte_ether_version.map
 create mode 100644 lib/librte_hash/rte_hash_version.map
 create mode 100644 lib/librte_ip_frag/rte_ipfrag_version.map
 create mode 100644 lib/librte_ivshmem/rte_ivshmem_version.map
 create mode 100644 lib/librte_kni/rte_kni_version.map
 create mode 100644 lib/librte_kvargs/rte_kvargs_version.map
 create mode 100644 lib/librte_lpm/rte_lpm_version.map
 create mode 100644 lib/librte_malloc/rte_malloc_version.map
 create mode 100644 lib/librte_mbuf/rte_mbuf_version.map
 create mode 100644 lib/librte_mempool/rte_mempool_version.map
 create mode 100644 lib/librte_meter/rte_meter_version.map
 create mode 100644 lib/librte_pipeline/rte_pipeline_version.map
 create mode 100644 lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 create mode 100644 lib/librte_pmd_bond/rte_eth_bond_version.map
 create mode 100644 lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 create mode 100644 lib/librte_pmd_enic/rte_pmd_enic_version.map
 create mode 100644 lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 create mode 100644 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 create mode 100644 lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 create mode 100644 lib/librte_pmd_ring/rte_eth_ring_version.map
 create mode 100644 lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 create mode 100644 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 create mode 100644 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 create mode 100644 lib/librte_port/rte_port_version.map
 create mode 100644 lib/librte_power/rte_power_version.map
 create mode 100644 lib/librte_ring/rte_ring_version.map
 create mode 100644 lib/librte_sched/rte_sched_version.map
 create mode 100644 lib/librte_table/rte_table_version.map
 create mode 100644 lib/librte_timer/rte_timer_version.map
 create mode 100644 lib/librte_vhost/rte_vhost_version.map

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 65e566d..1f96645 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -37,6 +37,8 @@ LIB = librte_acl.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_acl/rte_acl_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
new file mode 100644
index 0000000..9f05a86
--- /dev/null
+++ b/lib/librte_acl/rte_acl_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+	rte_acl_create;
+	rte_acl_find_existing;
+	rte_acl_free;
+	rte_acl_add_rules;
+	rte_acl_reset_rules;
+	rte_acl_build;
+	rte_acl_reset;
+	rte_acl_classify;
+	rte_acl_dump;
+	rte_acl_list_dump;
+	rte_acl_ipv4vlan_add_rules;
+	rte_acl_ipv4vlan_build;
+	rte_acl_classify_scalar;
+	rte_acl_classify_alg;
+	rte_acl_set_ctx_classify;
+
+	local: *;
+};
+
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 55e8701..e655098 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -39,6 +39,8 @@ LIB = librte_cfgfile.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_cfgfile/rte_cfgfile_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
new file mode 100644
index 0000000..10ecea6
--- /dev/null
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_cfgfile_load;
+	rte_cfgfile_num_sections;
+	rte_cfgfile_sections;
+	rte_cfgfile_has_section;
+	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_entries;
+	rte_cfgfile_get_entry;
+	rte_cfgfile_has_entry;
+	rte_cfgfile_close;
+
+	local: *;
+};
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 7eae449..1a47173 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -36,6 +36,8 @@ LIB = librte_cmdline.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_cmdline/rte_cmdline_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
new file mode 100644
index 0000000..7616eff
--- /dev/null
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -0,0 +1,69 @@
+DPDK_1.8 {
+	global:
+	cmdline_new;
+	cmdline_set_prompt;
+	cmdline_free;
+	cmdline_printf;
+	cmdline_in;
+	cmdline_write_char;
+	cmdline_interact;
+	cmdline_quit;
+	cmdline_parse;
+	cmdline_complete;
+	cmdline_isendoftoken;
+	cmdline_parse_num;
+	cmdline_get_help_num;
+	cmdline_parse_ipaddr;
+	cmdline_get_help_ipaddr;
+	cmdline_parse_etheraddr;
+	cmdline_get_help_etheraddr;
+	cmdline_parse_string;
+	cmdline_complete_get_nb_string;
+	cmdline_complete_get_elt_string;
+	cmdline_get_help_string;
+	cmdline_parse_portlist;
+	cmdline_get_help_portlist;
+	cmdline_token_string_ops;
+	cmdline_token_num_ops;
+	cmdline_token_string_ops;
+	cmdline_token_ipaddr_ops;
+	cmdline_token_etheraddr_ops;
+	vt100_init;
+	vt100_parser;
+	cmdline_file_new;
+	cmdline_stdin_new;
+	cmdline_stdin_exit;
+	cirbuf_init;
+	cirbuf_add_head_safe;
+	cirbuf_add_head;
+	cirbuf_add_tail_safe;
+	cirbuf_add_tail;
+	cirbuf_del_head_safe;
+	cirbuf_del_head;
+	cirbuf_del_tail_safe;
+	cirbuf_del_tail;
+	cirbuf_get_head;
+	cirbuf_get_tail;
+	cirbuf_add_buf_head;
+	cirbuf_add_buf_tail;
+	cirbuf_del_buf_head;
+	cirbuf_del_buf_tail;
+	cirbuf_get_buf_head;
+	cirbuf_get_buf_tail;
+	cirbuf_align_left;
+	cirbuf_align_right;
+	rdline_init;
+	rdline_newline;
+	rdline_stop;
+	rdline_quit;
+	rdline_restart;
+	rdline_redisplay;
+	rdline_reset;
+	rdline_char_in;
+	rdline_get_buffer;
+	rdline_add_history;
+	rdline_clear_history;
+	rdline_get_history_item;
+
+	local: *;
+};
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 36699f8..97d8bbb 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -37,6 +37,8 @@ LIB = librte_distributor.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_distributor/rte_distributor_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
new file mode 100644
index 0000000..b81ddc8
--- /dev/null
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+
+	global:
+	rte_distributor_create;
+	rte_distributor_process;
+	rte_distributor_returned_pkts;
+	rte_distributor_flush;
+	rte_distributor_clear_returns;
+	rte_distributor_get_pkt;
+	rte_distributor_return_pkt;
+	rte_distributor_request_pkt;
+	rte_distributor_poll_pkt;
+
+	local: *;
+};
+
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index d434882..b28a8b7 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -46,6 +46,8 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_pcap
 CFLAGS += $(WERROR_FLAGS) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..4f1b11f 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -33,6 +33,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_eal.a
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index a461c31..6250f4d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -39,6 +39,8 @@ LIB = libethdev.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_ether/rte_ether_version.map
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
new file mode 100644
index 0000000..dbd0eca
--- /dev/null
+++ b/lib/librte_ether/rte_ether_version.map
@@ -0,0 +1,113 @@
+DPDK_1.8 {
+	global:
+	rte_eth_driver_register;
+	rte_eth_dev_configure;
+	rte_eth_rx_queue_setup;
+	rte_eth_tx_queue_setup;
+	rte_eth_dev_socket_id;
+	rte_eth_dev_rx_queue_start;
+	rte_eth_dev_rx_queue_stop;
+	rte_eth_dev_tx_queue_start;
+	rte_eth_dev_tx_queue_stop;
+	rte_eth_dev_start;
+	rte_eth_dev_stop;
+	rte_eth_dev_set_link_up;
+	rte_eth_dev_set_link_down;
+	rte_eth_dev_close;
+	rte_eth_promiscuous_enable;
+	rte_eth_promiscuous_disable;
+	rte_eth_promiscuous_get;
+	rte_eth_allmulticast_enable;
+	rte_eth_allmulticast_disable;
+	rte_eth_allmulticast_get;
+	rte_eth_link;
+	rte_eth_link_get_nowait;
+	rte_eth_stats;
+	rte_eth_stats_reset;
+	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_rx_queue_stats_mapping;
+	rte_eth_macaddr_get;
+	rte_eth_dev_info_get;
+	rte_eth_dev_get_mtu;
+	rte_eth_dev_set_mtu;
+	rte_eth_dev_vlan_filter;
+	rte_eth_dev_set_vlan_strip_on_queue;
+	rte_eth_dev_set_vlan_ether_type;
+	rte_eth_dev_set_vlan_offload;
+	rte_eth_dev_get_vlan_offload;
+	rte_eth_dev_set_vlan_pvid;
+	rte_eth_rx_burst;
+	rte_eth_rx_queue_count;
+	rte_eth_rx_descriptor_done;
+	rte_eth_tx_burst;
+	rte_eth_dev_fdir_add_signature_filter;
+	rte_eth_dev_fdir_update_signature_filter;
+	rte_eth_dev_fdir_remove_signature_filter;
+	rte_eth_dev_fdir_get_infos;
+	rte_eth_dev_fdir_add_perfect_filter;
+	rte_eth_dev_fdir_update_perfect_filter;
+	rte_eth_dev_fdir_remove_perfect_filter;
+	rte_eth_dev_fdir_set_masks;
+	rte_eth_dev_callback_register;
+	rte_eth_dev_callback_unregister;
+	rte_eth_dev_callback_process;
+	rte_eth_led_on;
+	rte_eth_led_off;
+	rte_eth_dev_flow_ctrl_get;
+	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_mac_addr_add;
+	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rss_reta_query;
+	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_uc_all_hash_table_set;
+	rte_eth_dev_set_vf_rxmode;
+	rte_eth_dev_set_vf_tx;
+	rte_eth_dev_set_vf_rx;
+	rte_eth_dev_set_vf_vlan_filter;
+	rte_eth_mirror_rule_set;
+	rte_eth_mirror_rule_reset;
+	rte_eth_set_queue_rate_limit;
+	rte_eth_set_vf_rate_limit;
+	rte_eth_dev_bypass_init;
+	rte_eth_dev_bypass_state_show;
+	rte_eth_dev_bypass_state_set;
+	rte_eth_dev_bypass_event_show;
+	rte_eth_dev_bypass_event_store;
+	rte_eth_dev_wd_timeout_store;
+	rte_eth_dev_bypass_ver_show;
+	rte_eth_dev_bypass_wd_timeout_show;
+	rte_eth_dev_bypass_wd_reset;
+	rte_eth_dev_rss_hash_update;
+	rte_eth_dev_rss_hash_conf_get;
+	rte_eth_dev_add_syn_filter;
+	rte_eth_dev_remove_syn_filter;
+	rte_eth_dev_get_syn_filter;
+	rte_eth_dev_add_ethertype_filter;
+	rte_eth_dev_remove_ethertype_filter;
+	rte_eth_dev_get_ethertype_filter;
+	rte_eth_dev_add_2tuple_filter;
+	rte_eth_dev_remove_2tuple_filter;
+	rte_eth_dev_get_2tuple_filter;
+	rte_eth_dev_add_5tuple_filter;
+	rte_eth_dev_remove_5tuple_filter;
+	rte_eth_dev_get_5tuple_filter;
+	rte_eth_dev_add_flex_filter;
+	rte_eth_dev_remove_flex_filter;
+	rte_eth_dev_get_flex_filter;
+	rte_eth_dev_count;
+	rte_eth_link_get;
+	rte_eth_devices;
+	rte_eth_stats_get;
+	rte_eth_dev_allocate;
+	_rte_eth_dev_callback_process;
+	rte_eth_dev_filter_ctrl;
+	rte_eth_dev_udp_tunnel_delete;
+	rte_eth_dev_udp_tunnel_add;
+	rte_eth_xstats_get;
+	rte_eth_xstats_reset;
+	rte_eth_dev_filter_supported;
+	local: *;
+};
+
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 95e4c09..a449ec2 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -37,6 +37,8 @@ LIB = librte_hash.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_hash/rte_hash_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
new file mode 100644
index 0000000..2a34313
--- /dev/null
+++ b/lib/librte_hash/rte_hash_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_fbk_hash_find_existing;
+	rte_fbk_hash_create;
+	rte_fbk_hash_free;
+	rte_hash_create;
+	rte_hash_find_existing;
+	rte_hash_free;
+	rte_hash_add_key;
+	rte_hash_add_key_with_hash;
+	rte_hash_del_key;
+	rte_hash_del_key_with_hash;
+	rte_hash_lookup;
+	rte_hash_lookup_with_hash;
+	rte_hash_lookup_bulk;
+
+	local: *;
+};
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 8c00d39..fba05d0 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -37,6 +37,8 @@ LIB = librte_ip_frag.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_ip_frag/rte_ipfrag_version.map
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipfrag_version.map b/lib/librte_ip_frag/rte_ipfrag_version.map
new file mode 100644
index 0000000..afe1a0b
--- /dev/null
+++ b/lib/librte_ip_frag/rte_ipfrag_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_ip_frag_table_create;
+	rte_ipv6_fragment_packet;
+	rte_ipv6_frag_reassemble_packet;
+	rte_ipv4_fragment_packet;
+	rte_ipv4_frag_reassemble_packet;
+	rte_ip_frag_free_death_row;
+	rte_ip_frag_table_statistics_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 536814c..be6f21a 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ivshmem.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAPS := $(RTE_SDK)/lib/librte_ivshmem/rte_ivshmem_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_ivshmem/rte_ivshmem_version.map b/lib/librte_ivshmem/rte_ivshmem_version.map
new file mode 100644
index 0000000..a204339
--- /dev/null
+++ b/lib/librte_ivshmem/rte_ivshmem_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_ivshmem_metadata_create;
+	rte_ivshmem_metadata_add_memzone;
+	rte_ivshmem_metadata_add_ring;
+	rte_ivshmem_metadata_add_mempool;
+	rte_ivshmem_metadata_cmdline_generate;
+	rte_ivshmem_metadata_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 5267304..c119fc1 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -36,6 +36,8 @@ LIB = librte_kni.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_kni/rte_kni_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
new file mode 100644
index 0000000..7db39a3
--- /dev/null
+++ b/lib/librte_kni/rte_kni_version.map
@@ -0,0 +1,20 @@
+DPDK_1.8 {
+	global:
+
+	rte_kni_alloc;
+	rte_kni_create;
+	rte_kni_release;
+	rte_kni_handle_request;
+	rte_kni_rx_burst;
+	rte_kni_tx_burst;
+	rte_kni_get_port_id;
+	rte_kni_get;
+	rte_kni_info_get;
+	rte_kni_register_handlers;
+	rte_kni_unregister_handlers;
+	rte_kni_close;
+	rte_kni_init;
+
+	local: *;
+};
+
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b09359a..83a42b1 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -38,6 +38,8 @@ LIB = librte_kvargs.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_kvargs/rte_kvargs_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
new file mode 100644
index 0000000..7873c8c
--- /dev/null
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+	rte_kvargs_parse;
+	rte_kvargs_free;
+	rte_kvargs_process;
+	rte_kvargs_count;
+
+	local: *;
+};
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index fa94163..05de8d9 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -37,6 +37,8 @@ LIB = librte_lpm.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_lpm/rte_lpm_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
new file mode 100644
index 0000000..8ae9318
--- /dev/null
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -0,0 +1,24 @@
+DPDK_1.8 {
+	global:
+
+	rte_lpm_create;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_add;
+	rte_lpm_is_rule_present;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm6_create;
+	rte_lpm6_find_existing;
+	rte_lpm6_free;
+	rte_lpm6_add;
+	rte_lpm6_is_rule_present;
+	rte_lpm6_delete;
+	rte_lpm6_delete_bulk_func;
+	rte_lpm6_delete_all;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
+
+	local: *;
+};
+
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index ba87e34..1a5c288 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -36,6 +36,8 @@ LIB = librte_malloc.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_malloc/rte_malloc_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MALLOC) := rte_malloc.c malloc_elem.c malloc_heap.c
 
diff --git a/lib/librte_malloc/rte_malloc_version.map b/lib/librte_malloc/rte_malloc_version.map
new file mode 100644
index 0000000..77db879
--- /dev/null
+++ b/lib/librte_malloc/rte_malloc_version.map
@@ -0,0 +1,19 @@
+DPDK_1.8 {
+	global:
+
+	rte_malloc;
+	rte_zmalloc;
+	rte_calloc;
+	rte_realloc;
+	rte_malloc_socket;
+	rte_zmalloc_socket;
+	rte_calloc_socket;
+	rte_free;
+	rte_malloc_validate;
+	rte_malloc_get_socket_stats;
+	rte_malloc_dump_stats;
+	rte_malloc_set_limit;
+	rte_malloc_virt2phy;
+
+	local: *;
+};
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 9b45ba4..5cd4941 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mbuf.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_mbuf/rte_mbuf_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
new file mode 100644
index 0000000..7260507
--- /dev/null
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_mbuf_sanity_check;
+	rte_ctrlmbuf_init;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_init;
+	rte_pktmbuf_dump;
+	rte_get_rx_ol_flag_name;
+	rte_get_tx_ol_flag_name;
+
+	local: *;
+};
+
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 9939e10..07b5b4e 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mempool.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_mempool/rte_mempool_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
new file mode 100644
index 0000000..7a19982
--- /dev/null
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_create;
+	rte_mempool_xmem_create;
+	rte_dom0_mempool_create;
+	rte_mempool_dump;
+	rte_mempool_audit;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
+	rte_mempool_calc_obj_size;
+	rte_mempool_xmem_size;
+	rte_mempool_xmem_usage;
+	rte_mempool_walk;
+	rte_mempool_count;
+
+	local: *;
+};
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index b25c0cc..0778690 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -39,6 +39,8 @@ LIB = librte_meter.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_meter/rte_meter_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
new file mode 100644
index 0000000..51a73b1
--- /dev/null
+++ b/lib/librte_meter/rte_meter_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_meter_srtcm_config;
+	rte_meter_trtcm_config;
+	rte_meter_srtcm_color_blind_check;
+	rte_meter_srtcm_color_aware_check;
+	rte_meter_trtcm_color_blind_check;
+	rte_meter_trtcm_color_aware_check;
+
+	local: *;
+};
+
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf8fde8..5465d00 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pipeline.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pipeline/rte_pipeline_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
new file mode 100644
index 0000000..f868b96
--- /dev/null
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -0,0 +1,23 @@
+DPDK_1.8 {
+	global:
+
+	rte_pipeline_create;
+	rte_pipeline_free;
+	rte_pipeline_check;
+	rte_pipeline_run;
+	rte_pipeline_flush;
+	rte_pipeline_table_create;
+	rte_pipeline_table_default_entry_add;
+	rte_pipeline_table_default_entry_delete;
+	rte_pipeline_table_entry_add;
+	rte_pipeline_table_entry_delete;
+	rte_pipeline_port_in_create;
+	rte_pipeline_port_in_connect_to_table;
+	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_disable;
+	rte_pipeline_port_out_create;
+	rte_pipeline_port_out_packet_insert;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 6955e5c..41bb2cd 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
new file mode 100644
index 0000000..c68beae
--- /dev/null
+++ b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
@@ -0,0 +1,7 @@
+DPDK_1.8 {
+	global:
+	rte_pmd_af_packet_devinit;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index cdff126..7376018 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_bond.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_bond/rte_eth_bond_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_bond/rte_eth_bond_version.map b/lib/librte_pmd_bond/rte_eth_bond_version.map
new file mode 100644
index 0000000..206b53e
--- /dev/null
+++ b/lib/librte_pmd_bond/rte_eth_bond_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+
+	rte_eth_bond_create;
+	rte_eth_bond_slave_add;
+	rte_eth_bond_slave_remove;
+	rte_eth_bond_mode_set;
+	rte_eth_bond_mode_get;
+	rte_eth_bond_primary_set;
+	rte_eth_bond_primary_get;
+	rte_eth_bond_slaves_get;
+	rte_eth_bond_active_slaves_get;
+	rte_eth_bond_mac_address_set;
+	rte_eth_bond_mac_address_reset;
+	rte_eth_bond_xmit_policy_set;
+	rte_eth_bond_xmit_policy_get;
+	rte_eth_bond_link_monitoring_set;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index 14bc4a2..e225bfe 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_e1000.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_e1000/rte_pmd_e1000_version.map b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index a2a623f..6359ac0 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_enic/rte_pmd_enic_version.map
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_enic/rte_pmd_enic_version.map b/lib/librte_pmd_enic/rte_pmd_enic_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_enic/rte_pmd_enic_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 98e4bdf..9c26ab6 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_i40e.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_i40e/rte_pmd_i40e_version.map b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index 3588047..c9e8665 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ixgbe.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index c5c214d..fff5572 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_pcap.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_pcap/rte_pmd_pcap_version.map b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index b57e421..25ad27f 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ring.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ring/rte_eth_ring_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 4f1b6ed..df7b583 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -473,7 +473,7 @@ out:
 	return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
 	struct rte_kvargs *kvlist;
diff --git a/lib/librte_pmd_ring/rte_eth_ring.h b/lib/librte_pmd_ring/rte_eth_ring.h
index e6ae19e..d36489a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.h
+++ b/lib/librte_pmd_ring/rte_eth_ring.h
@@ -50,12 +50,6 @@ int rte_eth_from_rings(const char *name,
 int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
 int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
 
-/**
- * For use by test apps only. Called as part of EAL init to set up any dummy NICs
- * configured on command line.
- */
-int rte_pmd_ring_devinit(const char *name, const char *params);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_pmd_ring/rte_eth_ring_version.map b/lib/librte_pmd_ring/rte_eth_ring_version.map
new file mode 100644
index 0000000..5edaa3d
--- /dev/null
+++ b/lib/librte_pmd_ring/rte_eth_ring_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+
+	rte_eth_from_rings;
+	rte_eth_ring_pair_create;
+	rte_eth_ring_pair_attach;
+
+	local: *;
+};
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index 456095b..bf51bd9 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -39,6 +39,7 @@ LIB = librte_pmd_virtio_uio.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_pmd_virtio/rte_pmd_virtio_version.map b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index 6872c74..e5a1c6b 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -66,6 +66,8 @@ endif
 
 VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 01bfcaa..0a08b1b 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_xenvirt.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
new file mode 100644
index 0000000..66199b1
--- /dev/null
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
@@ -0,0 +1,8 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_gntalloc_create;
+
+	local: *;
+};
+
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 82b5192..f01a12c 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -39,6 +39,8 @@ LIB = librte_port.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_port/rte_port_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
new file mode 100644
index 0000000..57ccaa3
--- /dev/null
+++ b/lib/librte_port/rte_port_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_ops;
+	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_sched_reader_ops;
+	rte_port_sched_writer_ops;
+	rte_port_source_ops;
+	rte_port_sink_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index d672a5a..faf73a5 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -36,6 +36,8 @@ LIB = librte_power.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_power/rte_power_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
new file mode 100644
index 0000000..061bca7
--- /dev/null
+++ b/lib/librte_power/rte_power_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_power_init;
+	rte_power_exit;
+	rte_power_freqs;
+	rte_power_get_freq;
+	rte_power_set_freq;
+	rte_power_freq_up;
+	rte_power_freq_down;
+	rte_power_freq_max;
+	rte_power_freq_min;
+	rte_power_set_env;
+	rte_power_get_env;
+	rte_power_unset_env;
+	
+	local: *;
+};
+
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 2380a43..0adaa00 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ring.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_ring/rte_ring_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
new file mode 100644
index 0000000..6c28af9
--- /dev/null
+++ b/lib/librte_ring/rte_ring_version.map
@@ -0,0 +1,12 @@
+DPDK_1.8 {
+	global:
+	rte_ring_get_memsize;
+	rte_ring_init;
+	rte_ring_create;
+	rte_ring_set_water_mark;
+	rte_ring_dump;
+	rte_ring_list_dump;
+	rte_ring_lookup;
+
+	local: *;
+};
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 1a25b21..205fb7a 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 CFLAGS_rte_red.o := -D_GNU_SOURCE
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_sched/rte_sched_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
new file mode 100644
index 0000000..b5877ce
--- /dev/null
+++ b/lib/librte_sched/rte_sched_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_approx;
+	rte_red_rt_data_init;
+	rte_red_config_init;
+	rte_sched_port_config;
+	rte_sched_port_free;
+	rte_sched_subport_config;
+	rte_sched_pipe_config;
+	rte_sched_port_get_memory_footprint;
+	rte_sched_subport_read_stats;
+	rte_sched_queue_read_stats;
+	rte_sched_port_enqueue;
+	rte_sched_port_dequeue;
+	rte_red_log2_1_minus_Wq;
+	rte_red_pow2_frac_inv;
+	rte_red_rand_val;
+	rte_red_rand_seed;
+
+	local: *;
+};
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index dd684cc..5b54acc 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -39,6 +39,8 @@ LIB = librte_table.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_table/rte_table_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
new file mode 100644
index 0000000..86f16b8
--- /dev/null
+++ b/lib/librte_table/rte_table_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_table_stub_ops;
+	rte_table_lpm_ops;
+	rte_table_array_ops;
+	rte_table_hash_key8_lru_ops;
+	rte_table_hash_key8_lru_dosig_ops;
+	rte_table_hash_key8_ext_ops;
+	rte_table_hash_key8_ext_dosig_ops;
+	rte_table_lpm_ipv6_ops;
+	rte_table_hash_key16_lru_ops;
+	rte_table_hash_key32_lru_ops;
+	rte_table_hash_key16_ext_ops;
+	rte_table_hash_key32_ext_ops;
+	rte_table_acl_ops;
+	rte_table_hash_lru_ops;
+	rte_table_hash_ext_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 07eb0c6..f703e5f 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -36,6 +36,8 @@ LIB = librte_timer.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_timer/rte_timer_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
new file mode 100644
index 0000000..00b6b52
--- /dev/null
+++ b/lib/librte_timer/rte_timer_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+	global:
+
+	rte_timer_subsystem_init;
+	rte_timer_init;
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_stop;
+	rte_timer_stop_sync;
+	rte_timer_pending;
+	rte_timer_manage;
+	rte_timer_dump_stats;
+
+	local: *;
+};
+
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index c008d64..7f8c5dc 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+EXPORT_MAP := $(RTE_SDK)/lib/librte_vhost/rte_vhost_version.map
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
new file mode 100644
index 0000000..7685bb8
--- /dev/null
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_vhost_feature_disable;
+	rte_vhost_feature_enable;
+	rte_vhost_feature_get;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_driver_register;
+	rte_vhost_driver_callback_register;
+	rte_vhost_driver_session_start;
+	rte_vhost_enqueue_burst;
+	rte_vhost_dequeue_burst;
+
+	local: *;
+};
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH 3/4] Add library version extenstion
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2014-12-20 21:01 ` Neil Horman
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 +++++++++---
 38 files changed, 83 insertions(+), 3 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 1f96645..4db403b 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_acl/rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index e655098..1c81579 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_cfgfile/rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 1a47173..b0ab5b6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_cmdline/rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 3415c7b..a23d349 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 97d8bbb..12d9df1 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_distributor/rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index b28a8b7..664698a 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/bsdapp/eal/rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 4f1b11f..1eacf4a 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 6250f4d..8e6d253 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_ether/rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index a449ec2..17778ba 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_hash/rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index fba05d0..43313e4 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_ip_frag/rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index be6f21a..7c8dc17 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAPS := $(RTE_SDK)/lib/librte_ivshmem/rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index c119fc1..59abd85 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_kni/rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index 83a42b1..10713db 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_kvargs/rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 05de8d9..c99bfbd 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_lpm/rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 1a5c288..3bb7a99 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_malloc/rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 5cd4941..3cf94d1 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_mbuf/rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 07b5b4e..2c2a6e8 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_mempool/rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index 0778690..f58822e 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_meter/rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 5465d00..df44f51 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pipeline/rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 41bb2cd..bd7d091 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+LIBABIVER := 1
+
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 
 CFLAGS += -O3
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 7376018..974cb65 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_bond/rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index e225bfe..a5e3b66 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 6359ac0..3238d85 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+LIBABIVER := 1
+
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_enic/rte_pmd_enic_version.map
 
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 9c26ab6..e4f17ec 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index c9e8665..a38685b 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index fff5572..8f05c2c 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index 25ad27f..24c57fc 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ring/rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index bf51bd9..d0bec84 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index e5a1c6b..2b418f4 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 0a08b1b..6132c1c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index f01a12c..98f9eec 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_port/rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index faf73a5..f96330a 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_power/rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 0adaa00..fa697ea 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_ring/rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 205fb7a..1a54bf9 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_sched/rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 5b54acc..29b768c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_table/rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index f703e5f..01772c7 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_timer/rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 7f8c5dc..2747070 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+LIBABIVER := 1
+
 EXPORT_MAP := $(RTE_SDK)/lib/librte_vhost/rte_vhost_version.map
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 2299cbe..e0a1863 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,8 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
-
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
 
 endif
@@ -63,6 +61,7 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+
 ifeq ($(LINK_USING_CC),1)
 # Override the definition of LD here, since we're linking with CC
 LD := $(CC) $(CPU_CFLAGS)
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@exit 1
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,10 +167,12 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 ifneq ($(LIB),)
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
 endif
 
 #
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (2 preceding siblings ...)
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
@ 2014-12-20 21:01 ` Neil Horman
  2014-12-22 20:24 ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-22 14:01   ` Gonzalez Monroy, Sergio
  2014-12-22 16:22     ` Neil Horman
  2014-12-22 16:34     ` Neil Horman
  0 siblings, 2 replies; 104+ messages in thread
From: Gonzalez Monroy, Sergio @ 2014-12-22 14:01 UTC (permalink / raw)
  To: Neil Horman, dev

Hi Neil,

Just a couple of minor comments.

> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Saturday, December 20, 2014 9:02 PM
> Subject: [PATCH 1/4] compat: Add infrastructure to support symbol
> versioning
> 
> Add initial pass header files to support symbol versioning.
> 
 [...]
>
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index 81bf8e1..2299cbe 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
> 
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so,$(LIB))
> +
> +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)

What about setting --version-script=$(SRCDIR)/$(EXPORT_MAP) so we can do:
Ie. 'EXPORT_MAP = rte_eal_version.map' instead of 'EXPORT_MAP = $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map' 

> +
>  endif
> 
> +
>  _BUILD = $(LIB)
>  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> $(RTE_OUTPUT)/lib/$(LIB)  _CLEAN = doclean @@ -161,7 +165,9 @@ endif
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> +ifneq ($(LIB),)
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +endif
> 
We could move the ifneq($(LIB),) to the _INSTALL variable (top of the same file).
Something like this:

-_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
+_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
+ifneq ($(LIB),)
+_INSTALL += $(RTE_OUTPUT)/lib/$(LIB)
+endif

Thanks,
Sergio

>  #
>  # Clean all generated files
> --
> 1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-22 14:01   ` Gonzalez Monroy, Sergio
@ 2014-12-22 16:22     ` Neil Horman
  2014-12-22 16:34     ` Neil Horman
  1 sibling, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-22 16:22 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Mon, Dec 22, 2014 at 02:01:10PM +0000, Gonzalez Monroy, Sergio wrote:
> Hi Neil,
> 
> Just a couple of minor comments.
> 
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Saturday, December 20, 2014 9:02 PM
> > Subject: [PATCH 1/4] compat: Add infrastructure to support symbol
> > versioning
> > 
> > Add initial pass header files to support symbol versioning.
> > 
>  [...]
> >
> > diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index 81bf8e1..2299cbe 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
> > 
> >  ifeq ($(RTE_BUILD_SHARED_LIB),y)
> >  LIB := $(patsubst %.a,%.so,$(LIB))
> > +
> > +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> 
> What about setting --version-script=$(SRCDIR)/$(EXPORT_MAP) so we can do:
> Ie. 'EXPORT_MAP = rte_eal_version.map' instead of 'EXPORT_MAP = $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map' 
> 
> > +
> >  endif
> > 
> > +
> >  _BUILD = $(LIB)
> >  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> > $(RTE_OUTPUT)/lib/$(LIB)  _CLEAN = doclean @@ -161,7 +165,9 @@ endif
> >  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> >  	@echo "  INSTALL-LIB $(LIB)"
> >  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> > +ifneq ($(LIB),)
> >  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> > +endif
> > 
> We could move the ifneq($(LIB),) to the _INSTALL variable (top of the same file).
> Something like this:
> 
> -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
> +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> +ifneq ($(LIB),)
> +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB)
> +endif
> 

Yeah, this all seems reasonable, I'll repost shortly

Thanks
Neil

> Thanks,
> Sergio
> 
> >  #
> >  # Clean all generated files
> > --
> > 1.9.3
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-22 14:01   ` Gonzalez Monroy, Sergio
  2014-12-22 16:22     ` Neil Horman
@ 2014-12-22 16:34     ` Neil Horman
  2014-12-22 17:09       ` Gonzalez Monroy, Sergio
  1 sibling, 1 reply; 104+ messages in thread
From: Neil Horman @ 2014-12-22 16:34 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Mon, Dec 22, 2014 at 02:01:10PM +0000, Gonzalez Monroy, Sergio wrote:
> Hi Neil,
> 
> Just a couple of minor comments.
> 
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Saturday, December 20, 2014 9:02 PM
> > Subject: [PATCH 1/4] compat: Add infrastructure to support symbol
> > versioning
> > 
> > Add initial pass header files to support symbol versioning.
> > 
>  [...]
> >
> > diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index 81bf8e1..2299cbe 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
> > 
> >  ifeq ($(RTE_BUILD_SHARED_LIB),y)
> >  LIB := $(patsubst %.a,%.so,$(LIB))
> > +
> > +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> 
> What about setting --version-script=$(SRCDIR)/$(EXPORT_MAP) so we can do:
> Ie. 'EXPORT_MAP = rte_eal_version.map' instead of 'EXPORT_MAP = $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map' 
> 
> > +
> >  endif
> > 
> > +
> >  _BUILD = $(LIB)
> >  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> > $(RTE_OUTPUT)/lib/$(LIB)  _CLEAN = doclean @@ -161,7 +165,9 @@ endif
> >  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> >  	@echo "  INSTALL-LIB $(LIB)"
> >  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> > +ifneq ($(LIB),)
> >  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> > +endif
> > 
> We could move the ifneq($(LIB),) to the _INSTALL variable (top of the same file).
> Something like this:
> 
> -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
> +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> +ifneq ($(LIB),)
> +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB)
> +endif
> 
Actually, as I look at it, this second one doesn't seem to make any sense to me.
_INSTALL as a variable doesn't seem to get used anywhere that I can see,
certainly not in the capacity of copying shared libraries into the build/lib
area so that the example apps can get linked with them.  So I'm not sure this
makes sense.

Neil

> Thanks,
> Sergio
> 
> >  #
> >  # Clean all generated files
> > --
> > 1.9.3
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-22 16:34     ` Neil Horman
@ 2014-12-22 17:09       ` Gonzalez Monroy, Sergio
  2014-12-22 19:00         ` Neil Horman
  0 siblings, 1 reply; 104+ messages in thread
From: Gonzalez Monroy, Sergio @ 2014-12-22 17:09 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Monday, December 22, 2014 4:35 PM
> 
> On Mon, Dec 22, 2014 at 02:01:10PM +0000, Gonzalez Monroy, Sergio wrote:
> >
> > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > Sent: Saturday, December 20, 2014 9:02 PM
> > We could move the ifneq($(LIB),) to the _INSTALL variable (top of the same
> file).
> > Something like this:
> >
> > -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> > $(RTE_OUTPUT)/lib/$(LIB)
> > +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) ifneq ($(LIB),)
> > +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB) endif
> >
> Actually, as I look at it, this second one doesn't seem to make any sense to
> me.
> _INSTALL as a variable doesn't seem to get used anywhere that I can see,
> certainly not in the capacity of copying shared libraries into the build/lib area
> so that the example apps can get linked with them.  So I'm not sure this
> makes sense.
> 
The _INSTALL var gets expanded for the rule '_install' in mk/internal/rte.install-post.mk if I am not mistaken.
That would trigger the rule $(RTE_OUTPUT)/lib/$(LIB) which in turn builds and copy the shared/static library to build/lib.

If we do not add $(RTE_OUTPUT)/lib/$(LIB) to _INSTALL, then the rule will not trigger.

Regards,
Sergio

> Neil
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-22 17:09       ` Gonzalez Monroy, Sergio
@ 2014-12-22 19:00         ` Neil Horman
  2014-12-22 20:04           ` Neil Horman
  0 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2014-12-22 19:00 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Mon, Dec 22, 2014 at 05:09:55PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Monday, December 22, 2014 4:35 PM
> > 
> > On Mon, Dec 22, 2014 at 02:01:10PM +0000, Gonzalez Monroy, Sergio wrote:
> > >
> > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > Sent: Saturday, December 20, 2014 9:02 PM
> > > We could move the ifneq($(LIB),) to the _INSTALL variable (top of the same
> > file).
> > > Something like this:
> > >
> > > -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> > > $(RTE_OUTPUT)/lib/$(LIB)
> > > +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) ifneq ($(LIB),)
> > > +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB) endif
> > >
> > Actually, as I look at it, this second one doesn't seem to make any sense to
> > me.
> > _INSTALL as a variable doesn't seem to get used anywhere that I can see,
> > certainly not in the capacity of copying shared libraries into the build/lib area
> > so that the example apps can get linked with them.  So I'm not sure this
> > makes sense.
> > 
> The _INSTALL var gets expanded for the rule '_install' in mk/internal/rte.install-post.mk if I am not mistaken.
> That would trigger the rule $(RTE_OUTPUT)/lib/$(LIB) which in turn builds and copy the shared/static library to build/lib.
> 
> If we do not add $(RTE_OUTPUT)/lib/$(LIB) to _INSTALL, then the rule will not trigger.
> 
I get all of that, but something isn't right with either your reasoning, or my
coding, as If I make the change you suggest, nothing ever gets copied into the
build/lib directory, either for a static or DSO build.

Neil

> Regards,
> Sergio
> 
> > Neil
> > 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-22 19:00         ` Neil Horman
@ 2014-12-22 20:04           ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-22 20:04 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Mon, Dec 22, 2014 at 02:00:17PM -0500, Neil Horman wrote:
> On Mon, Dec 22, 2014 at 05:09:55PM +0000, Gonzalez Monroy, Sergio wrote:
> > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > Sent: Monday, December 22, 2014 4:35 PM
> > > 
> > > On Mon, Dec 22, 2014 at 02:01:10PM +0000, Gonzalez Monroy, Sergio wrote:
> > > >
> > > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > > Sent: Saturday, December 20, 2014 9:02 PM
> > > > We could move the ifneq($(LIB),) to the _INSTALL variable (top of the same
> > > file).
> > > > Something like this:
> > > >
> > > > -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> > > > $(RTE_OUTPUT)/lib/$(LIB)
> > > > +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) ifneq ($(LIB),)
> > > > +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB) endif
> > > >
> > > Actually, as I look at it, this second one doesn't seem to make any sense to
> > > me.
> > > _INSTALL as a variable doesn't seem to get used anywhere that I can see,
> > > certainly not in the capacity of copying shared libraries into the build/lib area
> > > so that the example apps can get linked with them.  So I'm not sure this
> > > makes sense.
> > > 
> > The _INSTALL var gets expanded for the rule '_install' in mk/internal/rte.install-post.mk if I am not mistaken.
> > That would trigger the rule $(RTE_OUTPUT)/lib/$(LIB) which in turn builds and copy the shared/static library to build/lib.
> > 
> > If we do not add $(RTE_OUTPUT)/lib/$(LIB) to _INSTALL, then the rule will not trigger.
> > 
> I get all of that, but something isn't right with either your reasoning, or my
> coding, as If I make the change you suggest, nothing ever gets copied into the
> build/lib directory, either for a static or DSO build.
> 
> Neil
> 
Ah, nm, I figured it out, I had accidentally deleted the copy operation which
needs to remain there.  I'll fix this up and repost.
Neil

> > Regards,
> > Sergio
> > 
> > > Neil
> > > 
> > 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (3 preceding siblings ...)
  2014-12-20 21:01 ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-22 20:24 ` Neil Horman
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (3 more replies)
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
                   ` (9 subsequent siblings)
  14 siblings, 4 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

Change Notes:
V2)
	Moved ifeq to _INSTALL target
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  9 +++-
 4 files changed, 143 insertions(+), 1 deletion(-)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..3415c7b
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..cbd439b 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,10 +40,17 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
-_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
+_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
+ifneq ($(LIB),)
+_INSTALL += $(RTE_OUTPUT)/lib/$(LIB)
+endif
 _CLEAN = doclean
 
 .PHONY: all
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v2 2/4] Provide initial versioning for all DPDK libraries
  2014-12-22 20:24 ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-22 20:24   ` Neil Horman
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 3/4] Add library version extenstion Neil Horman
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

Add linker version script files to each DPDK library to put a stake in the
ground from which we can start cleaning up API's

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:

v2)
	* Updated export map to not require full path
---
 lib/librte_acl/Makefile                            |   2 +
 lib/librte_acl/rte_acl_version.map                 |  21 ++++
 lib/librte_cfgfile/Makefile                        |   2 +
 lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
 lib/librte_cmdline/Makefile                        |   2 +
 lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
 lib/librte_distributor/Makefile                    |   2 +
 lib/librte_distributor/rte_distributor_version.map |  16 +++
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
 lib/librte_ether/Makefile                          |   2 +
 lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
 lib/librte_hash/Makefile                           |   2 +
 lib/librte_hash/rte_hash_version.map               |  18 ++++
 lib/librte_ip_frag/Makefile                        |   2 +
 lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
 lib/librte_ivshmem/Makefile                        |   2 +
 lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
 lib/librte_kni/Makefile                            |   2 +
 lib/librte_kni/rte_kni_version.map                 |  20 ++++
 lib/librte_kvargs/Makefile                         |   2 +
 lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
 lib/librte_lpm/Makefile                            |   2 +
 lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
 lib/librte_malloc/Makefile                         |   2 +
 lib/librte_malloc/rte_malloc_version.map           |  19 ++++
 lib/librte_mbuf/Makefile                           |   2 +
 lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
 lib/librte_mempool/Makefile                        |   2 +
 lib/librte_mempool/rte_mempool_version.map         |  18 ++++
 lib/librte_meter/Makefile                          |   2 +
 lib/librte_meter/rte_meter_version.map             |  13 +++
 lib/librte_pipeline/Makefile                       |   2 +
 lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
 lib/librte_pmd_af_packet/Makefile                  |   2 +
 .../rte_pmd_af_packet_version.map                  |   7 ++
 lib/librte_pmd_bond/Makefile                       |   2 +
 lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
 lib/librte_pmd_e1000/Makefile                      |   2 +
 lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
 lib/librte_pmd_enic/Makefile                       |   2 +
 lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
 lib/librte_pmd_i40e/Makefile                       |   2 +
 lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
 lib/librte_pmd_ixgbe/Makefile                      |   2 +
 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
 lib/librte_pmd_pcap/Makefile                       |   2 +
 lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
 lib/librte_pmd_ring/Makefile                       |   2 +
 lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
 lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
 lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
 lib/librte_pmd_virtio/Makefile                     |   1 +
 lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
 lib/librte_pmd_vmxnet3/Makefile                    |   2 +
 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
 lib/librte_pmd_xenvirt/Makefile                    |   2 +
 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
 lib/librte_port/Makefile                           |   2 +
 lib/librte_port/rte_port_version.map               |  18 ++++
 lib/librte_power/Makefile                          |   2 +
 lib/librte_power/rte_power_version.map             |  18 ++++
 lib/librte_ring/Makefile                           |   2 +
 lib/librte_ring/rte_ring_version.map               |  12 +++
 lib/librte_sched/Makefile                          |   2 +
 lib/librte_sched/rte_sched_version.map             |  22 ++++
 lib/librte_table/Makefile                          |   2 +
 lib/librte_table/rte_table_version.map             |  22 ++++
 lib/librte_timer/Makefile                          |   2 +
 lib/librte_timer/rte_timer_version.map             |  16 +++
 lib/librte_vhost/Makefile                          |   2 +
 lib/librte_vhost/rte_vhost_version.map             |  14 +++
 mk/rte.lib.mk                                      |   2 +-
 75 files changed, 875 insertions(+), 8 deletions(-)
 create mode 100644 lib/librte_acl/rte_acl_version.map
 create mode 100644 lib/librte_cfgfile/rte_cfgfile_version.map
 create mode 100644 lib/librte_cmdline/rte_cmdline_version.map
 create mode 100644 lib/librte_distributor/rte_distributor_version.map
 create mode 100644 lib/librte_eal/bsdapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_eal/linuxapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_ether/rte_ether_version.map
 create mode 100644 lib/librte_hash/rte_hash_version.map
 create mode 100644 lib/librte_ip_frag/rte_ipfrag_version.map
 create mode 100644 lib/librte_ivshmem/rte_ivshmem_version.map
 create mode 100644 lib/librte_kni/rte_kni_version.map
 create mode 100644 lib/librte_kvargs/rte_kvargs_version.map
 create mode 100644 lib/librte_lpm/rte_lpm_version.map
 create mode 100644 lib/librte_malloc/rte_malloc_version.map
 create mode 100644 lib/librte_mbuf/rte_mbuf_version.map
 create mode 100644 lib/librte_mempool/rte_mempool_version.map
 create mode 100644 lib/librte_meter/rte_meter_version.map
 create mode 100644 lib/librte_pipeline/rte_pipeline_version.map
 create mode 100644 lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 create mode 100644 lib/librte_pmd_bond/rte_eth_bond_version.map
 create mode 100644 lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 create mode 100644 lib/librte_pmd_enic/rte_pmd_enic_version.map
 create mode 100644 lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 create mode 100644 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 create mode 100644 lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 create mode 100644 lib/librte_pmd_ring/rte_eth_ring_version.map
 create mode 100644 lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 create mode 100644 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 create mode 100644 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 create mode 100644 lib/librte_port/rte_port_version.map
 create mode 100644 lib/librte_power/rte_power_version.map
 create mode 100644 lib/librte_ring/rte_ring_version.map
 create mode 100644 lib/librte_sched/rte_sched_version.map
 create mode 100644 lib/librte_table/rte_table_version.map
 create mode 100644 lib/librte_timer/rte_timer_version.map
 create mode 100644 lib/librte_vhost/rte_vhost_version.map

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 65e566d..45cbf80 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -37,6 +37,8 @@ LIB = librte_acl.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_acl_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
new file mode 100644
index 0000000..9f05a86
--- /dev/null
+++ b/lib/librte_acl/rte_acl_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+	rte_acl_create;
+	rte_acl_find_existing;
+	rte_acl_free;
+	rte_acl_add_rules;
+	rte_acl_reset_rules;
+	rte_acl_build;
+	rte_acl_reset;
+	rte_acl_classify;
+	rte_acl_dump;
+	rte_acl_list_dump;
+	rte_acl_ipv4vlan_add_rules;
+	rte_acl_ipv4vlan_build;
+	rte_acl_classify_scalar;
+	rte_acl_classify_alg;
+	rte_acl_set_ctx_classify;
+
+	local: *;
+};
+
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 55e8701..a4f73de 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -39,6 +39,8 @@ LIB = librte_cfgfile.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_cfgfile_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
new file mode 100644
index 0000000..10ecea6
--- /dev/null
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_cfgfile_load;
+	rte_cfgfile_num_sections;
+	rte_cfgfile_sections;
+	rte_cfgfile_has_section;
+	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_entries;
+	rte_cfgfile_get_entry;
+	rte_cfgfile_has_entry;
+	rte_cfgfile_close;
+
+	local: *;
+};
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 7eae449..3c71831 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -36,6 +36,8 @@ LIB = librte_cmdline.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_cmdline_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
new file mode 100644
index 0000000..7616eff
--- /dev/null
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -0,0 +1,69 @@
+DPDK_1.8 {
+	global:
+	cmdline_new;
+	cmdline_set_prompt;
+	cmdline_free;
+	cmdline_printf;
+	cmdline_in;
+	cmdline_write_char;
+	cmdline_interact;
+	cmdline_quit;
+	cmdline_parse;
+	cmdline_complete;
+	cmdline_isendoftoken;
+	cmdline_parse_num;
+	cmdline_get_help_num;
+	cmdline_parse_ipaddr;
+	cmdline_get_help_ipaddr;
+	cmdline_parse_etheraddr;
+	cmdline_get_help_etheraddr;
+	cmdline_parse_string;
+	cmdline_complete_get_nb_string;
+	cmdline_complete_get_elt_string;
+	cmdline_get_help_string;
+	cmdline_parse_portlist;
+	cmdline_get_help_portlist;
+	cmdline_token_string_ops;
+	cmdline_token_num_ops;
+	cmdline_token_string_ops;
+	cmdline_token_ipaddr_ops;
+	cmdline_token_etheraddr_ops;
+	vt100_init;
+	vt100_parser;
+	cmdline_file_new;
+	cmdline_stdin_new;
+	cmdline_stdin_exit;
+	cirbuf_init;
+	cirbuf_add_head_safe;
+	cirbuf_add_head;
+	cirbuf_add_tail_safe;
+	cirbuf_add_tail;
+	cirbuf_del_head_safe;
+	cirbuf_del_head;
+	cirbuf_del_tail_safe;
+	cirbuf_del_tail;
+	cirbuf_get_head;
+	cirbuf_get_tail;
+	cirbuf_add_buf_head;
+	cirbuf_add_buf_tail;
+	cirbuf_del_buf_head;
+	cirbuf_del_buf_tail;
+	cirbuf_get_buf_head;
+	cirbuf_get_buf_tail;
+	cirbuf_align_left;
+	cirbuf_align_right;
+	rdline_init;
+	rdline_newline;
+	rdline_stop;
+	rdline_quit;
+	rdline_restart;
+	rdline_redisplay;
+	rdline_reset;
+	rdline_char_in;
+	rdline_get_buffer;
+	rdline_add_history;
+	rdline_clear_history;
+	rdline_get_history_item;
+
+	local: *;
+};
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 36699f8..3674a2c 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -37,6 +37,8 @@ LIB = librte_distributor.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_distributor_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
new file mode 100644
index 0000000..b81ddc8
--- /dev/null
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+
+	global:
+	rte_distributor_create;
+	rte_distributor_process;
+	rte_distributor_returned_pkts;
+	rte_distributor_flush;
+	rte_distributor_clear_returns;
+	rte_distributor_get_pkt;
+	rte_distributor_return_pkt;
+	rte_distributor_request_pkt;
+	rte_distributor_poll_pkt;
+
+	local: *;
+};
+
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index d434882..0b5f9d9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -46,6 +46,8 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_pcap
 CFLAGS += $(WERROR_FLAGS) -O3
 
+EXPORT_MAP := rte_eal_version.map
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..bae8af1 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -33,6 +33,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_eal.a
 
+EXPORT_MAP := rte_eal_version.map
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index a461c31..80ad78d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -39,6 +39,8 @@ LIB = libethdev.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_ether_version.map
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
new file mode 100644
index 0000000..dbd0eca
--- /dev/null
+++ b/lib/librte_ether/rte_ether_version.map
@@ -0,0 +1,113 @@
+DPDK_1.8 {
+	global:
+	rte_eth_driver_register;
+	rte_eth_dev_configure;
+	rte_eth_rx_queue_setup;
+	rte_eth_tx_queue_setup;
+	rte_eth_dev_socket_id;
+	rte_eth_dev_rx_queue_start;
+	rte_eth_dev_rx_queue_stop;
+	rte_eth_dev_tx_queue_start;
+	rte_eth_dev_tx_queue_stop;
+	rte_eth_dev_start;
+	rte_eth_dev_stop;
+	rte_eth_dev_set_link_up;
+	rte_eth_dev_set_link_down;
+	rte_eth_dev_close;
+	rte_eth_promiscuous_enable;
+	rte_eth_promiscuous_disable;
+	rte_eth_promiscuous_get;
+	rte_eth_allmulticast_enable;
+	rte_eth_allmulticast_disable;
+	rte_eth_allmulticast_get;
+	rte_eth_link;
+	rte_eth_link_get_nowait;
+	rte_eth_stats;
+	rte_eth_stats_reset;
+	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_rx_queue_stats_mapping;
+	rte_eth_macaddr_get;
+	rte_eth_dev_info_get;
+	rte_eth_dev_get_mtu;
+	rte_eth_dev_set_mtu;
+	rte_eth_dev_vlan_filter;
+	rte_eth_dev_set_vlan_strip_on_queue;
+	rte_eth_dev_set_vlan_ether_type;
+	rte_eth_dev_set_vlan_offload;
+	rte_eth_dev_get_vlan_offload;
+	rte_eth_dev_set_vlan_pvid;
+	rte_eth_rx_burst;
+	rte_eth_rx_queue_count;
+	rte_eth_rx_descriptor_done;
+	rte_eth_tx_burst;
+	rte_eth_dev_fdir_add_signature_filter;
+	rte_eth_dev_fdir_update_signature_filter;
+	rte_eth_dev_fdir_remove_signature_filter;
+	rte_eth_dev_fdir_get_infos;
+	rte_eth_dev_fdir_add_perfect_filter;
+	rte_eth_dev_fdir_update_perfect_filter;
+	rte_eth_dev_fdir_remove_perfect_filter;
+	rte_eth_dev_fdir_set_masks;
+	rte_eth_dev_callback_register;
+	rte_eth_dev_callback_unregister;
+	rte_eth_dev_callback_process;
+	rte_eth_led_on;
+	rte_eth_led_off;
+	rte_eth_dev_flow_ctrl_get;
+	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_mac_addr_add;
+	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rss_reta_query;
+	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_uc_all_hash_table_set;
+	rte_eth_dev_set_vf_rxmode;
+	rte_eth_dev_set_vf_tx;
+	rte_eth_dev_set_vf_rx;
+	rte_eth_dev_set_vf_vlan_filter;
+	rte_eth_mirror_rule_set;
+	rte_eth_mirror_rule_reset;
+	rte_eth_set_queue_rate_limit;
+	rte_eth_set_vf_rate_limit;
+	rte_eth_dev_bypass_init;
+	rte_eth_dev_bypass_state_show;
+	rte_eth_dev_bypass_state_set;
+	rte_eth_dev_bypass_event_show;
+	rte_eth_dev_bypass_event_store;
+	rte_eth_dev_wd_timeout_store;
+	rte_eth_dev_bypass_ver_show;
+	rte_eth_dev_bypass_wd_timeout_show;
+	rte_eth_dev_bypass_wd_reset;
+	rte_eth_dev_rss_hash_update;
+	rte_eth_dev_rss_hash_conf_get;
+	rte_eth_dev_add_syn_filter;
+	rte_eth_dev_remove_syn_filter;
+	rte_eth_dev_get_syn_filter;
+	rte_eth_dev_add_ethertype_filter;
+	rte_eth_dev_remove_ethertype_filter;
+	rte_eth_dev_get_ethertype_filter;
+	rte_eth_dev_add_2tuple_filter;
+	rte_eth_dev_remove_2tuple_filter;
+	rte_eth_dev_get_2tuple_filter;
+	rte_eth_dev_add_5tuple_filter;
+	rte_eth_dev_remove_5tuple_filter;
+	rte_eth_dev_get_5tuple_filter;
+	rte_eth_dev_add_flex_filter;
+	rte_eth_dev_remove_flex_filter;
+	rte_eth_dev_get_flex_filter;
+	rte_eth_dev_count;
+	rte_eth_link_get;
+	rte_eth_devices;
+	rte_eth_stats_get;
+	rte_eth_dev_allocate;
+	_rte_eth_dev_callback_process;
+	rte_eth_dev_filter_ctrl;
+	rte_eth_dev_udp_tunnel_delete;
+	rte_eth_dev_udp_tunnel_add;
+	rte_eth_xstats_get;
+	rte_eth_xstats_reset;
+	rte_eth_dev_filter_supported;
+	local: *;
+};
+
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 95e4c09..bec61ab 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -37,6 +37,8 @@ LIB = librte_hash.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_hash_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
new file mode 100644
index 0000000..2a34313
--- /dev/null
+++ b/lib/librte_hash/rte_hash_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_fbk_hash_find_existing;
+	rte_fbk_hash_create;
+	rte_fbk_hash_free;
+	rte_hash_create;
+	rte_hash_find_existing;
+	rte_hash_free;
+	rte_hash_add_key;
+	rte_hash_add_key_with_hash;
+	rte_hash_del_key;
+	rte_hash_del_key_with_hash;
+	rte_hash_lookup;
+	rte_hash_lookup_with_hash;
+	rte_hash_lookup_bulk;
+
+	local: *;
+};
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 8c00d39..aa88578 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -37,6 +37,8 @@ LIB = librte_ip_frag.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_ipfrag_version.map
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipfrag_version.map b/lib/librte_ip_frag/rte_ipfrag_version.map
new file mode 100644
index 0000000..afe1a0b
--- /dev/null
+++ b/lib/librte_ip_frag/rte_ipfrag_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_ip_frag_table_create;
+	rte_ipv6_fragment_packet;
+	rte_ipv6_frag_reassemble_packet;
+	rte_ipv4_fragment_packet;
+	rte_ipv4_frag_reassemble_packet;
+	rte_ip_frag_free_death_row;
+	rte_ip_frag_table_statistics_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 536814c..068ee10 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ivshmem.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ivshmem_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_ivshmem/rte_ivshmem_version.map b/lib/librte_ivshmem/rte_ivshmem_version.map
new file mode 100644
index 0000000..a204339
--- /dev/null
+++ b/lib/librte_ivshmem/rte_ivshmem_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_ivshmem_metadata_create;
+	rte_ivshmem_metadata_add_memzone;
+	rte_ivshmem_metadata_add_ring;
+	rte_ivshmem_metadata_add_mempool;
+	rte_ivshmem_metadata_cmdline_generate;
+	rte_ivshmem_metadata_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 5267304..93a516d 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -36,6 +36,8 @@ LIB = librte_kni.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_kni_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
new file mode 100644
index 0000000..7db39a3
--- /dev/null
+++ b/lib/librte_kni/rte_kni_version.map
@@ -0,0 +1,20 @@
+DPDK_1.8 {
+	global:
+
+	rte_kni_alloc;
+	rte_kni_create;
+	rte_kni_release;
+	rte_kni_handle_request;
+	rte_kni_rx_burst;
+	rte_kni_tx_burst;
+	rte_kni_get_port_id;
+	rte_kni_get;
+	rte_kni_info_get;
+	rte_kni_register_handlers;
+	rte_kni_unregister_handlers;
+	rte_kni_close;
+	rte_kni_init;
+
+	local: *;
+};
+
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b09359a..b1c34f3 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -38,6 +38,8 @@ LIB = librte_kvargs.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_kvargs_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
new file mode 100644
index 0000000..7873c8c
--- /dev/null
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+	rte_kvargs_parse;
+	rte_kvargs_free;
+	rte_kvargs_process;
+	rte_kvargs_count;
+
+	local: *;
+};
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index fa94163..8214630 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -37,6 +37,8 @@ LIB = librte_lpm.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_lpm_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
new file mode 100644
index 0000000..8ae9318
--- /dev/null
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -0,0 +1,24 @@
+DPDK_1.8 {
+	global:
+
+	rte_lpm_create;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_add;
+	rte_lpm_is_rule_present;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm6_create;
+	rte_lpm6_find_existing;
+	rte_lpm6_free;
+	rte_lpm6_add;
+	rte_lpm6_is_rule_present;
+	rte_lpm6_delete;
+	rte_lpm6_delete_bulk_func;
+	rte_lpm6_delete_all;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
+
+	local: *;
+};
+
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index ba87e34..15b7eed 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -36,6 +36,8 @@ LIB = librte_malloc.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_malloc_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MALLOC) := rte_malloc.c malloc_elem.c malloc_heap.c
 
diff --git a/lib/librte_malloc/rte_malloc_version.map b/lib/librte_malloc/rte_malloc_version.map
new file mode 100644
index 0000000..77db879
--- /dev/null
+++ b/lib/librte_malloc/rte_malloc_version.map
@@ -0,0 +1,19 @@
+DPDK_1.8 {
+	global:
+
+	rte_malloc;
+	rte_zmalloc;
+	rte_calloc;
+	rte_realloc;
+	rte_malloc_socket;
+	rte_zmalloc_socket;
+	rte_calloc_socket;
+	rte_free;
+	rte_malloc_validate;
+	rte_malloc_get_socket_stats;
+	rte_malloc_dump_stats;
+	rte_malloc_set_limit;
+	rte_malloc_virt2phy;
+
+	local: *;
+};
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 9b45ba4..03becae 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mbuf.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mbuf_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
new file mode 100644
index 0000000..7260507
--- /dev/null
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_mbuf_sanity_check;
+	rte_ctrlmbuf_init;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_init;
+	rte_pktmbuf_dump;
+	rte_get_rx_ol_flag_name;
+	rte_get_tx_ol_flag_name;
+
+	local: *;
+};
+
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 9939e10..31d1a71 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mempool.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mempool_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
new file mode 100644
index 0000000..7a19982
--- /dev/null
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_create;
+	rte_mempool_xmem_create;
+	rte_dom0_mempool_create;
+	rte_mempool_dump;
+	rte_mempool_audit;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
+	rte_mempool_calc_obj_size;
+	rte_mempool_xmem_size;
+	rte_mempool_xmem_usage;
+	rte_mempool_walk;
+	rte_mempool_count;
+
+	local: *;
+};
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index b25c0cc..c4a7a32 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -39,6 +39,8 @@ LIB = librte_meter.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_meter_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
new file mode 100644
index 0000000..51a73b1
--- /dev/null
+++ b/lib/librte_meter/rte_meter_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_meter_srtcm_config;
+	rte_meter_trtcm_config;
+	rte_meter_srtcm_color_blind_check;
+	rte_meter_srtcm_color_aware_check;
+	rte_meter_trtcm_color_blind_check;
+	rte_meter_trtcm_color_aware_check;
+
+	local: *;
+};
+
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf8fde8..15b58df 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pipeline.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pipeline_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
new file mode 100644
index 0000000..f868b96
--- /dev/null
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -0,0 +1,23 @@
+DPDK_1.8 {
+	global:
+
+	rte_pipeline_create;
+	rte_pipeline_free;
+	rte_pipeline_check;
+	rte_pipeline_run;
+	rte_pipeline_flush;
+	rte_pipeline_table_create;
+	rte_pipeline_table_default_entry_add;
+	rte_pipeline_table_default_entry_delete;
+	rte_pipeline_table_entry_add;
+	rte_pipeline_table_entry_delete;
+	rte_pipeline_port_in_create;
+	rte_pipeline_port_in_connect_to_table;
+	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_disable;
+	rte_pipeline_port_out_create;
+	rte_pipeline_port_out_packet_insert;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 6955e5c..85a7860 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+EXPORT_MAP := rte_pmd_af_packet_version.map
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
new file mode 100644
index 0000000..c68beae
--- /dev/null
+++ b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
@@ -0,0 +1,7 @@
+DPDK_1.8 {
+	global:
+	rte_pmd_af_packet_devinit;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index cdff126..074110a 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_bond.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_bond_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_bond/rte_eth_bond_version.map b/lib/librte_pmd_bond/rte_eth_bond_version.map
new file mode 100644
index 0000000..206b53e
--- /dev/null
+++ b/lib/librte_pmd_bond/rte_eth_bond_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+
+	rte_eth_bond_create;
+	rte_eth_bond_slave_add;
+	rte_eth_bond_slave_remove;
+	rte_eth_bond_mode_set;
+	rte_eth_bond_mode_get;
+	rte_eth_bond_primary_set;
+	rte_eth_bond_primary_get;
+	rte_eth_bond_slaves_get;
+	rte_eth_bond_active_slaves_get;
+	rte_eth_bond_mac_address_set;
+	rte_eth_bond_mac_address_reset;
+	rte_eth_bond_xmit_policy_set;
+	rte_eth_bond_xmit_policy_get;
+	rte_eth_bond_link_monitoring_set;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index 14bc4a2..cd14444 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_e1000.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_e1000_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_e1000/rte_pmd_e1000_version.map b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index a2a623f..697231c 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+EXPORT_MAP := rte_pmd_enic_version.map
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_enic/rte_pmd_enic_version.map b/lib/librte_pmd_enic/rte_pmd_enic_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_enic/rte_pmd_enic_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 98e4bdf..73de373 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_i40e.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_i40e_version.map
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_i40e/rte_pmd_i40e_version.map b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index 3588047..e0a17f6 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ixgbe.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_ixgbe_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index c5c214d..cb6678e 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_pcap.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_pcap_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_pcap/rte_pmd_pcap_version.map b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index b57e421..aa1b461 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ring.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_ring_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 4f1b6ed..df7b583 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -473,7 +473,7 @@ out:
 	return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
 	struct rte_kvargs *kvlist;
diff --git a/lib/librte_pmd_ring/rte_eth_ring.h b/lib/librte_pmd_ring/rte_eth_ring.h
index e6ae19e..d36489a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.h
+++ b/lib/librte_pmd_ring/rte_eth_ring.h
@@ -50,12 +50,6 @@ int rte_eth_from_rings(const char *name,
 int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
 int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
 
-/**
- * For use by test apps only. Called as part of EAL init to set up any dummy NICs
- * configured on command line.
- */
-int rte_pmd_ring_devinit(const char *name, const char *params);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_pmd_ring/rte_eth_ring_version.map b/lib/librte_pmd_ring/rte_eth_ring_version.map
new file mode 100644
index 0000000..5edaa3d
--- /dev/null
+++ b/lib/librte_pmd_ring/rte_eth_ring_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+
+	rte_eth_from_rings;
+	rte_eth_ring_pair_create;
+	rte_eth_ring_pair_attach;
+
+	local: *;
+};
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index 456095b..d979c59 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -39,6 +39,7 @@ LIB = librte_pmd_virtio_uio.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_virtio_version.map
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_pmd_virtio/rte_pmd_virtio_version.map b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index 6872c74..f3ab178 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -66,6 +66,8 @@ endif
 
 VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
+EXPORT_MAP := rte_pmd_vmxnet3_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 01bfcaa..4510603 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_xenvirt.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_xenvirt_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
new file mode 100644
index 0000000..66199b1
--- /dev/null
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
@@ -0,0 +1,8 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_gntalloc_create;
+
+	local: *;
+};
+
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 82b5192..266ed39 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -39,6 +39,8 @@ LIB = librte_port.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_port_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
new file mode 100644
index 0000000..57ccaa3
--- /dev/null
+++ b/lib/librte_port/rte_port_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_ops;
+	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_sched_reader_ops;
+	rte_port_sched_writer_ops;
+	rte_port_source_ops;
+	rte_port_sink_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index d672a5a..0547dcd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -36,6 +36,8 @@ LIB = librte_power.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_power_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
new file mode 100644
index 0000000..061bca7
--- /dev/null
+++ b/lib/librte_power/rte_power_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_power_init;
+	rte_power_exit;
+	rte_power_freqs;
+	rte_power_get_freq;
+	rte_power_set_freq;
+	rte_power_freq_up;
+	rte_power_freq_down;
+	rte_power_freq_max;
+	rte_power_freq_min;
+	rte_power_set_env;
+	rte_power_get_env;
+	rte_power_unset_env;
+	
+	local: *;
+};
+
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 2380a43..b437dc5 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ring.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ring_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
new file mode 100644
index 0000000..6c28af9
--- /dev/null
+++ b/lib/librte_ring/rte_ring_version.map
@@ -0,0 +1,12 @@
+DPDK_1.8 {
+	global:
+	rte_ring_get_memsize;
+	rte_ring_init;
+	rte_ring_create;
+	rte_ring_set_water_mark;
+	rte_ring_dump;
+	rte_ring_list_dump;
+	rte_ring_lookup;
+
+	local: *;
+};
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 1a25b21..48f280a 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 CFLAGS_rte_red.o := -D_GNU_SOURCE
 
+EXPORT_MAP := rte_sched_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
new file mode 100644
index 0000000..b5877ce
--- /dev/null
+++ b/lib/librte_sched/rte_sched_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_approx;
+	rte_red_rt_data_init;
+	rte_red_config_init;
+	rte_sched_port_config;
+	rte_sched_port_free;
+	rte_sched_subport_config;
+	rte_sched_pipe_config;
+	rte_sched_port_get_memory_footprint;
+	rte_sched_subport_read_stats;
+	rte_sched_queue_read_stats;
+	rte_sched_port_enqueue;
+	rte_sched_port_dequeue;
+	rte_red_log2_1_minus_Wq;
+	rte_red_pow2_frac_inv;
+	rte_red_rand_val;
+	rte_red_rand_seed;
+
+	local: *;
+};
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index dd684cc..4e1a54a 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -39,6 +39,8 @@ LIB = librte_table.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_table_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
new file mode 100644
index 0000000..86f16b8
--- /dev/null
+++ b/lib/librte_table/rte_table_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_table_stub_ops;
+	rte_table_lpm_ops;
+	rte_table_array_ops;
+	rte_table_hash_key8_lru_ops;
+	rte_table_hash_key8_lru_dosig_ops;
+	rte_table_hash_key8_ext_ops;
+	rte_table_hash_key8_ext_dosig_ops;
+	rte_table_lpm_ipv6_ops;
+	rte_table_hash_key16_lru_ops;
+	rte_table_hash_key32_lru_ops;
+	rte_table_hash_key16_ext_ops;
+	rte_table_hash_key32_ext_ops;
+	rte_table_acl_ops;
+	rte_table_hash_lru_ops;
+	rte_table_hash_ext_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 07eb0c6..9fb6079 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -36,6 +36,8 @@ LIB = librte_timer.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_timer_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
new file mode 100644
index 0000000..00b6b52
--- /dev/null
+++ b/lib/librte_timer/rte_timer_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+	global:
+
+	rte_timer_subsystem_init;
+	rte_timer_init;
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_stop;
+	rte_timer_stop_sync;
+	rte_timer_pending;
+	rte_timer_manage;
+	rte_timer_dump_stats;
+
+	local: *;
+};
+
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index c008d64..96a7dd0 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+EXPORT_MAP := rte_vhost_version.map
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
new file mode 100644
index 0000000..7685bb8
--- /dev/null
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_vhost_feature_disable;
+	rte_vhost_feature_enable;
+	rte_vhost_feature_get;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_driver_register;
+	rte_vhost_driver_callback_register;
+	rte_vhost_driver_session_start;
+	rte_vhost_enqueue_burst;
+	rte_vhost_dequeue_burst;
+
+	local: *;
+};
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index cbd439b..7949254 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -41,7 +41,7 @@ VPATH += $(SRCDIR)
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
 
-CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
 
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v2 3/4] Add library version extenstion
  2014-12-22 20:24 ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2014-12-22 20:24   ` Neil Horman
  2014-12-23 13:05     ` Gonzalez Monroy, Sergio
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
  2014-12-23 13:27   ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Gonzalez Monroy, Sergio
  3 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 11 +++++++++--
 38 files changed, 83 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 3415c7b..a23d349 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 7949254..ad058b5 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -66,6 +65,7 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+
 ifeq ($(LINK_USING_CC),1)
 # Override the definition of LD here, since we're linking with CC
 LD := $(CC) $(CPU_CFLAGS)
@@ -116,6 +116,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@exit 1
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -129,6 +133,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -166,9 +171,11 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
  2014-12-22 20:24 ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 3/4] Add library version extenstion Neil Horman
@ 2014-12-22 20:24   ` Neil Horman
  2014-12-23  9:48     ` Iremonger, Bernard
  2014-12-23 13:27   ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Gonzalez Monroy, Sergio
  3 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-23  9:48     ` Iremonger, Bernard
  2014-12-23 13:01       ` Neil Horman
  0 siblings, 1 reply; 104+ messages in thread
From: Iremonger, Bernard @ 2014-12-23  9:48 UTC (permalink / raw)
  To: Neil Horman, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Monday, December 22, 2014 8:24 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
> 
> Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> ---
>  doc/abi.txt | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..b6dcc7d
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI
> +may change multiple times between the last labeling and the HEAD label
> +of the git tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle,
> +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> +then the decision to remove it is made during the development of DPDK
> +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> +release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a
> +given update.
> +
> +Deprecation Notices:
> +
> --
> 1.9.3

Should this document be added to the guides documentation (for example doc/guides/prog_guide)?

Regards,

Bernard.

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
  2014-12-23  9:48     ` Iremonger, Bernard
@ 2014-12-23 13:01       ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 13:01 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

On Tue, Dec 23, 2014 at 09:48:43AM +0000, Iremonger, Bernard wrote:
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Monday, December 22, 2014 8:24 PM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
> > 
> > Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> > announcements
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > ---
> >  doc/abi.txt | 17 +++++++++++++++++
> >  1 file changed, 17 insertions(+)
> >  create mode 100644 doc/abi.txt
> > 
> > diff --git a/doc/abi.txt b/doc/abi.txt
> > new file mode 100644
> > index 0000000..b6dcc7d
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,17 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI
> > +may change multiple times between the last labeling and the HEAD label
> > +of the git tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle,
> > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > +then the decision to remove it is made during the development of DPDK
> > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > +release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a
> > +given update.
> > +
> > +Deprecation Notices:
> > +
> > --
> > 1.9.3
> 
> Should this document be added to the guides documentation (for example doc/guides/prog_guide)?
> 
> Regards,
> 
> Bernard.
> 
> 
I don't think so, since this document is meant to be used not only by end users,
but by other programmers while working on the dpdk.  

Neil

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/4] Add library version extenstion
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 3/4] Add library version extenstion Neil Horman
@ 2014-12-23 13:05     ` Gonzalez Monroy, Sergio
  2014-12-23 15:50       ` Neil Horman
  0 siblings, 1 reply; 104+ messages in thread
From: Gonzalez Monroy, Sergio @ 2014-12-23 13:05 UTC (permalink / raw)
  To: Neil Horman, dev

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Monday, December 22, 2014 8:24 PM
>
> a/mk/rte.lib.mk b/mk/rte.lib.mk index 7949254..ad058b5 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -166,9 +171,11 @@ endif
>  # install lib in $(RTE_OUTPUT)/lib
>  #
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> +	$(eval LIBSONAME := $(basename $(LIB)))
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB)
> $(RTE_OUTPUT)/lib/$(LIBSONAME)
> 
Sorry Neil, I missed this before.
We probably only want to do symbolic links for shared libs. At the moment it creates lots of unwanted links for static libs too.
Also, I would suggest to do relative symbolic links instead.

Regards,
Sergio

> --
> 1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-22 20:24 ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                     ` (2 preceding siblings ...)
  2014-12-22 20:24   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-23 13:27   ` Gonzalez Monroy, Sergio
  2014-12-23 15:50     ` Neil Horman
  3 siblings, 1 reply; 104+ messages in thread
From: Gonzalez Monroy, Sergio @ 2014-12-23 13:27 UTC (permalink / raw)
  To: Neil Horman, dev

> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Monday, December 22, 2014 8:24 PM
> +++ b/lib/librte_compat/Makefile
>[...]
> +
> +include $(RTE_SDK)/mk/rte.vars.mk
> +
> +
> +# install includes
> +SYMLINK-y-include := rte_compat.h
> +
> +include $(RTE_SDK)/mk/rte.lib.mk
>
I just realized that we can avoid doing the _INSTALL change below if we include
mk/rte_install.mk instead of mk/rte_lib.mk, as it is done in librte_net.

Regards,
Sergio

> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index 81bf8e1..cbd439b 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -40,10 +40,17 @@ VPATH += $(SRCDIR)
> [...]
> +
>  _BUILD = $(LIB)
> -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> $(RTE_OUTPUT)/lib/$(LIB)
> +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) ifneq ($(LIB),)
> +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB) endif
>  _CLEAN = doclean
> 
>  .PHONY: all
> --
> 1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-23 13:27   ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Gonzalez Monroy, Sergio
@ 2014-12-23 15:50     ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 15:50 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Tue, Dec 23, 2014 at 01:27:32PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Monday, December 22, 2014 8:24 PM
> > +++ b/lib/librte_compat/Makefile
> >[...]
> > +
> > +include $(RTE_SDK)/mk/rte.vars.mk
> > +
> > +
> > +# install includes
> > +SYMLINK-y-include := rte_compat.h
> > +
> > +include $(RTE_SDK)/mk/rte.lib.mk
> >
> I just realized that we can avoid doing the _INSTALL change below if we include
> mk/rte_install.mk instead of mk/rte_lib.mk, as it is done in librte_net.
> 
> Regards,
> Sergio
> 
But doing so limits the compat directory to only install headers, correct? I'm
ok with that mind you, just need to keep it in mind if we ever add any sort of
compatibility code there.

Neil

> > diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index 81bf8e1..cbd439b 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -40,10 +40,17 @@ VPATH += $(SRCDIR)
> > [...]
> > +
> >  _BUILD = $(LIB)
> > -_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> > $(RTE_OUTPUT)/lib/$(LIB)
> > +_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) ifneq ($(LIB),)
> > +_INSTALL += $(RTE_OUTPUT)/lib/$(LIB) endif
> >  _CLEAN = doclean
> > 
> >  .PHONY: all
> > --
> > 1.9.3
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/4] Add library version extenstion
  2014-12-23 13:05     ` Gonzalez Monroy, Sergio
@ 2014-12-23 15:50       ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 15:50 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Tue, Dec 23, 2014 at 01:05:16PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Monday, December 22, 2014 8:24 PM
> >
> > a/mk/rte.lib.mk b/mk/rte.lib.mk index 7949254..ad058b5 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -166,9 +171,11 @@ endif
> >  # install lib in $(RTE_OUTPUT)/lib
> >  #
> >  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> > +	$(eval LIBSONAME := $(basename $(LIB)))
> >  	@echo "  INSTALL-LIB $(LIB)"
> >  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> >  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> > +	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB)
> > $(RTE_OUTPUT)/lib/$(LIBSONAME)
> > 
> Sorry Neil, I missed this before.
> We probably only want to do symbolic links for shared libs. At the moment it creates lots of unwanted links for static libs too.
> Also, I would suggest to do relative symbolic links instead.
> 
Ack, will update
Neil

> Regards,
> Sergio
> 
> > --
> > 1.9.3
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (4 preceding siblings ...)
  2014-12-22 20:24 ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-23 15:51 ` Neil Horman
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (4 more replies)
  2015-01-09 12:35 ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (8 subsequent siblings)
  14 siblings, 5 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  4 ++
 4 files changed, 139 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..46d5905
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..75e3652 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
@ 2014-12-23 15:51   ` Neil Horman
  2014-12-29 16:21     ` Sergio Gonzalez Monroy
  2015-01-14 15:29     ` Thomas Monjalon
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
                     ` (3 subsequent siblings)
  4 siblings, 2 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

Add linker version script files to each DPDK library to put a stake in the
ground from which we can start cleaning up API's

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:

v2)
	* Updated export map to not require full path
---
 lib/librte_acl/Makefile                            |   2 +
 lib/librte_acl/rte_acl_version.map                 |  21 ++++
 lib/librte_cfgfile/Makefile                        |   2 +
 lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
 lib/librte_cmdline/Makefile                        |   2 +
 lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
 lib/librte_distributor/Makefile                    |   2 +
 lib/librte_distributor/rte_distributor_version.map |  16 +++
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
 lib/librte_ether/Makefile                          |   2 +
 lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
 lib/librte_hash/Makefile                           |   2 +
 lib/librte_hash/rte_hash_version.map               |  18 ++++
 lib/librte_ip_frag/Makefile                        |   2 +
 lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
 lib/librte_ivshmem/Makefile                        |   2 +
 lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
 lib/librte_kni/Makefile                            |   2 +
 lib/librte_kni/rte_kni_version.map                 |  20 ++++
 lib/librte_kvargs/Makefile                         |   2 +
 lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
 lib/librte_lpm/Makefile                            |   2 +
 lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
 lib/librte_malloc/Makefile                         |   2 +
 lib/librte_malloc/rte_malloc_version.map           |  19 ++++
 lib/librte_mbuf/Makefile                           |   2 +
 lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
 lib/librte_mempool/Makefile                        |   2 +
 lib/librte_mempool/rte_mempool_version.map         |  18 ++++
 lib/librte_meter/Makefile                          |   2 +
 lib/librte_meter/rte_meter_version.map             |  13 +++
 lib/librte_pipeline/Makefile                       |   2 +
 lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
 lib/librte_pmd_af_packet/Makefile                  |   2 +
 .../rte_pmd_af_packet_version.map                  |   7 ++
 lib/librte_pmd_bond/Makefile                       |   2 +
 lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
 lib/librte_pmd_e1000/Makefile                      |   2 +
 lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
 lib/librte_pmd_enic/Makefile                       |   2 +
 lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
 lib/librte_pmd_i40e/Makefile                       |   2 +
 lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
 lib/librte_pmd_ixgbe/Makefile                      |   2 +
 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
 lib/librte_pmd_pcap/Makefile                       |   2 +
 lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
 lib/librte_pmd_ring/Makefile                       |   2 +
 lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
 lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
 lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
 lib/librte_pmd_virtio/Makefile                     |   1 +
 lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
 lib/librte_pmd_vmxnet3/Makefile                    |   2 +
 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
 lib/librte_pmd_xenvirt/Makefile                    |   2 +
 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
 lib/librte_port/Makefile                           |   2 +
 lib/librte_port/rte_port_version.map               |  18 ++++
 lib/librte_power/Makefile                          |   2 +
 lib/librte_power/rte_power_version.map             |  18 ++++
 lib/librte_ring/Makefile                           |   2 +
 lib/librte_ring/rte_ring_version.map               |  12 +++
 lib/librte_sched/Makefile                          |   2 +
 lib/librte_sched/rte_sched_version.map             |  22 ++++
 lib/librte_table/Makefile                          |   2 +
 lib/librte_table/rte_table_version.map             |  22 ++++
 lib/librte_timer/Makefile                          |   2 +
 lib/librte_timer/rte_timer_version.map             |  16 +++
 lib/librte_vhost/Makefile                          |   2 +
 lib/librte_vhost/rte_vhost_version.map             |  14 +++
 mk/rte.lib.mk                                      |   2 +-
 75 files changed, 875 insertions(+), 8 deletions(-)
 create mode 100644 lib/librte_acl/rte_acl_version.map
 create mode 100644 lib/librte_cfgfile/rte_cfgfile_version.map
 create mode 100644 lib/librte_cmdline/rte_cmdline_version.map
 create mode 100644 lib/librte_distributor/rte_distributor_version.map
 create mode 100644 lib/librte_eal/bsdapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_eal/linuxapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_ether/rte_ether_version.map
 create mode 100644 lib/librte_hash/rte_hash_version.map
 create mode 100644 lib/librte_ip_frag/rte_ipfrag_version.map
 create mode 100644 lib/librte_ivshmem/rte_ivshmem_version.map
 create mode 100644 lib/librte_kni/rte_kni_version.map
 create mode 100644 lib/librte_kvargs/rte_kvargs_version.map
 create mode 100644 lib/librte_lpm/rte_lpm_version.map
 create mode 100644 lib/librte_malloc/rte_malloc_version.map
 create mode 100644 lib/librte_mbuf/rte_mbuf_version.map
 create mode 100644 lib/librte_mempool/rte_mempool_version.map
 create mode 100644 lib/librte_meter/rte_meter_version.map
 create mode 100644 lib/librte_pipeline/rte_pipeline_version.map
 create mode 100644 lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 create mode 100644 lib/librte_pmd_bond/rte_eth_bond_version.map
 create mode 100644 lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 create mode 100644 lib/librte_pmd_enic/rte_pmd_enic_version.map
 create mode 100644 lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 create mode 100644 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 create mode 100644 lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 create mode 100644 lib/librte_pmd_ring/rte_eth_ring_version.map
 create mode 100644 lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 create mode 100644 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 create mode 100644 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 create mode 100644 lib/librte_port/rte_port_version.map
 create mode 100644 lib/librte_power/rte_power_version.map
 create mode 100644 lib/librte_ring/rte_ring_version.map
 create mode 100644 lib/librte_sched/rte_sched_version.map
 create mode 100644 lib/librte_table/rte_table_version.map
 create mode 100644 lib/librte_timer/rte_timer_version.map
 create mode 100644 lib/librte_vhost/rte_vhost_version.map

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 65e566d..45cbf80 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -37,6 +37,8 @@ LIB = librte_acl.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_acl_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
new file mode 100644
index 0000000..9f05a86
--- /dev/null
+++ b/lib/librte_acl/rte_acl_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+	rte_acl_create;
+	rte_acl_find_existing;
+	rte_acl_free;
+	rte_acl_add_rules;
+	rte_acl_reset_rules;
+	rte_acl_build;
+	rte_acl_reset;
+	rte_acl_classify;
+	rte_acl_dump;
+	rte_acl_list_dump;
+	rte_acl_ipv4vlan_add_rules;
+	rte_acl_ipv4vlan_build;
+	rte_acl_classify_scalar;
+	rte_acl_classify_alg;
+	rte_acl_set_ctx_classify;
+
+	local: *;
+};
+
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 55e8701..a4f73de 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -39,6 +39,8 @@ LIB = librte_cfgfile.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_cfgfile_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
new file mode 100644
index 0000000..10ecea6
--- /dev/null
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_cfgfile_load;
+	rte_cfgfile_num_sections;
+	rte_cfgfile_sections;
+	rte_cfgfile_has_section;
+	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_entries;
+	rte_cfgfile_get_entry;
+	rte_cfgfile_has_entry;
+	rte_cfgfile_close;
+
+	local: *;
+};
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 7eae449..3c71831 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -36,6 +36,8 @@ LIB = librte_cmdline.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_cmdline_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
new file mode 100644
index 0000000..7616eff
--- /dev/null
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -0,0 +1,69 @@
+DPDK_1.8 {
+	global:
+	cmdline_new;
+	cmdline_set_prompt;
+	cmdline_free;
+	cmdline_printf;
+	cmdline_in;
+	cmdline_write_char;
+	cmdline_interact;
+	cmdline_quit;
+	cmdline_parse;
+	cmdline_complete;
+	cmdline_isendoftoken;
+	cmdline_parse_num;
+	cmdline_get_help_num;
+	cmdline_parse_ipaddr;
+	cmdline_get_help_ipaddr;
+	cmdline_parse_etheraddr;
+	cmdline_get_help_etheraddr;
+	cmdline_parse_string;
+	cmdline_complete_get_nb_string;
+	cmdline_complete_get_elt_string;
+	cmdline_get_help_string;
+	cmdline_parse_portlist;
+	cmdline_get_help_portlist;
+	cmdline_token_string_ops;
+	cmdline_token_num_ops;
+	cmdline_token_string_ops;
+	cmdline_token_ipaddr_ops;
+	cmdline_token_etheraddr_ops;
+	vt100_init;
+	vt100_parser;
+	cmdline_file_new;
+	cmdline_stdin_new;
+	cmdline_stdin_exit;
+	cirbuf_init;
+	cirbuf_add_head_safe;
+	cirbuf_add_head;
+	cirbuf_add_tail_safe;
+	cirbuf_add_tail;
+	cirbuf_del_head_safe;
+	cirbuf_del_head;
+	cirbuf_del_tail_safe;
+	cirbuf_del_tail;
+	cirbuf_get_head;
+	cirbuf_get_tail;
+	cirbuf_add_buf_head;
+	cirbuf_add_buf_tail;
+	cirbuf_del_buf_head;
+	cirbuf_del_buf_tail;
+	cirbuf_get_buf_head;
+	cirbuf_get_buf_tail;
+	cirbuf_align_left;
+	cirbuf_align_right;
+	rdline_init;
+	rdline_newline;
+	rdline_stop;
+	rdline_quit;
+	rdline_restart;
+	rdline_redisplay;
+	rdline_reset;
+	rdline_char_in;
+	rdline_get_buffer;
+	rdline_add_history;
+	rdline_clear_history;
+	rdline_get_history_item;
+
+	local: *;
+};
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 36699f8..3674a2c 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -37,6 +37,8 @@ LIB = librte_distributor.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_distributor_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
new file mode 100644
index 0000000..b81ddc8
--- /dev/null
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+
+	global:
+	rte_distributor_create;
+	rte_distributor_process;
+	rte_distributor_returned_pkts;
+	rte_distributor_flush;
+	rte_distributor_clear_returns;
+	rte_distributor_get_pkt;
+	rte_distributor_return_pkt;
+	rte_distributor_request_pkt;
+	rte_distributor_poll_pkt;
+
+	local: *;
+};
+
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index d434882..0b5f9d9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -46,6 +46,8 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_pcap
 CFLAGS += $(WERROR_FLAGS) -O3
 
+EXPORT_MAP := rte_eal_version.map
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..bae8af1 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -33,6 +33,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_eal.a
 
+EXPORT_MAP := rte_eal_version.map
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index a461c31..80ad78d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -39,6 +39,8 @@ LIB = libethdev.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_ether_version.map
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
new file mode 100644
index 0000000..dbd0eca
--- /dev/null
+++ b/lib/librte_ether/rte_ether_version.map
@@ -0,0 +1,113 @@
+DPDK_1.8 {
+	global:
+	rte_eth_driver_register;
+	rte_eth_dev_configure;
+	rte_eth_rx_queue_setup;
+	rte_eth_tx_queue_setup;
+	rte_eth_dev_socket_id;
+	rte_eth_dev_rx_queue_start;
+	rte_eth_dev_rx_queue_stop;
+	rte_eth_dev_tx_queue_start;
+	rte_eth_dev_tx_queue_stop;
+	rte_eth_dev_start;
+	rte_eth_dev_stop;
+	rte_eth_dev_set_link_up;
+	rte_eth_dev_set_link_down;
+	rte_eth_dev_close;
+	rte_eth_promiscuous_enable;
+	rte_eth_promiscuous_disable;
+	rte_eth_promiscuous_get;
+	rte_eth_allmulticast_enable;
+	rte_eth_allmulticast_disable;
+	rte_eth_allmulticast_get;
+	rte_eth_link;
+	rte_eth_link_get_nowait;
+	rte_eth_stats;
+	rte_eth_stats_reset;
+	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_rx_queue_stats_mapping;
+	rte_eth_macaddr_get;
+	rte_eth_dev_info_get;
+	rte_eth_dev_get_mtu;
+	rte_eth_dev_set_mtu;
+	rte_eth_dev_vlan_filter;
+	rte_eth_dev_set_vlan_strip_on_queue;
+	rte_eth_dev_set_vlan_ether_type;
+	rte_eth_dev_set_vlan_offload;
+	rte_eth_dev_get_vlan_offload;
+	rte_eth_dev_set_vlan_pvid;
+	rte_eth_rx_burst;
+	rte_eth_rx_queue_count;
+	rte_eth_rx_descriptor_done;
+	rte_eth_tx_burst;
+	rte_eth_dev_fdir_add_signature_filter;
+	rte_eth_dev_fdir_update_signature_filter;
+	rte_eth_dev_fdir_remove_signature_filter;
+	rte_eth_dev_fdir_get_infos;
+	rte_eth_dev_fdir_add_perfect_filter;
+	rte_eth_dev_fdir_update_perfect_filter;
+	rte_eth_dev_fdir_remove_perfect_filter;
+	rte_eth_dev_fdir_set_masks;
+	rte_eth_dev_callback_register;
+	rte_eth_dev_callback_unregister;
+	rte_eth_dev_callback_process;
+	rte_eth_led_on;
+	rte_eth_led_off;
+	rte_eth_dev_flow_ctrl_get;
+	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_mac_addr_add;
+	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rss_reta_query;
+	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_uc_all_hash_table_set;
+	rte_eth_dev_set_vf_rxmode;
+	rte_eth_dev_set_vf_tx;
+	rte_eth_dev_set_vf_rx;
+	rte_eth_dev_set_vf_vlan_filter;
+	rte_eth_mirror_rule_set;
+	rte_eth_mirror_rule_reset;
+	rte_eth_set_queue_rate_limit;
+	rte_eth_set_vf_rate_limit;
+	rte_eth_dev_bypass_init;
+	rte_eth_dev_bypass_state_show;
+	rte_eth_dev_bypass_state_set;
+	rte_eth_dev_bypass_event_show;
+	rte_eth_dev_bypass_event_store;
+	rte_eth_dev_wd_timeout_store;
+	rte_eth_dev_bypass_ver_show;
+	rte_eth_dev_bypass_wd_timeout_show;
+	rte_eth_dev_bypass_wd_reset;
+	rte_eth_dev_rss_hash_update;
+	rte_eth_dev_rss_hash_conf_get;
+	rte_eth_dev_add_syn_filter;
+	rte_eth_dev_remove_syn_filter;
+	rte_eth_dev_get_syn_filter;
+	rte_eth_dev_add_ethertype_filter;
+	rte_eth_dev_remove_ethertype_filter;
+	rte_eth_dev_get_ethertype_filter;
+	rte_eth_dev_add_2tuple_filter;
+	rte_eth_dev_remove_2tuple_filter;
+	rte_eth_dev_get_2tuple_filter;
+	rte_eth_dev_add_5tuple_filter;
+	rte_eth_dev_remove_5tuple_filter;
+	rte_eth_dev_get_5tuple_filter;
+	rte_eth_dev_add_flex_filter;
+	rte_eth_dev_remove_flex_filter;
+	rte_eth_dev_get_flex_filter;
+	rte_eth_dev_count;
+	rte_eth_link_get;
+	rte_eth_devices;
+	rte_eth_stats_get;
+	rte_eth_dev_allocate;
+	_rte_eth_dev_callback_process;
+	rte_eth_dev_filter_ctrl;
+	rte_eth_dev_udp_tunnel_delete;
+	rte_eth_dev_udp_tunnel_add;
+	rte_eth_xstats_get;
+	rte_eth_xstats_reset;
+	rte_eth_dev_filter_supported;
+	local: *;
+};
+
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 95e4c09..bec61ab 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -37,6 +37,8 @@ LIB = librte_hash.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_hash_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
new file mode 100644
index 0000000..2a34313
--- /dev/null
+++ b/lib/librte_hash/rte_hash_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_fbk_hash_find_existing;
+	rte_fbk_hash_create;
+	rte_fbk_hash_free;
+	rte_hash_create;
+	rte_hash_find_existing;
+	rte_hash_free;
+	rte_hash_add_key;
+	rte_hash_add_key_with_hash;
+	rte_hash_del_key;
+	rte_hash_del_key_with_hash;
+	rte_hash_lookup;
+	rte_hash_lookup_with_hash;
+	rte_hash_lookup_bulk;
+
+	local: *;
+};
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 8c00d39..aa88578 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -37,6 +37,8 @@ LIB = librte_ip_frag.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_ipfrag_version.map
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipfrag_version.map b/lib/librte_ip_frag/rte_ipfrag_version.map
new file mode 100644
index 0000000..afe1a0b
--- /dev/null
+++ b/lib/librte_ip_frag/rte_ipfrag_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_ip_frag_table_create;
+	rte_ipv6_fragment_packet;
+	rte_ipv6_frag_reassemble_packet;
+	rte_ipv4_fragment_packet;
+	rte_ipv4_frag_reassemble_packet;
+	rte_ip_frag_free_death_row;
+	rte_ip_frag_table_statistics_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 536814c..068ee10 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ivshmem.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ivshmem_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_ivshmem/rte_ivshmem_version.map b/lib/librte_ivshmem/rte_ivshmem_version.map
new file mode 100644
index 0000000..a204339
--- /dev/null
+++ b/lib/librte_ivshmem/rte_ivshmem_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_ivshmem_metadata_create;
+	rte_ivshmem_metadata_add_memzone;
+	rte_ivshmem_metadata_add_ring;
+	rte_ivshmem_metadata_add_mempool;
+	rte_ivshmem_metadata_cmdline_generate;
+	rte_ivshmem_metadata_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 5267304..93a516d 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -36,6 +36,8 @@ LIB = librte_kni.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_kni_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
new file mode 100644
index 0000000..7db39a3
--- /dev/null
+++ b/lib/librte_kni/rte_kni_version.map
@@ -0,0 +1,20 @@
+DPDK_1.8 {
+	global:
+
+	rte_kni_alloc;
+	rte_kni_create;
+	rte_kni_release;
+	rte_kni_handle_request;
+	rte_kni_rx_burst;
+	rte_kni_tx_burst;
+	rte_kni_get_port_id;
+	rte_kni_get;
+	rte_kni_info_get;
+	rte_kni_register_handlers;
+	rte_kni_unregister_handlers;
+	rte_kni_close;
+	rte_kni_init;
+
+	local: *;
+};
+
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b09359a..b1c34f3 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -38,6 +38,8 @@ LIB = librte_kvargs.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_kvargs_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
new file mode 100644
index 0000000..7873c8c
--- /dev/null
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+	rte_kvargs_parse;
+	rte_kvargs_free;
+	rte_kvargs_process;
+	rte_kvargs_count;
+
+	local: *;
+};
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index fa94163..8214630 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -37,6 +37,8 @@ LIB = librte_lpm.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_lpm_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
new file mode 100644
index 0000000..8ae9318
--- /dev/null
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -0,0 +1,24 @@
+DPDK_1.8 {
+	global:
+
+	rte_lpm_create;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_add;
+	rte_lpm_is_rule_present;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm6_create;
+	rte_lpm6_find_existing;
+	rte_lpm6_free;
+	rte_lpm6_add;
+	rte_lpm6_is_rule_present;
+	rte_lpm6_delete;
+	rte_lpm6_delete_bulk_func;
+	rte_lpm6_delete_all;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
+
+	local: *;
+};
+
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index ba87e34..15b7eed 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -36,6 +36,8 @@ LIB = librte_malloc.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_malloc_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MALLOC) := rte_malloc.c malloc_elem.c malloc_heap.c
 
diff --git a/lib/librte_malloc/rte_malloc_version.map b/lib/librte_malloc/rte_malloc_version.map
new file mode 100644
index 0000000..77db879
--- /dev/null
+++ b/lib/librte_malloc/rte_malloc_version.map
@@ -0,0 +1,19 @@
+DPDK_1.8 {
+	global:
+
+	rte_malloc;
+	rte_zmalloc;
+	rte_calloc;
+	rte_realloc;
+	rte_malloc_socket;
+	rte_zmalloc_socket;
+	rte_calloc_socket;
+	rte_free;
+	rte_malloc_validate;
+	rte_malloc_get_socket_stats;
+	rte_malloc_dump_stats;
+	rte_malloc_set_limit;
+	rte_malloc_virt2phy;
+
+	local: *;
+};
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 9b45ba4..03becae 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mbuf.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mbuf_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
new file mode 100644
index 0000000..7260507
--- /dev/null
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_mbuf_sanity_check;
+	rte_ctrlmbuf_init;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_init;
+	rte_pktmbuf_dump;
+	rte_get_rx_ol_flag_name;
+	rte_get_tx_ol_flag_name;
+
+	local: *;
+};
+
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 9939e10..31d1a71 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mempool.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mempool_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
new file mode 100644
index 0000000..7a19982
--- /dev/null
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_create;
+	rte_mempool_xmem_create;
+	rte_dom0_mempool_create;
+	rte_mempool_dump;
+	rte_mempool_audit;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
+	rte_mempool_calc_obj_size;
+	rte_mempool_xmem_size;
+	rte_mempool_xmem_usage;
+	rte_mempool_walk;
+	rte_mempool_count;
+
+	local: *;
+};
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index b25c0cc..c4a7a32 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -39,6 +39,8 @@ LIB = librte_meter.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_meter_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
new file mode 100644
index 0000000..51a73b1
--- /dev/null
+++ b/lib/librte_meter/rte_meter_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_meter_srtcm_config;
+	rte_meter_trtcm_config;
+	rte_meter_srtcm_color_blind_check;
+	rte_meter_srtcm_color_aware_check;
+	rte_meter_trtcm_color_blind_check;
+	rte_meter_trtcm_color_aware_check;
+
+	local: *;
+};
+
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf8fde8..15b58df 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pipeline.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pipeline_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
new file mode 100644
index 0000000..f868b96
--- /dev/null
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -0,0 +1,23 @@
+DPDK_1.8 {
+	global:
+
+	rte_pipeline_create;
+	rte_pipeline_free;
+	rte_pipeline_check;
+	rte_pipeline_run;
+	rte_pipeline_flush;
+	rte_pipeline_table_create;
+	rte_pipeline_table_default_entry_add;
+	rte_pipeline_table_default_entry_delete;
+	rte_pipeline_table_entry_add;
+	rte_pipeline_table_entry_delete;
+	rte_pipeline_port_in_create;
+	rte_pipeline_port_in_connect_to_table;
+	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_disable;
+	rte_pipeline_port_out_create;
+	rte_pipeline_port_out_packet_insert;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 6955e5c..85a7860 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+EXPORT_MAP := rte_pmd_af_packet_version.map
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
new file mode 100644
index 0000000..c68beae
--- /dev/null
+++ b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
@@ -0,0 +1,7 @@
+DPDK_1.8 {
+	global:
+	rte_pmd_af_packet_devinit;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index cdff126..074110a 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_bond.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_bond_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_bond/rte_eth_bond_version.map b/lib/librte_pmd_bond/rte_eth_bond_version.map
new file mode 100644
index 0000000..206b53e
--- /dev/null
+++ b/lib/librte_pmd_bond/rte_eth_bond_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+
+	rte_eth_bond_create;
+	rte_eth_bond_slave_add;
+	rte_eth_bond_slave_remove;
+	rte_eth_bond_mode_set;
+	rte_eth_bond_mode_get;
+	rte_eth_bond_primary_set;
+	rte_eth_bond_primary_get;
+	rte_eth_bond_slaves_get;
+	rte_eth_bond_active_slaves_get;
+	rte_eth_bond_mac_address_set;
+	rte_eth_bond_mac_address_reset;
+	rte_eth_bond_xmit_policy_set;
+	rte_eth_bond_xmit_policy_get;
+	rte_eth_bond_link_monitoring_set;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index 14bc4a2..cd14444 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_e1000.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_e1000_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_e1000/rte_pmd_e1000_version.map b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index a2a623f..697231c 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+EXPORT_MAP := rte_pmd_enic_version.map
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_enic/rte_pmd_enic_version.map b/lib/librte_pmd_enic/rte_pmd_enic_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_enic/rte_pmd_enic_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 98e4bdf..73de373 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_i40e.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_i40e_version.map
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_i40e/rte_pmd_i40e_version.map b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index 3588047..e0a17f6 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ixgbe.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_ixgbe_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index c5c214d..cb6678e 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_pcap.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_pcap_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_pcap/rte_pmd_pcap_version.map b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index b57e421..aa1b461 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ring.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_ring_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 4f1b6ed..df7b583 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -473,7 +473,7 @@ out:
 	return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
 	struct rte_kvargs *kvlist;
diff --git a/lib/librte_pmd_ring/rte_eth_ring.h b/lib/librte_pmd_ring/rte_eth_ring.h
index e6ae19e..d36489a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.h
+++ b/lib/librte_pmd_ring/rte_eth_ring.h
@@ -50,12 +50,6 @@ int rte_eth_from_rings(const char *name,
 int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
 int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
 
-/**
- * For use by test apps only. Called as part of EAL init to set up any dummy NICs
- * configured on command line.
- */
-int rte_pmd_ring_devinit(const char *name, const char *params);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_pmd_ring/rte_eth_ring_version.map b/lib/librte_pmd_ring/rte_eth_ring_version.map
new file mode 100644
index 0000000..5edaa3d
--- /dev/null
+++ b/lib/librte_pmd_ring/rte_eth_ring_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+
+	rte_eth_from_rings;
+	rte_eth_ring_pair_create;
+	rte_eth_ring_pair_attach;
+
+	local: *;
+};
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index 456095b..d979c59 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -39,6 +39,7 @@ LIB = librte_pmd_virtio_uio.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_virtio_version.map
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_pmd_virtio/rte_pmd_virtio_version.map b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index 6872c74..f3ab178 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -66,6 +66,8 @@ endif
 
 VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
+EXPORT_MAP := rte_pmd_vmxnet3_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 01bfcaa..4510603 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_xenvirt.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_xenvirt_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
new file mode 100644
index 0000000..66199b1
--- /dev/null
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
@@ -0,0 +1,8 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_gntalloc_create;
+
+	local: *;
+};
+
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 82b5192..266ed39 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -39,6 +39,8 @@ LIB = librte_port.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_port_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
new file mode 100644
index 0000000..57ccaa3
--- /dev/null
+++ b/lib/librte_port/rte_port_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_ops;
+	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_sched_reader_ops;
+	rte_port_sched_writer_ops;
+	rte_port_source_ops;
+	rte_port_sink_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index d672a5a..0547dcd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -36,6 +36,8 @@ LIB = librte_power.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_power_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
new file mode 100644
index 0000000..061bca7
--- /dev/null
+++ b/lib/librte_power/rte_power_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_power_init;
+	rte_power_exit;
+	rte_power_freqs;
+	rte_power_get_freq;
+	rte_power_set_freq;
+	rte_power_freq_up;
+	rte_power_freq_down;
+	rte_power_freq_max;
+	rte_power_freq_min;
+	rte_power_set_env;
+	rte_power_get_env;
+	rte_power_unset_env;
+	
+	local: *;
+};
+
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 2380a43..b437dc5 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ring.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ring_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
new file mode 100644
index 0000000..6c28af9
--- /dev/null
+++ b/lib/librte_ring/rte_ring_version.map
@@ -0,0 +1,12 @@
+DPDK_1.8 {
+	global:
+	rte_ring_get_memsize;
+	rte_ring_init;
+	rte_ring_create;
+	rte_ring_set_water_mark;
+	rte_ring_dump;
+	rte_ring_list_dump;
+	rte_ring_lookup;
+
+	local: *;
+};
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 1a25b21..48f280a 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 CFLAGS_rte_red.o := -D_GNU_SOURCE
 
+EXPORT_MAP := rte_sched_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
new file mode 100644
index 0000000..b5877ce
--- /dev/null
+++ b/lib/librte_sched/rte_sched_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_approx;
+	rte_red_rt_data_init;
+	rte_red_config_init;
+	rte_sched_port_config;
+	rte_sched_port_free;
+	rte_sched_subport_config;
+	rte_sched_pipe_config;
+	rte_sched_port_get_memory_footprint;
+	rte_sched_subport_read_stats;
+	rte_sched_queue_read_stats;
+	rte_sched_port_enqueue;
+	rte_sched_port_dequeue;
+	rte_red_log2_1_minus_Wq;
+	rte_red_pow2_frac_inv;
+	rte_red_rand_val;
+	rte_red_rand_seed;
+
+	local: *;
+};
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index dd684cc..4e1a54a 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -39,6 +39,8 @@ LIB = librte_table.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_table_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
new file mode 100644
index 0000000..86f16b8
--- /dev/null
+++ b/lib/librte_table/rte_table_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_table_stub_ops;
+	rte_table_lpm_ops;
+	rte_table_array_ops;
+	rte_table_hash_key8_lru_ops;
+	rte_table_hash_key8_lru_dosig_ops;
+	rte_table_hash_key8_ext_ops;
+	rte_table_hash_key8_ext_dosig_ops;
+	rte_table_lpm_ipv6_ops;
+	rte_table_hash_key16_lru_ops;
+	rte_table_hash_key32_lru_ops;
+	rte_table_hash_key16_ext_ops;
+	rte_table_hash_key32_ext_ops;
+	rte_table_acl_ops;
+	rte_table_hash_lru_ops;
+	rte_table_hash_ext_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 07eb0c6..9fb6079 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -36,6 +36,8 @@ LIB = librte_timer.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_timer_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
new file mode 100644
index 0000000..00b6b52
--- /dev/null
+++ b/lib/librte_timer/rte_timer_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+	global:
+
+	rte_timer_subsystem_init;
+	rte_timer_init;
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_stop;
+	rte_timer_stop_sync;
+	rte_timer_pending;
+	rte_timer_manage;
+	rte_timer_dump_stats;
+
+	local: *;
+};
+
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index c008d64..96a7dd0 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+EXPORT_MAP := rte_vhost_version.map
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
new file mode 100644
index 0000000..7685bb8
--- /dev/null
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_vhost_feature_disable;
+	rte_vhost_feature_enable;
+	rte_vhost_feature_get;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_driver_register;
+	rte_vhost_driver_callback_register;
+	rte_vhost_driver_session_start;
+	rte_vhost_enqueue_burst;
+	rte_vhost_dequeue_burst;
+
+	local: *;
+};
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 75e3652..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -41,7 +41,7 @@ VPATH += $(SRCDIR)
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
 
-CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
 
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2014-12-23 15:51   ` Neil Horman
  2014-12-23 16:44     ` Gonzalez Monroy, Sergio
                       ` (2 more replies)
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
                     ` (2 subsequent siblings)
  4 siblings, 3 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 13 +++++++++++--
 38 files changed, 85 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 46d5905..c63d622 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..7326b8e 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -63,6 +62,7 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+
 ifeq ($(LINK_USING_CC),1)
 # Override the definition of LD here, since we're linking with CC
 LD := $(CC) $(CPU_CFLAGS)
@@ -113,6 +113,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@exit 1
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +130,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +168,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f ./$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
@ 2014-12-23 15:51   ` Neil Horman
  2014-12-29 16:24     ` Sergio Gonzalez Monroy
  2015-01-14 15:59     ` Thomas Monjalon
  2014-12-29 16:20   ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Sergio Gonzalez Monroy
  2015-01-14 15:25   ` Thomas Monjalon
  4 siblings, 2 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
@ 2014-12-23 16:44     ` Gonzalez Monroy, Sergio
  2014-12-23 17:08       ` Neil Horman
  2014-12-29 16:23     ` Sergio Gonzalez Monroy
  2015-01-14 15:48     ` Thomas Monjalon
  2 siblings, 1 reply; 104+ messages in thread
From: Gonzalez Monroy, Sergio @ 2014-12-23 16:44 UTC (permalink / raw)
  To: Neil Horman, dev

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, December 23, 2014 3:52 PM
>
> a/mk/rte.lib.mk b/mk/rte.lib.mk index 1d3b646..7326b8e 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -163,9 +168,13 @@ endif
>  # install lib in $(RTE_OUTPUT)/lib
>  #
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> +	$(eval LIBSONAME := $(basename $(LIB)))
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +ifeq ($(RTE_BUILD_SHARED_LIB),y)
> +	$(Q)ln -s -f ./$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME) endif
> 
For the relative symbolic link I meant the -r option:
ln -r -s -f $(RTE_OUTPUT)/lib /$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)

But this works too so I leave it up to you whether to change it or not.

Regards,
Sergio

>  #
>  # Clean all generated files
> --
> 1.9.3

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 16:44     ` Gonzalez Monroy, Sergio
@ 2014-12-23 17:08       ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2014-12-23 17:08 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Tue, Dec 23, 2014 at 04:44:32PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Tuesday, December 23, 2014 3:52 PM
> >
> > a/mk/rte.lib.mk b/mk/rte.lib.mk index 1d3b646..7326b8e 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -163,9 +168,13 @@ endif
> >  # install lib in $(RTE_OUTPUT)/lib
> >  #
> >  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> > +	$(eval LIBSONAME := $(basename $(LIB)))
> >  	@echo "  INSTALL-LIB $(LIB)"
> >  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> >  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> > +ifeq ($(RTE_BUILD_SHARED_LIB),y)
> > +	$(Q)ln -s -f ./$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME) endif
> > 
> For the relative symbolic link I meant the -r option:
> ln -r -s -f $(RTE_OUTPUT)/lib /$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
> 
I don't think theres any need to change it, given that they produce identical
output

> But this works too so I leave it up to you whether to change it or not.
> 
I'm gong to leave it as is

> Regards,
> Sergio
> 
> >  #
> >  # Clean all generated files
> > --
> > 1.9.3
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
                     ` (2 preceding siblings ...)
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-29 16:20   ` Sergio Gonzalez Monroy
  2015-01-14 15:25   ` Thomas Monjalon
  4 siblings, 0 replies; 104+ messages in thread
From: Sergio Gonzalez Monroy @ 2014-12-29 16:20 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Dec 23, 2014 at 10:51:50AM -0500, Neil Horman wrote:
> Add initial pass header files to support symbol versioning.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
> 
> Change Notes:
> V2)
> 	Moved ifeq to _INSTALL target
> 
> V3)
> 	Undo V2 changes and make librte_compat use the rte.install.mk file
> instead
> ---
>  lib/Makefile                   |  1 +
>  lib/librte_compat/Makefile     | 38 +++++++++++++++++
>  lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
>  mk/rte.lib.mk                  |  4 ++
>  4 files changed, 139 insertions(+)
>  create mode 100644 lib/librte_compat/Makefile
>  create mode 100644 lib/librte_compat/rte_compat.h
>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2014-12-29 16:21     ` Sergio Gonzalez Monroy
  2015-01-14 15:29     ` Thomas Monjalon
  1 sibling, 0 replies; 104+ messages in thread
From: Sergio Gonzalez Monroy @ 2014-12-29 16:21 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Dec 23, 2014 at 10:51:51AM -0500, Neil Horman wrote:
> Add linker version script files to each DPDK library to put a stake in the
> ground from which we can start cleaning up API's
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change Notes:
> 
> v2)
> 	* Updated export map to not require full path
> ---
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
  2014-12-23 16:44     ` Gonzalez Monroy, Sergio
@ 2014-12-29 16:23     ` Sergio Gonzalez Monroy
  2015-01-14 15:48     ` Thomas Monjalon
  2 siblings, 0 replies; 104+ messages in thread
From: Sergio Gonzalez Monroy @ 2014-12-29 16:23 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Dec 23, 2014 at 10:51:52AM -0500, Neil Horman wrote:
> To differentiate libraries that break ABI, we add a library version number
> suffix to the library, which must be incremented when a given libraries ABI is
> broken.  This patch enforces that addition, sets the initial abi soname
> extension to 1 for each library and creates a symlink to the base SONAME so that
> the test applications will link properly.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> Change Notes:
> v3)
> 	Made symlinking of libraries conditional on a DSO build
> ---
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-29 16:24     ` Sergio Gonzalez Monroy
  2015-01-14 15:59     ` Thomas Monjalon
  1 sibling, 0 replies; 104+ messages in thread
From: Sergio Gonzalez Monroy @ 2014-12-29 16:24 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Dec 23, 2014 at 10:51:53AM -0500, Neil Horman wrote:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> ---
>  doc/abi.txt | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..b6dcc7d
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +Deprecation Notices:
> +
> -- 
> 1.9.3
>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (5 preceding siblings ...)
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
@ 2015-01-09 12:35 ` Neil Horman
  2015-01-15 19:35 ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-09 12:35 UTC (permalink / raw)
  To: dev

On Sat, Dec 20, 2014 at 04:01:35PM -0500, Neil Horman wrote:
> GI: [PATCH 1/4] compat: Add infrastructure to support symbol versioninBI
> develops and changes quickly, which makes it difficult for
> applications to keep up with the latest version of the library, especially when
> it (the DPDK) is built as a set of shared objects, as applications may be built
> against an older version of the library.
> 
> To mitigate this, this patch series introduces support for library and symbol
> versioning when the DPDK is built as a DSO.  Specifically, it does 4 things:
> 
> 1) Adds initial support for library versioning.  Each library now has a version
> map that explicitly calls out what symbols are exported to using applications,
> and assigns version(s) to them
> 
> 2) Adds support macros so that when libraries create incompatible ABI's,
> multiple versions may be supported so that applications linked against older
> DPDK releases can continue to function
> 
> 3) Adds library soname versioning suffixes so that when ABI's must be broken in
> a fashion that requires a rebuild of older applications, they will break at load
> time, rather than cause unexpected issues at run time.
> 
> 4) Adds documentation for ABI policy, and provides space to document deprecated
> ABI versions, so that applications might be warned of impending changes.
> 
> With these elements in place the DPDK has some support to allow for the extended
> maintenence of older API's while still allowing the freedom to develop new and
> improved API's.
> 
> Implementing this feature will require some additional effort on the part of
> developers and reviewers.  When reviewing patches, must be checked against
> existing exports to ensure that the function prototypes are not changing.  If
> they are, the versioning macros must be used, and the library export map should
> be updated to reflect the new version of the function.
> 
> When data structures change, if those structures are application accessible,
> apis that accept or return instances of those data structures should have new
> versions created so that users of the old data structure version might co-exist
> at the same time.
> 
> Note it was requested that this series be delayed until DPDK 2.0, so this is a
> repost, now that DPDK 1.8 has been tagged.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Robert Love" <robert.w.love@intel.com>
> 
> 
Ping Thomas....

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-23 15:51 ` [dpdk-dev] [PATCH v3 " Neil Horman
                     ` (3 preceding siblings ...)
  2014-12-29 16:20   ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Sergio Gonzalez Monroy
@ 2015-01-14 15:25   ` Thomas Monjalon
  2015-01-14 20:29     ` Neil Horman
  4 siblings, 1 reply; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-14 15:25 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Hi Neil,

2014-12-23 10:51, Neil Horman:
> Add initial pass header files to support symbol versioning.

[...]

> +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>

Why these dates?

> +#   All rights reserved.

I think this line is not required anymore:
	http://en.wikipedia.org/wiki/All_rights_reserved

[...]

> +#ifndef _RTE_COMPAT_H_
> +#define _RTE_COMPAT_H_

Why using underscores?
I think it's reserved:
	http://en.wikipedia.org/wiki/Include_guard#Use_of_.23include_guards

> +#define SA(x) #x

It should be prefixed. But it's better to use RTE_STR.

> +#ifdef RTE_BUILD_SHARED_LIB
> +
> +/*
> + * Provides backwards compatibility when updating exported functions.
> + * When a symol is exported from a library to provide an API, it also provides a
> + * calling convention (ABI) that is embodied in its name, return type,
> + * arguments, etc.  On occasion that function may need to change to accomodate
> + * new functionality, behavior, etc.  When that occurs, it is desireable to
> + * allow for backwards compatibility for a time with older binaries that are
> + * dynamically linked to the dpdk.  to support that the __vsym and

Should be "To support that," with uppercase and comma.

> + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> + * <library>_version.map file for a given library allow for multiple versions of
> + * a symbol to exist in a shared library so that older binaries need not be
> + * immediately recompiled. Their use is outlined in the following example:
> + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> + *
> + * To accomplish this:
> + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> + * foo is exported as a global symbol.
> + *
> + * 2) rename the existing function int foo(char *string) to 
> + * 	int __vsym foo_v18(char *string)
> + *
> + * 3) Add this macro immediately below the function
> + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> + *
> + * 4) Implement a new version of foo.
> + * 	char foo(int value, int otherval) { ...}
> + *
> + * 5) Mark the newest version as the default version
> + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> + *
> + */

Thanks for this good tutorial.

> +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> +#define __vsym __attribute__((used))

OK. It would be simpler to read if b, e, v and n were formally defined in a comment.

> +#else
[...]
> +/*
> + * RTE_BUILD_SHARED_LIB
> + */

This type of comment is strange. It makes me think that we are in the case
RTE_BUILD_SHARED_LIB=y

> +#endif

[...]

> +
> +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)

Why this variable name? VERSION_SCRIPT or VERSION_MAP seems more appropriate.

> +
>  endif
>  
> +

Why this newline?

>  _BUILD = $(LIB)

-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2014-12-29 16:21     ` Sergio Gonzalez Monroy
@ 2015-01-14 15:29     ` Thomas Monjalon
  2015-01-14 16:24       ` Neil Horman
  1 sibling, 1 reply; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-14 15:29 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-23 10:51, Neil Horman:
> Add linker version script files to each DPDK library to put a stake in the
> ground from which we can start cleaning up API's

[...]

>  lib/librte_acl/Makefile                            |   2 +
>  lib/librte_acl/rte_acl_version.map                 |  21 ++++
>  lib/librte_cfgfile/Makefile                        |   2 +
>  lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
>  lib/librte_cmdline/Makefile                        |   2 +
>  lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
>  lib/librte_distributor/Makefile                    |   2 +
>  lib/librte_distributor/rte_distributor_version.map |  16 +++
>  lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
>  lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
>  lib/librte_eal/linuxapp/eal/Makefile               |   2 +
>  lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
>  lib/librte_ether/Makefile                          |   2 +
>  lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
>  lib/librte_hash/Makefile                           |   2 +
>  lib/librte_hash/rte_hash_version.map               |  18 ++++
>  lib/librte_ip_frag/Makefile                        |   2 +
>  lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
>  lib/librte_ivshmem/Makefile                        |   2 +
>  lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
>  lib/librte_kni/Makefile                            |   2 +
>  lib/librte_kni/rte_kni_version.map                 |  20 ++++
>  lib/librte_kvargs/Makefile                         |   2 +
>  lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
>  lib/librte_lpm/Makefile                            |   2 +
>  lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
>  lib/librte_malloc/Makefile                         |   2 +
>  lib/librte_malloc/rte_malloc_version.map           |  19 ++++
>  lib/librte_mbuf/Makefile                           |   2 +
>  lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
>  lib/librte_mempool/Makefile                        |   2 +
>  lib/librte_mempool/rte_mempool_version.map         |  18 ++++
>  lib/librte_meter/Makefile                          |   2 +
>  lib/librte_meter/rte_meter_version.map             |  13 +++
>  lib/librte_pipeline/Makefile                       |   2 +
>  lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
>  lib/librte_pmd_af_packet/Makefile                  |   2 +
>  .../rte_pmd_af_packet_version.map                  |   7 ++
>  lib/librte_pmd_bond/Makefile                       |   2 +
>  lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
>  lib/librte_pmd_e1000/Makefile                      |   2 +
>  lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
>  lib/librte_pmd_enic/Makefile                       |   2 +
>  lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
>  lib/librte_pmd_i40e/Makefile                       |   2 +
>  lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
>  lib/librte_pmd_ixgbe/Makefile                      |   2 +
>  lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
>  lib/librte_pmd_pcap/Makefile                       |   2 +
>  lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
>  lib/librte_pmd_ring/Makefile                       |   2 +
>  lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
>  lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
>  lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
>  lib/librte_pmd_virtio/Makefile                     |   1 +
>  lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
>  lib/librte_pmd_vmxnet3/Makefile                    |   2 +
>  lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
>  lib/librte_pmd_xenvirt/Makefile                    |   2 +
>  lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
>  lib/librte_port/Makefile                           |   2 +
>  lib/librte_port/rte_port_version.map               |  18 ++++
>  lib/librte_power/Makefile                          |   2 +
>  lib/librte_power/rte_power_version.map             |  18 ++++
>  lib/librte_ring/Makefile                           |   2 +
>  lib/librte_ring/rte_ring_version.map               |  12 +++
>  lib/librte_sched/Makefile                          |   2 +
>  lib/librte_sched/rte_sched_version.map             |  22 ++++
>  lib/librte_table/Makefile                          |   2 +
>  lib/librte_table/rte_table_version.map             |  22 ++++
>  lib/librte_timer/Makefile                          |   2 +
>  lib/librte_timer/rte_timer_version.map             |  16 +++
>  lib/librte_vhost/Makefile                          |   2 +
>  lib/librte_vhost/rte_vhost_version.map             |  14 +++

Honestly, this patch is difficult to review.
How have you populated .map files? Did you use some script?

[...]

> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> -CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> +CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)

I guess this change should go in patch 1 which introduced this option.

-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
  2014-12-23 16:44     ` Gonzalez Monroy, Sergio
  2014-12-29 16:23     ` Sergio Gonzalez Monroy
@ 2015-01-14 15:48     ` Thomas Monjalon
  2 siblings, 0 replies; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-14 15:48 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-23 10:51, Neil Horman:
> To differentiate libraries that break ABI, we add a library version number
> suffix to the library, which must be incremented when a given libraries ABI is
> broken.  This patch enforces that addition, sets the initial abi soname
> extension to 1 for each library and creates a symlink to the base SONAME so that
> the test applications will link properly.

[...]

> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
>  
>  # VPATH contains at least SRCDIR
>  VPATH += $(SRCDIR)
> -
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
> -LIB := $(patsubst %.a,%.so,$(LIB))
>  
> +LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
>  CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
>  
>  endif
> @@ -63,6 +62,7 @@ build: _postbuild
>  
>  exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
>  
> +

Newline changes seem weird.

>  ifeq ($(LINK_USING_CC),1)
>  # Override the definition of LD here, since we're linking with CC
>  LD := $(CC) $(CPU_CFLAGS)
> @@ -113,6 +113,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
>  #
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
> +ifeq ($(LIBABIVER),)
> +	@echo "Must Specify a $(LIB) ABI version"
> +	@exit 1

I think (not sure) that @false is better handled than @exit in case of parallel processing.

> +endif
>  	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
>  	$(if $(D),\
>  		@echo -n "$< -> $@ " ; \
> @@ -126,6 +130,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
>  		$(depfile_missing),\
>  		$(depfile_newer)),\
>  		$(O_TO_S_DO))
> +
>  ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
>  	$(if $(or \
>          $(file_missing),\
> @@ -163,9 +168,13 @@ endif
>  # install lib in $(RTE_OUTPUT)/lib
>  #
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> +	$(eval LIBSONAME := $(basename $(LIB)))
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +ifeq ($(RTE_BUILD_SHARED_LIB),y)
> +	$(Q)ln -s -f ./$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
> +endif

Why using ./ ?
Why using the eval trick for $(LIBSONAME) instead of $(basename $(LIB)) ?
Even better, you could use $< instead of $(LIB), matter of taste.

-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2014-12-23 15:51   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
  2014-12-29 16:24     ` Sergio Gonzalez Monroy
@ 2015-01-14 15:59     ` Thomas Monjalon
  2015-01-14 20:07       ` Neil Horman
  1 sibling, 1 reply; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-14 15:59 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-23 10:51, Neil Horman:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements

We had a good discussion about the policy and its impact:
	http://thread.gmane.org/gmane.comp.networking.dpdk.devel/8367/focus=8461
Sadly nobody else discussed it.
I think we should integrate some of the conclusions in this documentation.

> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +Deprecation Notices:
> +

You could upgrade your example to 2.0/2.1.

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 2/4] Provide initial versioning for all DPDK libraries
  2015-01-14 15:29     ` Thomas Monjalon
@ 2015-01-14 16:24       ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-14 16:24 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 14, 2015 at 04:29:29PM +0100, Thomas Monjalon wrote:
> 2014-12-23 10:51, Neil Horman:
> > Add linker version script files to each DPDK library to put a stake in the
> > ground from which we can start cleaning up API's
> 
> [...]
> 
> >  lib/librte_acl/Makefile                            |   2 +
> >  lib/librte_acl/rte_acl_version.map                 |  21 ++++
> >  lib/librte_cfgfile/Makefile                        |   2 +
> >  lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
> >  lib/librte_cmdline/Makefile                        |   2 +
> >  lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
> >  lib/librte_distributor/Makefile                    |   2 +
> >  lib/librte_distributor/rte_distributor_version.map |  16 +++
> >  lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
> >  lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
> >  lib/librte_eal/linuxapp/eal/Makefile               |   2 +
> >  lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
> >  lib/librte_ether/Makefile                          |   2 +
> >  lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
> >  lib/librte_hash/Makefile                           |   2 +
> >  lib/librte_hash/rte_hash_version.map               |  18 ++++
> >  lib/librte_ip_frag/Makefile                        |   2 +
> >  lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
> >  lib/librte_ivshmem/Makefile                        |   2 +
> >  lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
> >  lib/librte_kni/Makefile                            |   2 +
> >  lib/librte_kni/rte_kni_version.map                 |  20 ++++
> >  lib/librte_kvargs/Makefile                         |   2 +
> >  lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
> >  lib/librte_lpm/Makefile                            |   2 +
> >  lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
> >  lib/librte_malloc/Makefile                         |   2 +
> >  lib/librte_malloc/rte_malloc_version.map           |  19 ++++
> >  lib/librte_mbuf/Makefile                           |   2 +
> >  lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
> >  lib/librte_mempool/Makefile                        |   2 +
> >  lib/librte_mempool/rte_mempool_version.map         |  18 ++++
> >  lib/librte_meter/Makefile                          |   2 +
> >  lib/librte_meter/rte_meter_version.map             |  13 +++
> >  lib/librte_pipeline/Makefile                       |   2 +
> >  lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
> >  lib/librte_pmd_af_packet/Makefile                  |   2 +
> >  .../rte_pmd_af_packet_version.map                  |   7 ++
> >  lib/librte_pmd_bond/Makefile                       |   2 +
> >  lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
> >  lib/librte_pmd_e1000/Makefile                      |   2 +
> >  lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
> >  lib/librte_pmd_enic/Makefile                       |   2 +
> >  lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
> >  lib/librte_pmd_i40e/Makefile                       |   2 +
> >  lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
> >  lib/librte_pmd_ixgbe/Makefile                      |   2 +
> >  lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
> >  lib/librte_pmd_pcap/Makefile                       |   2 +
> >  lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
> >  lib/librte_pmd_ring/Makefile                       |   2 +
> >  lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
> >  lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
> >  lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
> >  lib/librte_pmd_virtio/Makefile                     |   1 +
> >  lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
> >  lib/librte_pmd_vmxnet3/Makefile                    |   2 +
> >  lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
> >  lib/librte_pmd_xenvirt/Makefile                    |   2 +
> >  lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
> >  lib/librte_port/Makefile                           |   2 +
> >  lib/librte_port/rte_port_version.map               |  18 ++++
> >  lib/librte_power/Makefile                          |   2 +
> >  lib/librte_power/rte_power_version.map             |  18 ++++
> >  lib/librte_ring/Makefile                           |   2 +
> >  lib/librte_ring/rte_ring_version.map               |  12 +++
> >  lib/librte_sched/Makefile                          |   2 +
> >  lib/librte_sched/rte_sched_version.map             |  22 ++++
> >  lib/librte_table/Makefile                          |   2 +
> >  lib/librte_table/rte_table_version.map             |  22 ++++
> >  lib/librte_timer/Makefile                          |   2 +
> >  lib/librte_timer/rte_timer_version.map             |  16 +++
> >  lib/librte_vhost/Makefile                          |   2 +
> >  lib/librte_vhost/rte_vhost_version.map             |  14 +++
> 
> Honestly, this patch is difficult to review.
> How have you populated .map files? Did you use some script?
> 
I did it the same way I did it the first time I posted this patch way back for
1.8.  I used the libraries' exported header files as a starting point, and
stripped them so that only the function symbols remained (as those are the only
symbols that can be versioned).  I tagged those with a version number, and the
appropriate version script boilerplate syntax.

Not sure what I can do to make review simpler.  But if you have a suggestion,
I'm happy to listen.

> [...]
> 
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > -CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> > +CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
> 
> I guess this change should go in patch 1 which introduced this option.
> 
I can, though its not really necessecary, since I didn't list any EXPORT_MAP
variables in patch 1.

Regards
Neil


> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2015-01-14 15:59     ` Thomas Monjalon
@ 2015-01-14 20:07       ` Neil Horman
  2015-01-16 13:34         ` Thomas Monjalon
  0 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2015-01-14 20:07 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 14, 2015 at 04:59:51PM +0100, Thomas Monjalon wrote:
> 2014-12-23 10:51, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice space for
> > any deprecation announcements
> 
> We had a good discussion about the policy and its impact:
> 	http://thread.gmane.org/gmane.comp.networking.dpdk.devel/8367/focus=8461
> Sadly nobody else discussed it.
> I think we should integrate some of the conclusions in this documentation.
> 
I'm certainly open to that.  However, I felt like that conversation centered
more around the debate for the need for ABI versioning, not the mechanics
thereof.  Are there specific sections of that conversation that you are looking
to incorporate, or specific topics?

> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,17 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +Deprecation Notices:
> > +
> 
> You could upgrade your example to 2.0/2.1.
> 
Sure, though I think doing so is rather arbitrary, as its going to be
immediately dated as soon as version 2.1 releases.  But I can do that if you
like when we square up the documentation question above
Neil

> Thanks
> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2015-01-14 15:25   ` Thomas Monjalon
@ 2015-01-14 20:29     ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-14 20:29 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 14, 2015 at 04:25:19PM +0100, Thomas Monjalon wrote:
> Hi Neil,
> 
> 2014-12-23 10:51, Neil Horman:
> > Add initial pass header files to support symbol versioning.
> 
> [...]
> 
> > +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
> 
> Why these dates?
> 
Because I copied the Makefile from librte_acl, and modified the name but not the
dates.

> > +#   All rights reserved.
> 
> I think this line is not required anymore:
> 	http://en.wikipedia.org/wiki/All_rights_reserved
> 
Hmm, apparently so.  However, since it exists in every other copyright notice in
the tree, I'd just as soon keep this language consistent, and make a tree wide
change in a separate patch if the consensus is to do so.

> [...]
> 
> > +#ifndef _RTE_COMPAT_H_
> > +#define _RTE_COMPAT_H_
> 
> Why using underscores?
> I think it's reserved:
> 	http://en.wikipedia.org/wiki/Include_guard#Use_of_.23include_guards
> 
Its reserved for the implementation, and must not be used by a user using the
header file.  Its ok, and is common practice.  See every other symlinked header
file in the DPDK.

> > +#define SA(x) #x
> 
> It should be prefixed. But it's better to use RTE_STR.
> 
very well

> > +#ifdef RTE_BUILD_SHARED_LIB
> > +
> > +/*
> > + * Provides backwards compatibility when updating exported functions.
> > + * When a symol is exported from a library to provide an API, it also provides a
> > + * calling convention (ABI) that is embodied in its name, return type,
> > + * arguments, etc.  On occasion that function may need to change to accomodate
> > + * new functionality, behavior, etc.  When that occurs, it is desireable to
> > + * allow for backwards compatibility for a time with older binaries that are
> > + * dynamically linked to the dpdk.  to support that the __vsym and
> 
> Should be "To support that," with uppercase and comma.
> 
yup

> > + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> > + * <library>_version.map file for a given library allow for multiple versions of
> > + * a symbol to exist in a shared library so that older binaries need not be
> > + * immediately recompiled. Their use is outlined in the following example:
> > + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> > + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> > + *
> > + * To accomplish this:
> > + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> > + * foo is exported as a global symbol.
> > + *
> > + * 2) rename the existing function int foo(char *string) to 
> > + * 	int __vsym foo_v18(char *string)
> > + *
> > + * 3) Add this macro immediately below the function
> > + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> > + *
> > + * 4) Implement a new version of foo.
> > + * 	char foo(int value, int otherval) { ...}
> > + *
> > + * 5) Mark the newest version as the default version
> > + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> > + *
> > + */
> 
> Thanks for this good tutorial.
> 
> > +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> > +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> > +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> > +#define __vsym __attribute__((used))
> 
> OK. It would be simpler to read if b, e, v and n were formally defined in a comment.
> 
> > +#else
> [...]
> > +/*
> > + * RTE_BUILD_SHARED_LIB
> > + */
> 
> This type of comment is strange. It makes me think that we are in the case
> RTE_BUILD_SHARED_LIB=y
> 
> > +#endif
> 
> [...]
> 
> > +
> > +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> 
> Why this variable name? VERSION_SCRIPT or VERSION_MAP seems more appropriate.
> 
> > +
> >  endif
> >  
> > +
> 
> Why this newline?
> 
> >  _BUILD = $(LIB)
> 
> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (6 preceding siblings ...)
  2015-01-09 12:35 ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
@ 2015-01-15 19:35 ` Neil Horman
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (3 more replies)
  2015-01-16 15:33 ` [dpdk-dev] [PATCH v5 " Neil Horman
                   ` (6 subsequent siblings)
  14 siblings, 4 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v4 2/4] Provide initial versioning for all DPDK libraries
  2015-01-15 19:35 ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-15 19:35   ` Neil Horman
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 3/4] Add library version extenstion Neil Horman
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

Add linker version script files to each DPDK library to put a stake in the
ground from which we can start cleaning up API's

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:

v2)
	* Updated export map to not require full path
---
 lib/librte_acl/Makefile                            |   2 +
 lib/librte_acl/rte_acl_version.map                 |  21 ++++
 lib/librte_cfgfile/Makefile                        |   2 +
 lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
 lib/librte_cmdline/Makefile                        |   2 +
 lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
 lib/librte_distributor/Makefile                    |   2 +
 lib/librte_distributor/rte_distributor_version.map |  16 +++
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
 lib/librte_ether/Makefile                          |   2 +
 lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
 lib/librte_hash/Makefile                           |   2 +
 lib/librte_hash/rte_hash_version.map               |  18 ++++
 lib/librte_ip_frag/Makefile                        |   2 +
 lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
 lib/librte_ivshmem/Makefile                        |   2 +
 lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
 lib/librte_kni/Makefile                            |   2 +
 lib/librte_kni/rte_kni_version.map                 |  20 ++++
 lib/librte_kvargs/Makefile                         |   2 +
 lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
 lib/librte_lpm/Makefile                            |   2 +
 lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
 lib/librte_malloc/Makefile                         |   2 +
 lib/librte_malloc/rte_malloc_version.map           |  19 ++++
 lib/librte_mbuf/Makefile                           |   2 +
 lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
 lib/librte_mempool/Makefile                        |   2 +
 lib/librte_mempool/rte_mempool_version.map         |  18 ++++
 lib/librte_meter/Makefile                          |   2 +
 lib/librte_meter/rte_meter_version.map             |  13 +++
 lib/librte_pipeline/Makefile                       |   2 +
 lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
 lib/librte_pmd_af_packet/Makefile                  |   2 +
 .../rte_pmd_af_packet_version.map                  |   7 ++
 lib/librte_pmd_bond/Makefile                       |   2 +
 lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
 lib/librte_pmd_e1000/Makefile                      |   2 +
 lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
 lib/librte_pmd_enic/Makefile                       |   2 +
 lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
 lib/librte_pmd_i40e/Makefile                       |   2 +
 lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
 lib/librte_pmd_ixgbe/Makefile                      |   2 +
 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
 lib/librte_pmd_pcap/Makefile                       |   2 +
 lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
 lib/librte_pmd_ring/Makefile                       |   2 +
 lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
 lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
 lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
 lib/librte_pmd_virtio/Makefile                     |   1 +
 lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
 lib/librte_pmd_vmxnet3/Makefile                    |   2 +
 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
 lib/librte_pmd_xenvirt/Makefile                    |   2 +
 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
 lib/librte_port/Makefile                           |   2 +
 lib/librte_port/rte_port_version.map               |  18 ++++
 lib/librte_power/Makefile                          |   2 +
 lib/librte_power/rte_power_version.map             |  18 ++++
 lib/librte_ring/Makefile                           |   2 +
 lib/librte_ring/rte_ring_version.map               |  12 +++
 lib/librte_sched/Makefile                          |   2 +
 lib/librte_sched/rte_sched_version.map             |  22 ++++
 lib/librte_table/Makefile                          |   2 +
 lib/librte_table/rte_table_version.map             |  22 ++++
 lib/librte_timer/Makefile                          |   2 +
 lib/librte_timer/rte_timer_version.map             |  16 +++
 lib/librte_vhost/Makefile                          |   2 +
 lib/librte_vhost/rte_vhost_version.map             |  14 +++
 74 files changed, 874 insertions(+), 7 deletions(-)
 create mode 100644 lib/librte_acl/rte_acl_version.map
 create mode 100644 lib/librte_cfgfile/rte_cfgfile_version.map
 create mode 100644 lib/librte_cmdline/rte_cmdline_version.map
 create mode 100644 lib/librte_distributor/rte_distributor_version.map
 create mode 100644 lib/librte_eal/bsdapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_eal/linuxapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_ether/rte_ether_version.map
 create mode 100644 lib/librte_hash/rte_hash_version.map
 create mode 100644 lib/librte_ip_frag/rte_ipfrag_version.map
 create mode 100644 lib/librte_ivshmem/rte_ivshmem_version.map
 create mode 100644 lib/librte_kni/rte_kni_version.map
 create mode 100644 lib/librte_kvargs/rte_kvargs_version.map
 create mode 100644 lib/librte_lpm/rte_lpm_version.map
 create mode 100644 lib/librte_malloc/rte_malloc_version.map
 create mode 100644 lib/librte_mbuf/rte_mbuf_version.map
 create mode 100644 lib/librte_mempool/rte_mempool_version.map
 create mode 100644 lib/librte_meter/rte_meter_version.map
 create mode 100644 lib/librte_pipeline/rte_pipeline_version.map
 create mode 100644 lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 create mode 100644 lib/librte_pmd_bond/rte_eth_bond_version.map
 create mode 100644 lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 create mode 100644 lib/librte_pmd_enic/rte_pmd_enic_version.map
 create mode 100644 lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 create mode 100644 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 create mode 100644 lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 create mode 100644 lib/librte_pmd_ring/rte_eth_ring_version.map
 create mode 100644 lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 create mode 100644 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 create mode 100644 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 create mode 100644 lib/librte_port/rte_port_version.map
 create mode 100644 lib/librte_power/rte_power_version.map
 create mode 100644 lib/librte_ring/rte_ring_version.map
 create mode 100644 lib/librte_sched/rte_sched_version.map
 create mode 100644 lib/librte_table/rte_table_version.map
 create mode 100644 lib/librte_timer/rte_timer_version.map
 create mode 100644 lib/librte_vhost/rte_vhost_version.map

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 65e566d..45cbf80 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -37,6 +37,8 @@ LIB = librte_acl.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_acl_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
new file mode 100644
index 0000000..9f05a86
--- /dev/null
+++ b/lib/librte_acl/rte_acl_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+	rte_acl_create;
+	rte_acl_find_existing;
+	rte_acl_free;
+	rte_acl_add_rules;
+	rte_acl_reset_rules;
+	rte_acl_build;
+	rte_acl_reset;
+	rte_acl_classify;
+	rte_acl_dump;
+	rte_acl_list_dump;
+	rte_acl_ipv4vlan_add_rules;
+	rte_acl_ipv4vlan_build;
+	rte_acl_classify_scalar;
+	rte_acl_classify_alg;
+	rte_acl_set_ctx_classify;
+
+	local: *;
+};
+
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 55e8701..a4f73de 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -39,6 +39,8 @@ LIB = librte_cfgfile.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_cfgfile_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
new file mode 100644
index 0000000..10ecea6
--- /dev/null
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_cfgfile_load;
+	rte_cfgfile_num_sections;
+	rte_cfgfile_sections;
+	rte_cfgfile_has_section;
+	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_entries;
+	rte_cfgfile_get_entry;
+	rte_cfgfile_has_entry;
+	rte_cfgfile_close;
+
+	local: *;
+};
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 7eae449..3c71831 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -36,6 +36,8 @@ LIB = librte_cmdline.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_cmdline_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
new file mode 100644
index 0000000..7616eff
--- /dev/null
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -0,0 +1,69 @@
+DPDK_1.8 {
+	global:
+	cmdline_new;
+	cmdline_set_prompt;
+	cmdline_free;
+	cmdline_printf;
+	cmdline_in;
+	cmdline_write_char;
+	cmdline_interact;
+	cmdline_quit;
+	cmdline_parse;
+	cmdline_complete;
+	cmdline_isendoftoken;
+	cmdline_parse_num;
+	cmdline_get_help_num;
+	cmdline_parse_ipaddr;
+	cmdline_get_help_ipaddr;
+	cmdline_parse_etheraddr;
+	cmdline_get_help_etheraddr;
+	cmdline_parse_string;
+	cmdline_complete_get_nb_string;
+	cmdline_complete_get_elt_string;
+	cmdline_get_help_string;
+	cmdline_parse_portlist;
+	cmdline_get_help_portlist;
+	cmdline_token_string_ops;
+	cmdline_token_num_ops;
+	cmdline_token_string_ops;
+	cmdline_token_ipaddr_ops;
+	cmdline_token_etheraddr_ops;
+	vt100_init;
+	vt100_parser;
+	cmdline_file_new;
+	cmdline_stdin_new;
+	cmdline_stdin_exit;
+	cirbuf_init;
+	cirbuf_add_head_safe;
+	cirbuf_add_head;
+	cirbuf_add_tail_safe;
+	cirbuf_add_tail;
+	cirbuf_del_head_safe;
+	cirbuf_del_head;
+	cirbuf_del_tail_safe;
+	cirbuf_del_tail;
+	cirbuf_get_head;
+	cirbuf_get_tail;
+	cirbuf_add_buf_head;
+	cirbuf_add_buf_tail;
+	cirbuf_del_buf_head;
+	cirbuf_del_buf_tail;
+	cirbuf_get_buf_head;
+	cirbuf_get_buf_tail;
+	cirbuf_align_left;
+	cirbuf_align_right;
+	rdline_init;
+	rdline_newline;
+	rdline_stop;
+	rdline_quit;
+	rdline_restart;
+	rdline_redisplay;
+	rdline_reset;
+	rdline_char_in;
+	rdline_get_buffer;
+	rdline_add_history;
+	rdline_clear_history;
+	rdline_get_history_item;
+
+	local: *;
+};
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 36699f8..3674a2c 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -37,6 +37,8 @@ LIB = librte_distributor.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_distributor_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
new file mode 100644
index 0000000..b81ddc8
--- /dev/null
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+
+	global:
+	rte_distributor_create;
+	rte_distributor_process;
+	rte_distributor_returned_pkts;
+	rte_distributor_flush;
+	rte_distributor_clear_returns;
+	rte_distributor_get_pkt;
+	rte_distributor_return_pkt;
+	rte_distributor_request_pkt;
+	rte_distributor_poll_pkt;
+
+	local: *;
+};
+
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index d434882..0b5f9d9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -46,6 +46,8 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_pcap
 CFLAGS += $(WERROR_FLAGS) -O3
 
+EXPORT_MAP := rte_eal_version.map
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..bae8af1 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -33,6 +33,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_eal.a
 
+EXPORT_MAP := rte_eal_version.map
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index a461c31..80ad78d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -39,6 +39,8 @@ LIB = libethdev.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_ether_version.map
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
new file mode 100644
index 0000000..dbd0eca
--- /dev/null
+++ b/lib/librte_ether/rte_ether_version.map
@@ -0,0 +1,113 @@
+DPDK_1.8 {
+	global:
+	rte_eth_driver_register;
+	rte_eth_dev_configure;
+	rte_eth_rx_queue_setup;
+	rte_eth_tx_queue_setup;
+	rte_eth_dev_socket_id;
+	rte_eth_dev_rx_queue_start;
+	rte_eth_dev_rx_queue_stop;
+	rte_eth_dev_tx_queue_start;
+	rte_eth_dev_tx_queue_stop;
+	rte_eth_dev_start;
+	rte_eth_dev_stop;
+	rte_eth_dev_set_link_up;
+	rte_eth_dev_set_link_down;
+	rte_eth_dev_close;
+	rte_eth_promiscuous_enable;
+	rte_eth_promiscuous_disable;
+	rte_eth_promiscuous_get;
+	rte_eth_allmulticast_enable;
+	rte_eth_allmulticast_disable;
+	rte_eth_allmulticast_get;
+	rte_eth_link;
+	rte_eth_link_get_nowait;
+	rte_eth_stats;
+	rte_eth_stats_reset;
+	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_rx_queue_stats_mapping;
+	rte_eth_macaddr_get;
+	rte_eth_dev_info_get;
+	rte_eth_dev_get_mtu;
+	rte_eth_dev_set_mtu;
+	rte_eth_dev_vlan_filter;
+	rte_eth_dev_set_vlan_strip_on_queue;
+	rte_eth_dev_set_vlan_ether_type;
+	rte_eth_dev_set_vlan_offload;
+	rte_eth_dev_get_vlan_offload;
+	rte_eth_dev_set_vlan_pvid;
+	rte_eth_rx_burst;
+	rte_eth_rx_queue_count;
+	rte_eth_rx_descriptor_done;
+	rte_eth_tx_burst;
+	rte_eth_dev_fdir_add_signature_filter;
+	rte_eth_dev_fdir_update_signature_filter;
+	rte_eth_dev_fdir_remove_signature_filter;
+	rte_eth_dev_fdir_get_infos;
+	rte_eth_dev_fdir_add_perfect_filter;
+	rte_eth_dev_fdir_update_perfect_filter;
+	rte_eth_dev_fdir_remove_perfect_filter;
+	rte_eth_dev_fdir_set_masks;
+	rte_eth_dev_callback_register;
+	rte_eth_dev_callback_unregister;
+	rte_eth_dev_callback_process;
+	rte_eth_led_on;
+	rte_eth_led_off;
+	rte_eth_dev_flow_ctrl_get;
+	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_mac_addr_add;
+	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rss_reta_query;
+	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_uc_all_hash_table_set;
+	rte_eth_dev_set_vf_rxmode;
+	rte_eth_dev_set_vf_tx;
+	rte_eth_dev_set_vf_rx;
+	rte_eth_dev_set_vf_vlan_filter;
+	rte_eth_mirror_rule_set;
+	rte_eth_mirror_rule_reset;
+	rte_eth_set_queue_rate_limit;
+	rte_eth_set_vf_rate_limit;
+	rte_eth_dev_bypass_init;
+	rte_eth_dev_bypass_state_show;
+	rte_eth_dev_bypass_state_set;
+	rte_eth_dev_bypass_event_show;
+	rte_eth_dev_bypass_event_store;
+	rte_eth_dev_wd_timeout_store;
+	rte_eth_dev_bypass_ver_show;
+	rte_eth_dev_bypass_wd_timeout_show;
+	rte_eth_dev_bypass_wd_reset;
+	rte_eth_dev_rss_hash_update;
+	rte_eth_dev_rss_hash_conf_get;
+	rte_eth_dev_add_syn_filter;
+	rte_eth_dev_remove_syn_filter;
+	rte_eth_dev_get_syn_filter;
+	rte_eth_dev_add_ethertype_filter;
+	rte_eth_dev_remove_ethertype_filter;
+	rte_eth_dev_get_ethertype_filter;
+	rte_eth_dev_add_2tuple_filter;
+	rte_eth_dev_remove_2tuple_filter;
+	rte_eth_dev_get_2tuple_filter;
+	rte_eth_dev_add_5tuple_filter;
+	rte_eth_dev_remove_5tuple_filter;
+	rte_eth_dev_get_5tuple_filter;
+	rte_eth_dev_add_flex_filter;
+	rte_eth_dev_remove_flex_filter;
+	rte_eth_dev_get_flex_filter;
+	rte_eth_dev_count;
+	rte_eth_link_get;
+	rte_eth_devices;
+	rte_eth_stats_get;
+	rte_eth_dev_allocate;
+	_rte_eth_dev_callback_process;
+	rte_eth_dev_filter_ctrl;
+	rte_eth_dev_udp_tunnel_delete;
+	rte_eth_dev_udp_tunnel_add;
+	rte_eth_xstats_get;
+	rte_eth_xstats_reset;
+	rte_eth_dev_filter_supported;
+	local: *;
+};
+
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 95e4c09..bec61ab 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -37,6 +37,8 @@ LIB = librte_hash.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_hash_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
new file mode 100644
index 0000000..2a34313
--- /dev/null
+++ b/lib/librte_hash/rte_hash_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_fbk_hash_find_existing;
+	rte_fbk_hash_create;
+	rte_fbk_hash_free;
+	rte_hash_create;
+	rte_hash_find_existing;
+	rte_hash_free;
+	rte_hash_add_key;
+	rte_hash_add_key_with_hash;
+	rte_hash_del_key;
+	rte_hash_del_key_with_hash;
+	rte_hash_lookup;
+	rte_hash_lookup_with_hash;
+	rte_hash_lookup_bulk;
+
+	local: *;
+};
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 8c00d39..aa88578 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -37,6 +37,8 @@ LIB = librte_ip_frag.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_ipfrag_version.map
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipfrag_version.map b/lib/librte_ip_frag/rte_ipfrag_version.map
new file mode 100644
index 0000000..afe1a0b
--- /dev/null
+++ b/lib/librte_ip_frag/rte_ipfrag_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_ip_frag_table_create;
+	rte_ipv6_fragment_packet;
+	rte_ipv6_frag_reassemble_packet;
+	rte_ipv4_fragment_packet;
+	rte_ipv4_frag_reassemble_packet;
+	rte_ip_frag_free_death_row;
+	rte_ip_frag_table_statistics_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 536814c..068ee10 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ivshmem.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ivshmem_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_ivshmem/rte_ivshmem_version.map b/lib/librte_ivshmem/rte_ivshmem_version.map
new file mode 100644
index 0000000..a204339
--- /dev/null
+++ b/lib/librte_ivshmem/rte_ivshmem_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_ivshmem_metadata_create;
+	rte_ivshmem_metadata_add_memzone;
+	rte_ivshmem_metadata_add_ring;
+	rte_ivshmem_metadata_add_mempool;
+	rte_ivshmem_metadata_cmdline_generate;
+	rte_ivshmem_metadata_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 5267304..93a516d 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -36,6 +36,8 @@ LIB = librte_kni.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_kni_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
new file mode 100644
index 0000000..7db39a3
--- /dev/null
+++ b/lib/librte_kni/rte_kni_version.map
@@ -0,0 +1,20 @@
+DPDK_1.8 {
+	global:
+
+	rte_kni_alloc;
+	rte_kni_create;
+	rte_kni_release;
+	rte_kni_handle_request;
+	rte_kni_rx_burst;
+	rte_kni_tx_burst;
+	rte_kni_get_port_id;
+	rte_kni_get;
+	rte_kni_info_get;
+	rte_kni_register_handlers;
+	rte_kni_unregister_handlers;
+	rte_kni_close;
+	rte_kni_init;
+
+	local: *;
+};
+
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b09359a..b1c34f3 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -38,6 +38,8 @@ LIB = librte_kvargs.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_kvargs_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
new file mode 100644
index 0000000..7873c8c
--- /dev/null
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+	rte_kvargs_parse;
+	rte_kvargs_free;
+	rte_kvargs_process;
+	rte_kvargs_count;
+
+	local: *;
+};
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index fa94163..8214630 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -37,6 +37,8 @@ LIB = librte_lpm.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_lpm_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
new file mode 100644
index 0000000..8ae9318
--- /dev/null
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -0,0 +1,24 @@
+DPDK_1.8 {
+	global:
+
+	rte_lpm_create;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_add;
+	rte_lpm_is_rule_present;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm6_create;
+	rte_lpm6_find_existing;
+	rte_lpm6_free;
+	rte_lpm6_add;
+	rte_lpm6_is_rule_present;
+	rte_lpm6_delete;
+	rte_lpm6_delete_bulk_func;
+	rte_lpm6_delete_all;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
+
+	local: *;
+};
+
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index ba87e34..15b7eed 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -36,6 +36,8 @@ LIB = librte_malloc.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_malloc_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MALLOC) := rte_malloc.c malloc_elem.c malloc_heap.c
 
diff --git a/lib/librte_malloc/rte_malloc_version.map b/lib/librte_malloc/rte_malloc_version.map
new file mode 100644
index 0000000..77db879
--- /dev/null
+++ b/lib/librte_malloc/rte_malloc_version.map
@@ -0,0 +1,19 @@
+DPDK_1.8 {
+	global:
+
+	rte_malloc;
+	rte_zmalloc;
+	rte_calloc;
+	rte_realloc;
+	rte_malloc_socket;
+	rte_zmalloc_socket;
+	rte_calloc_socket;
+	rte_free;
+	rte_malloc_validate;
+	rte_malloc_get_socket_stats;
+	rte_malloc_dump_stats;
+	rte_malloc_set_limit;
+	rte_malloc_virt2phy;
+
+	local: *;
+};
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 9b45ba4..03becae 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mbuf.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mbuf_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
new file mode 100644
index 0000000..7260507
--- /dev/null
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_mbuf_sanity_check;
+	rte_ctrlmbuf_init;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_init;
+	rte_pktmbuf_dump;
+	rte_get_rx_ol_flag_name;
+	rte_get_tx_ol_flag_name;
+
+	local: *;
+};
+
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 9939e10..31d1a71 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mempool.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mempool_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
new file mode 100644
index 0000000..7a19982
--- /dev/null
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_create;
+	rte_mempool_xmem_create;
+	rte_dom0_mempool_create;
+	rte_mempool_dump;
+	rte_mempool_audit;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
+	rte_mempool_calc_obj_size;
+	rte_mempool_xmem_size;
+	rte_mempool_xmem_usage;
+	rte_mempool_walk;
+	rte_mempool_count;
+
+	local: *;
+};
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index b25c0cc..c4a7a32 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -39,6 +39,8 @@ LIB = librte_meter.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_meter_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
new file mode 100644
index 0000000..51a73b1
--- /dev/null
+++ b/lib/librte_meter/rte_meter_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_meter_srtcm_config;
+	rte_meter_trtcm_config;
+	rte_meter_srtcm_color_blind_check;
+	rte_meter_srtcm_color_aware_check;
+	rte_meter_trtcm_color_blind_check;
+	rte_meter_trtcm_color_aware_check;
+
+	local: *;
+};
+
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf8fde8..15b58df 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pipeline.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pipeline_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
new file mode 100644
index 0000000..f868b96
--- /dev/null
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -0,0 +1,23 @@
+DPDK_1.8 {
+	global:
+
+	rte_pipeline_create;
+	rte_pipeline_free;
+	rte_pipeline_check;
+	rte_pipeline_run;
+	rte_pipeline_flush;
+	rte_pipeline_table_create;
+	rte_pipeline_table_default_entry_add;
+	rte_pipeline_table_default_entry_delete;
+	rte_pipeline_table_entry_add;
+	rte_pipeline_table_entry_delete;
+	rte_pipeline_port_in_create;
+	rte_pipeline_port_in_connect_to_table;
+	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_disable;
+	rte_pipeline_port_out_create;
+	rte_pipeline_port_out_packet_insert;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 6955e5c..85a7860 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+EXPORT_MAP := rte_pmd_af_packet_version.map
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
new file mode 100644
index 0000000..c68beae
--- /dev/null
+++ b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
@@ -0,0 +1,7 @@
+DPDK_1.8 {
+	global:
+	rte_pmd_af_packet_devinit;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index cdff126..074110a 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_bond.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_bond_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_bond/rte_eth_bond_version.map b/lib/librte_pmd_bond/rte_eth_bond_version.map
new file mode 100644
index 0000000..206b53e
--- /dev/null
+++ b/lib/librte_pmd_bond/rte_eth_bond_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+
+	rte_eth_bond_create;
+	rte_eth_bond_slave_add;
+	rte_eth_bond_slave_remove;
+	rte_eth_bond_mode_set;
+	rte_eth_bond_mode_get;
+	rte_eth_bond_primary_set;
+	rte_eth_bond_primary_get;
+	rte_eth_bond_slaves_get;
+	rte_eth_bond_active_slaves_get;
+	rte_eth_bond_mac_address_set;
+	rte_eth_bond_mac_address_reset;
+	rte_eth_bond_xmit_policy_set;
+	rte_eth_bond_xmit_policy_get;
+	rte_eth_bond_link_monitoring_set;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index 14bc4a2..cd14444 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_e1000.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_e1000_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_e1000/rte_pmd_e1000_version.map b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index a2a623f..697231c 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+EXPORT_MAP := rte_pmd_enic_version.map
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_enic/rte_pmd_enic_version.map b/lib/librte_pmd_enic/rte_pmd_enic_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_enic/rte_pmd_enic_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 98e4bdf..73de373 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_i40e.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_i40e_version.map
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_i40e/rte_pmd_i40e_version.map b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index 3588047..e0a17f6 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ixgbe.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_ixgbe_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index c5c214d..cb6678e 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_pcap.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_pcap_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_pcap/rte_pmd_pcap_version.map b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index b57e421..aa1b461 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ring.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_ring_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 4f1b6ed..df7b583 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -473,7 +473,7 @@ out:
 	return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
 	struct rte_kvargs *kvlist;
diff --git a/lib/librte_pmd_ring/rte_eth_ring.h b/lib/librte_pmd_ring/rte_eth_ring.h
index e6ae19e..d36489a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.h
+++ b/lib/librte_pmd_ring/rte_eth_ring.h
@@ -50,12 +50,6 @@ int rte_eth_from_rings(const char *name,
 int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
 int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
 
-/**
- * For use by test apps only. Called as part of EAL init to set up any dummy NICs
- * configured on command line.
- */
-int rte_pmd_ring_devinit(const char *name, const char *params);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_pmd_ring/rte_eth_ring_version.map b/lib/librte_pmd_ring/rte_eth_ring_version.map
new file mode 100644
index 0000000..5edaa3d
--- /dev/null
+++ b/lib/librte_pmd_ring/rte_eth_ring_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+
+	rte_eth_from_rings;
+	rte_eth_ring_pair_create;
+	rte_eth_ring_pair_attach;
+
+	local: *;
+};
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index 456095b..d979c59 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -39,6 +39,7 @@ LIB = librte_pmd_virtio_uio.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_virtio_version.map
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_pmd_virtio/rte_pmd_virtio_version.map b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index 6872c74..f3ab178 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -66,6 +66,8 @@ endif
 
 VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
+EXPORT_MAP := rte_pmd_vmxnet3_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 01bfcaa..4510603 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_xenvirt.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_xenvirt_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
new file mode 100644
index 0000000..66199b1
--- /dev/null
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
@@ -0,0 +1,8 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_gntalloc_create;
+
+	local: *;
+};
+
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 82b5192..266ed39 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -39,6 +39,8 @@ LIB = librte_port.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_port_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
new file mode 100644
index 0000000..57ccaa3
--- /dev/null
+++ b/lib/librte_port/rte_port_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_ops;
+	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_sched_reader_ops;
+	rte_port_sched_writer_ops;
+	rte_port_source_ops;
+	rte_port_sink_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index d672a5a..0547dcd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -36,6 +36,8 @@ LIB = librte_power.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_power_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
new file mode 100644
index 0000000..061bca7
--- /dev/null
+++ b/lib/librte_power/rte_power_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_power_init;
+	rte_power_exit;
+	rte_power_freqs;
+	rte_power_get_freq;
+	rte_power_set_freq;
+	rte_power_freq_up;
+	rte_power_freq_down;
+	rte_power_freq_max;
+	rte_power_freq_min;
+	rte_power_set_env;
+	rte_power_get_env;
+	rte_power_unset_env;
+	
+	local: *;
+};
+
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 2380a43..b437dc5 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ring.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ring_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
new file mode 100644
index 0000000..6c28af9
--- /dev/null
+++ b/lib/librte_ring/rte_ring_version.map
@@ -0,0 +1,12 @@
+DPDK_1.8 {
+	global:
+	rte_ring_get_memsize;
+	rte_ring_init;
+	rte_ring_create;
+	rte_ring_set_water_mark;
+	rte_ring_dump;
+	rte_ring_list_dump;
+	rte_ring_lookup;
+
+	local: *;
+};
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 1a25b21..48f280a 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 CFLAGS_rte_red.o := -D_GNU_SOURCE
 
+EXPORT_MAP := rte_sched_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
new file mode 100644
index 0000000..b5877ce
--- /dev/null
+++ b/lib/librte_sched/rte_sched_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_approx;
+	rte_red_rt_data_init;
+	rte_red_config_init;
+	rte_sched_port_config;
+	rte_sched_port_free;
+	rte_sched_subport_config;
+	rte_sched_pipe_config;
+	rte_sched_port_get_memory_footprint;
+	rte_sched_subport_read_stats;
+	rte_sched_queue_read_stats;
+	rte_sched_port_enqueue;
+	rte_sched_port_dequeue;
+	rte_red_log2_1_minus_Wq;
+	rte_red_pow2_frac_inv;
+	rte_red_rand_val;
+	rte_red_rand_seed;
+
+	local: *;
+};
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index dd684cc..4e1a54a 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -39,6 +39,8 @@ LIB = librte_table.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_table_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
new file mode 100644
index 0000000..86f16b8
--- /dev/null
+++ b/lib/librte_table/rte_table_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_table_stub_ops;
+	rte_table_lpm_ops;
+	rte_table_array_ops;
+	rte_table_hash_key8_lru_ops;
+	rte_table_hash_key8_lru_dosig_ops;
+	rte_table_hash_key8_ext_ops;
+	rte_table_hash_key8_ext_dosig_ops;
+	rte_table_lpm_ipv6_ops;
+	rte_table_hash_key16_lru_ops;
+	rte_table_hash_key32_lru_ops;
+	rte_table_hash_key16_ext_ops;
+	rte_table_hash_key32_ext_ops;
+	rte_table_acl_ops;
+	rte_table_hash_lru_ops;
+	rte_table_hash_ext_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 07eb0c6..9fb6079 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -36,6 +36,8 @@ LIB = librte_timer.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_timer_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
new file mode 100644
index 0000000..00b6b52
--- /dev/null
+++ b/lib/librte_timer/rte_timer_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+	global:
+
+	rte_timer_subsystem_init;
+	rte_timer_init;
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_stop;
+	rte_timer_stop_sync;
+	rte_timer_pending;
+	rte_timer_manage;
+	rte_timer_dump_stats;
+
+	local: *;
+};
+
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index c008d64..96a7dd0 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+EXPORT_MAP := rte_vhost_version.map
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
new file mode 100644
index 0000000..7685bb8
--- /dev/null
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_vhost_feature_disable;
+	rte_vhost_feature_enable;
+	rte_vhost_feature_get;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_driver_register;
+	rte_vhost_driver_callback_register;
+	rte_vhost_driver_session_start;
+	rte_vhost_enqueue_burst;
+	rte_vhost_dequeue_burst;
+
+	local: *;
+};
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v4 3/4] Add library version extenstion
  2015-01-15 19:35 ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2015-01-15 19:35   ` Neil Horman
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation Neil Horman
  2015-01-30 17:13   ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Gray, Mark D
  3 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation
  2015-01-15 19:35 ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 3/4] Add library version extenstion Neil Horman
@ 2015-01-15 19:35   ` Neil Horman
  2015-01-30 17:13   ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Gray, Mark D
  3 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2015-01-14 20:07       ` Neil Horman
@ 2015-01-16 13:34         ` Thomas Monjalon
  0 siblings, 0 replies; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-16 13:34 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-14 15:07, Neil Horman:
> On Wed, Jan 14, 2015 at 04:59:51PM +0100, Thomas Monjalon wrote:
> > 2014-12-23 10:51, Neil Horman:
> > > Adding a document describing rudimentary ABI policy and adding notice space for
> > > any deprecation announcements
> > 
> > We had a good discussion about the policy and its impact:
> > 	http://thread.gmane.org/gmane.comp.networking.dpdk.devel/8367/focus=8461
> > Sadly nobody else discussed it.
> > I think we should integrate some of the conclusions in this documentation.
> > 
> I'm certainly open to that.  However, I felt like that conversation centered
> more around the debate for the need for ABI versioning, not the mechanics
> thereof.  Are there specific sections of that conversation that you are looking
> to incorporate, or specific topics?

Yes.
In the point number 2, you suggest to skip ABI compatibility (after a
deprecation schedule) for big changes.
In the point 3, you suggest to add new fields at the end of the structure,
even if it's asthetic, with exceptions if performance impact.

Thank you
-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v5 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (7 preceding siblings ...)
  2015-01-15 19:35 ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-16 15:33 ` Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (2 more replies)
  2015-01-20 21:17 ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (5 subsequent siblings)
  14 siblings, 3 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v5 2/4] Provide initial versioning for all DPDK libraries
  2015-01-16 15:33 ` [dpdk-dev] [PATCH v5 " Neil Horman
@ 2015-01-16 15:33   ` Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 3/4] Add library version extenstion Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

Add linker version script files to each DPDK library to put a stake in the
ground from which we can start cleaning up API's

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:

v2)
	* Updated export map to not require full path
---
 lib/librte_acl/Makefile                            |   2 +
 lib/librte_acl/rte_acl_version.map                 |  21 ++++
 lib/librte_cfgfile/Makefile                        |   2 +
 lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
 lib/librte_cmdline/Makefile                        |   2 +
 lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
 lib/librte_distributor/Makefile                    |   2 +
 lib/librte_distributor/rte_distributor_version.map |  16 +++
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
 lib/librte_ether/Makefile                          |   2 +
 lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
 lib/librte_hash/Makefile                           |   2 +
 lib/librte_hash/rte_hash_version.map               |  18 ++++
 lib/librte_ip_frag/Makefile                        |   2 +
 lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
 lib/librte_ivshmem/Makefile                        |   2 +
 lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
 lib/librte_kni/Makefile                            |   2 +
 lib/librte_kni/rte_kni_version.map                 |  20 ++++
 lib/librte_kvargs/Makefile                         |   2 +
 lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
 lib/librte_lpm/Makefile                            |   2 +
 lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
 lib/librte_malloc/Makefile                         |   2 +
 lib/librte_malloc/rte_malloc_version.map           |  19 ++++
 lib/librte_mbuf/Makefile                           |   2 +
 lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
 lib/librte_mempool/Makefile                        |   2 +
 lib/librte_mempool/rte_mempool_version.map         |  18 ++++
 lib/librte_meter/Makefile                          |   2 +
 lib/librte_meter/rte_meter_version.map             |  13 +++
 lib/librte_pipeline/Makefile                       |   2 +
 lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
 lib/librte_pmd_af_packet/Makefile                  |   2 +
 .../rte_pmd_af_packet_version.map                  |   7 ++
 lib/librte_pmd_bond/Makefile                       |   2 +
 lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
 lib/librte_pmd_e1000/Makefile                      |   2 +
 lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
 lib/librte_pmd_enic/Makefile                       |   2 +
 lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
 lib/librte_pmd_i40e/Makefile                       |   2 +
 lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
 lib/librte_pmd_ixgbe/Makefile                      |   2 +
 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
 lib/librte_pmd_pcap/Makefile                       |   2 +
 lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
 lib/librte_pmd_ring/Makefile                       |   2 +
 lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
 lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
 lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
 lib/librte_pmd_virtio/Makefile                     |   1 +
 lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
 lib/librte_pmd_vmxnet3/Makefile                    |   2 +
 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
 lib/librte_pmd_xenvirt/Makefile                    |   2 +
 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
 lib/librte_port/Makefile                           |   2 +
 lib/librte_port/rte_port_version.map               |  18 ++++
 lib/librte_power/Makefile                          |   2 +
 lib/librte_power/rte_power_version.map             |  18 ++++
 lib/librte_ring/Makefile                           |   2 +
 lib/librte_ring/rte_ring_version.map               |  12 +++
 lib/librte_sched/Makefile                          |   2 +
 lib/librte_sched/rte_sched_version.map             |  22 ++++
 lib/librte_table/Makefile                          |   2 +
 lib/librte_table/rte_table_version.map             |  22 ++++
 lib/librte_timer/Makefile                          |   2 +
 lib/librte_timer/rte_timer_version.map             |  16 +++
 lib/librte_vhost/Makefile                          |   2 +
 lib/librte_vhost/rte_vhost_version.map             |  14 +++
 74 files changed, 874 insertions(+), 7 deletions(-)
 create mode 100644 lib/librte_acl/rte_acl_version.map
 create mode 100644 lib/librte_cfgfile/rte_cfgfile_version.map
 create mode 100644 lib/librte_cmdline/rte_cmdline_version.map
 create mode 100644 lib/librte_distributor/rte_distributor_version.map
 create mode 100644 lib/librte_eal/bsdapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_eal/linuxapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_ether/rte_ether_version.map
 create mode 100644 lib/librte_hash/rte_hash_version.map
 create mode 100644 lib/librte_ip_frag/rte_ipfrag_version.map
 create mode 100644 lib/librte_ivshmem/rte_ivshmem_version.map
 create mode 100644 lib/librte_kni/rte_kni_version.map
 create mode 100644 lib/librte_kvargs/rte_kvargs_version.map
 create mode 100644 lib/librte_lpm/rte_lpm_version.map
 create mode 100644 lib/librte_malloc/rte_malloc_version.map
 create mode 100644 lib/librte_mbuf/rte_mbuf_version.map
 create mode 100644 lib/librte_mempool/rte_mempool_version.map
 create mode 100644 lib/librte_meter/rte_meter_version.map
 create mode 100644 lib/librte_pipeline/rte_pipeline_version.map
 create mode 100644 lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 create mode 100644 lib/librte_pmd_bond/rte_eth_bond_version.map
 create mode 100644 lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 create mode 100644 lib/librte_pmd_enic/rte_pmd_enic_version.map
 create mode 100644 lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 create mode 100644 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 create mode 100644 lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 create mode 100644 lib/librte_pmd_ring/rte_eth_ring_version.map
 create mode 100644 lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 create mode 100644 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 create mode 100644 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 create mode 100644 lib/librte_port/rte_port_version.map
 create mode 100644 lib/librte_power/rte_power_version.map
 create mode 100644 lib/librte_ring/rte_ring_version.map
 create mode 100644 lib/librte_sched/rte_sched_version.map
 create mode 100644 lib/librte_table/rte_table_version.map
 create mode 100644 lib/librte_timer/rte_timer_version.map
 create mode 100644 lib/librte_vhost/rte_vhost_version.map

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 65e566d..45cbf80 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -37,6 +37,8 @@ LIB = librte_acl.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_acl_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
new file mode 100644
index 0000000..9f05a86
--- /dev/null
+++ b/lib/librte_acl/rte_acl_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+	rte_acl_create;
+	rte_acl_find_existing;
+	rte_acl_free;
+	rte_acl_add_rules;
+	rte_acl_reset_rules;
+	rte_acl_build;
+	rte_acl_reset;
+	rte_acl_classify;
+	rte_acl_dump;
+	rte_acl_list_dump;
+	rte_acl_ipv4vlan_add_rules;
+	rte_acl_ipv4vlan_build;
+	rte_acl_classify_scalar;
+	rte_acl_classify_alg;
+	rte_acl_set_ctx_classify;
+
+	local: *;
+};
+
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 55e8701..a4f73de 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -39,6 +39,8 @@ LIB = librte_cfgfile.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_cfgfile_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
new file mode 100644
index 0000000..10ecea6
--- /dev/null
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_cfgfile_load;
+	rte_cfgfile_num_sections;
+	rte_cfgfile_sections;
+	rte_cfgfile_has_section;
+	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_entries;
+	rte_cfgfile_get_entry;
+	rte_cfgfile_has_entry;
+	rte_cfgfile_close;
+
+	local: *;
+};
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 7eae449..3c71831 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -36,6 +36,8 @@ LIB = librte_cmdline.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_cmdline_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
new file mode 100644
index 0000000..7616eff
--- /dev/null
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -0,0 +1,69 @@
+DPDK_1.8 {
+	global:
+	cmdline_new;
+	cmdline_set_prompt;
+	cmdline_free;
+	cmdline_printf;
+	cmdline_in;
+	cmdline_write_char;
+	cmdline_interact;
+	cmdline_quit;
+	cmdline_parse;
+	cmdline_complete;
+	cmdline_isendoftoken;
+	cmdline_parse_num;
+	cmdline_get_help_num;
+	cmdline_parse_ipaddr;
+	cmdline_get_help_ipaddr;
+	cmdline_parse_etheraddr;
+	cmdline_get_help_etheraddr;
+	cmdline_parse_string;
+	cmdline_complete_get_nb_string;
+	cmdline_complete_get_elt_string;
+	cmdline_get_help_string;
+	cmdline_parse_portlist;
+	cmdline_get_help_portlist;
+	cmdline_token_string_ops;
+	cmdline_token_num_ops;
+	cmdline_token_string_ops;
+	cmdline_token_ipaddr_ops;
+	cmdline_token_etheraddr_ops;
+	vt100_init;
+	vt100_parser;
+	cmdline_file_new;
+	cmdline_stdin_new;
+	cmdline_stdin_exit;
+	cirbuf_init;
+	cirbuf_add_head_safe;
+	cirbuf_add_head;
+	cirbuf_add_tail_safe;
+	cirbuf_add_tail;
+	cirbuf_del_head_safe;
+	cirbuf_del_head;
+	cirbuf_del_tail_safe;
+	cirbuf_del_tail;
+	cirbuf_get_head;
+	cirbuf_get_tail;
+	cirbuf_add_buf_head;
+	cirbuf_add_buf_tail;
+	cirbuf_del_buf_head;
+	cirbuf_del_buf_tail;
+	cirbuf_get_buf_head;
+	cirbuf_get_buf_tail;
+	cirbuf_align_left;
+	cirbuf_align_right;
+	rdline_init;
+	rdline_newline;
+	rdline_stop;
+	rdline_quit;
+	rdline_restart;
+	rdline_redisplay;
+	rdline_reset;
+	rdline_char_in;
+	rdline_get_buffer;
+	rdline_add_history;
+	rdline_clear_history;
+	rdline_get_history_item;
+
+	local: *;
+};
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 36699f8..3674a2c 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -37,6 +37,8 @@ LIB = librte_distributor.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_distributor_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
new file mode 100644
index 0000000..b81ddc8
--- /dev/null
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+
+	global:
+	rte_distributor_create;
+	rte_distributor_process;
+	rte_distributor_returned_pkts;
+	rte_distributor_flush;
+	rte_distributor_clear_returns;
+	rte_distributor_get_pkt;
+	rte_distributor_return_pkt;
+	rte_distributor_request_pkt;
+	rte_distributor_poll_pkt;
+
+	local: *;
+};
+
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index d434882..0b5f9d9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -46,6 +46,8 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_pcap
 CFLAGS += $(WERROR_FLAGS) -O3
 
+EXPORT_MAP := rte_eal_version.map
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..bae8af1 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -33,6 +33,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_eal.a
 
+EXPORT_MAP := rte_eal_version.map
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index a461c31..80ad78d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -39,6 +39,8 @@ LIB = libethdev.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_ether_version.map
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
new file mode 100644
index 0000000..dbd0eca
--- /dev/null
+++ b/lib/librte_ether/rte_ether_version.map
@@ -0,0 +1,113 @@
+DPDK_1.8 {
+	global:
+	rte_eth_driver_register;
+	rte_eth_dev_configure;
+	rte_eth_rx_queue_setup;
+	rte_eth_tx_queue_setup;
+	rte_eth_dev_socket_id;
+	rte_eth_dev_rx_queue_start;
+	rte_eth_dev_rx_queue_stop;
+	rte_eth_dev_tx_queue_start;
+	rte_eth_dev_tx_queue_stop;
+	rte_eth_dev_start;
+	rte_eth_dev_stop;
+	rte_eth_dev_set_link_up;
+	rte_eth_dev_set_link_down;
+	rte_eth_dev_close;
+	rte_eth_promiscuous_enable;
+	rte_eth_promiscuous_disable;
+	rte_eth_promiscuous_get;
+	rte_eth_allmulticast_enable;
+	rte_eth_allmulticast_disable;
+	rte_eth_allmulticast_get;
+	rte_eth_link;
+	rte_eth_link_get_nowait;
+	rte_eth_stats;
+	rte_eth_stats_reset;
+	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_rx_queue_stats_mapping;
+	rte_eth_macaddr_get;
+	rte_eth_dev_info_get;
+	rte_eth_dev_get_mtu;
+	rte_eth_dev_set_mtu;
+	rte_eth_dev_vlan_filter;
+	rte_eth_dev_set_vlan_strip_on_queue;
+	rte_eth_dev_set_vlan_ether_type;
+	rte_eth_dev_set_vlan_offload;
+	rte_eth_dev_get_vlan_offload;
+	rte_eth_dev_set_vlan_pvid;
+	rte_eth_rx_burst;
+	rte_eth_rx_queue_count;
+	rte_eth_rx_descriptor_done;
+	rte_eth_tx_burst;
+	rte_eth_dev_fdir_add_signature_filter;
+	rte_eth_dev_fdir_update_signature_filter;
+	rte_eth_dev_fdir_remove_signature_filter;
+	rte_eth_dev_fdir_get_infos;
+	rte_eth_dev_fdir_add_perfect_filter;
+	rte_eth_dev_fdir_update_perfect_filter;
+	rte_eth_dev_fdir_remove_perfect_filter;
+	rte_eth_dev_fdir_set_masks;
+	rte_eth_dev_callback_register;
+	rte_eth_dev_callback_unregister;
+	rte_eth_dev_callback_process;
+	rte_eth_led_on;
+	rte_eth_led_off;
+	rte_eth_dev_flow_ctrl_get;
+	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_mac_addr_add;
+	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rss_reta_query;
+	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_uc_all_hash_table_set;
+	rte_eth_dev_set_vf_rxmode;
+	rte_eth_dev_set_vf_tx;
+	rte_eth_dev_set_vf_rx;
+	rte_eth_dev_set_vf_vlan_filter;
+	rte_eth_mirror_rule_set;
+	rte_eth_mirror_rule_reset;
+	rte_eth_set_queue_rate_limit;
+	rte_eth_set_vf_rate_limit;
+	rte_eth_dev_bypass_init;
+	rte_eth_dev_bypass_state_show;
+	rte_eth_dev_bypass_state_set;
+	rte_eth_dev_bypass_event_show;
+	rte_eth_dev_bypass_event_store;
+	rte_eth_dev_wd_timeout_store;
+	rte_eth_dev_bypass_ver_show;
+	rte_eth_dev_bypass_wd_timeout_show;
+	rte_eth_dev_bypass_wd_reset;
+	rte_eth_dev_rss_hash_update;
+	rte_eth_dev_rss_hash_conf_get;
+	rte_eth_dev_add_syn_filter;
+	rte_eth_dev_remove_syn_filter;
+	rte_eth_dev_get_syn_filter;
+	rte_eth_dev_add_ethertype_filter;
+	rte_eth_dev_remove_ethertype_filter;
+	rte_eth_dev_get_ethertype_filter;
+	rte_eth_dev_add_2tuple_filter;
+	rte_eth_dev_remove_2tuple_filter;
+	rte_eth_dev_get_2tuple_filter;
+	rte_eth_dev_add_5tuple_filter;
+	rte_eth_dev_remove_5tuple_filter;
+	rte_eth_dev_get_5tuple_filter;
+	rte_eth_dev_add_flex_filter;
+	rte_eth_dev_remove_flex_filter;
+	rte_eth_dev_get_flex_filter;
+	rte_eth_dev_count;
+	rte_eth_link_get;
+	rte_eth_devices;
+	rte_eth_stats_get;
+	rte_eth_dev_allocate;
+	_rte_eth_dev_callback_process;
+	rte_eth_dev_filter_ctrl;
+	rte_eth_dev_udp_tunnel_delete;
+	rte_eth_dev_udp_tunnel_add;
+	rte_eth_xstats_get;
+	rte_eth_xstats_reset;
+	rte_eth_dev_filter_supported;
+	local: *;
+};
+
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 95e4c09..bec61ab 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -37,6 +37,8 @@ LIB = librte_hash.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_hash_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
new file mode 100644
index 0000000..2a34313
--- /dev/null
+++ b/lib/librte_hash/rte_hash_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_fbk_hash_find_existing;
+	rte_fbk_hash_create;
+	rte_fbk_hash_free;
+	rte_hash_create;
+	rte_hash_find_existing;
+	rte_hash_free;
+	rte_hash_add_key;
+	rte_hash_add_key_with_hash;
+	rte_hash_del_key;
+	rte_hash_del_key_with_hash;
+	rte_hash_lookup;
+	rte_hash_lookup_with_hash;
+	rte_hash_lookup_bulk;
+
+	local: *;
+};
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 8c00d39..aa88578 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -37,6 +37,8 @@ LIB = librte_ip_frag.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_ipfrag_version.map
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipfrag_version.map b/lib/librte_ip_frag/rte_ipfrag_version.map
new file mode 100644
index 0000000..afe1a0b
--- /dev/null
+++ b/lib/librte_ip_frag/rte_ipfrag_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_ip_frag_table_create;
+	rte_ipv6_fragment_packet;
+	rte_ipv6_frag_reassemble_packet;
+	rte_ipv4_fragment_packet;
+	rte_ipv4_frag_reassemble_packet;
+	rte_ip_frag_free_death_row;
+	rte_ip_frag_table_statistics_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 536814c..068ee10 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ivshmem.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ivshmem_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_ivshmem/rte_ivshmem_version.map b/lib/librte_ivshmem/rte_ivshmem_version.map
new file mode 100644
index 0000000..a204339
--- /dev/null
+++ b/lib/librte_ivshmem/rte_ivshmem_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_ivshmem_metadata_create;
+	rte_ivshmem_metadata_add_memzone;
+	rte_ivshmem_metadata_add_ring;
+	rte_ivshmem_metadata_add_mempool;
+	rte_ivshmem_metadata_cmdline_generate;
+	rte_ivshmem_metadata_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 5267304..93a516d 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -36,6 +36,8 @@ LIB = librte_kni.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_kni_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
new file mode 100644
index 0000000..7db39a3
--- /dev/null
+++ b/lib/librte_kni/rte_kni_version.map
@@ -0,0 +1,20 @@
+DPDK_1.8 {
+	global:
+
+	rte_kni_alloc;
+	rte_kni_create;
+	rte_kni_release;
+	rte_kni_handle_request;
+	rte_kni_rx_burst;
+	rte_kni_tx_burst;
+	rte_kni_get_port_id;
+	rte_kni_get;
+	rte_kni_info_get;
+	rte_kni_register_handlers;
+	rte_kni_unregister_handlers;
+	rte_kni_close;
+	rte_kni_init;
+
+	local: *;
+};
+
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b09359a..b1c34f3 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -38,6 +38,8 @@ LIB = librte_kvargs.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_kvargs_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
new file mode 100644
index 0000000..7873c8c
--- /dev/null
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+	rte_kvargs_parse;
+	rte_kvargs_free;
+	rte_kvargs_process;
+	rte_kvargs_count;
+
+	local: *;
+};
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index fa94163..8214630 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -37,6 +37,8 @@ LIB = librte_lpm.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_lpm_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
new file mode 100644
index 0000000..8ae9318
--- /dev/null
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -0,0 +1,24 @@
+DPDK_1.8 {
+	global:
+
+	rte_lpm_create;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_add;
+	rte_lpm_is_rule_present;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm6_create;
+	rte_lpm6_find_existing;
+	rte_lpm6_free;
+	rte_lpm6_add;
+	rte_lpm6_is_rule_present;
+	rte_lpm6_delete;
+	rte_lpm6_delete_bulk_func;
+	rte_lpm6_delete_all;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
+
+	local: *;
+};
+
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index ba87e34..15b7eed 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -36,6 +36,8 @@ LIB = librte_malloc.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_malloc_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MALLOC) := rte_malloc.c malloc_elem.c malloc_heap.c
 
diff --git a/lib/librte_malloc/rte_malloc_version.map b/lib/librte_malloc/rte_malloc_version.map
new file mode 100644
index 0000000..77db879
--- /dev/null
+++ b/lib/librte_malloc/rte_malloc_version.map
@@ -0,0 +1,19 @@
+DPDK_1.8 {
+	global:
+
+	rte_malloc;
+	rte_zmalloc;
+	rte_calloc;
+	rte_realloc;
+	rte_malloc_socket;
+	rte_zmalloc_socket;
+	rte_calloc_socket;
+	rte_free;
+	rte_malloc_validate;
+	rte_malloc_get_socket_stats;
+	rte_malloc_dump_stats;
+	rte_malloc_set_limit;
+	rte_malloc_virt2phy;
+
+	local: *;
+};
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 9b45ba4..03becae 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mbuf.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mbuf_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
new file mode 100644
index 0000000..7260507
--- /dev/null
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_mbuf_sanity_check;
+	rte_ctrlmbuf_init;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_init;
+	rte_pktmbuf_dump;
+	rte_get_rx_ol_flag_name;
+	rte_get_tx_ol_flag_name;
+
+	local: *;
+};
+
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 9939e10..31d1a71 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mempool.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mempool_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
new file mode 100644
index 0000000..7a19982
--- /dev/null
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_create;
+	rte_mempool_xmem_create;
+	rte_dom0_mempool_create;
+	rte_mempool_dump;
+	rte_mempool_audit;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
+	rte_mempool_calc_obj_size;
+	rte_mempool_xmem_size;
+	rte_mempool_xmem_usage;
+	rte_mempool_walk;
+	rte_mempool_count;
+
+	local: *;
+};
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index b25c0cc..c4a7a32 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -39,6 +39,8 @@ LIB = librte_meter.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_meter_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
new file mode 100644
index 0000000..51a73b1
--- /dev/null
+++ b/lib/librte_meter/rte_meter_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_meter_srtcm_config;
+	rte_meter_trtcm_config;
+	rte_meter_srtcm_color_blind_check;
+	rte_meter_srtcm_color_aware_check;
+	rte_meter_trtcm_color_blind_check;
+	rte_meter_trtcm_color_aware_check;
+
+	local: *;
+};
+
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf8fde8..15b58df 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pipeline.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pipeline_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
new file mode 100644
index 0000000..f868b96
--- /dev/null
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -0,0 +1,23 @@
+DPDK_1.8 {
+	global:
+
+	rte_pipeline_create;
+	rte_pipeline_free;
+	rte_pipeline_check;
+	rte_pipeline_run;
+	rte_pipeline_flush;
+	rte_pipeline_table_create;
+	rte_pipeline_table_default_entry_add;
+	rte_pipeline_table_default_entry_delete;
+	rte_pipeline_table_entry_add;
+	rte_pipeline_table_entry_delete;
+	rte_pipeline_port_in_create;
+	rte_pipeline_port_in_connect_to_table;
+	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_disable;
+	rte_pipeline_port_out_create;
+	rte_pipeline_port_out_packet_insert;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 6955e5c..85a7860 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+EXPORT_MAP := rte_pmd_af_packet_version.map
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
new file mode 100644
index 0000000..c68beae
--- /dev/null
+++ b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
@@ -0,0 +1,7 @@
+DPDK_1.8 {
+	global:
+	rte_pmd_af_packet_devinit;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index cdff126..074110a 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_bond.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_bond_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_bond/rte_eth_bond_version.map b/lib/librte_pmd_bond/rte_eth_bond_version.map
new file mode 100644
index 0000000..206b53e
--- /dev/null
+++ b/lib/librte_pmd_bond/rte_eth_bond_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+
+	rte_eth_bond_create;
+	rte_eth_bond_slave_add;
+	rte_eth_bond_slave_remove;
+	rte_eth_bond_mode_set;
+	rte_eth_bond_mode_get;
+	rte_eth_bond_primary_set;
+	rte_eth_bond_primary_get;
+	rte_eth_bond_slaves_get;
+	rte_eth_bond_active_slaves_get;
+	rte_eth_bond_mac_address_set;
+	rte_eth_bond_mac_address_reset;
+	rte_eth_bond_xmit_policy_set;
+	rte_eth_bond_xmit_policy_get;
+	rte_eth_bond_link_monitoring_set;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index 14bc4a2..cd14444 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_e1000.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_e1000_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_e1000/rte_pmd_e1000_version.map b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index a2a623f..697231c 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+EXPORT_MAP := rte_pmd_enic_version.map
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_enic/rte_pmd_enic_version.map b/lib/librte_pmd_enic/rte_pmd_enic_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_enic/rte_pmd_enic_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 98e4bdf..73de373 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_i40e.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_i40e_version.map
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_i40e/rte_pmd_i40e_version.map b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index 3588047..e0a17f6 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ixgbe.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_ixgbe_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index c5c214d..cb6678e 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_pcap.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_pcap_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_pcap/rte_pmd_pcap_version.map b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index b57e421..aa1b461 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ring.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_ring_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 4f1b6ed..df7b583 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -473,7 +473,7 @@ out:
 	return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
 	struct rte_kvargs *kvlist;
diff --git a/lib/librte_pmd_ring/rte_eth_ring.h b/lib/librte_pmd_ring/rte_eth_ring.h
index e6ae19e..d36489a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.h
+++ b/lib/librte_pmd_ring/rte_eth_ring.h
@@ -50,12 +50,6 @@ int rte_eth_from_rings(const char *name,
 int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
 int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
 
-/**
- * For use by test apps only. Called as part of EAL init to set up any dummy NICs
- * configured on command line.
- */
-int rte_pmd_ring_devinit(const char *name, const char *params);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_pmd_ring/rte_eth_ring_version.map b/lib/librte_pmd_ring/rte_eth_ring_version.map
new file mode 100644
index 0000000..5edaa3d
--- /dev/null
+++ b/lib/librte_pmd_ring/rte_eth_ring_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+
+	rte_eth_from_rings;
+	rte_eth_ring_pair_create;
+	rte_eth_ring_pair_attach;
+
+	local: *;
+};
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index 456095b..d979c59 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -39,6 +39,7 @@ LIB = librte_pmd_virtio_uio.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_virtio_version.map
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_pmd_virtio/rte_pmd_virtio_version.map b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index 6872c74..f3ab178 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -66,6 +66,8 @@ endif
 
 VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
+EXPORT_MAP := rte_pmd_vmxnet3_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 01bfcaa..4510603 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_xenvirt.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_xenvirt_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
new file mode 100644
index 0000000..66199b1
--- /dev/null
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
@@ -0,0 +1,8 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_gntalloc_create;
+
+	local: *;
+};
+
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 82b5192..266ed39 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -39,6 +39,8 @@ LIB = librte_port.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_port_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
new file mode 100644
index 0000000..57ccaa3
--- /dev/null
+++ b/lib/librte_port/rte_port_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_ops;
+	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_sched_reader_ops;
+	rte_port_sched_writer_ops;
+	rte_port_source_ops;
+	rte_port_sink_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index d672a5a..0547dcd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -36,6 +36,8 @@ LIB = librte_power.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_power_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
new file mode 100644
index 0000000..061bca7
--- /dev/null
+++ b/lib/librte_power/rte_power_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_power_init;
+	rte_power_exit;
+	rte_power_freqs;
+	rte_power_get_freq;
+	rte_power_set_freq;
+	rte_power_freq_up;
+	rte_power_freq_down;
+	rte_power_freq_max;
+	rte_power_freq_min;
+	rte_power_set_env;
+	rte_power_get_env;
+	rte_power_unset_env;
+	
+	local: *;
+};
+
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 2380a43..b437dc5 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ring.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ring_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
new file mode 100644
index 0000000..6c28af9
--- /dev/null
+++ b/lib/librte_ring/rte_ring_version.map
@@ -0,0 +1,12 @@
+DPDK_1.8 {
+	global:
+	rte_ring_get_memsize;
+	rte_ring_init;
+	rte_ring_create;
+	rte_ring_set_water_mark;
+	rte_ring_dump;
+	rte_ring_list_dump;
+	rte_ring_lookup;
+
+	local: *;
+};
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 1a25b21..48f280a 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 CFLAGS_rte_red.o := -D_GNU_SOURCE
 
+EXPORT_MAP := rte_sched_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
new file mode 100644
index 0000000..b5877ce
--- /dev/null
+++ b/lib/librte_sched/rte_sched_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_approx;
+	rte_red_rt_data_init;
+	rte_red_config_init;
+	rte_sched_port_config;
+	rte_sched_port_free;
+	rte_sched_subport_config;
+	rte_sched_pipe_config;
+	rte_sched_port_get_memory_footprint;
+	rte_sched_subport_read_stats;
+	rte_sched_queue_read_stats;
+	rte_sched_port_enqueue;
+	rte_sched_port_dequeue;
+	rte_red_log2_1_minus_Wq;
+	rte_red_pow2_frac_inv;
+	rte_red_rand_val;
+	rte_red_rand_seed;
+
+	local: *;
+};
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index dd684cc..4e1a54a 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -39,6 +39,8 @@ LIB = librte_table.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_table_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
new file mode 100644
index 0000000..86f16b8
--- /dev/null
+++ b/lib/librte_table/rte_table_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_table_stub_ops;
+	rte_table_lpm_ops;
+	rte_table_array_ops;
+	rte_table_hash_key8_lru_ops;
+	rte_table_hash_key8_lru_dosig_ops;
+	rte_table_hash_key8_ext_ops;
+	rte_table_hash_key8_ext_dosig_ops;
+	rte_table_lpm_ipv6_ops;
+	rte_table_hash_key16_lru_ops;
+	rte_table_hash_key32_lru_ops;
+	rte_table_hash_key16_ext_ops;
+	rte_table_hash_key32_ext_ops;
+	rte_table_acl_ops;
+	rte_table_hash_lru_ops;
+	rte_table_hash_ext_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 07eb0c6..9fb6079 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -36,6 +36,8 @@ LIB = librte_timer.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_timer_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
new file mode 100644
index 0000000..00b6b52
--- /dev/null
+++ b/lib/librte_timer/rte_timer_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+	global:
+
+	rte_timer_subsystem_init;
+	rte_timer_init;
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_stop;
+	rte_timer_stop_sync;
+	rte_timer_pending;
+	rte_timer_manage;
+	rte_timer_dump_stats;
+
+	local: *;
+};
+
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index c008d64..96a7dd0 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+EXPORT_MAP := rte_vhost_version.map
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
new file mode 100644
index 0000000..7685bb8
--- /dev/null
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_vhost_feature_disable;
+	rte_vhost_feature_enable;
+	rte_vhost_feature_get;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_driver_register;
+	rte_vhost_driver_callback_register;
+	rte_vhost_driver_session_start;
+	rte_vhost_enqueue_burst;
+	rte_vhost_dequeue_burst;
+
+	local: *;
+};
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v5 3/4] Add library version extenstion
  2015-01-16 15:33 ` [dpdk-dev] [PATCH v5 " Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2015-01-16 15:33   ` Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-16 15:33 ` [dpdk-dev] [PATCH v5 " Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 3/4] Add library version extenstion Neil Horman
@ 2015-01-16 15:33   ` Neil Horman
  2015-01-20  7:14     ` Thomas Monjalon
  2015-01-20 14:00     ` Thomas Monjalon
  2 siblings, 2 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change notes:

v5) Updated documentation to add notes from Thomas M.
---
 doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..14be464
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,36 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+	Some ABI changes may be too significant to reasonably maintain multiple
+versions of.  In those events ABI's may be updated without backward
+compatibility provided.  The requirements for doing so are:
+	1) At least 3 acknoweldgements of the need on the dpdk.org
+	2) A full deprecation cycle must be made to offer downstream consumers
+sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
+the change is proposed, a deprecation notice must be added to this file, and
+released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
+	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
+incorporated must be incremented in parallel with the ABI changes themselves
+
+	Note that the above process for ABI deprecation should not be undertaken
+lightly.  ABI stability is extreemely important for downstream consumers of the
+DPDK, especially when distributed in shared object form.  Every effort should be
+made to preserve ABI whenever possible.  For instance, reorganizing public
+structure field for astetic or readability purposes should be avoided as it will
+cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
+as cause to alter ABI.
+  
+Deprecation Notices:
+
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-20  7:14     ` Thomas Monjalon
  2015-01-20 10:47       ` Bruce Richardson
  2015-01-20 13:37       ` Iremonger, Bernard
  2015-01-20 14:00     ` Thomas Monjalon
  1 sibling, 2 replies; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-20  7:14 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Thank you Neil for writing this document.
This is a really important change in DPDK.
It would be very good to have comments or acknowledgement from several
developpers. This policy would be enforced by having several Acked-by lines.


2015-01-16 10:33, Neil Horman:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> ---
>  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 36 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..14be464
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,36 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +	Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +	1) At least 3 acknoweldgements of the need on the dpdk.org
> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> +the change is proposed, a deprecation notice must be added to this file, and
> +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> +incorporated must be incremented in parallel with the ABI changes themselves
> +
> +	Note that the above process for ABI deprecation should not be undertaken
> +lightly.  ABI stability is extreemely important for downstream consumers of the
> +DPDK, especially when distributed in shared object form.  Every effort should be
> +made to preserve ABI whenever possible.  For instance, reorganizing public
> +structure field for astetic or readability purposes should be avoided as it will
> +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> +as cause to alter ABI.

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20  7:14     ` Thomas Monjalon
@ 2015-01-20 10:47       ` Bruce Richardson
  2015-01-20 13:37       ` Iremonger, Bernard
  1 sibling, 0 replies; 104+ messages in thread
From: Bruce Richardson @ 2015-01-20 10:47 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Jan 20, 2015 at 08:14:50AM +0100, Thomas Monjalon wrote:
> Thank you Neil for writing this document.
> This is a really important change in DPDK.
> It would be very good to have comments or acknowledgement from several
> developpers. This policy would be enforced by having several Acked-by lines.
> 
> 
> 2015-01-16 10:33, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice space for
> > any deprecation announcements
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>

This policy looks sensible to me.
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

> > 
> > ---
> > Change notes:
> > 
> > v5) Updated documentation to add notes from Thomas M.
> > ---
> >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> >  1 file changed, 36 insertions(+)
> >  create mode 100644 doc/abi.txt
> > 
> > diff --git a/doc/abi.txt b/doc/abi.txt
> > new file mode 100644
> > index 0000000..14be464
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,36 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain multiple
> > +versions of.  In those events ABI's may be updated without backward
> > +compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream consumers
> > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > +the change is proposed, a deprecation notice must be added to this file, and
> > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > +incorporated must be incremented in parallel with the ABI changes themselves
> > +
> > +	Note that the above process for ABI deprecation should not be undertaken
> > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > +DPDK, especially when distributed in shared object form.  Every effort should be
> > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > +structure field for astetic or readability purposes should be avoided as it will
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > +as cause to alter ABI.
>

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20  7:14     ` Thomas Monjalon
  2015-01-20 10:47       ` Bruce Richardson
@ 2015-01-20 13:37       ` Iremonger, Bernard
  2015-01-20 13:46         ` Thomas Monjalon
  2015-01-20 14:24         ` Neil Horman
  1 sibling, 2 replies; 104+ messages in thread
From: Iremonger, Bernard @ 2015-01-20 13:37 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Tuesday, January 20, 2015 7:15 AM
> To: Neil Horman
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> Thank you Neil for writing this document.
> This is a really important change in DPDK.
> It would be very good to have comments or acknowledgement from several developpers. This policy
> would be enforced by having several Acked-by lines.
> 
> 
> 2015-01-16 10:33, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice
> > space for any deprecation announcements
> >
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> >
> > ---
> > Change notes:
> >
> > v5) Updated documentation to add notes from Thomas M.
> > ---
> >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> >  1 file changed, 36 insertions(+)
> >  create mode 100644 doc/abi.txt
> >
> > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > 0000000..14be464
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,36 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI
> > +may change multiple times between the last labeling and the HEAD
> > +label of the git tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle,
> > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > +then the decision to remove it is made during the development of DPDK
> > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > +release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a
> > +given update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain
> > +multiple versions of.  In those events ABI's may be updated without
> > +backward compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream
> > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > +under development when the change is proposed, a deprecation notice
> > +must be added to this file, and released with dpdk 2.0.  Then the change may be incorporated for
> dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> > +are incorporated must be incremented in parallel with the ABI changes
> > +themselves
> > +
> > +	Note that the above process for ABI deprecation should not be
> > +undertaken lightly.  ABI stability is extreemely important for
> > +downstream consumers of the DPDK, especially when distributed in
> > +shared object form.  Every effort should be made to preserve ABI
> > +whenever possible.  For instance, reorganizing public structure field
> > +for astetic or readability purposes should be avoided as it will
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter
> ABI.

Hi Thomas,

Should there be a reference to this document in the programmers guide?

Regards,

Bernard.

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 13:37       ` Iremonger, Bernard
@ 2015-01-20 13:46         ` Thomas Monjalon
  2015-01-20 14:24         ` Neil Horman
  1 sibling, 0 replies; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-20 13:46 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

2015-01-20 13:37, Iremonger, Bernard:
> Should there be a reference to this document in the programmers guide?

Maybe. You mean that an application developper must be aware of the deprecation
policy? So probably yes.
And I'd add that the release notes should reference the deprecations.

-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-16 15:33   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
  2015-01-20  7:14     ` Thomas Monjalon
@ 2015-01-20 14:00     ` Thomas Monjalon
  2015-01-20 14:37       ` Neil Horman
  1 sibling, 1 reply; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-20 14:00 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-16 10:33, Neil Horman:
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,36 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +	Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +	1) At least 3 acknoweldgements of the need on the dpdk.org
> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> +the change is proposed, a deprecation notice must be added to this file, and
> +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> +incorporated must be incremented in parallel with the ABI changes themselves
> +
> +	Note that the above process for ABI deprecation should not be undertaken
> +lightly.  ABI stability is extreemely important for downstream consumers of the
> +DPDK, especially when distributed in shared object form.  Every effort should be
> +made to preserve ABI whenever possible.  For instance, reorganizing public
> +structure field for astetic or readability purposes should be avoided as it will

astetic? typo?

> +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> +as cause to alter ABI.
> +  
> +Deprecation Notices:

Neil, are you sure it's a good idea to put deprecations notices here instead
of release notes?

I'm also thinking that we need to add more things in this doc:
	- case of macros/constant deprecation (API only)
	- case of structure update: must be renamed to provide ABI compatibility?

Do you think we can have a tool to test the ABI compatibility by building
examples/apps of previous version and checking them with built DSO of
current version?

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 13:37       ` Iremonger, Bernard
  2015-01-20 13:46         ` Thomas Monjalon
@ 2015-01-20 14:24         ` Neil Horman
  2015-01-20 14:29           ` Butler, Siobhan A
  2015-01-20 14:32           ` O'driscoll, Tim
  1 sibling, 2 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 14:24 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > Sent: Tuesday, January 20, 2015 7:15 AM
> > To: Neil Horman
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > 
> > Thank you Neil for writing this document.
> > This is a really important change in DPDK.
> > It would be very good to have comments or acknowledgement from several developpers. This policy
> > would be enforced by having several Acked-by lines.
> > 
> > 
> > 2015-01-16 10:33, Neil Horman:
> > > Adding a document describing rudimentary ABI policy and adding notice
> > > space for any deprecation announcements
> > >
> > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > >
> > > ---
> > > Change notes:
> > >
> > > v5) Updated documentation to add notes from Thomas M.
> > > ---
> > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 36 insertions(+)
> > >  create mode 100644 doc/abi.txt
> > >
> > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > 0000000..14be464
> > > --- /dev/null
> > > +++ b/doc/abi.txt
> > > @@ -0,0 +1,36 @@
> > > +ABI policy:
> > > +	ABI versions are set at the time of major release labeling, and ABI
> > > +may change multiple times between the last labeling and the HEAD
> > > +label of the git tree without warning
> > > +
> > > +	ABI versions, once released are available until such time as their
> > > +deprecation has been noted here for at least one major release cycle,
> > > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > > +then the decision to remove it is made during the development of DPDK
> > > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > > +release, and actually removed when DPDK
> > > +1.10 ships.
> > > +
> > > +	ABI versions may be deprecated in whole, or in part as needed by a
> > > +given update.
> > > +
> > > +	Some ABI changes may be too significant to reasonably maintain
> > > +multiple versions of.  In those events ABI's may be updated without
> > > +backward compatibility provided.  The requirements for doing so are:
> > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > +	2) A full deprecation cycle must be made to offer downstream
> > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > +under development when the change is proposed, a deprecation notice
> > > +must be added to this file, and released with dpdk 2.0.  Then the change may be incorporated for
> > dpdk 2.1
> > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> > > +are incorporated must be incremented in parallel with the ABI changes
> > > +themselves
> > > +
> > > +	Note that the above process for ABI deprecation should not be
> > > +undertaken lightly.  ABI stability is extreemely important for
> > > +downstream consumers of the DPDK, especially when distributed in
> > > +shared object form.  Every effort should be made to preserve ABI
> > > +whenever possible.  For instance, reorganizing public structure field
> > > +for astetic or readability purposes should be avoided as it will
> > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter
> > ABI.
> 
> Hi Thomas,
> 
> Should there be a reference to this document in the programmers guide?
> 
Thats a good question. I think, as Thomas notes, it probably should be
referenced in some way.  The programmers guide might be good.  What might be
better would be checking the deprecation notices and adding them to the release
notes for any given release.

Thoughts?
Neil

> Regards,
> 
> Bernard.
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:24         ` Neil Horman
@ 2015-01-20 14:29           ` Butler, Siobhan A
  2015-01-20 14:41             ` Neil Horman
  2015-01-20 14:32           ` O'driscoll, Tim
  1 sibling, 1 reply; 104+ messages in thread
From: Butler, Siobhan A @ 2015-01-20 14:29 UTC (permalink / raw)
  To: Neil Horman, Iremonger, Bernard; +Cc: dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, January 20, 2015 2:24 PM
> To: Iremonger, Bernard
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> Monjalon
> > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > To: Neil Horman
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > >
> > > Thank you Neil for writing this document.
> > > This is a really important change in DPDK.
> > > It would be very good to have comments or acknowledgement from
> > > several developpers. This policy would be enforced by having several
> Acked-by lines.
> > >
> > >
> > > 2015-01-16 10:33, Neil Horman:
> > > > Adding a document describing rudimentary ABI policy and adding
> > > > notice space for any deprecation announcements
> > > >
> > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > >
> > > > ---
> > > > Change notes:
> > > >
> > > > v5) Updated documentation to add notes from Thomas M.
> > > > ---
> > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 36 insertions(+)
> > > >  create mode 100644 doc/abi.txt
> > > >
> > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > > 0000000..14be464
> > > > --- /dev/null
> > > > +++ b/doc/abi.txt
> > > > @@ -0,0 +1,36 @@
> > > > +ABI policy:
> > > > +	ABI versions are set at the time of major release labeling, and
> > > > +ABI may change multiple times between the last labeling and the
> > > > +HEAD label of the git tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as
> > > > +their deprecation has been noted here for at least one major
> > > > +release cycle, after it has been tagged.  E.g. the ABI for DPDK
> > > > +1.8 is shipped, and then the decision to remove it is made during
> > > > +the development of DPDK 1.9.  The decision will be recorded here,
> > > > +shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > +1.10 ships.
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by
> > > > +a given update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain
> > > > +multiple versions of.  In those events ABI's may be updated
> > > > +without backward compatibility provided.  The requirements for doing
> so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream
> > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > > +under development when the change is proposed, a deprecation
> > > > +notice must be added to this file, and released with dpdk 2.0.
> > > > +Then the change may be incorporated for
> > > dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > +changes are incorporated must be incremented in parallel with the
> > > > +ABI changes themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be
> > > > +undertaken lightly.  ABI stability is extreemely important for
> > > > +downstream consumers of the DPDK, especially when distributed in
> > > > +shared object form.  Every effort should be made to preserve ABI
> > > > +whenever possible.  For instance, reorganizing public structure
> > > > +field for astetic or readability purposes should be avoided as it
> > > > +will cause ABI breakage.  Only significant (e.g. performance)
> > > > +reasons should be seen as cause to alter
> > > ABI.
> >
> > Hi Thomas,
> >
> > Should there be a reference to this document in the programmers guide?
> >
> Thats a good question. I think, as Thomas notes, it probably should be
> referenced in some way.  The programmers guide might be good.  What
> might be better would be checking the deprecation notices and adding them
> to the release notes for any given release.
> 
> Thoughts?
> Neil
> 
> > Regards,
> >
> > Bernard.
> >
> >

Sorry to be pedantic but would you also mind sending it as a .rst file instead of .txt if you're going to send as patches to Programmer's Guide anyway? :)
Thanks,
Siobhan

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:24         ` Neil Horman
  2015-01-20 14:29           ` Butler, Siobhan A
@ 2015-01-20 14:32           ` O'driscoll, Tim
  1 sibling, 0 replies; 104+ messages in thread
From: O'driscoll, Tim @ 2015-01-20 14:32 UTC (permalink / raw)
  To: Neil Horman, Iremonger, Bernard; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, January 20, 2015 2:24 PM
> To: Iremonger, Bernard
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> Monjalon
> > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > To: Neil Horman
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > >
> > > Thank you Neil for writing this document.
> > > This is a really important change in DPDK.
> > > It would be very good to have comments or acknowledgement from
> several developpers. This policy
> > > would be enforced by having several Acked-by lines.
> > >
> > >
> > > 2015-01-16 10:33, Neil Horman:
> > > > Adding a document describing rudimentary ABI policy and adding notice
> > > > space for any deprecation announcements
> > > >
> > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > >
> > > > ---
> > > > Change notes:
> > > >
> > > > v5) Updated documentation to add notes from Thomas M.
> > > > ---
> > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 36 insertions(+)
> > > >  create mode 100644 doc/abi.txt
> > > >
> > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > > 0000000..14be464
> > > > --- /dev/null
> > > > +++ b/doc/abi.txt
> > > > @@ -0,0 +1,36 @@
> > > > +ABI policy:
> > > > +	ABI versions are set at the time of major release labeling, and ABI
> > > > +may change multiple times between the last labeling and the HEAD
> > > > +label of the git tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as their
> > > > +deprecation has been noted here for at least one major release cycle,
> > > > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > > > +then the decision to remove it is made during the development of
> DPDK
> > > > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > > > +release, and actually removed when DPDK
> > > > +1.10 ships.
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by a
> > > > +given update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain
> > > > +multiple versions of.  In those events ABI's may be updated without
> > > > +backward compatibility provided.  The requirements for doing so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream
> > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > > +under development when the change is proposed, a deprecation
> notice
> > > > +must be added to this file, and released with dpdk 2.0.  Then the
> change may be incorporated for
> > > dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> > > > +are incorporated must be incremented in parallel with the ABI changes
> > > > +themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be
> > > > +undertaken lightly.  ABI stability is extreemely important for
> > > > +downstream consumers of the DPDK, especially when distributed in
> > > > +shared object form.  Every effort should be made to preserve ABI
> > > > +whenever possible.  For instance, reorganizing public structure field
> > > > +for astetic or readability purposes should be avoided as it will
> > > > +cause ABI breakage.  Only significant (e.g. performance) reasons
> should be seen as cause to alter
> > > ABI.
> >
> > Hi Thomas,
> >
> > Should there be a reference to this document in the programmers guide?
> >
> Thats a good question. I think, as Thomas notes, it probably should be
> referenced in some way.  The programmers guide might be good.  What
> might be
> better would be checking the deprecation notices and adding them to the
> release
> notes for any given release.
> 
> Thoughts?

I'd suggest that the policy itself should go in, or at least be referenced from, the programmer's guide. I agree that the deprecation notices themselves should go in the release notes.

> Neil
> 
> > Regards,
> >
> > Bernard.
> >
> >

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:00     ` Thomas Monjalon
@ 2015-01-20 14:37       ` Neil Horman
  2015-01-20 15:06         ` Thomas Monjalon
  0 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2015-01-20 14:37 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Jan 20, 2015 at 03:00:01PM +0100, Thomas Monjalon wrote:
> 2015-01-16 10:33, Neil Horman:
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,36 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain multiple
> > +versions of.  In those events ABI's may be updated without backward
> > +compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream consumers
> > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > +the change is proposed, a deprecation notice must be added to this file, and
> > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > +incorporated must be incremented in parallel with the ABI changes themselves
> > +
> > +	Note that the above process for ABI deprecation should not be undertaken
> > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > +DPDK, especially when distributed in shared object form.  Every effort should be
> > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > +structure field for astetic or readability purposes should be avoided as it will
> 
> astetic? typo?
> 
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > +as cause to alter ABI.
> > +  
> > +Deprecation Notices:
> 
> Neil, are you sure it's a good idea to put deprecations notices here instead
> of release notes?
> 
Funny, I just made mention of that in my last note.  I do think that the release
notes is the right place to "officially" announce deprecation warnings, but I
think we need a way for developers to communicate that efficiently (given that
the release notes aren't stored in the git tree).  I think this is the place for
developers to canonically list deprecations, and make reading this file part of
the release notes generation process.  That way, updates can be made as part of
the commit process easily.

> I'm also thinking that we need to add more things in this doc:
> 	- case of macros/constant deprecation (API only)
> 	- case of structure update: must be renamed to provide ABI compatibility?
> 
I'm definately in favor of adding such notices here, but I hadn't planned for
any strict formatting of any given notice.  That is to say, I considered you're
two issues above to be able to be included here.  I have no issue with listing a
deprecation note that indicates macros are being removed or that sections of api
are being versioned to accomodate structure changes. of any sort

> Do you think we can have a tool to test the ABI compatibility by building
> examples/apps of previous version and checking them with built DSO of
> current version?
> 
I do, though I'm not sure its within the scope of this update.  The easiest way
to do it currently is to checkout the last released version of the dpdk, build
it as a DSO build, copy out one of the test/example apps, checkout the HEAD of
the tree, rebuild, and run the saved off test app from the first build using the
shared objects of the second build.  That does some rudimentary validation,
but it only touches on the API aspects that the application you're using makes
use of.  What would be better would be if we had a test application that made a
call to every exported API call that we have, so that we could be confident that
we were exhaustively testing the ABI surface.  I think thats a large piece of
work, but it would be beneficial to have.

Thanks
Neil

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:29           ` Butler, Siobhan A
@ 2015-01-20 14:41             ` Neil Horman
  2015-01-20 14:50               ` Butler, Siobhan A
  0 siblings, 1 reply; 104+ messages in thread
From: Neil Horman @ 2015-01-20 14:41 UTC (permalink / raw)
  To: Butler, Siobhan A; +Cc: dev

On Tue, Jan 20, 2015 at 02:29:54PM +0000, Butler, Siobhan A wrote:
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Tuesday, January 20, 2015 2:24 PM
> > To: Iremonger, Bernard
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > 
> > On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > > -----Original Message-----
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > Monjalon
> > > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > > To: Neil Horman
> > > > Cc: dev@dpdk.org
> > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > > >
> > > > Thank you Neil for writing this document.
> > > > This is a really important change in DPDK.
> > > > It would be very good to have comments or acknowledgement from
> > > > several developpers. This policy would be enforced by having several
> > Acked-by lines.
> > > >
> > > >
> > > > 2015-01-16 10:33, Neil Horman:
> > > > > Adding a document describing rudimentary ABI policy and adding
> > > > > notice space for any deprecation announcements
> > > > >
> > > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > >
> > > > > ---
> > > > > Change notes:
> > > > >
> > > > > v5) Updated documentation to add notes from Thomas M.
> > > > > ---
> > > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > > >  1 file changed, 36 insertions(+)
> > > > >  create mode 100644 doc/abi.txt
> > > > >
> > > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > > > 0000000..14be464
> > > > > --- /dev/null
> > > > > +++ b/doc/abi.txt
> > > > > @@ -0,0 +1,36 @@
> > > > > +ABI policy:
> > > > > +	ABI versions are set at the time of major release labeling, and
> > > > > +ABI may change multiple times between the last labeling and the
> > > > > +HEAD label of the git tree without warning
> > > > > +
> > > > > +	ABI versions, once released are available until such time as
> > > > > +their deprecation has been noted here for at least one major
> > > > > +release cycle, after it has been tagged.  E.g. the ABI for DPDK
> > > > > +1.8 is shipped, and then the decision to remove it is made during
> > > > > +the development of DPDK 1.9.  The decision will be recorded here,
> > > > > +shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > > +1.10 ships.
> > > > > +
> > > > > +	ABI versions may be deprecated in whole, or in part as needed by
> > > > > +a given update.
> > > > > +
> > > > > +	Some ABI changes may be too significant to reasonably maintain
> > > > > +multiple versions of.  In those events ABI's may be updated
> > > > > +without backward compatibility provided.  The requirements for doing
> > so are:
> > > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > > +	2) A full deprecation cycle must be made to offer downstream
> > > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > > > +under development when the change is proposed, a deprecation
> > > > > +notice must be added to this file, and released with dpdk 2.0.
> > > > > +Then the change may be incorporated for
> > > > dpdk 2.1
> > > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > > +changes are incorporated must be incremented in parallel with the
> > > > > +ABI changes themselves
> > > > > +
> > > > > +	Note that the above process for ABI deprecation should not be
> > > > > +undertaken lightly.  ABI stability is extreemely important for
> > > > > +downstream consumers of the DPDK, especially when distributed in
> > > > > +shared object form.  Every effort should be made to preserve ABI
> > > > > +whenever possible.  For instance, reorganizing public structure
> > > > > +field for astetic or readability purposes should be avoided as it
> > > > > +will cause ABI breakage.  Only significant (e.g. performance)
> > > > > +reasons should be seen as cause to alter
> > > > ABI.
> > >
> > > Hi Thomas,
> > >
> > > Should there be a reference to this document in the programmers guide?
> > >
> > Thats a good question. I think, as Thomas notes, it probably should be
> > referenced in some way.  The programmers guide might be good.  What
> > might be better would be checking the deprecation notices and adding them
> > to the release notes for any given release.
> > 
> > Thoughts?
> > Neil
> > 
> > > Regards,
> > >
> > > Bernard.
> > >
> > >
> 
> Sorry to be pedantic but would you also mind sending it as a .rst file instead of .txt if you're going to send as patches to Programmer's Guide anyway? :)
> Thanks,
Actually I'm not sure this is a good idea.  The release notes get formatted and
review by a documentation team right?  I'm not sure theres value in having a
developer write formatted text if its just going to get reviewed and reformatted
later, is there?
Neil

> Siobhan
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:41             ` Neil Horman
@ 2015-01-20 14:50               ` Butler, Siobhan A
  2015-01-20 15:30                 ` Neil Horman
  0 siblings, 1 reply; 104+ messages in thread
From: Butler, Siobhan A @ 2015-01-20 14:50 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev



> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Tuesday, January 20, 2015 2:42 PM
> To: Butler, Siobhan A
> Cc: Iremonger, Bernard; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> On Tue, Jan 20, 2015 at 02:29:54PM +0000, Butler, Siobhan A wrote:
> >
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > > Sent: Tuesday, January 20, 2015 2:24 PM
> > > To: Iremonger, Bernard
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > >
> > > On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > > > -----Original Message-----
> > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > > Monjalon
> > > > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > > > To: Neil Horman
> > > > > Cc: dev@dpdk.org
> > > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI
> > > > > documentation
> > > > >
> > > > > Thank you Neil for writing this document.
> > > > > This is a really important change in DPDK.
> > > > > It would be very good to have comments or acknowledgement from
> > > > > several developpers. This policy would be enforced by having
> > > > > several
> > > Acked-by lines.
> > > > >
> > > > >
> > > > > 2015-01-16 10:33, Neil Horman:
> > > > > > Adding a document describing rudimentary ABI policy and adding
> > > > > > notice space for any deprecation announcements
> > > > > >
> > > > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > > >
> > > > > > ---
> > > > > > Change notes:
> > > > > >
> > > > > > v5) Updated documentation to add notes from Thomas M.
> > > > > > ---
> > > > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > > > >  1 file changed, 36 insertions(+)  create mode 100644
> > > > > > doc/abi.txt
> > > > > >
> > > > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644
> > > > > > index
> > > > > > 0000000..14be464
> > > > > > --- /dev/null
> > > > > > +++ b/doc/abi.txt
> > > > > > @@ -0,0 +1,36 @@
> > > > > > +ABI policy:
> > > > > > +	ABI versions are set at the time of major release labeling,
> > > > > > +and ABI may change multiple times between the last labeling
> > > > > > +and the HEAD label of the git tree without warning
> > > > > > +
> > > > > > +	ABI versions, once released are available until such time as
> > > > > > +their deprecation has been noted here for at least one major
> > > > > > +release cycle, after it has been tagged.  E.g. the ABI for
> > > > > > +DPDK
> > > > > > +1.8 is shipped, and then the decision to remove it is made
> > > > > > +during the development of DPDK 1.9.  The decision will be
> > > > > > +recorded here, shipped with the DPDK 1.9 release, and
> > > > > > +actually removed when DPDK
> > > > > > +1.10 ships.
> > > > > > +
> > > > > > +	ABI versions may be deprecated in whole, or in part as
> > > > > > +needed by a given update.
> > > > > > +
> > > > > > +	Some ABI changes may be too significant to reasonably
> > > > > > +maintain multiple versions of.  In those events ABI's may be
> > > > > > +updated without backward compatibility provided.  The
> > > > > > +requirements for doing
> > > so are:
> > > > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > > > +	2) A full deprecation cycle must be made to offer
> downstream
> > > > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0
> > > > > > +is under development when the change is proposed, a
> > > > > > +deprecation notice must be added to this file, and released with
> dpdk 2.0.
> > > > > > +Then the change may be incorporated for
> > > > > dpdk 2.1
> > > > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > > > +changes are incorporated must be incremented in parallel with
> > > > > > +the ABI changes themselves
> > > > > > +
> > > > > > +	Note that the above process for ABI deprecation should not
> > > > > > +be undertaken lightly.  ABI stability is extreemely important
> > > > > > +for downstream consumers of the DPDK, especially when
> > > > > > +distributed in shared object form.  Every effort should be
> > > > > > +made to preserve ABI whenever possible.  For instance,
> > > > > > +reorganizing public structure field for astetic or
> > > > > > +readability purposes should be avoided as it will cause ABI
> > > > > > +breakage.  Only significant (e.g. performance) reasons should
> > > > > > +be seen as cause to alter
> > > > > ABI.
> > > >
> > > > Hi Thomas,
> > > >
> > > > Should there be a reference to this document in the programmers
> guide?
> > > >
> > > Thats a good question. I think, as Thomas notes, it probably should
> > > be referenced in some way.  The programmers guide might be good.
> > > What might be better would be checking the deprecation notices and
> > > adding them to the release notes for any given release.
> > >
> > > Thoughts?
> > > Neil
> > >
> > > > Regards,
> > > >
> > > > Bernard.
> > > >
> > > >
> >
> > Sorry to be pedantic but would you also mind sending it as a .rst file
> > instead of .txt if you're going to send as patches to Programmer's
> > Guide anyway? :) Thanks,
> Actually I'm not sure this is a good idea.  The release notes get formatted and
> review by a documentation team right?  I'm not sure theres value in having a
> developer write formatted text if its just going to get reviewed and
> reformatted later, is there?
> Neil
Bernard and I are the documentation team :) we use .rst files (which are plain text files) and then sphinx to auto-generate the HTML version.
It's no big issue anyway, just if you had to resend it I thought it would be handy.
Thanks Neil - great to see more contributions to the docs coming in.
S
> 
> > Siobhan
> >

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:37       ` Neil Horman
@ 2015-01-20 15:06         ` Thomas Monjalon
  2015-01-20 15:35           ` Neil Horman
  0 siblings, 1 reply; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-20 15:06 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-20 09:37, Neil Horman:
> On Tue, Jan 20, 2015 at 03:00:01PM +0100, Thomas Monjalon wrote:
> > 2015-01-16 10:33, Neil Horman:
> > > --- /dev/null
> > > +++ b/doc/abi.txt
> > > @@ -0,0 +1,36 @@
> > > +ABI policy:
> > > +	ABI versions are set at the time of major release labeling, and ABI may
> > > +change multiple times between the last labeling and the HEAD label of the git
> > > +tree without warning
> > > +
> > > +	ABI versions, once released are available until such time as their
> > > +deprecation has been noted here for at least one major release cycle, after it
> > > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > > +remove it is made during the development of DPDK 1.9.  The decision will be
> > > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > +1.10 ships.
> > > +
> > > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > > +update.
> > > +
> > > +	Some ABI changes may be too significant to reasonably maintain multiple
> > > +versions of.  In those events ABI's may be updated without backward
> > > +compatibility provided.  The requirements for doing so are:
> > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > +	2) A full deprecation cycle must be made to offer downstream consumers
> > > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > > +the change is proposed, a deprecation notice must be added to this file, and
> > > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > > +incorporated must be incremented in parallel with the ABI changes themselves
> > > +
> > > +	Note that the above process for ABI deprecation should not be undertaken
> > > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > > +DPDK, especially when distributed in shared object form.  Every effort should be
> > > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > > +structure field for astetic or readability purposes should be avoided as it will
> > 
> > astetic? typo?
> > 
> > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > > +as cause to alter ABI.
> > > +  
> > > +Deprecation Notices:
> > 
> > Neil, are you sure it's a good idea to put deprecations notices here instead
> > of release notes?
> > 
> Funny, I just made mention of that in my last note.  I do think that the release
> notes is the right place to "officially" announce deprecation warnings, but I
> think we need a way for developers to communicate that efficiently (given that
> the release notes aren't stored in the git tree).

Yes, they are:
	http://dpdk.org/browse/dpdk/tree/doc/guides/rel_notes
So I suggest to remove Deprecation Notices from abi.txt and create an entry
in release notes.

> I think this is the place for
> developers to canonically list deprecations, and make reading this file part of
> the release notes generation process.  That way, updates can be made as part of
> the commit process easily.

Developpers can update the release notes themselves.

> > I'm also thinking that we need to add more things in this doc:
> > 	- case of macros/constant deprecation (API only)
> > 	- case of structure update: must be renamed to provide ABI compatibility?
> > 
> I'm definately in favor of adding such notices here, but I hadn't planned for
> any strict formatting of any given notice.  That is to say, I considered you're
> two issues above to be able to be included here.  I have no issue with listing a
> deprecation note that indicates macros are being removed or that sections of api
> are being versioned to accomodate structure changes. of any sort

No, I was suggesting to explain in this doc that macro removal must be
announced with a deprecation notice,
and that in case structure must be reworked, the name must change if we
want to preserve ABI compatibility with old structure.

> > Do you think we can have a tool to test the ABI compatibility by building
> > examples/apps of previous version and checking them with built DSO of
> > current version?
> > 
> I do, though I'm not sure its within the scope of this update.  The easiest way
> to do it currently is to checkout the last released version of the dpdk, build
> it as a DSO build, copy out one of the test/example apps, checkout the HEAD of
> the tree, rebuild, and run the saved off test app from the first build using the
> shared objects of the second build.  That does some rudimentary validation,
> but it only touches on the API aspects that the application you're using makes
> use of.  What would be better would be if we had a test application that made a
> call to every exported API call that we have, so that we could be confident that
> we were exhaustively testing the ABI surface.  I think thats a large piece of
> work, but it would be beneficial to have.

Yes, it should be another patchset.
Do you plan to work on it? It would be very convenient for developpers and
maintainers to test ABI compatibility.

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:50               ` Butler, Siobhan A
@ 2015-01-20 15:30                 ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 15:30 UTC (permalink / raw)
  To: Butler, Siobhan A; +Cc: dev

On Tue, Jan 20, 2015 at 02:50:43PM +0000, Butler, Siobhan A wrote:
> 
> 
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Tuesday, January 20, 2015 2:42 PM
> > To: Butler, Siobhan A
> > Cc: Iremonger, Bernard; dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > 
> > On Tue, Jan 20, 2015 at 02:29:54PM +0000, Butler, Siobhan A wrote:
> > >
> > >
> > > > -----Original Message-----
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > > > Sent: Tuesday, January 20, 2015 2:24 PM
> > > > To: Iremonger, Bernard
> > > > Cc: dev@dpdk.org
> > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > > >
> > > > On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > > > > -----Original Message-----
> > > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > > > Monjalon
> > > > > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > > > > To: Neil Horman
> > > > > > Cc: dev@dpdk.org
> > > > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI
> > > > > > documentation
> > > > > >
> > > > > > Thank you Neil for writing this document.
> > > > > > This is a really important change in DPDK.
> > > > > > It would be very good to have comments or acknowledgement from
> > > > > > several developpers. This policy would be enforced by having
> > > > > > several
> > > > Acked-by lines.
> > > > > >
> > > > > >
> > > > > > 2015-01-16 10:33, Neil Horman:
> > > > > > > Adding a document describing rudimentary ABI policy and adding
> > > > > > > notice space for any deprecation announcements
> > > > > > >
> > > > > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > > > >
> > > > > > > ---
> > > > > > > Change notes:
> > > > > > >
> > > > > > > v5) Updated documentation to add notes from Thomas M.
> > > > > > > ---
> > > > > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > > > > >  1 file changed, 36 insertions(+)  create mode 100644
> > > > > > > doc/abi.txt
> > > > > > >
> > > > > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644
> > > > > > > index
> > > > > > > 0000000..14be464
> > > > > > > --- /dev/null
> > > > > > > +++ b/doc/abi.txt
> > > > > > > @@ -0,0 +1,36 @@
> > > > > > > +ABI policy:
> > > > > > > +	ABI versions are set at the time of major release labeling,
> > > > > > > +and ABI may change multiple times between the last labeling
> > > > > > > +and the HEAD label of the git tree without warning
> > > > > > > +
> > > > > > > +	ABI versions, once released are available until such time as
> > > > > > > +their deprecation has been noted here for at least one major
> > > > > > > +release cycle, after it has been tagged.  E.g. the ABI for
> > > > > > > +DPDK
> > > > > > > +1.8 is shipped, and then the decision to remove it is made
> > > > > > > +during the development of DPDK 1.9.  The decision will be
> > > > > > > +recorded here, shipped with the DPDK 1.9 release, and
> > > > > > > +actually removed when DPDK
> > > > > > > +1.10 ships.
> > > > > > > +
> > > > > > > +	ABI versions may be deprecated in whole, or in part as
> > > > > > > +needed by a given update.
> > > > > > > +
> > > > > > > +	Some ABI changes may be too significant to reasonably
> > > > > > > +maintain multiple versions of.  In those events ABI's may be
> > > > > > > +updated without backward compatibility provided.  The
> > > > > > > +requirements for doing
> > > > so are:
> > > > > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > > > > +	2) A full deprecation cycle must be made to offer
> > downstream
> > > > > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0
> > > > > > > +is under development when the change is proposed, a
> > > > > > > +deprecation notice must be added to this file, and released with
> > dpdk 2.0.
> > > > > > > +Then the change may be incorporated for
> > > > > > dpdk 2.1
> > > > > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > > > > +changes are incorporated must be incremented in parallel with
> > > > > > > +the ABI changes themselves
> > > > > > > +
> > > > > > > +	Note that the above process for ABI deprecation should not
> > > > > > > +be undertaken lightly.  ABI stability is extreemely important
> > > > > > > +for downstream consumers of the DPDK, especially when
> > > > > > > +distributed in shared object form.  Every effort should be
> > > > > > > +made to preserve ABI whenever possible.  For instance,
> > > > > > > +reorganizing public structure field for astetic or
> > > > > > > +readability purposes should be avoided as it will cause ABI
> > > > > > > +breakage.  Only significant (e.g. performance) reasons should
> > > > > > > +be seen as cause to alter
> > > > > > ABI.
> > > > >
> > > > > Hi Thomas,
> > > > >
> > > > > Should there be a reference to this document in the programmers
> > guide?
> > > > >
> > > > Thats a good question. I think, as Thomas notes, it probably should
> > > > be referenced in some way.  The programmers guide might be good.
> > > > What might be better would be checking the deprecation notices and
> > > > adding them to the release notes for any given release.
> > > >
> > > > Thoughts?
> > > > Neil
> > > >
> > > > > Regards,
> > > > >
> > > > > Bernard.
> > > > >
> > > > >
> > >
> > > Sorry to be pedantic but would you also mind sending it as a .rst file
> > > instead of .txt if you're going to send as patches to Programmer's
> > > Guide anyway? :) Thanks,
> > Actually I'm not sure this is a good idea.  The release notes get formatted and
> > review by a documentation team right?  I'm not sure theres value in having a
> > developer write formatted text if its just going to get reviewed and
> > reformatted later, is there?
> > Neil
> Bernard and I are the documentation team :) we use .rst files (which are plain text files) and then sphinx to auto-generate the HTML version.
> It's no big issue anyway, just if you had to resend it I thought it would be handy.
Can I infer from this then, that if I need to resend it, it would be sufficient
to simply rename this file with an .rst extension?  If so, I'm happy to do so.

> Thanks Neil - great to see more contributions to the docs coming in.
Thank you!
Neil

> S
> > 
> > > Siobhan
> > >
> 
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 15:06         ` Thomas Monjalon
@ 2015-01-20 15:35           ` Neil Horman
  0 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 15:35 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Jan 20, 2015 at 04:06:07PM +0100, Thomas Monjalon wrote:
> 2015-01-20 09:37, Neil Horman:
> > On Tue, Jan 20, 2015 at 03:00:01PM +0100, Thomas Monjalon wrote:
> > > 2015-01-16 10:33, Neil Horman:
> > > > --- /dev/null
> > > > +++ b/doc/abi.txt
> > > > @@ -0,0 +1,36 @@
> > > > +ABI policy:
> > > > +	ABI versions are set at the time of major release labeling, and ABI may
> > > > +change multiple times between the last labeling and the HEAD label of the git
> > > > +tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as their
> > > > +deprecation has been noted here for at least one major release cycle, after it
> > > > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > > > +remove it is made during the development of DPDK 1.9.  The decision will be
> > > > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > +1.10 ships.
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > > > +update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain multiple
> > > > +versions of.  In those events ABI's may be updated without backward
> > > > +compatibility provided.  The requirements for doing so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream consumers
> > > > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > > > +the change is proposed, a deprecation notice must be added to this file, and
> > > > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > > > +incorporated must be incremented in parallel with the ABI changes themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be undertaken
> > > > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > > > +DPDK, especially when distributed in shared object form.  Every effort should be
> > > > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > > > +structure field for astetic or readability purposes should be avoided as it will
> > > 
> > > astetic? typo?
> > > 
> > > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > > > +as cause to alter ABI.
> > > > +  
> > > > +Deprecation Notices:
> > > 
> > > Neil, are you sure it's a good idea to put deprecations notices here instead
> > > of release notes?
> > > 
> > Funny, I just made mention of that in my last note.  I do think that the release
> > notes is the right place to "officially" announce deprecation warnings, but I
> > think we need a way for developers to communicate that efficiently (given that
> > the release notes aren't stored in the git tree).
> 
> Yes, they are:
> 	http://dpdk.org/browse/dpdk/tree/doc/guides/rel_notes
> So I suggest to remove Deprecation Notices from abi.txt and create an entry
> in release notes.
> 
> > I think this is the place for
> > developers to canonically list deprecations, and make reading this file part of
> > the release notes generation process.  That way, updates can be made as part of
> > the commit process easily.
> 
> Developpers can update the release notes themselves.
> 
ok, I was unaware. If thats the case, then yes, putting these deprecations
directly in the release notes makes the most sense. I'll resubmit with that
changed.


> > > I'm also thinking that we need to add more things in this doc:
> > > 	- case of macros/constant deprecation (API only)
> > > 	- case of structure update: must be renamed to provide ABI compatibility?
> > > 
> > I'm definately in favor of adding such notices here, but I hadn't planned for
> > any strict formatting of any given notice.  That is to say, I considered you're
> > two issues above to be able to be included here.  I have no issue with listing a
> > deprecation note that indicates macros are being removed or that sections of api
> > are being versioned to accomodate structure changes. of any sort
> 
> No, I was suggesting to explain in this doc that macro removal must be
> announced with a deprecation notice,
> and that in case structure must be reworked, the name must change if we
> want to preserve ABI compatibility with old structure.
> 
> > > Do you think we can have a tool to test the ABI compatibility by building
> > > examples/apps of previous version and checking them with built DSO of
> > > current version?
> > > 
> > I do, though I'm not sure its within the scope of this update.  The easiest way
> > to do it currently is to checkout the last released version of the dpdk, build
> > it as a DSO build, copy out one of the test/example apps, checkout the HEAD of
> > the tree, rebuild, and run the saved off test app from the first build using the
> > shared objects of the second build.  That does some rudimentary validation,
> > but it only touches on the API aspects that the application you're using makes
> > use of.  What would be better would be if we had a test application that made a
> > call to every exported API call that we have, so that we could be confident that
> > we were exhaustively testing the ABI surface.  I think thats a large piece of
> > work, but it would be beneficial to have.
> 
> Yes, it should be another patchset.
> Do you plan to work on it? It would be very convenient for developpers and
> maintainers to test ABI compatibility.
> 
Gladly, if we can get this in.  I think its an important tool.

> Thanks
> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (8 preceding siblings ...)
  2015-01-16 15:33 ` [dpdk-dev] [PATCH v5 " Neil Horman
@ 2015-01-20 21:17 ` Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (2 more replies)
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                   ` (4 subsequent siblings)
  14 siblings, 3 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v6 2/4] Provide initial versioning for all DPDK libraries
  2015-01-20 21:17 ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-20 21:17   ` Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 3/4] Add library version extenstion Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

Add linker version script files to each DPDK library to put a stake in the
ground from which we can start cleaning up API's

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:

v2)
	* Updated export map to not require full path
---
 lib/librte_acl/Makefile                            |   2 +
 lib/librte_acl/rte_acl_version.map                 |  21 ++++
 lib/librte_cfgfile/Makefile                        |   2 +
 lib/librte_cfgfile/rte_cfgfile_version.map         |  14 +++
 lib/librte_cmdline/Makefile                        |   2 +
 lib/librte_cmdline/rte_cmdline_version.map         |  69 +++++++++++++
 lib/librte_distributor/Makefile                    |   2 +
 lib/librte_distributor/rte_distributor_version.map |  16 +++
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  90 ++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  90 ++++++++++++++++
 lib/librte_ether/Makefile                          |   2 +
 lib/librte_ether/rte_ether_version.map             | 113 +++++++++++++++++++++
 lib/librte_hash/Makefile                           |   2 +
 lib/librte_hash/rte_hash_version.map               |  18 ++++
 lib/librte_ip_frag/Makefile                        |   2 +
 lib/librte_ip_frag/rte_ipfrag_version.map          |  14 +++
 lib/librte_ivshmem/Makefile                        |   2 +
 lib/librte_ivshmem/rte_ivshmem_version.map         |  13 +++
 lib/librte_kni/Makefile                            |   2 +
 lib/librte_kni/rte_kni_version.map                 |  20 ++++
 lib/librte_kvargs/Makefile                         |   2 +
 lib/librte_kvargs/rte_kvargs_version.map           |  10 ++
 lib/librte_lpm/Makefile                            |   2 +
 lib/librte_lpm/rte_lpm_version.map                 |  24 +++++
 lib/librte_malloc/Makefile                         |   2 +
 lib/librte_malloc/rte_malloc_version.map           |  19 ++++
 lib/librte_mbuf/Makefile                           |   2 +
 lib/librte_mbuf/rte_mbuf_version.map               |  14 +++
 lib/librte_mempool/Makefile                        |   2 +
 lib/librte_mempool/rte_mempool_version.map         |  18 ++++
 lib/librte_meter/Makefile                          |   2 +
 lib/librte_meter/rte_meter_version.map             |  13 +++
 lib/librte_pipeline/Makefile                       |   2 +
 lib/librte_pipeline/rte_pipeline_version.map       |  23 +++++
 lib/librte_pmd_af_packet/Makefile                  |   2 +
 .../rte_pmd_af_packet_version.map                  |   7 ++
 lib/librte_pmd_bond/Makefile                       |   2 +
 lib/librte_pmd_bond/rte_eth_bond_version.map       |  21 ++++
 lib/librte_pmd_e1000/Makefile                      |   2 +
 lib/librte_pmd_e1000/rte_pmd_e1000_version.map     |   5 +
 lib/librte_pmd_enic/Makefile                       |   2 +
 lib/librte_pmd_enic/rte_pmd_enic_version.map       |   5 +
 lib/librte_pmd_i40e/Makefile                       |   2 +
 lib/librte_pmd_i40e/rte_pmd_i40e_version.map       |   5 +
 lib/librte_pmd_ixgbe/Makefile                      |   2 +
 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map     |   5 +
 lib/librte_pmd_pcap/Makefile                       |   2 +
 lib/librte_pmd_pcap/rte_pmd_pcap_version.map       |   5 +
 lib/librte_pmd_ring/Makefile                       |   2 +
 lib/librte_pmd_ring/rte_eth_ring.c                 |   2 +-
 lib/librte_pmd_ring/rte_eth_ring.h                 |   6 --
 lib/librte_pmd_ring/rte_eth_ring_version.map       |  10 ++
 lib/librte_pmd_virtio/Makefile                     |   1 +
 lib/librte_pmd_virtio/rte_pmd_virtio_version.map   |   5 +
 lib/librte_pmd_vmxnet3/Makefile                    |   2 +
 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map |   5 +
 lib/librte_pmd_xenvirt/Makefile                    |   2 +
 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map |   8 ++
 lib/librte_port/Makefile                           |   2 +
 lib/librte_port/rte_port_version.map               |  18 ++++
 lib/librte_power/Makefile                          |   2 +
 lib/librte_power/rte_power_version.map             |  18 ++++
 lib/librte_ring/Makefile                           |   2 +
 lib/librte_ring/rte_ring_version.map               |  12 +++
 lib/librte_sched/Makefile                          |   2 +
 lib/librte_sched/rte_sched_version.map             |  22 ++++
 lib/librte_table/Makefile                          |   2 +
 lib/librte_table/rte_table_version.map             |  22 ++++
 lib/librte_timer/Makefile                          |   2 +
 lib/librte_timer/rte_timer_version.map             |  16 +++
 lib/librte_vhost/Makefile                          |   2 +
 lib/librte_vhost/rte_vhost_version.map             |  14 +++
 74 files changed, 874 insertions(+), 7 deletions(-)
 create mode 100644 lib/librte_acl/rte_acl_version.map
 create mode 100644 lib/librte_cfgfile/rte_cfgfile_version.map
 create mode 100644 lib/librte_cmdline/rte_cmdline_version.map
 create mode 100644 lib/librte_distributor/rte_distributor_version.map
 create mode 100644 lib/librte_eal/bsdapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_eal/linuxapp/eal/rte_eal_version.map
 create mode 100644 lib/librte_ether/rte_ether_version.map
 create mode 100644 lib/librte_hash/rte_hash_version.map
 create mode 100644 lib/librte_ip_frag/rte_ipfrag_version.map
 create mode 100644 lib/librte_ivshmem/rte_ivshmem_version.map
 create mode 100644 lib/librte_kni/rte_kni_version.map
 create mode 100644 lib/librte_kvargs/rte_kvargs_version.map
 create mode 100644 lib/librte_lpm/rte_lpm_version.map
 create mode 100644 lib/librte_malloc/rte_malloc_version.map
 create mode 100644 lib/librte_mbuf/rte_mbuf_version.map
 create mode 100644 lib/librte_mempool/rte_mempool_version.map
 create mode 100644 lib/librte_meter/rte_meter_version.map
 create mode 100644 lib/librte_pipeline/rte_pipeline_version.map
 create mode 100644 lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 create mode 100644 lib/librte_pmd_bond/rte_eth_bond_version.map
 create mode 100644 lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 create mode 100644 lib/librte_pmd_enic/rte_pmd_enic_version.map
 create mode 100644 lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 create mode 100644 lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 create mode 100644 lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 create mode 100644 lib/librte_pmd_ring/rte_eth_ring_version.map
 create mode 100644 lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 create mode 100644 lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 create mode 100644 lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 create mode 100644 lib/librte_port/rte_port_version.map
 create mode 100644 lib/librte_power/rte_power_version.map
 create mode 100644 lib/librte_ring/rte_ring_version.map
 create mode 100644 lib/librte_sched/rte_sched_version.map
 create mode 100644 lib/librte_table/rte_table_version.map
 create mode 100644 lib/librte_timer/rte_timer_version.map
 create mode 100644 lib/librte_vhost/rte_vhost_version.map

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 65e566d..45cbf80 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -37,6 +37,8 @@ LIB = librte_acl.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_acl_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_acl/rte_acl_version.map b/lib/librte_acl/rte_acl_version.map
new file mode 100644
index 0000000..9f05a86
--- /dev/null
+++ b/lib/librte_acl/rte_acl_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+	rte_acl_create;
+	rte_acl_find_existing;
+	rte_acl_free;
+	rte_acl_add_rules;
+	rte_acl_reset_rules;
+	rte_acl_build;
+	rte_acl_reset;
+	rte_acl_classify;
+	rte_acl_dump;
+	rte_acl_list_dump;
+	rte_acl_ipv4vlan_add_rules;
+	rte_acl_ipv4vlan_build;
+	rte_acl_classify_scalar;
+	rte_acl_classify_alg;
+	rte_acl_set_ctx_classify;
+
+	local: *;
+};
+
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index 55e8701..a4f73de 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -39,6 +39,8 @@ LIB = librte_cfgfile.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_cfgfile_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cfgfile/rte_cfgfile_version.map b/lib/librte_cfgfile/rte_cfgfile_version.map
new file mode 100644
index 0000000..10ecea6
--- /dev/null
+++ b/lib/librte_cfgfile/rte_cfgfile_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_cfgfile_load;
+	rte_cfgfile_num_sections;
+	rte_cfgfile_sections;
+	rte_cfgfile_has_section;
+	rte_cfgfile_section_num_entries;
+	rte_cfgfile_section_entries;
+	rte_cfgfile_get_entry;
+	rte_cfgfile_has_entry;
+	rte_cfgfile_close;
+
+	local: *;
+};
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 7eae449..3c71831 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -36,6 +36,8 @@ LIB = librte_cmdline.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_cmdline_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
new file mode 100644
index 0000000..7616eff
--- /dev/null
+++ b/lib/librte_cmdline/rte_cmdline_version.map
@@ -0,0 +1,69 @@
+DPDK_1.8 {
+	global:
+	cmdline_new;
+	cmdline_set_prompt;
+	cmdline_free;
+	cmdline_printf;
+	cmdline_in;
+	cmdline_write_char;
+	cmdline_interact;
+	cmdline_quit;
+	cmdline_parse;
+	cmdline_complete;
+	cmdline_isendoftoken;
+	cmdline_parse_num;
+	cmdline_get_help_num;
+	cmdline_parse_ipaddr;
+	cmdline_get_help_ipaddr;
+	cmdline_parse_etheraddr;
+	cmdline_get_help_etheraddr;
+	cmdline_parse_string;
+	cmdline_complete_get_nb_string;
+	cmdline_complete_get_elt_string;
+	cmdline_get_help_string;
+	cmdline_parse_portlist;
+	cmdline_get_help_portlist;
+	cmdline_token_string_ops;
+	cmdline_token_num_ops;
+	cmdline_token_string_ops;
+	cmdline_token_ipaddr_ops;
+	cmdline_token_etheraddr_ops;
+	vt100_init;
+	vt100_parser;
+	cmdline_file_new;
+	cmdline_stdin_new;
+	cmdline_stdin_exit;
+	cirbuf_init;
+	cirbuf_add_head_safe;
+	cirbuf_add_head;
+	cirbuf_add_tail_safe;
+	cirbuf_add_tail;
+	cirbuf_del_head_safe;
+	cirbuf_del_head;
+	cirbuf_del_tail_safe;
+	cirbuf_del_tail;
+	cirbuf_get_head;
+	cirbuf_get_tail;
+	cirbuf_add_buf_head;
+	cirbuf_add_buf_tail;
+	cirbuf_del_buf_head;
+	cirbuf_del_buf_tail;
+	cirbuf_get_buf_head;
+	cirbuf_get_buf_tail;
+	cirbuf_align_left;
+	cirbuf_align_right;
+	rdline_init;
+	rdline_newline;
+	rdline_stop;
+	rdline_quit;
+	rdline_restart;
+	rdline_redisplay;
+	rdline_reset;
+	rdline_char_in;
+	rdline_get_buffer;
+	rdline_add_history;
+	rdline_clear_history;
+	rdline_get_history_item;
+
+	local: *;
+};
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 36699f8..3674a2c 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -37,6 +37,8 @@ LIB = librte_distributor.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_distributor_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_distributor/rte_distributor_version.map b/lib/librte_distributor/rte_distributor_version.map
new file mode 100644
index 0000000..b81ddc8
--- /dev/null
+++ b/lib/librte_distributor/rte_distributor_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+
+	global:
+	rte_distributor_create;
+	rte_distributor_process;
+	rte_distributor_returned_pkts;
+	rte_distributor_flush;
+	rte_distributor_clear_returns;
+	rte_distributor_get_pkt;
+	rte_distributor_return_pkt;
+	rte_distributor_request_pkt;
+	rte_distributor_poll_pkt;
+
+	local: *;
+};
+
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index d434882..0b5f9d9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -46,6 +46,8 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_ring
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_pcap
 CFLAGS += $(WERROR_FLAGS) -O3
 
+EXPORT_MAP := rte_eal_version.map
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 72ecf3a..bae8af1 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -33,6 +33,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 LIB = librte_eal.a
 
+EXPORT_MAP := rte_eal_version.map
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
new file mode 100644
index 0000000..498130d
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -0,0 +1,90 @@
+DPDK_1.8 {
+	global:
+	rte_eal_alarm_set;
+	rte_eal_alarm_cancel;
+	rte_exit;
+	rte_cpu_get_flag_enabled;
+	rte_cpu_check_supported;
+	rte_get_tsc_hz;
+	rte_get_hpet_cycles;
+	rte_get_hpet_hz;
+	rte_eal_hpet_init;
+	rte_delay_us;
+	rte_dump_stack;
+	rte_dump_registers;
+	__rte_panic;
+	rte_eal_devargs_add;
+	rte_eal_devargs_type_count;
+	rte_eal_devargs_dump;
+	rte_eal_driver_register;
+	rte_eal_driver_unregister;
+	rte_eal_dev_init;
+	rte_eal_init;
+	rte_set_application_usage_hook;
+	rte_eal_has_hugepages;
+	rte_strerror;
+	rte_hexdump;
+	rte_memdump;
+	rte_intr_callback_register;
+	rte_intr_callback_unregister;
+	rte_intr_enable;
+	rte_intr_disable;
+	rte_eal_remote_launch;
+	rte_eal_mp_remote_launch;
+	rte_eal_get_lcore_state;
+	rte_eal_wait_lcore;
+	rte_eal_mp_wait_lcore;
+	rte_openlog_stream;
+	rte_set_log_level;
+	rte_set_log_type;
+	rte_log_cur_msg_loglevel;
+	rte_log_cur_msg_logtype;
+	rte_log_set_history;
+	rte_log_dump_history;
+	rte_log_add_in_history;
+	rte_log;
+	rte_vlog;
+	rte_mem_lock_page;
+	rte_mem_virt2phy;
+	rte_eal_get_physmem_layout;
+	rte_dump_physmem_layout;
+	rte_eal_get_physmem_size;
+	rte_memory_get_nchannel;
+	rte_memory_get_nrank;
+	rte_mem_phy2mch;
+	rte_xen_dom0_memory_init;
+	rte_xen_dom0_memory_attach;
+	rte_memzone_reserve;
+	rte_memzone_reserve_aligned;
+	rte_memzone_reserve_bounded;
+	rte_memzone_lookup;
+	rte_memzone_dump;
+	rte_memzone_walk;
+	rte_eal_pci_probe;
+	rte_eal_pci_dump;
+	rte_eal_pci_register;
+	rte_eal_pci_unregister;
+	rte_snprintf;
+	rte_strsplit;
+	rte_eal_tailq_reserve;
+	rte_eal_tailq_reserve_by_idx;
+	rte_dump_tailq;
+	rte_eal_tailq_lookup;
+	rte_eal_tailq_lookup_by_idx;
+	lcore_config;
+	per_lcore__lcore_id;
+	eal_timer_source;
+	rte_cycles_vmware_tsc_map;
+	rte_eal_get_configuration;
+	rte_logs;
+	rte_eal_lcore_role;
+	test_mp_secondary;
+	rte_eal_process_type;
+	per_lcore__rte_errno;
+	pci_device_list;
+	devargs_list;
+	eal_parse_sysfs_value;
+	pci_driver_list;
+
+	local: *;
+};
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index a461c31..80ad78d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -39,6 +39,8 @@ LIB = libethdev.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_ether_version.map
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
new file mode 100644
index 0000000..dbd0eca
--- /dev/null
+++ b/lib/librte_ether/rte_ether_version.map
@@ -0,0 +1,113 @@
+DPDK_1.8 {
+	global:
+	rte_eth_driver_register;
+	rte_eth_dev_configure;
+	rte_eth_rx_queue_setup;
+	rte_eth_tx_queue_setup;
+	rte_eth_dev_socket_id;
+	rte_eth_dev_rx_queue_start;
+	rte_eth_dev_rx_queue_stop;
+	rte_eth_dev_tx_queue_start;
+	rte_eth_dev_tx_queue_stop;
+	rte_eth_dev_start;
+	rte_eth_dev_stop;
+	rte_eth_dev_set_link_up;
+	rte_eth_dev_set_link_down;
+	rte_eth_dev_close;
+	rte_eth_promiscuous_enable;
+	rte_eth_promiscuous_disable;
+	rte_eth_promiscuous_get;
+	rte_eth_allmulticast_enable;
+	rte_eth_allmulticast_disable;
+	rte_eth_allmulticast_get;
+	rte_eth_link;
+	rte_eth_link_get_nowait;
+	rte_eth_stats;
+	rte_eth_stats_reset;
+	rte_eth_dev_set_tx_queue_stats_mapping;
+	rte_eth_dev_set_rx_queue_stats_mapping;
+	rte_eth_macaddr_get;
+	rte_eth_dev_info_get;
+	rte_eth_dev_get_mtu;
+	rte_eth_dev_set_mtu;
+	rte_eth_dev_vlan_filter;
+	rte_eth_dev_set_vlan_strip_on_queue;
+	rte_eth_dev_set_vlan_ether_type;
+	rte_eth_dev_set_vlan_offload;
+	rte_eth_dev_get_vlan_offload;
+	rte_eth_dev_set_vlan_pvid;
+	rte_eth_rx_burst;
+	rte_eth_rx_queue_count;
+	rte_eth_rx_descriptor_done;
+	rte_eth_tx_burst;
+	rte_eth_dev_fdir_add_signature_filter;
+	rte_eth_dev_fdir_update_signature_filter;
+	rte_eth_dev_fdir_remove_signature_filter;
+	rte_eth_dev_fdir_get_infos;
+	rte_eth_dev_fdir_add_perfect_filter;
+	rte_eth_dev_fdir_update_perfect_filter;
+	rte_eth_dev_fdir_remove_perfect_filter;
+	rte_eth_dev_fdir_set_masks;
+	rte_eth_dev_callback_register;
+	rte_eth_dev_callback_unregister;
+	rte_eth_dev_callback_process;
+	rte_eth_led_on;
+	rte_eth_led_off;
+	rte_eth_dev_flow_ctrl_get;
+	rte_eth_dev_flow_ctrl_set;
+	rte_eth_dev_priority_flow_ctrl_set;
+	rte_eth_dev_mac_addr_add;
+	rte_eth_dev_mac_addr_remove;
+	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rss_reta_query;
+	rte_eth_dev_uc_hash_table_set;
+	rte_eth_dev_uc_all_hash_table_set;
+	rte_eth_dev_set_vf_rxmode;
+	rte_eth_dev_set_vf_tx;
+	rte_eth_dev_set_vf_rx;
+	rte_eth_dev_set_vf_vlan_filter;
+	rte_eth_mirror_rule_set;
+	rte_eth_mirror_rule_reset;
+	rte_eth_set_queue_rate_limit;
+	rte_eth_set_vf_rate_limit;
+	rte_eth_dev_bypass_init;
+	rte_eth_dev_bypass_state_show;
+	rte_eth_dev_bypass_state_set;
+	rte_eth_dev_bypass_event_show;
+	rte_eth_dev_bypass_event_store;
+	rte_eth_dev_wd_timeout_store;
+	rte_eth_dev_bypass_ver_show;
+	rte_eth_dev_bypass_wd_timeout_show;
+	rte_eth_dev_bypass_wd_reset;
+	rte_eth_dev_rss_hash_update;
+	rte_eth_dev_rss_hash_conf_get;
+	rte_eth_dev_add_syn_filter;
+	rte_eth_dev_remove_syn_filter;
+	rte_eth_dev_get_syn_filter;
+	rte_eth_dev_add_ethertype_filter;
+	rte_eth_dev_remove_ethertype_filter;
+	rte_eth_dev_get_ethertype_filter;
+	rte_eth_dev_add_2tuple_filter;
+	rte_eth_dev_remove_2tuple_filter;
+	rte_eth_dev_get_2tuple_filter;
+	rte_eth_dev_add_5tuple_filter;
+	rte_eth_dev_remove_5tuple_filter;
+	rte_eth_dev_get_5tuple_filter;
+	rte_eth_dev_add_flex_filter;
+	rte_eth_dev_remove_flex_filter;
+	rte_eth_dev_get_flex_filter;
+	rte_eth_dev_count;
+	rte_eth_link_get;
+	rte_eth_devices;
+	rte_eth_stats_get;
+	rte_eth_dev_allocate;
+	_rte_eth_dev_callback_process;
+	rte_eth_dev_filter_ctrl;
+	rte_eth_dev_udp_tunnel_delete;
+	rte_eth_dev_udp_tunnel_add;
+	rte_eth_xstats_get;
+	rte_eth_xstats_reset;
+	rte_eth_dev_filter_supported;
+	local: *;
+};
+
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index 95e4c09..bec61ab 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -37,6 +37,8 @@ LIB = librte_hash.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_hash_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map
new file mode 100644
index 0000000..2a34313
--- /dev/null
+++ b/lib/librte_hash/rte_hash_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_fbk_hash_find_existing;
+	rte_fbk_hash_create;
+	rte_fbk_hash_free;
+	rte_hash_create;
+	rte_hash_find_existing;
+	rte_hash_free;
+	rte_hash_add_key;
+	rte_hash_add_key_with_hash;
+	rte_hash_del_key;
+	rte_hash_del_key_with_hash;
+	rte_hash_lookup;
+	rte_hash_lookup_with_hash;
+	rte_hash_lookup_bulk;
+
+	local: *;
+};
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index 8c00d39..aa88578 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -37,6 +37,8 @@ LIB = librte_ip_frag.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_ipfrag_version.map
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipfrag_version.map b/lib/librte_ip_frag/rte_ipfrag_version.map
new file mode 100644
index 0000000..afe1a0b
--- /dev/null
+++ b/lib/librte_ip_frag/rte_ipfrag_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_ip_frag_table_create;
+	rte_ipv6_fragment_packet;
+	rte_ipv6_frag_reassemble_packet;
+	rte_ipv4_fragment_packet;
+	rte_ipv4_frag_reassemble_packet;
+	rte_ip_frag_free_death_row;
+	rte_ip_frag_table_statistics_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 536814c..068ee10 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ivshmem.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ivshmem_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_ivshmem/rte_ivshmem_version.map b/lib/librte_ivshmem/rte_ivshmem_version.map
new file mode 100644
index 0000000..a204339
--- /dev/null
+++ b/lib/librte_ivshmem/rte_ivshmem_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_ivshmem_metadata_create;
+	rte_ivshmem_metadata_add_memzone;
+	rte_ivshmem_metadata_add_ring;
+	rte_ivshmem_metadata_add_mempool;
+	rte_ivshmem_metadata_cmdline_generate;
+	rte_ivshmem_metadata_dump;
+
+	local: *;
+};
+
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 5267304..93a516d 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -36,6 +36,8 @@ LIB = librte_kni.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_kni_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kni/rte_kni_version.map b/lib/librte_kni/rte_kni_version.map
new file mode 100644
index 0000000..7db39a3
--- /dev/null
+++ b/lib/librte_kni/rte_kni_version.map
@@ -0,0 +1,20 @@
+DPDK_1.8 {
+	global:
+
+	rte_kni_alloc;
+	rte_kni_create;
+	rte_kni_release;
+	rte_kni_handle_request;
+	rte_kni_rx_burst;
+	rte_kni_tx_burst;
+	rte_kni_get_port_id;
+	rte_kni_get;
+	rte_kni_info_get;
+	rte_kni_register_handlers;
+	rte_kni_unregister_handlers;
+	rte_kni_close;
+	rte_kni_init;
+
+	local: *;
+};
+
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b09359a..b1c34f3 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -38,6 +38,8 @@ LIB = librte_kvargs.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_kvargs_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map
new file mode 100644
index 0000000..7873c8c
--- /dev/null
+++ b/lib/librte_kvargs/rte_kvargs_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+	rte_kvargs_parse;
+	rte_kvargs_free;
+	rte_kvargs_process;
+	rte_kvargs_count;
+
+	local: *;
+};
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index fa94163..8214630 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -37,6 +37,8 @@ LIB = librte_lpm.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
+EXPORT_MAP := rte_lpm_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_lpm/rte_lpm_version.map b/lib/librte_lpm/rte_lpm_version.map
new file mode 100644
index 0000000..8ae9318
--- /dev/null
+++ b/lib/librte_lpm/rte_lpm_version.map
@@ -0,0 +1,24 @@
+DPDK_1.8 {
+	global:
+
+	rte_lpm_create;
+	rte_lpm_find_existing;
+	rte_lpm_free;
+	rte_lpm_add;
+	rte_lpm_is_rule_present;
+	rte_lpm_delete;
+	rte_lpm_delete_all;
+	rte_lpm6_create;
+	rte_lpm6_find_existing;
+	rte_lpm6_free;
+	rte_lpm6_add;
+	rte_lpm6_is_rule_present;
+	rte_lpm6_delete;
+	rte_lpm6_delete_bulk_func;
+	rte_lpm6_delete_all;
+	rte_lpm6_lookup;
+	rte_lpm6_lookup_bulk_func;
+
+	local: *;
+};
+
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index ba87e34..15b7eed 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -36,6 +36,8 @@ LIB = librte_malloc.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_malloc_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MALLOC) := rte_malloc.c malloc_elem.c malloc_heap.c
 
diff --git a/lib/librte_malloc/rte_malloc_version.map b/lib/librte_malloc/rte_malloc_version.map
new file mode 100644
index 0000000..77db879
--- /dev/null
+++ b/lib/librte_malloc/rte_malloc_version.map
@@ -0,0 +1,19 @@
+DPDK_1.8 {
+	global:
+
+	rte_malloc;
+	rte_zmalloc;
+	rte_calloc;
+	rte_realloc;
+	rte_malloc_socket;
+	rte_zmalloc_socket;
+	rte_calloc_socket;
+	rte_free;
+	rte_malloc_validate;
+	rte_malloc_get_socket_stats;
+	rte_malloc_dump_stats;
+	rte_malloc_set_limit;
+	rte_malloc_virt2phy;
+
+	local: *;
+};
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 9b45ba4..03becae 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mbuf.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mbuf_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map
new file mode 100644
index 0000000..7260507
--- /dev/null
+++ b/lib/librte_mbuf/rte_mbuf_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+
+	rte_mbuf_sanity_check;
+	rte_ctrlmbuf_init;
+	rte_pktmbuf_init;
+	rte_pktmbuf_pool_init;
+	rte_pktmbuf_dump;
+	rte_get_rx_ol_flag_name;
+	rte_get_tx_ol_flag_name;
+
+	local: *;
+};
+
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 9939e10..31d1a71 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -36,6 +36,8 @@ LIB = librte_mempool.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_mempool_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map
new file mode 100644
index 0000000..7a19982
--- /dev/null
+++ b/lib/librte_mempool/rte_mempool_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_create;
+	rte_mempool_xmem_create;
+	rte_dom0_mempool_create;
+	rte_mempool_dump;
+	rte_mempool_audit;
+	rte_mempool_list_dump;
+	rte_mempool_lookup;
+	rte_mempool_calc_obj_size;
+	rte_mempool_xmem_size;
+	rte_mempool_xmem_usage;
+	rte_mempool_walk;
+	rte_mempool_count;
+
+	local: *;
+};
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index b25c0cc..c4a7a32 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -39,6 +39,8 @@ LIB = librte_meter.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_meter_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_meter/rte_meter_version.map b/lib/librte_meter/rte_meter_version.map
new file mode 100644
index 0000000..51a73b1
--- /dev/null
+++ b/lib/librte_meter/rte_meter_version.map
@@ -0,0 +1,13 @@
+DPDK_1.8 {
+	global:
+
+	rte_meter_srtcm_config;
+	rte_meter_trtcm_config;
+	rte_meter_srtcm_color_blind_check;
+	rte_meter_srtcm_color_aware_check;
+	rte_meter_trtcm_color_blind_check;
+	rte_meter_trtcm_color_aware_check;
+
+	local: *;
+};
+
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index cf8fde8..15b58df 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pipeline.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pipeline_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/rte_pipeline_version.map b/lib/librte_pipeline/rte_pipeline_version.map
new file mode 100644
index 0000000..f868b96
--- /dev/null
+++ b/lib/librte_pipeline/rte_pipeline_version.map
@@ -0,0 +1,23 @@
+DPDK_1.8 {
+	global:
+
+	rte_pipeline_create;
+	rte_pipeline_free;
+	rte_pipeline_check;
+	rte_pipeline_run;
+	rte_pipeline_flush;
+	rte_pipeline_table_create;
+	rte_pipeline_table_default_entry_add;
+	rte_pipeline_table_default_entry_delete;
+	rte_pipeline_table_entry_add;
+	rte_pipeline_table_entry_delete;
+	rte_pipeline_port_in_create;
+	rte_pipeline_port_in_connect_to_table;
+	rte_pipeline_port_in_enable;
+	rte_pipeline_port_in_disable;
+	rte_pipeline_port_out_create;
+	rte_pipeline_port_out_packet_insert;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 6955e5c..85a7860 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+EXPORT_MAP := rte_pmd_af_packet_version.map
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
new file mode 100644
index 0000000..c68beae
--- /dev/null
+++ b/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
@@ -0,0 +1,7 @@
+DPDK_1.8 {
+	global:
+	rte_pmd_af_packet_devinit;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index cdff126..074110a 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_bond.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_bond_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_bond/rte_eth_bond_version.map b/lib/librte_pmd_bond/rte_eth_bond_version.map
new file mode 100644
index 0000000..206b53e
--- /dev/null
+++ b/lib/librte_pmd_bond/rte_eth_bond_version.map
@@ -0,0 +1,21 @@
+DPDK_1.8 {
+	global:
+
+	rte_eth_bond_create;
+	rte_eth_bond_slave_add;
+	rte_eth_bond_slave_remove;
+	rte_eth_bond_mode_set;
+	rte_eth_bond_mode_get;
+	rte_eth_bond_primary_set;
+	rte_eth_bond_primary_get;
+	rte_eth_bond_slaves_get;
+	rte_eth_bond_active_slaves_get;
+	rte_eth_bond_mac_address_set;
+	rte_eth_bond_mac_address_reset;
+	rte_eth_bond_xmit_policy_set;
+	rte_eth_bond_xmit_policy_get;
+	rte_eth_bond_link_monitoring_set;
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index 14bc4a2..cd14444 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_e1000.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_e1000_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_e1000/rte_pmd_e1000_version.map b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index a2a623f..697231c 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+EXPORT_MAP := rte_pmd_enic_version.map
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_enic/rte_pmd_enic_version.map b/lib/librte_pmd_enic/rte_pmd_enic_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_enic/rte_pmd_enic_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 98e4bdf..73de373 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_i40e.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_i40e_version.map
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_i40e/rte_pmd_i40e_version.map b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index 3588047..e0a17f6 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ixgbe.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_ixgbe_version.map
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index c5c214d..cb6678e 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_pcap.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_pcap_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_pcap/rte_pmd_pcap_version.map b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index b57e421..aa1b461 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_ring.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_ring_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 4f1b6ed..df7b583 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -473,7 +473,7 @@ out:
 	return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
 	struct rte_kvargs *kvlist;
diff --git a/lib/librte_pmd_ring/rte_eth_ring.h b/lib/librte_pmd_ring/rte_eth_ring.h
index e6ae19e..d36489a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.h
+++ b/lib/librte_pmd_ring/rte_eth_ring.h
@@ -50,12 +50,6 @@ int rte_eth_from_rings(const char *name,
 int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
 int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
 
-/**
- * For use by test apps only. Called as part of EAL init to set up any dummy NICs
- * configured on command line.
- */
-int rte_pmd_ring_devinit(const char *name, const char *params);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_pmd_ring/rte_eth_ring_version.map b/lib/librte_pmd_ring/rte_eth_ring_version.map
new file mode 100644
index 0000000..5edaa3d
--- /dev/null
+++ b/lib/librte_pmd_ring/rte_eth_ring_version.map
@@ -0,0 +1,10 @@
+DPDK_1.8 {
+
+	global:
+
+	rte_eth_from_rings;
+	rte_eth_ring_pair_create;
+	rte_eth_ring_pair_attach;
+
+	local: *;
+};
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index 456095b..d979c59 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -39,6 +39,7 @@ LIB = librte_pmd_virtio_uio.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_virtio_version.map
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_pmd_virtio/rte_pmd_virtio_version.map b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index 6872c74..f3ab178 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -66,6 +66,8 @@ endif
 
 VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
+EXPORT_MAP := rte_pmd_vmxnet3_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
new file mode 100644
index 0000000..cbc401f
--- /dev/null
+++ b/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
@@ -0,0 +1,5 @@
+DPDK_1.8 {
+
+	local: *;
+};
+
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 01bfcaa..4510603 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_xenvirt.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_eth_xenvirt_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
new file mode 100644
index 0000000..66199b1
--- /dev/null
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
@@ -0,0 +1,8 @@
+DPDK_1.8 {
+	global:
+
+	rte_mempool_gntalloc_create;
+
+	local: *;
+};
+
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 82b5192..266ed39 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -39,6 +39,8 @@ LIB = librte_port.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_port_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/rte_port_version.map b/lib/librte_port/rte_port_version.map
new file mode 100644
index 0000000..57ccaa3
--- /dev/null
+++ b/lib/librte_port/rte_port_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_ethdev_reader_ops;
+	rte_port_ethdev_writer_ops;
+	rte_port_ring_reader_ipv4_frag_ops;
+	rte_port_ring_writer_ipv4_ras_ops;
+	rte_port_ring_reader_ops;
+	rte_port_ring_writer_ops;
+	rte_port_sched_reader_ops;
+	rte_port_sched_writer_ops;
+	rte_port_source_ops;
+	rte_port_sink_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index d672a5a..0547dcd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -36,6 +36,8 @@ LIB = librte_power.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
+EXPORT_MAP := rte_power_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
new file mode 100644
index 0000000..061bca7
--- /dev/null
+++ b/lib/librte_power/rte_power_version.map
@@ -0,0 +1,18 @@
+DPDK_1.8 {
+	global:
+	rte_power_init;
+	rte_power_exit;
+	rte_power_freqs;
+	rte_power_get_freq;
+	rte_power_set_freq;
+	rte_power_freq_up;
+	rte_power_freq_down;
+	rte_power_freq_max;
+	rte_power_freq_min;
+	rte_power_set_env;
+	rte_power_get_env;
+	rte_power_unset_env;
+	
+	local: *;
+};
+
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 2380a43..b437dc5 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -36,6 +36,8 @@ LIB = librte_ring.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_ring_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_ring/rte_ring_version.map b/lib/librte_ring/rte_ring_version.map
new file mode 100644
index 0000000..6c28af9
--- /dev/null
+++ b/lib/librte_ring/rte_ring_version.map
@@ -0,0 +1,12 @@
+DPDK_1.8 {
+	global:
+	rte_ring_get_memsize;
+	rte_ring_init;
+	rte_ring_create;
+	rte_ring_set_water_mark;
+	rte_ring_dump;
+	rte_ring_list_dump;
+	rte_ring_lookup;
+
+	local: *;
+};
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 1a25b21..48f280a 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 CFLAGS_rte_red.o := -D_GNU_SOURCE
 
+EXPORT_MAP := rte_sched_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
new file mode 100644
index 0000000..b5877ce
--- /dev/null
+++ b/lib/librte_sched/rte_sched_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_approx;
+	rte_red_rt_data_init;
+	rte_red_config_init;
+	rte_sched_port_config;
+	rte_sched_port_free;
+	rte_sched_subport_config;
+	rte_sched_pipe_config;
+	rte_sched_port_get_memory_footprint;
+	rte_sched_subport_read_stats;
+	rte_sched_queue_read_stats;
+	rte_sched_port_enqueue;
+	rte_sched_port_dequeue;
+	rte_red_log2_1_minus_Wq;
+	rte_red_pow2_frac_inv;
+	rte_red_rand_val;
+	rte_red_rand_seed;
+
+	local: *;
+};
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index dd684cc..4e1a54a 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -39,6 +39,8 @@ LIB = librte_table.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_table_version.map
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/rte_table_version.map b/lib/librte_table/rte_table_version.map
new file mode 100644
index 0000000..86f16b8
--- /dev/null
+++ b/lib/librte_table/rte_table_version.map
@@ -0,0 +1,22 @@
+DPDK_1.8 {
+	global:
+
+	rte_table_stub_ops;
+	rte_table_lpm_ops;
+	rte_table_array_ops;
+	rte_table_hash_key8_lru_ops;
+	rte_table_hash_key8_lru_dosig_ops;
+	rte_table_hash_key8_ext_ops;
+	rte_table_hash_key8_ext_dosig_ops;
+	rte_table_lpm_ipv6_ops;
+	rte_table_hash_key16_lru_ops;
+	rte_table_hash_key32_lru_ops;
+	rte_table_hash_key16_ext_ops;
+	rte_table_hash_key32_ext_ops;
+	rte_table_acl_ops;
+	rte_table_hash_lru_ops;
+	rte_table_hash_ext_ops;
+
+	local: *;
+};
+
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 07eb0c6..9fb6079 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -36,6 +36,8 @@ LIB = librte_timer.a
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
+EXPORT_MAP := rte_timer_version.map
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
new file mode 100644
index 0000000..00b6b52
--- /dev/null
+++ b/lib/librte_timer/rte_timer_version.map
@@ -0,0 +1,16 @@
+DPDK_1.8 {
+	global:
+
+	rte_timer_subsystem_init;
+	rte_timer_init;
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_stop;
+	rte_timer_stop_sync;
+	rte_timer_pending;
+	rte_timer_manage;
+	rte_timer_dump_stats;
+
+	local: *;
+};
+
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index c008d64..96a7dd0 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+EXPORT_MAP := rte_vhost_version.map
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
new file mode 100644
index 0000000..7685bb8
--- /dev/null
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -0,0 +1,14 @@
+DPDK_1.8 {
+	global:
+	rte_vhost_feature_disable;
+	rte_vhost_feature_enable;
+	rte_vhost_feature_get;
+	rte_vhost_enable_guest_notification;
+	rte_vhost_driver_register;
+	rte_vhost_driver_callback_register;
+	rte_vhost_driver_session_start;
+	rte_vhost_enqueue_burst;
+	rte_vhost_dequeue_burst;
+
+	local: *;
+};
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v6 3/4] Add library version extenstion
  2015-01-20 21:17 ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2015-01-20 21:17   ` Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-20 21:17 ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 3/4] Add library version extenstion Neil Horman
@ 2015-01-20 21:17   ` Neil Horman
  2015-01-21 10:13     ` Iremonger, Bernard
  2015-01-21 10:25     ` Thomas Monjalon
  2 siblings, 2 replies; 104+ messages in thread
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change notes:

v5) Updated documentation to add notes from Thomas M.

v6) Moved abi.txt to guides/rel_notes/abi.rst
---
 doc/guides/rel_notes/abi.rst | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 doc/guides/rel_notes/abi.rst

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
new file mode 100644
index 0000000..98ac19d
--- /dev/null
+++ b/doc/guides/rel_notes/abi.rst
@@ -0,0 +1,38 @@
+ABI policy
+==========
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+	Some ABI changes may be too significant to reasonably maintain multiple
+versions of.  In those events ABI's may be updated without backward
+compatibility provided.  The requirements for doing so are:
+	1) At least 3 acknoweldgements of the need on the dpdk.org
+	2) A full deprecation cycle must be made to offer downstream consumers
+sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
+the change is proposed, a deprecation notice must be added to this file, and
+released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
+	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
+incorporated must be incremented in parallel with the ABI changes themselves
+
+	Note that the above process for ABI deprecation should not be undertaken
+lightly.  ABI stability is extreemely important for downstream consumers of the
+DPDK, especially when distributed in shared object form.  Every effort should be
+made to preserve ABI whenever possible.  For instance, reorganizing public
+structure field for astetic or readability purposes should be avoided as it will
+cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
+as cause to alter ABI.
+  
+Deprecation Notices
+===================
+
-- 
2.1.0

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-21 10:13     ` Iremonger, Bernard
  2015-01-21 10:25     ` Thomas Monjalon
  1 sibling, 0 replies; 104+ messages in thread
From: Iremonger, Bernard @ 2015-01-21 10:13 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, January 20, 2015 9:18 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
> 
> Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst
> ---
>  doc/guides/rel_notes/abi.rst | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>  create mode 100644 doc/guides/rel_notes/abi.rst

Hi Neil,

The file doc/guides/rel_notes/index.rst  should be modified to include "abi" so that the abi.rst file is included in the release notes.

> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst new file mode 100644 index
> 0000000..98ac19d
> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,38 @@
> +ABI policy
> +==========
> +	ABI versions are set at the time of major release labeling, and ABI
> +may change multiple times between the last labeling and the HEAD label
> +of the git tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle,
> +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> +then the decision to remove it is made during the development of DPDK
> +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> +release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a
> +given update.
> +
> +	Some ABI changes may be too significant to reasonably maintain
> +multiple versions of.  In those events ABI's may be updated without
> +backward compatibility provided.  The requirements for doing so are:

The #.  Syntax could be used for numbered lists

> +	1) At least 3 acknoweldgements of the need on the dpdk.org

A blank line is needed otherwise the text will concatenate.

> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under
> +development when the change is proposed, a deprecation notice must be
> +added to this file, and released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1

A blank line is needed otherwise the text will concatenate.

> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> +are incorporated must be incremented in parallel with the ABI changes
> +themselves

A blank line is needed otherwise the text will concatenate.
> +
> +	Note that the above process for ABI deprecation should not be
> +undertaken lightly.  ABI stability is extreemely important for
> +downstream consumers of the DPDK, especially when distributed in shared
> +object form.  Every effort should be made to preserve ABI whenever
> +possible.  For instance, reorganizing public structure field for
> +astetic or readability purposes should be avoided as it will cause ABI
> +breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter ABI.
> +
> +Deprecation Notices
> +===================
> +
> --
> 2.1.0
Regards,

Bernard.

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-20 21:17   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
  2015-01-21 10:13     ` Iremonger, Bernard
@ 2015-01-21 10:25     ` Thomas Monjalon
  2015-01-21 14:59       ` Neil Horman
  1 sibling, 1 reply; 104+ messages in thread
From: Thomas Monjalon @ 2015-01-21 10:25 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-20 16:17, Neil Horman:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst

You didn't integrate this file in the index.

[...]

> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,38 @@
> +ABI policy
> +==========
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.

As previously said, speaking about 2.0/2.1 would be more coherent.

> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +	Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +	1) At least 3 acknoweldgements of the need on the dpdk.org
> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> +the change is proposed, a deprecation notice must be added to this file, and
> +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> +incorporated must be incremented in parallel with the ABI changes themselves
> +
> +	Note that the above process for ABI deprecation should not be undertaken
> +lightly.  ABI stability is extreemely important for downstream consumers of the
> +DPDK, especially when distributed in shared object form.  Every effort should be
> +made to preserve ABI whenever possible.  For instance, reorganizing public
> +structure field for astetic or readability purposes should be avoided as it will
> +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> +as cause to alter ABI.

When applying the patch, there are these (minor) warnings:

/home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:52: trailing whitespace.
/home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:55: new blank line at EOF.

When building the documentation, there are these errors:
make doc-guides-html
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:4: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:8: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:15: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:18: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:20: ERROR: Unexpected indentation.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:22: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:25: ERROR: Unexpected indentation.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:26: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:29: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thom