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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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] 99+ 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; 99+ 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/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree

Please check it.

Other comment, what about the additions I suggested about macros and structure renaming?

Neil, we expect that you consider comments done previously and that you test your patch.
Otherwise, we are losing time in useless reviews.

-- 
Thomas

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

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 10:25     ` Thomas Monjalon
@ 2015-01-21 14:59       ` Neil Horman
  2015-01-21 16:05         ` Thomas Monjalon
  0 siblings, 1 reply; 99+ messages in thread
From: Neil Horman @ 2015-01-21 14:59 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 21, 2015 at 11:25:48AM +0100, Thomas Monjalon wrote:
> 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.
> 
Shiobahn indicated that its just a plain text file, so I left it as a plain text
file.  I guess we have different definitions of plain text files.

> [...]
> 
> > --- /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.
> 
As previously mentioned, I really don't see this as relevant, as it will be out
of date within a release, and I think we can agree, no one is going to update
this paragraph every release.

> > +
> > +	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/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> 
> Please check it.
> 
Again, I guess we have separate definitions of what a plain text file is, but
I'll look into it.


> Other comment, what about the additions I suggested about macros and structure renaming?
> 
Considered and answered already.  I'm in favor of listing macros and structure
changes in the abi document, but I think an exhaustive list isn't needed.  If it
is, we could spend pages diving into minute.  Better to point out the need for
abi noticies as patches get posted.

> Neil, we expect that you consider comments done previously and that you test your patch.
> Otherwise, we are losing time in useless reviews.
> 
Thomas, I have considered your comments, I simply don't agree with all of them,
and I made that clear.

As for losing time, you let the first attempt at this
patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
until I yelled for reviews.  No doubt when all is said and done here you'll
complain because this series likely won't work when you apply it for all the
patches you take between the time I posted it and now.  So lets be careful about
complaining over wasted time.

Neil
 
> -- 
> Thomas
> 

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

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 14:59       ` Neil Horman
@ 2015-01-21 16:05         ` Thomas Monjalon
  2015-01-21 19:43           ` Neil Horman
  0 siblings, 1 reply; 99+ messages in thread
From: Thomas Monjalon @ 2015-01-21 16:05 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-21 09:59, Neil Horman:
> On Wed, Jan 21, 2015 at 11:25:48AM +0100, Thomas Monjalon wrote:
> > 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.
> > 
> Shiobahn indicated that its just a plain text file, so I left it as a plain text
> file.  I guess we have different definitions of plain text files.
> 
> > [...]
> > 
> > > --- /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.
> > 
> As previously mentioned, I really don't see this as relevant, as it will be out
> of date within a release, and I think we can agree, no one is going to update
> this paragraph every release.
> 
> > > +
> > > +	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/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> > 
> > Please check it.
> > 
> Again, I guess we have separate definitions of what a plain text file is, but
> I'll look into it.
> 
> 
> > Other comment, what about the additions I suggested about macros and structure renaming?
> > 
> Considered and answered already.  I'm in favor of listing macros and structure
> changes in the abi document, but I think an exhaustive list isn't needed.  If it
> is, we could spend pages diving into minute.  Better to point out the need for
> abi noticies as patches get posted.

I'm afraid you don't understand what I'm saying. Copy/paste:
"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."
Rewording: if you agree with this policy, please add it in this document.

> > Neil, we expect that you consider comments done previously and that you test your patch.
> > Otherwise, we are losing time in useless reviews.
> > 
> Thomas, I have considered your comments, I simply don't agree with all of them,
> and I made that clear.
> 
> As for losing time, you let the first attempt at this
> patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> until I yelled for reviews.

Now, I'm really upset of your wrong assumptions.
You sent your first proposal on september, during 1.8 cycle, not 1.7 !
And during this cycle, the decision was to postpone it for 2.0 release.

I don't understand what's wrong with you.
You don't make any effort to understand what we are saying and
you make no effort to understand what is this doc directory.
You prefer crying that your patch is not applied.
And I still don't understand if you are willing to work on a test tool for ABI?

> No doubt when all is said and done here you'll
> complain because this series likely won't work when you apply it for all the
> patches you take between the time I posted it and now.  So lets be careful about
> complaining over wasted time.

Note that I'm sure we can do some good work together. And I'd prefer more
pleasant discussions. Life is too short to have this kind of conflict.

-- 
Thomas

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

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 16:05         ` Thomas Monjalon
@ 2015-01-21 19:43           ` Neil Horman
  2015-01-21 22:24             ` Thomas Monjalon
  0 siblings, 1 reply; 99+ messages in thread
From: Neil Horman @ 2015-01-21 19:43 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 21, 2015 at 05:05:51PM +0100, Thomas Monjalon wrote:
> 2015-01-21 09:59, Neil Horman:
> > On Wed, Jan 21, 2015 at 11:25:48AM +0100, Thomas Monjalon wrote:
> > > 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.
> > > 
> > Shiobahn indicated that its just a plain text file, so I left it as a plain text
> > file.  I guess we have different definitions of plain text files.
> > 
> > > [...]
> > > 
> > > > --- /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.
> > > 
> > As previously mentioned, I really don't see this as relevant, as it will be out
> > of date within a release, and I think we can agree, no one is going to update
> > this paragraph every release.
> > 
> > > > +
> > > > +	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/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> > > 
> > > Please check it.
> > > 
> > Again, I guess we have separate definitions of what a plain text file is, but
> > I'll look into it.
> > 
> > 
> > > Other comment, what about the additions I suggested about macros and structure renaming?
> > > 
> > Considered and answered already.  I'm in favor of listing macros and structure
> > changes in the abi document, but I think an exhaustive list isn't needed.  If it
> > is, we could spend pages diving into minute.  Better to point out the need for
> > abi noticies as patches get posted.
> 
> I'm afraid you don't understand what I'm saying. Copy/paste:
> "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."
> Rewording: if you agree with this policy, please add it in this document.
> 
Yes, we're on the same page regarding what your asking, I just don't agree that
it needs to be explicitly called out.  I thought I was clear on that.
Appaerntly not however, so if it will settle the point, I'll just add it.

> > > Neil, we expect that you consider comments done previously and that you test your patch.
> > > Otherwise, we are losing time in useless reviews.
> > > 
> > Thomas, I have considered your comments, I simply don't agree with all of them,
> > and I made that clear.
> > 
> > As for losing time, you let the first attempt at this
> > patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> > until I yelled for reviews.
> 
> Now, I'm really upset of your wrong assumptions.
> You sent your first proposal on september, during 1.8 cycle, not 1.7 !
> And during this cycle, the decision was to postpone it for 2.0 release.
> 
you're missing the point. I apologize for not getting the release numbers right,
it should be 1.8 to 2.0 not 1.7 to 1.8 as you note, but that doesn't really
matter.  The point was 6 months.  6 months this has been sitting around.  In
that time up to this point I've gotten one review from another devloper on the
set, and you indicating that its not ready yet.  Then, the day 1.8 released, I
reposed the patch series as we agreed, and its taken almost 5 weeks before I've
gotten any feedback on it, and then its feedback that could have been given 6
months ago (you'll note this patch was initially identical to the version I
posted back in september).  I think you can understand how I find that
frustrating.

> I don't understand what's wrong with you.
The above is whats wrong with me.  The fact that I can try and try and try to
add value to this project so that I can expand its user base, and the best I've
thus far been able to receive is indifference.  At worst, the indifference is
followed by being told that the indifference is tantamount to rejection.


> You don't make any effort to understand what we are saying and
> you make no effort to understand what is this doc directory.
> You prefer crying that your patch is not applied.
No effort?  How many emails have I written contesting your opinions, presenting
supporting evidence, only to be met with assertions?  I don't think I'm the one
not making an effort here.

> And I still don't understand if you are willing to work on a test tool for ABI?
> 
>From this email
http://dpdk.org/ml/archives/dev/2015-January/011306.html

=======================================================
> 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.
=========================================================

I'm not sure how thats unclear, but in the event that it wasn't, yes, I will
gladly work on such a tool.

> > No doubt when all is said and done here you'll
> > complain because this series likely won't work when you apply it for all the
> > patches you take between the time I posted it and now.  So lets be careful about
> > complaining over wasted time.
> 
> Note that I'm sure we can do some good work together. And I'd prefer more
> pleasant discussions. Life is too short to have this kind of conflict.
> 
I agree, and we've done so in the past.  I'm sorry if I've upset you, it wasn't
my intention.  That said, can you see how I might be frustrated by this patch
set taking 6 months to get reviewed, only to have commentary made on it that I
could have handled back at the beginning of this whole mess?

Participation.  Thats really whats needed here.  Not just from you, not just
from me, everyone, and not just on the items that we consider important to
ourselves.  Indifference leads to exclusion and frustration. 


I'll have another version of this ready soon.
Neil

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

* [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0
  2014-12-20 21:01 [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (9 preceding siblings ...)
  2015-01-20 21:17 ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-21 20:57 ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 02/26] mk: fix link to static combined library Neil Horman
                     ` (9 more replies)
  2015-01-21 20:59 ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (3 subsequent siblings)
  14 siblings, 10 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Thomas Monjalon <thomas.monjalon@6wind.com>

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 lib/librte_eal/common/include/rte_version.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/librte_eal/common/include/rte_version.h b/lib/librte_eal/common/include/rte_version.h
index d2686ae..a267040 100644
--- a/lib/librte_eal/common/include/rte_version.h
+++ b/lib/librte_eal/common/include/rte_version.h
@@ -54,12 +54,12 @@ extern "C" {
 /**
  * Major version number i.e. the x in x.y.z
  */
-#define RTE_VER_MAJOR 1
+#define RTE_VER_MAJOR 2
 
 /**
  * Minor version number i.e. the y in x.y.z
  */
-#define RTE_VER_MINOR 8
+#define RTE_VER_MINOR 0
 
 /**
  * Patch level number i.e. the z in x.y.z
@@ -69,14 +69,14 @@ extern "C" {
 /**
  * Extra string to be appended to version number
  */
-#define RTE_VER_SUFFIX ""
+#define RTE_VER_SUFFIX "-rc"
 
 /**
  * Patch release number
  *   0-15 = release candidates
  *   16   = release
  */
-#define RTE_VER_PATCH_RELEASE 16
+#define RTE_VER_PATCH_RELEASE 0
 
 /**
  * Macro to compute a version number usable for comparisons
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 02/26] mk: fix link to static combined library
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 03/26] eal: fix check for power of 2 in 0 case Neil Horman
                     ` (8 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

When building static archives with CONFIG_COMBINED_LIBS, we still need to
specify --whole-archive to pull in all the proper constructors.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Reported-by: Lyn M <netinal7@gmail.com>
Tested-by: Lyn M <netinal7@gmail.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 mk/rte.app.mk | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index e1a0dbf..40afb2c 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -61,6 +61,10 @@ ifeq ($(NO_AUTOLIBS),)
 
 LDLIBS += --whole-archive
 
+ifeq ($(CONFIG_RTE_BUILD_COMBINE_LIBS),y)
+LDLIBS += -l$(RTE_LIBNAME)
+endif
+
 ifeq ($(CONFIG_RTE_BUILD_COMBINE_LIBS),n)
 
 ifeq ($(CONFIG_RTE_LIBRTE_DISTRIBUTOR),y)
@@ -251,10 +255,6 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
-ifeq ($(CONFIG_RTE_BUILD_COMBINE_LIBS),y)
-LDLIBS += -l$(RTE_LIBNAME)
-endif
-
 ifeq ($(LINK_USING_CC),1)
 override EXTRA_LDFLAGS := $(call linkerprefix,$(EXTRA_LDFLAGS))
 O_TO_EXE = $(CC) $(CFLAGS) $(LDFLAGS_$(@)) \
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 03/26] eal: fix check for power of 2 in 0 case
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 02/26] mk: fix link to static combined library Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 04/26] ethdev: fix missing parenthesis in mac check Neil Horman
                     ` (7 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Ravi Kerur <rkerur@gmail.com>

rte_is_power_of_2 returns true for 0 and 0 is not power_of_2.
Fix by checking for n.

Signed-off-by: Ravi Kerur <rkerur@gmail.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 lib/librte_eal/common/include/rte_common.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h
index 921b91f..8ac940c 100644
--- a/lib/librte_eal/common/include/rte_common.h
+++ b/lib/librte_eal/common/include/rte_common.h
@@ -203,7 +203,7 @@ extern int RTE_BUILD_BUG_ON_detected_error;
 static inline int
 rte_is_power_of_2(uint32_t n)
 {
-	return ((n-1) & n) == 0;
+	return n && !(n & (n - 1));
 }
 
 /**
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 04/26] ethdev: fix missing parenthesis in mac check
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 02/26] mk: fix link to static combined library Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 03/26] eal: fix check for power of 2 in 0 case Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 05/26] mem: search only dpdk hugetlbfs maps Neil Horman
                     ` (6 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Pawel Wodkowski <pawelx.wodkowski@intel.com>

Fix check introduced in commit 4bdefaade6d1 (VMDQ enhancements).

Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 lib/librte_ether/rte_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 95f2ceb..ff26bd0 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -814,7 +814,7 @@ rte_eth_dev_config_restore(uint8_t port_id)
 
 		/* add address to the hardware */
 		if  (*dev->dev_ops->mac_addr_add &&
-			dev->data->mac_pool_sel[i] & (1ULL << pool))
+			(dev->data->mac_pool_sel[i] & (1ULL << pool)))
 			(*dev->dev_ops->mac_addr_add)(dev, &addr, i, pool);
 		else {
 			PMD_DEBUG_TRACE("port %d: MAC address array not supported\n",
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 05/26] mem: search only dpdk hugetlbfs maps
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (2 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 04/26] ethdev: fix missing parenthesis in mac check Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 06/26] log: remove unnecessary stubs Neil Horman
                     ` (5 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Vlad Zolotarov <vladz@cloudius-systems.com>

When scanning the hugetlbfs maps search only for the DPDK maps.
This will allow the application create its own hugetlbfs mappings
and use the DPDK facilities on the same hugetlbfs mount point.

Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 lib/librte_eal/linuxapp/eal/eal_memory.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
index bae2507..a67a1b0 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -611,7 +611,7 @@ find_numasocket(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi)
 	}
 
 	snprintf(hugedir_str, sizeof(hugedir_str),
-			"%s/", hpi->hugedir);
+			"%s/%s", hpi->hugedir, internal_config.hugefile_prefix);
 
 	/* parse numa map */
 	while (fgets(buf, sizeof(buf), f) != NULL) {
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 06/26] log: remove unnecessary stubs
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (3 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 05/26] mem: search only dpdk hugetlbfs maps Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 07/26] vfio: avoid enabling while the module is not loaded Neil Horman
                     ` (4 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Stephen Hemminger <stephen@networkplumber.org>

The read/seek/close stub functions are unnecessary on the
log stream.  Per glibc fopencookie man page:

       cookie_read_function_t *read
              If *read is a null pointer, then reads from  the  custom  stream
              always return end of file.

       cookie_seek_function_t *seek
              If *seek is a null pointer, then it is not possible  to  perform
              seek operations on the stream.

       cookie_close_function_t *close
              If  *close is NULL, then no special action is performed when the
              stream is closed.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 lib/librte_eal/linuxapp/eal/eal_log.c | 50 -----------------------------------
 1 file changed, 50 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_log.c b/lib/librte_eal/linuxapp/eal/eal_log.c
index 94dedfb..a2d9056 100644
--- a/lib/librte_eal/linuxapp/eal/eal_log.c
+++ b/lib/librte_eal/linuxapp/eal/eal_log.c
@@ -83,33 +83,8 @@ console_log_write(__attribute__((unused)) void *c, const char *buf, size_t size)
 	return ret;
 }
 
-static ssize_t
-console_log_read(__attribute__((unused)) void *c,
-		 __attribute__((unused)) char *buf,
-		 __attribute__((unused)) size_t size)
-{
-	return 0;
-}
-
-static int
-console_log_seek(__attribute__((unused)) void *c,
-		 __attribute__((unused)) off64_t *offset,
-		 __attribute__((unused)) int whence)
-{
-	return -1;
-}
-
-static int
-console_log_close(__attribute__((unused)) void *c)
-{
-	return 0;
-}
-
 static cookie_io_functions_t console_log_func = {
-	.read  = console_log_read,
 	.write = console_log_write,
-	.seek  = console_log_seek,
-	.close = console_log_close
 };
 
 /*
@@ -150,33 +125,8 @@ early_log_write(__attribute__((unused)) void *c, const char *buf, size_t size)
 	return ret;
 }
 
-static ssize_t
-early_log_read(__attribute__((unused)) void *c,
-	       __attribute__((unused)) char *buf,
-	       __attribute__((unused)) size_t size)
-{
-	return 0;
-}
-
-static int
-early_log_seek(__attribute__((unused)) void *c,
-	       __attribute__((unused)) off64_t *offset,
-	       __attribute__((unused)) int whence)
-{
-	return -1;
-}
-
-static int
-early_log_close(__attribute__((unused)) void *c)
-{
-	return 0;
-}
-
 static cookie_io_functions_t early_log_func = {
-	.read  = early_log_read,
 	.write = early_log_write,
-	.seek  = early_log_seek,
-	.close = early_log_close
 };
 static FILE *early_log_stream;
 
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 07/26] vfio: avoid enabling while the module is not loaded
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (4 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 06/26] log: remove unnecessary stubs Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 08/26] bond: fix vlan flag interpretation Neil Horman
                     ` (3 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Michael Qiu <michael.qiu@intel.com>

When vfio module is not loaded when kernel support vfio feature,
the routine still try to open the container to get file
description.

This action is not safe, and of course got error messages:

EAL: Detected 40 lcore(s)
EAL:   unsupported IOMMU type!
EAL: VFIO support could not be initialized
EAL: Setting up memory...

This may make user confuse, this patch make it reasonable
and much more smooth to user.

Signed-off-by: Michael Qiu <michael.qiu@intel.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 lib/librte_eal/common/eal_private.h        | 14 ++++++++++++++
 lib/librte_eal/linuxapp/eal/eal.c          | 27 +++++++++++++++++++++++++++
 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c | 24 ++++++++++++++++++++++--
 3 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index 232fcec..159cd66 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -203,4 +203,18 @@ int rte_eal_alarm_init(void);
  */
 int rte_eal_dev_init(void);
 
+/**
+ * Function is to check if the kernel module(like, vfio, vfio_iommu_type1,
+ * etc.) loaded.
+ *
+ * @param module_name
+ *	The module's name which need to be checked
+ *
+ * @return
+ *	-1 means some error happens(NULL pointer or open failure)
+ *	0  means the module not loaded
+ *	1  means the module loaded
+ */
+int rte_eal_check_module(const char *module_name);
+
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 2fb1acc..648ef81 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -859,3 +859,30 @@ int rte_eal_has_hugepages(void)
 {
 	return ! internal_config.no_hugetlbfs;
 }
+
+int
+rte_eal_check_module(const char *module_name)
+{
+	char mod_name[30]; /* Any module names can be longer than 30 bytes? */
+	int ret = 0;
+
+	if (NULL == module_name)
+		return -1;
+
+	FILE *fd = fopen("/proc/modules", "r");
+	if (NULL == fd) {
+		RTE_LOG(ERR, EAL, "Open /proc/modules failed!"
+			" error %i (%s)\n", errno, strerror(errno));
+		return -1;
+	}
+	while (!feof(fd)) {
+		fscanf(fd, "%29s %*[^\n]", mod_name);
+		if (!strcmp(mod_name, module_name)) {
+			ret = 1;
+			break;
+		}
+	}
+	fclose(fd);
+
+	return ret;
+}
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
index c1246e8..20e0977 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
@@ -44,6 +44,7 @@
 #include <rte_tailq.h>
 #include <rte_eal_memconfig.h>
 #include <rte_malloc.h>
+#include <eal_private.h>
 
 #include "eal_filesystem.h"
 #include "eal_pci_init.h"
@@ -340,9 +341,11 @@ pci_vfio_get_container_fd(void)
 		if (ret != 1) {
 			if (ret < 0)
 				RTE_LOG(ERR, EAL, "  could not get IOMMU type, "
-						"error %i (%s)\n", errno, strerror(errno));
+					"error %i (%s)\n", errno,
+					strerror(errno));
 			else
-				RTE_LOG(ERR, EAL, "  unsupported IOMMU type!\n");
+				RTE_LOG(ERR, EAL, "  unsupported IOMMU type "
+					"detected in VFIO\n");
 			close(vfio_container_fd);
 			return -1;
 		}
@@ -783,11 +786,28 @@ pci_vfio_enable(void)
 {
 	/* initialize group list */
 	int i;
+	int module_vfio_type1;
 
 	for (i = 0; i < VFIO_MAX_GROUPS; i++) {
 		vfio_cfg.vfio_groups[i].fd = -1;
 		vfio_cfg.vfio_groups[i].group_no = -1;
 	}
+
+	module_vfio_type1 = rte_eal_check_module("vfio_iommu_type1");
+
+	/* return error directly */
+	if (module_vfio_type1 == -1) {
+		RTE_LOG(INFO, EAL, "Could not get loaded module details!\n");
+		return -1;
+	}
+
+	/* return 0 if VFIO modules not loaded */
+	if (module_vfio_type1 == 0) {
+		RTE_LOG(INFO, EAL, "VFIO modules not all loaded, "
+			"skip VFIO support...\n");
+		return 0;
+	}
+
 	vfio_cfg.vfio_container_fd = pci_vfio_get_container_fd();
 
 	/* check if we have VFIO driver enabled */
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 08/26] bond: fix vlan flag interpretation
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (5 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 07/26] vfio: avoid enabling while the module is not loaded Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 09/26] app/testpmd: remove duplicated function for list parsing Neil Horman
                     ` (2 subsequent siblings)
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Declan Doherty <declan.doherty@intel.com>

This patch contains a fix for link bonding handling of vlan tagged packets in mode 3 and 5.
Currently xmit_slave_hash function misinterprets the PKT_RX_VLAN_PKT flag to mean that
there is a vlan tag within the packet when in actually means that there is a valid entry
in the vlan_tci field in the mbuf.

- Fixed VLAN tag support in hashing functions.
- Adds support for TCP in layer 4 header hashing.
- Splits transmit hashing function into separate functions for each policy to
  reduce branching and to make the code clearer.
- Fixed incorrect flag set in test application packet generator.

Test report: http://dpdk.org/ml/archives/dev/2015-January/010792.html

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
Acked-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Tested-by: SunX Jiajia <sunx.jiajia@intel.com>
---
 app/test/packet_burst_generator.c          |   2 +-
 lib/librte_net/rte_ip.h                    |   8 ++
 lib/librte_pmd_bond/rte_eth_bond_api.c     |   8 ++
 lib/librte_pmd_bond/rte_eth_bond_pmd.c     | 162 ++++++++++++++++-------------
 lib/librte_pmd_bond/rte_eth_bond_private.h |  15 +++
 5 files changed, 122 insertions(+), 73 deletions(-)

diff --git a/app/test/packet_burst_generator.c b/app/test/packet_burst_generator.c
index b2824dc..4a89663 100644
--- a/app/test/packet_burst_generator.c
+++ b/app/test/packet_burst_generator.c
@@ -97,7 +97,7 @@ initialize_eth_header(struct ether_hdr *eth_hdr, struct ether_addr *src_mac,
 		vhdr->eth_proto =  rte_cpu_to_be_16(ETHER_TYPE_IPv4);
 		vhdr->vlan_tci = van_id;
 	} else {
-		eth_hdr->ether_type = rte_cpu_to_be_16(ETHER_TYPE_VLAN);
+		eth_hdr->ether_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);
 	}
 
 }
diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h
index f0ec543..64935d9 100644
--- a/lib/librte_net/rte_ip.h
+++ b/lib/librte_net/rte_ip.h
@@ -110,6 +110,14 @@ struct ipv4_hdr {
 					   (((c) & 0xff) << 8)  | \
 					   ((d) & 0xff))
 
+/** Internet header length mask for version_ihl field */
+#define IPV4_HDR_IHL_MASK	(0x0f)
+/**
+ * Internet header length field multiplier (IHL field specifies overall header
+ * length in number of 4-byte words)
+ */
+#define IPV4_IHL_MULTIPLIER	(4)
+
 /* Fragment Offset * Flags. */
 #define	IPV4_HDR_DF_SHIFT	14
 #define	IPV4_HDR_MF_SHIFT	13
diff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c b/lib/librte_pmd_bond/rte_eth_bond_api.c
index c2a99a3..4ab3267 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_api.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_api.c
@@ -272,6 +272,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 	internals->mode = BONDING_MODE_INVALID;
 	internals->current_primary_port = 0;
 	internals->balance_xmit_policy = BALANCE_XMIT_POLICY_LAYER2;
+	internals->xmit_hash = xmit_l2_hash;
 	internals->user_defined_mac = 0;
 	internals->link_props_set = 0;
 
@@ -714,9 +715,16 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
 
 	switch (policy) {
 	case BALANCE_XMIT_POLICY_LAYER2:
+		internals->balance_xmit_policy = policy;
+		internals->xmit_hash = xmit_l2_hash;
+		break;
 	case BALANCE_XMIT_POLICY_LAYER23:
+		internals->balance_xmit_policy = policy;
+		internals->xmit_hash = xmit_l23_hash;
+		break;
 	case BALANCE_XMIT_POLICY_LAYER34:
 		internals->balance_xmit_policy = policy;
+		internals->xmit_hash = xmit_l34_hash;
 		break;
 
 	default:
diff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
index bb4a537..e9cec2a 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
@@ -31,6 +31,8 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <stdlib.h>
+#include <netinet/in.h>
+
 #include <rte_mbuf.h>
 #include <rte_malloc.h>
 #include <rte_ethdev.h>
@@ -48,6 +50,9 @@
 #include "rte_eth_bond_8023ad_private.h"
 
 #define REORDER_PERIOD_MS 10
+
+#define HASH_L4_PORTS(h) ((h)->src_port ^ (h)->dst_port)
+
 /* Table for statistics in mode 5 TLB */
 static uint64_t tlb_last_obytets[RTE_MAX_ETHPORTS];
 
@@ -276,90 +281,105 @@ ipv6_hash(struct ipv6_hdr *ipv6_hdr)
 			(word_src_addr[3] ^ word_dst_addr[3]);
 }
 
-static uint32_t
-udp_hash(struct udp_hdr *hdr)
+static inline size_t
+get_vlan_offset(struct ether_hdr *eth_hdr)
 {
-	return hdr->src_port ^ hdr->dst_port;
+	size_t vlan_offset = 0;
+
+	/* Calculate VLAN offset */
+	if (rte_cpu_to_be_16(ETHER_TYPE_VLAN) == eth_hdr->ether_type) {
+		struct vlan_hdr *vlan_hdr = (struct vlan_hdr *)(eth_hdr + 1);
+		vlan_offset = sizeof(struct vlan_hdr);
+
+		while (rte_cpu_to_be_16(ETHER_TYPE_VLAN) ==
+				vlan_hdr->eth_proto) {
+			vlan_hdr = vlan_hdr + 1;
+			vlan_offset += sizeof(struct vlan_hdr);
+		}
+	}
+	return vlan_offset;
 }
 
-static inline uint16_t
-xmit_slave_hash(const struct rte_mbuf *buf, uint8_t slave_count, uint8_t policy)
+uint16_t
+xmit_l2_hash(const struct rte_mbuf *buf, uint8_t slave_count)
 {
-	struct ether_hdr *eth_hdr;
-	struct udp_hdr *udp_hdr;
-	size_t eth_offset = 0;
-	uint32_t hash = 0;
-
-	if (slave_count == 1)
-		return 0;
+	struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);
 
-	switch (policy) {
-	case BALANCE_XMIT_POLICY_LAYER2:
-		eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);
+	uint32_t hash = ether_hash(eth_hdr);
 
-		hash = ether_hash(eth_hdr);
-		hash ^= hash >> 8;
-		return hash % slave_count;
+	return (hash ^= hash >> 8) % slave_count;
+}
 
-	case BALANCE_XMIT_POLICY_LAYER23:
-		eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);
+uint16_t
+xmit_l23_hash(const struct rte_mbuf *buf, uint8_t slave_count)
+{
+	struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);
+	size_t vlan_offset = get_vlan_offset(eth_hdr);
+	uint32_t hash, l3hash = 0;
 
-		if (buf->ol_flags & PKT_RX_VLAN_PKT)
-			eth_offset = sizeof(struct ether_hdr) + sizeof(struct vlan_hdr);
-		else
-			eth_offset = sizeof(struct ether_hdr);
+	hash = ether_hash(eth_hdr);
 
-		if (buf->ol_flags & PKT_RX_IPV4_HDR) {
-			struct ipv4_hdr *ipv4_hdr;
-			ipv4_hdr = (struct ipv4_hdr *)(rte_pktmbuf_mtod(buf,
-					unsigned char *) + eth_offset);
+	if (buf->ol_flags & PKT_RX_IPV4_HDR) {
+		struct ipv4_hdr *ipv4_hdr = (struct ipv4_hdr *)
+				((char *)(eth_hdr + 1) + vlan_offset);
+		l3hash = ipv4_hash(ipv4_hdr);
 
-			hash = ether_hash(eth_hdr) ^ ipv4_hash(ipv4_hdr);
+	} else if  (buf->ol_flags & PKT_RX_IPV6_HDR) {
+		struct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)
+				((char *)(eth_hdr + 1) + vlan_offset);
+		l3hash = ipv6_hash(ipv6_hdr);
+	}
 
-		} else {
-			struct ipv6_hdr *ipv6_hdr;
+	hash = hash ^ l3hash;
+	hash ^= hash >> 16;
+	hash ^= hash >> 8;
 
-			ipv6_hdr = (struct ipv6_hdr *)(rte_pktmbuf_mtod(buf,
-					unsigned char *) + eth_offset);
+	return hash % slave_count;
+}
 
-			hash = ether_hash(eth_hdr) ^ ipv6_hash(ipv6_hdr);
+uint16_t
+xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count)
+{
+	struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);
+	size_t vlan_offset = get_vlan_offset(eth_hdr);
+	struct udp_hdr *udp_hdr = NULL;
+	struct tcp_hdr *tcp_hdr = NULL;
+	uint32_t hash, l3hash = 0, l4hash = 0;
+
+	if (buf->ol_flags & PKT_RX_IPV4_HDR) {
+		struct ipv4_hdr *ipv4_hdr = (struct ipv4_hdr *)
+				((char *)(eth_hdr + 1) + vlan_offset);
+		size_t ip_hdr_offset;
+
+		l3hash = ipv4_hash(ipv4_hdr);
+
+		ip_hdr_offset = (ipv4_hdr->version_ihl & IPV4_HDR_IHL_MASK) *
+				IPV4_IHL_MULTIPLIER;
+
+		if (ipv4_hdr->next_proto_id == IPPROTO_TCP) {
+			tcp_hdr = (struct tcp_hdr *)((char *)ipv4_hdr +
+					ip_hdr_offset);
+			l4hash = HASH_L4_PORTS(tcp_hdr);
+		} else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) {
+			udp_hdr = (struct udp_hdr *)((char *)ipv4_hdr +
+					ip_hdr_offset);
+			l4hash = HASH_L4_PORTS(udp_hdr);
 		}
-		break;
-
-	case BALANCE_XMIT_POLICY_LAYER34:
-		if (buf->ol_flags & PKT_RX_VLAN_PKT)
-			eth_offset = sizeof(struct ether_hdr) + sizeof(struct vlan_hdr);
-		else
-			eth_offset = sizeof(struct ether_hdr);
-
-		if (buf->ol_flags & PKT_RX_IPV4_HDR) {
-			struct ipv4_hdr *ipv4_hdr = (struct ipv4_hdr *)
-					(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset);
-
-			if (ipv4_hdr->next_proto_id == IPPROTO_UDP) {
-				udp_hdr = (struct udp_hdr *)
-						(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset +
-								sizeof(struct ipv4_hdr));
-				hash = ipv4_hash(ipv4_hdr) ^ udp_hash(udp_hdr);
-			} else {
-				hash = ipv4_hash(ipv4_hdr);
-			}
-		} else {
-			struct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)
-					(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset);
-
-			if (ipv6_hdr->proto == IPPROTO_UDP) {
-				udp_hdr = (struct udp_hdr *)
-						(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset +
-								sizeof(struct ipv6_hdr));
-				hash = ipv6_hash(ipv6_hdr) ^ udp_hash(udp_hdr);
-			} else {
-				hash = ipv6_hash(ipv6_hdr);
-			}
+	} else if  (buf->ol_flags & PKT_RX_IPV6_HDR) {
+		struct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)
+				((char *)(eth_hdr + 1) + vlan_offset);
+		l3hash = ipv6_hash(ipv6_hdr);
+
+		if (ipv6_hdr->proto == IPPROTO_TCP) {
+			tcp_hdr = (struct tcp_hdr *)(ipv6_hdr + 1);
+			l4hash = HASH_L4_PORTS(tcp_hdr);
+		} else if (ipv6_hdr->proto == IPPROTO_UDP) {
+			udp_hdr = (struct udp_hdr *)(ipv6_hdr + 1);
+			l4hash = HASH_L4_PORTS(udp_hdr);
 		}
-		break;
 	}
 
+	hash = l3hash ^ l4hash;
 	hash ^= hash >> 16;
 	hash ^= hash >> 8;
 
@@ -536,8 +556,7 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs,
 	/* Populate slaves mbuf with the packets which are to be sent on it  */
 	for (i = 0; i < nb_pkts; i++) {
 		/* Select output slave using hash based on xmit policy */
-		op_slave_id = xmit_slave_hash(bufs[i], num_of_slaves,
-				internals->balance_xmit_policy);
+		op_slave_id = internals->xmit_hash(bufs[i], num_of_slaves);
 
 		/* Populate slave mbuf arrays with mbufs for that slave */
 		slave_bufs[op_slave_id][slave_nb_pkts[op_slave_id]++] = bufs[i];
@@ -575,7 +594,7 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 
 	uint8_t num_of_slaves;
 	uint8_t slaves[RTE_MAX_ETHPORTS];
-	 /* possitions in slaves, not ID */
+	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
 
@@ -622,8 +641,7 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 		/* Populate slaves mbuf with the packets which are to be sent on it */
 		for (i = 0; i < nb_pkts; i++) {
 			/* Select output slave using hash based on xmit policy */
-			op_slave_idx = xmit_slave_hash(bufs[i], distributing_count,
-					internals->balance_xmit_policy);
+			op_slave_idx = internals->xmit_hash(bufs[i], distributing_count);
 
 			/* Populate slave mbuf arrays with mbufs for that slave. Use only
 			 * slaves that are currently distributing. */
diff --git a/lib/librte_pmd_bond/rte_eth_bond_private.h b/lib/librte_pmd_bond/rte_eth_bond_private.h
index f913c5b..e01e66b 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_private.h
+++ b/lib/librte_pmd_bond/rte_eth_bond_private.h
@@ -108,6 +108,9 @@ struct bond_slave_details {
 	struct ether_addr persisted_mac_addr;
 };
 
+
+typedef uint16_t (*xmit_hash_t)(const struct rte_mbuf *buf, uint8_t slave_count);
+
 /** Link Bonding PMD device private configuration Structure */
 struct bond_dev_private {
 	uint8_t port_id;					/**< Port Id of Bonded Port */
@@ -122,6 +125,9 @@ struct bond_dev_private {
 
 	uint8_t balance_xmit_policy;
 	/**< Transmit policy - l2 / l23 / l34 for operation in balance mode */
+	xmit_hash_t xmit_hash;
+	/**< Transmit policy hash function */
+
 	uint8_t user_defined_mac;
 	/**< Flag for whether MAC address is user defined or not */
 	uint8_t promiscuous_en;
@@ -225,6 +231,15 @@ void
 slave_add(struct bond_dev_private *internals,
 		struct rte_eth_dev *slave_eth_dev);
 
+uint16_t
+xmit_l2_hash(const struct rte_mbuf *buf, uint8_t slave_count);
+
+uint16_t
+xmit_l23_hash(const struct rte_mbuf *buf, uint8_t slave_count);
+
+uint16_t
+xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count);
+
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
 		uint8_t slave_port_id);
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 09/26] app/testpmd: remove duplicated function for list parsing
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (6 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 08/26] bond: fix vlan flag interpretation Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 10/26] nic_uio: fix thread structure compatibility for future FreeBSD Neil Horman
  2015-01-21 20:58   ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Bruce Richardson <bruce.richardson@intel.com>

There were two static functions called "parse_item_list" in testpmd app.
Since one was a superset of the functionality of the other, we can
collapse the two calls down into a single one, shared between the two
C files.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 app/test-pmd/cmdline.c    |  2 +-
 app/test-pmd/parameters.c | 49 ++---------------------------------------------
 app/test-pmd/testpmd.h    |  3 +++
 3 files changed, 6 insertions(+), 48 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 882a5a2..4618b92 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -2224,7 +2224,7 @@ cmdline_parse_inst_t cmd_stop = {
 
 /* *** SET CORELIST and PORTLIST CONFIGURATION *** */
 
-static unsigned int
+unsigned int
 parse_item_list(char* str, const char* item_name, unsigned int max_items,
 		unsigned int *parsed_items, int check_unique_values)
 {
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index fcb2c99..adf3203 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -491,52 +491,6 @@ parse_ringnuma_config(const char *q_arg)
 	return 0;
 }
 
-static unsigned int
-parse_item_list(char* str, unsigned int max_items, unsigned int *parsed_items)
-{
-	unsigned int nb_item;
-	unsigned int value;
-	unsigned int i;
-	int value_ok;
-	char c;
-
-	/*
-	 * First parse all items in the list and store their value.
-	 */
-	value = 0;
-	nb_item = 0;
-	value_ok = 0;
-	for (i = 0; i < strlen(str); i++) {
-		c = str[i];
-		if ((c >= '0') && (c <= '9')) {
-			value = (unsigned int) (value * 10 + (c - '0'));
-			value_ok = 1;
-			continue;
-		}
-		if (c != ',') {
-			printf("character %c is not a decimal digit\n", c);
-			return (0);
-		}
-		if (! value_ok) {
-			printf("No valid value before comma\n");
-			return (0);
-		}
-		if (nb_item < max_items) {
-			parsed_items[nb_item] = value;
-			value_ok = 0;
-			value = 0;
-		}
-		nb_item++;
-	}
-
-	if (nb_item >= max_items)
-		rte_exit(EXIT_FAILURE, "too many txpkt segments!\n");
-
-	parsed_items[nb_item++] = value;
-
-	return (nb_item);
-}
-
 void
 launch_args_parse(int argc, char** argv)
 {
@@ -1050,7 +1004,8 @@ launch_args_parse(int argc, char** argv)
 				unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT];
 				unsigned int nb_segs;
 
-				nb_segs = parse_item_list(optarg, RTE_MAX_SEGS_PER_PKT, seg_lengths);
+				nb_segs = parse_item_list(optarg, "txpkt segments",
+						RTE_MAX_SEGS_PER_PKT, seg_lengths, 0);
 				if (nb_segs > 0)
 					set_tx_pkt_segments(seg_lengths, nb_segs);
 				else
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index f8b0740..8f5e6c7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -446,6 +446,9 @@ port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v)
 	port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value))
 
 /* Prototypes */
+unsigned int parse_item_list(char* str, const char* item_name,
+			unsigned int max_items,
+			unsigned int *parsed_items, int check_unique_values);
 void launch_args_parse(int argc, char** argv);
 void prompt(void);
 void nic_stats_display(portid_t port_id);
-- 
2.1.0

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

* [dpdk-dev] [PATCH v7 10/26] nic_uio: fix thread structure compatibility for future FreeBSD
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (7 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 09/26] app/testpmd: remove duplicated function for list parsing Neil Horman
@ 2015-01-21 20:57   ` Neil Horman
  2015-01-21 20:58   ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:57 UTC (permalink / raw)
  To: dev

From: Bruce Richardson <bruce.richardson@intel.com>

Replace d_thread_t with struct thread in nic_uio.

Ref: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=196691
Quote:
"The d_thread_t typedef is a compat shim to support FreeBSD 4.x.
I'm planning to remove this shim from 11 and dpdk is very unlikely
to ever be ported to 4.x.
If it does it will need far more changes than just d_thread_t"

Reported-by: John Baldwin <jhb@freebsd.org>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/librte_eal/bsdapp/nic_uio/nic_uio.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/librte_eal/bsdapp/nic_uio/nic_uio.c b/lib/librte_eal/bsdapp/nic_uio/nic_uio.c
index ed11d84..5ae8560 100644
--- a/lib/librte_eal/bsdapp/nic_uio/nic_uio.c
+++ b/lib/librte_eal/bsdapp/nic_uio/nic_uio.c
@@ -175,13 +175,13 @@ nic_uio_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size,
 
 
 int
-nic_uio_open(struct cdev *dev, int oflags, int devtype, d_thread_t *td)
+nic_uio_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
 {
 	return 0;
 }
 
 int
-nic_uio_close(struct cdev *dev, int fflag, int devtype, d_thread_t *td)
+nic_uio_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
 {
 	return 0;
 }
-- 
2.1.0

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

* Re: [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
                     ` (8 preceding siblings ...)
  2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 10/26] nic_uio: fix thread structure compatibility for future FreeBSD Neil Horman
@ 2015-01-21 20:58   ` Neil Horman
  9 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:58 UTC (permalink / raw)
  To: dev

On Wed, Jan 21, 2015 at 03:57:25PM -0500, Neil Horman wrote:
> From: Thomas Monjalon <thomas.monjalon@6wind.com>
> 
> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> ---
>  lib/librte_eal/common/include/rte_version.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/librte_eal/common/include/rte_version.h b/lib/librte_eal/common/include/rte_version.h
> index d2686ae..a267040 100644
> --- a/lib/librte_eal/common/include/rte_version.h
> +++ b/lib/librte_eal/common/include/rte_version.h
> @@ -54,12 +54,12 @@ extern "C" {
>  /**
>   * Major version number i.e. the x in x.y.z
>   */
> -#define RTE_VER_MAJOR 1
> +#define RTE_VER_MAJOR 2
>  
>  /**
>   * Minor version number i.e. the y in x.y.z
>   */
> -#define RTE_VER_MINOR 8
> +#define RTE_VER_MINOR 0
>  
>  /**
>   * Patch level number i.e. the z in x.y.z
> @@ -69,14 +69,14 @@ extern "C" {
>  /**
>   * Extra string to be appended to version number
>   */
> -#define RTE_VER_SUFFIX ""
> +#define RTE_VER_SUFFIX "-rc"
>  
>  /**
>   * Patch release number
>   *   0-15 = release candidates
>   *   16   = release
>   */
> -#define RTE_VER_PATCH_RELEASE 16
> +#define RTE_VER_PATCH_RELEASE 0
>  
>  /**
>   * Macro to compute a version number usable for comparisons
> -- 
> 2.1.0
> 
> 
Shoot, sorry, exuse this post, something just went sideways with my git tree
here
Neil

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

* [dpdk-dev] [PATCH v7 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
                   ` (10 preceding siblings ...)
  2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
@ 2015-01-21 20:59 ` Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (2 more replies)
  2015-01-22 15:49 ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (2 subsequent siblings)
  14 siblings, 3 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:59 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] 99+ messages in thread

* [dpdk-dev] [PATCH v7 2/4] Provide initial versioning for all DPDK libraries
  2015-01-21 20:59 ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-21 20:59   ` Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 3/4] Add library version extenstion Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:59 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] 99+ messages in thread

* [dpdk-dev] [PATCH v7 3/4] Add library version extenstion
  2015-01-21 20:59 ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2015-01-21 20:59   ` Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:59 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] 99+ messages in thread

* [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
  2015-01-21 20:59 ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 3/4] Add library version extenstion Neil Horman
@ 2015-01-21 20:59   ` Neil Horman
  2015-01-22 10:56     ` Iremonger, Bernard
  2 siblings, 1 reply; 99+ messages in thread
From: Neil Horman @ 2015-01-21 20:59 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

v7) Updated abi.rst to integrate with index file
    Updated abi.rst to conform to rst formatting
    Updated abi.rst to include example deprecation notices.  Its not exactly the
language that Thomas indicated, but I think it makes the idea clear.
---
 doc/guides/rel_notes/abi.rst | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 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..9b72719
--- /dev/null
+++ b/doc/guides/rel_notes/abi.rst
@@ -0,0 +1,41 @@
+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:
+
+#. At least 3 acknoweldgements of the need on the dpdk.org
+#. 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
+#. 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.
+
+Examples of Deprecation notices
+-------------------------------  
+* The Macro #RTE_FOO is deprecated and will be removed with version 2.0, to be replaced with the inline function rte_bar()
+* The function rte_mbuf_grok has been updated to include new parameter in version 2.0.  Backwards compatibility will be maintained for this function until the release of version 2.1
+* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have backwards compatibility in release 2.0, while newly built binaries will need to reference new structure variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require updating a rebuilding to the new structure at that time, which will be renamed to the origional struct foo.
+* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require updating and recompilation.
+
+Deprecation Notices
+-------------------
+
-- 
2.1.0

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

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 19:43           ` Neil Horman
@ 2015-01-21 22:24             ` Thomas Monjalon
  2015-01-22 19:21               ` Neil Horman
  0 siblings, 1 reply; 99+ messages in thread
From: Thomas Monjalon @ 2015-01-21 22:24 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-21 14:43, Neil Horman:
> On Wed, Jan 21, 2015 at 05:05:51PM +0100, Thomas Monjalon wrote:
> > 2015-01-21 09:59, Neil Horman:
> > > Considered and answered already.  I'm in favor of listing macros and structure
> > > changes in the abi document, but I think an exhaustive list isn't needed.  If it
> > > is, we could spend pages diving into minute.  Better to point out the need for
> > > abi noticies as patches get posted.
> > 
> > I'm afraid you don't understand what I'm saying. Copy/paste:
> > "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."
> > Rewording: if you agree with this policy, please add it in this document.
> > 
> Yes, we're on the same page regarding what your asking, I just don't agree that
> it needs to be explicitly called out.  I thought I was clear on that.
> Appaerntly not however, so if it will settle the point, I'll just add it.

OK maybe I didn't explain enough my proposal.
You can disagree but I want to be sure we think about the same thing.

1) Macros are not part of the ABI but can be part of the API.
Such macro removal must be announced in the previous release.
2) Structures are part of the ABI but cannot be versionned as the functions.
So an ABI breaking change should be done by cloning the structure in a new one.
And the API functions where this structure appears should be cloned and versionned
to support new structure while keeping old version.

Maybe that these precisions are confuse and useless.
Now I think I understand what you were saying by "an exhaustive list isn't needed".
You mean listing all types of ABI/API breakage like I did with these 2 cases, right?
I thought it was related to list of real/effective deprecations.

> > > > Neil, we expect that you consider comments done previously and that you test your patch.
> > > > Otherwise, we are losing time in useless reviews.
> > > > 
> > > Thomas, I have considered your comments, I simply don't agree with all of them,
> > > and I made that clear.
> > > 
> > > As for losing time, you let the first attempt at this
> > > patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> > > until I yelled for reviews.
> > 
> > Now, I'm really upset of your wrong assumptions.
> > You sent your first proposal on september, during 1.8 cycle, not 1.7 !
> > And during this cycle, the decision was to postpone it for 2.0 release.
> > 
> you're missing the point. I apologize for not getting the release numbers right,
> it should be 1.8 to 2.0 not 1.7 to 1.8 as you note, but that doesn't really
> matter.  The point was 6 months.  6 months this has been sitting around.

No, 5 months. Yes, it's long.

> In that time up to this point I've gotten one review from another devloper on the
> set, and you indicating that its not ready yet.  Then, the day 1.8 released, I
> reposed the patch series as we agreed, and its taken almost 5 weeks before I've
> gotten any feedback on it, and then its feedback that could have been given 6
> months ago (you'll note this patch was initially identical to the version I
> posted back in september).  I think you can understand how I find that
> frustrating.

You must understand that I'd prefer more people feel involved by this change.
It would be saner to have this policy reviewed and acked by many developpers.
As it was announced on the roadmap for 2.0, this first month of the cycle was
ideal to have more discussions on how this policy can be precisely applied.
You only received my comments (which may be useless) and it's now time to
apply this important patchset.

> > I don't understand what's wrong with you.
> The above is whats wrong with me.  The fact that I can try and try and try to
> add value to this project so that I can expand its user base, and the best I've
> thus far been able to receive is indifference.  At worst, the indifference is
> followed by being told that the indifference is tantamount to rejection.
> 
> 
> > You don't make any effort to understand what we are saying and
> > you make no effort to understand what is this doc directory.
> > You prefer crying that your patch is not applied.
> No effort?  How many emails have I written contesting your opinions, presenting
> supporting evidence, only to be met with assertions?  I don't think I'm the one
> not making an effort here.

At the end, I accept your point of view and will apply the patchset.

> > And I still don't understand if you are willing to work on a test tool for ABI?
> > 
> From this email
> http://dpdk.org/ml/archives/dev/2015-January/011306.html
> 
> =======================================================
> > 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.
> =========================================================
> 
> I'm not sure how thats unclear, but in the event that it wasn't, yes, I will
> gladly work on such a tool.

OK thanks, it would be helpful to have it in release 2.0.

> > > No doubt when all is said and done here you'll
> > > complain because this series likely won't work when you apply it for all the
> > > patches you take between the time I posted it and now.  So lets be careful about
> > > complaining over wasted time.
> > 
> > Note that I'm sure we can do some good work together. And I'd prefer more
> > pleasant discussions. Life is too short to have this kind of conflict.
> > 
> I agree, and we've done so in the past.  I'm sorry if I've upset you, it wasn't
> my intention.  That said, can you see how I might be frustrated by this patch
> set taking 6 months to get reviewed, only to have commentary made on it that I
> could have handled back at the beginning of this whole mess?

Yes, I was hoping more people would participate in this discussion.

> Participation.  Thats really whats needed here.  Not just from you, not just
> from me, everyone, and not just on the items that we consider important to
> ourselves.  Indifference leads to exclusion and frustration.

You're totally right. Participation is the key.
Sometimes, we have to *carefully* review patches whose we have no interest.
And maybe someone else will do the same thing for a patch we care.
This is a message ;)

-- 
Thomas

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

* Re: [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
  2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-22 10:56     ` Iremonger, Bernard
  2015-01-22 15:37       ` Neil Horman
  0 siblings, 1 reply; 99+ messages in thread
From: Iremonger, Bernard @ 2015-01-22 10:56 UTC (permalink / raw)
  To: Neil Horman, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Wednesday, January 21, 2015 9:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v7 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>

Hi Neil,

Tried to apply the patch and build it, the following warnings occurred.

Applying: docs: Add ABI documentation
/nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:55: trailing whitespace.
-------------------------------  
/nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:22: new blank line at EOF.
+
warning: 2 lines add whitespace errors.

sivswdev01> make doc-guides-html
sphinx for guides...
/nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree

Change to doc/guides/rel_notes/index.rst is missing from the patch.

Suggest applying and building the patch and then checking the generated HTML in Firefox to see that it is as you expect.
file:///home/nhorman/dpdk-doc-next/build/doc/html/guides/rel_notes/index.html

Regards,

Bernard.

 
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst
> 
> v7) Updated abi.rst to integrate with index file
>     Updated abi.rst to conform to rst formatting
>     Updated abi.rst to include example deprecation notices.  Its not exactly the language that Thomas
> indicated, but I think it makes the idea clear.
> ---
>  doc/guides/rel_notes/abi.rst | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 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..9b72719
> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,41 @@
> +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:
> +
> +#. At least 3 acknoweldgements of the need on the dpdk.org #. 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 #. 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.
> +
> +Examples of Deprecation notices
> +-------------------------------
> +* The Macro #RTE_FOO is deprecated and will be removed with version
> +2.0, to be replaced with the inline function rte_bar()
> +* The function rte_mbuf_grok has been updated to include new parameter
> +in version 2.0.  Backwards compatibility will be maintained for this
> +function until the release of version 2.1
> +* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have
> backwards compatibility in release 2.0, while newly built binaries will need to reference new structure
> variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require
> updating a rebuilding to the new structure at that time, which will be renamed to the origional struct
> foo.
> +* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will
> not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the
> invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require
> updating and recompilation.
> +
> +Deprecation Notices
> +-------------------
> +
> --
> 2.1.0

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

* Re: [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
  2015-01-22 10:56     ` Iremonger, Bernard
@ 2015-01-22 15:37       ` Neil Horman
  0 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-22 15:37 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

On Thu, Jan 22, 2015 at 10:56:08AM +0000, Iremonger, Bernard wrote:
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Wednesday, January 21, 2015 9:00 PM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v7 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>
> 
> Hi Neil,
> 
> Tried to apply the patch and build it, the following warnings occurred.
> 
> Applying: docs: Add ABI documentation
> /nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:55: trailing whitespace.
> -------------------------------  
> /nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:22: new blank line at EOF.
> +
> warning: 2 lines add whitespace errors.
> 
Those errors don't make much sense.  Theres no whitespace on line 55 of the
patch after the last character and line 22 isn't the end of a file that I can
see.

> sivswdev01> make doc-guides-html
> sphinx for guides...
> /nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> 
> Change to doc/guides/rel_notes/index.rst is missing from the patch.
> 
> Suggest applying and building the patch and then checking the generated HTML in Firefox to see that it is as you expect.
> file:///home/nhorman/dpdk-doc-next/build/doc/html/guides/rel_notes/index.html
> 
No, the generated html works fine.  I have the abi line added to index.rst but
somehow it didn't get comitted, so my testing worked, but the patch isn't right.
I'll resend it, and try to figure out whats wrong with those lines, though they
really seem screwy to me.
Neil

> Regards,
> 
> Bernard.
> 
>  
> > 
> > ---
> > Change notes:
> > 
> > v5) Updated documentation to add notes from Thomas M.
> > 
> > v6) Moved abi.txt to guides/rel_notes/abi.rst
> > 
> > v7) Updated abi.rst to integrate with index file
> >     Updated abi.rst to conform to rst formatting
> >     Updated abi.rst to include example deprecation notices.  Its not exactly the language that Thomas
> > indicated, but I think it makes the idea clear.
> > ---
> >  doc/guides/rel_notes/abi.rst | 41 +++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 41 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..9b72719
> > --- /dev/null
> > +++ b/doc/guides/rel_notes/abi.rst
> > @@ -0,0 +1,41 @@
> > +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:
> > +
> > +#. At least 3 acknoweldgements of the need on the dpdk.org #. 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 #. 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.
> > +
> > +Examples of Deprecation notices
> > +-------------------------------
> > +* The Macro #RTE_FOO is deprecated and will be removed with version
> > +2.0, to be replaced with the inline function rte_bar()
> > +* The function rte_mbuf_grok has been updated to include new parameter
> > +in version 2.0.  Backwards compatibility will be maintained for this
> > +function until the release of version 2.1
> > +* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have
> > backwards compatibility in release 2.0, while newly built binaries will need to reference new structure
> > variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require
> > updating a rebuilding to the new structure at that time, which will be renamed to the origional struct
> > foo.
> > +* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will
> > not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the
> > invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require
> > updating and recompilation.
> > +
> > +Deprecation Notices
> > +-------------------
> > +
> > --
> > 2.1.0
> 
> 

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

* [dpdk-dev] [PATCH v8 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
                   ` (11 preceding siblings ...)
  2015-01-21 20:59 ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-22 15:49 ` Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 2/4] Provide initial versioning for all DPDK libraries Neil Horman
                     ` (2 more replies)
       [not found] ` <1422898822-16422-1-git-send-email-nhorman@tuxdriver.com>
  2015-02-03 16:01 ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Thomas Monjalon
  14 siblings, 3 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-22 15:49 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] 99+ messages in thread

* [dpdk-dev] [PATCH v8 2/4] Provide initial versioning for all DPDK libraries
  2015-01-22 15:49 ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-22 15:49   ` Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 3/4] Add library version extenstion Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-22 15:49 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] 99+ messages in thread

* [dpdk-dev] [PATCH v8 3/4] Add library version extenstion
  2015-01-22 15:49 ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 2/4] Provide initial versioning for all DPDK libraries Neil Horman
@ 2015-01-22 15:49   ` Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
  2 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-22 15:49 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] 99+ messages in thread

* [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation
  2015-01-22 15:49 ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 2/4] Provide initial versioning for all DPDK libraries Neil Horman
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 3/4] Add library version extenstion Neil Horman
@ 2015-01-22 15:49   ` Neil Horman
  2015-01-22 16:46     ` Butler, Siobhan A
  2 siblings, 1 reply; 99+ messages in thread
From: Neil Horman @ 2015-01-22 15:49 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

v7) Updated abi.rst to integrate with index file
    Updated abi.rst to conform to rst formatting
    Updated abi.rst to include example deprecation notices.  Its not exactly the
language that Thomas indicated, but I think it makes the idea clear.

v8) Add missing file index.rst which was left out of the prior commit
---
 doc/guides/rel_notes/abi.rst   | 40 ++++++++++++++++++++++++++++++++++++++++
 doc/guides/rel_notes/index.rst |  1 +
 2 files changed, 41 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..73d88ca
--- /dev/null
+++ b/doc/guides/rel_notes/abi.rst
@@ -0,0 +1,40 @@
+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:
+
+#. At least 3 acknoweldgements of the need on the dpdk.org
+#. 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
+#. 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.
+
+Examples of Deprecation notices
+-------------------------------
+* The Macro #RTE_FOO is deprecated and will be removed with version 2.0, to be replaced with the inline function rte_bar()
+* The function rte_mbuf_grok has been updated to include new parameter in version 2.0.  Backwards compatibility will be maintained for this function until the release of version 2.1
+* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have backwards compatibility in release 2.0, while newly built binaries will need to reference new structure variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require updating a rebuilding to the new structure at that time, which will be renamed to the origional struct foo.
+* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require updating and recompilation.
+
+Deprecation Notices
+-------------------
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index 2724149..cf712b2 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -48,4 +48,5 @@ Contents
     updating_apps
     known_issues
     resolved_issues
+    abi
     faq
-- 
2.1.0

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

* Re: [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation
  2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-22 16:46     ` Butler, Siobhan A
  0 siblings, 0 replies; 99+ messages in thread
From: Butler, Siobhan A @ 2015-01-22 16:46 UTC (permalink / raw)
  To: Neil Horman, dev


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Thursday, January 22, 2015 3:49 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v8 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
> 
> v7) Updated abi.rst to integrate with index file
>     Updated abi.rst to conform to rst formatting
>     Updated abi.rst to include example deprecation notices.  Its not exactly the
> language that Thomas indicated, but I think it makes the idea clear.
> 
> v8) Add missing file index.rst which was left out of the prior commit
> ---
>  doc/guides/rel_notes/abi.rst   | 40
> ++++++++++++++++++++++++++++++++++++++++
>  doc/guides/rel_notes/index.rst |  1 +
>  2 files changed, 41 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..73d88ca
> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,40 @@
> +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:
> +
> +#. At least 3 acknoweldgements of the need on the dpdk.org #. 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 #. 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.
> +
> +Examples of Deprecation notices
> +-------------------------------
> +* The Macro #RTE_FOO is deprecated and will be removed with version
> +2.0, to be replaced with the inline function rte_bar()
> +* The function rte_mbuf_grok has been updated to include new parameter
> +in version 2.0.  Backwards compatibility will be maintained for this
> +function until the release of version 2.1
> +* The members struct foo have been reorganized in release 2.0.  Existing
> binary applications will have backwards compatibility in release 2.0, while
> newly built binaries will need to reference new structure variant struct foo2.
> Compatibility will be removed in release 2.2, and all applications will require
> updating a rebuilding to the new structure at that time, which will be
> renamed to the origional struct foo.
> +* Significant ABI changes are planned for the librte_dostuff library.  The
> upcomming release 2.0 will not contain these changes, but release 2.1 will,
> and no backwards compatibility is planned due to the invasive nature of
> these changes.  Binaries using this library built prior to version 2.1 will require
> updating and recompilation.
> +
> +Deprecation Notices
> +-------------------
> diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
> index 2724149..cf712b2 100644
> --- a/doc/guides/rel_notes/index.rst
> +++ b/doc/guides/rel_notes/index.rst
> @@ -48,4 +48,5 @@ Contents
>      updating_apps
>      known_issues
>      resolved_issues
> +    abi
>      faq
> --
> 2.1.0

Acked-by: Siobhan Butler <siobhan.a.butler@intel.com>

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

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 22:24             ` Thomas Monjalon
@ 2015-01-22 19:21               ` Neil Horman
  0 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-01-22 19:21 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 21, 2015 at 11:24:12PM +0100, Thomas Monjalon wrote:
> 2015-01-21 14:43, Neil Horman:
> > On Wed, Jan 21, 2015 at 05:05:51PM +0100, Thomas Monjalon wrote:
> > > 2015-01-21 09:59, Neil Horman:
> > > > Considered and answered already.  I'm in favor of listing macros and structure
> > > > changes in the abi document, but I think an exhaustive list isn't needed.  If it
> > > > is, we could spend pages diving into minute.  Better to point out the need for
> > > > abi noticies as patches get posted.
> > > 
> > > I'm afraid you don't understand what I'm saying. Copy/paste:
> > > "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."
> > > Rewording: if you agree with this policy, please add it in this document.
> > > 
> > Yes, we're on the same page regarding what your asking, I just don't agree that
> > it needs to be explicitly called out.  I thought I was clear on that.
> > Appaerntly not however, so if it will settle the point, I'll just add it.
> 
> OK maybe I didn't explain enough my proposal.
> You can disagree but I want to be sure we think about the same thing.
> 
> 1) Macros are not part of the ABI but can be part of the API.
> Such macro removal must be announced in the previous release.
> 2) Structures are part of the ABI but cannot be versionned as the functions.
> So an ABI breaking change should be done by cloning the structure in a new one.
> And the API functions where this structure appears should be cloned and versionned
> to support new structure while keeping old version.
> 
> Maybe that these precisions are confuse and useless.
> Now I think I understand what you were saying by "an exhaustive list isn't needed".
> You mean listing all types of ABI/API breakage like I did with these 2 cases, right?
> I thought it was related to list of real/effective deprecations.
> 
> > > > > Neil, we expect that you consider comments done previously and that you test your patch.
> > > > > Otherwise, we are losing time in useless reviews.
> > > > > 
> > > > Thomas, I have considered your comments, I simply don't agree with all of them,
> > > > and I made that clear.
> > > > 
> > > > As for losing time, you let the first attempt at this
> > > > patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> > > > until I yelled for reviews.
> > > 
> > > Now, I'm really upset of your wrong assumptions.
> > > You sent your first proposal on september, during 1.8 cycle, not 1.7 !
> > > And during this cycle, the decision was to postpone it for 2.0 release.
> > > 
> > you're missing the point. I apologize for not getting the release numbers right,
> > it should be 1.8 to 2.0 not 1.7 to 1.8 as you note, but that doesn't really
> > matter.  The point was 6 months.  6 months this has been sitting around.
> 
> No, 5 months. Yes, it's long.
> 
> > In that time up to this point I've gotten one review from another devloper on the
> > set, and you indicating that its not ready yet.  Then, the day 1.8 released, I
> > reposed the patch series as we agreed, and its taken almost 5 weeks before I've
> > gotten any feedback on it, and then its feedback that could have been given 6
> > months ago (you'll note this patch was initially identical to the version I
> > posted back in september).  I think you can understand how I find that
> > frustrating.
> 
> You must understand that I'd prefer more people feel involved by this change.
> It would be saner to have this policy reviewed and acked by many developpers.
> As it was announced on the roadmap for 2.0, this first month of the cycle was
> ideal to have more discussions on how this policy can be precisely applied.
> You only received my comments (which may be useless) and it's now time to
> apply this important patchset.
> 
> > > I don't understand what's wrong with you.
> > The above is whats wrong with me.  The fact that I can try and try and try to
> > add value to this project so that I can expand its user base, and the best I've
> > thus far been able to receive is indifference.  At worst, the indifference is
> > followed by being told that the indifference is tantamount to rejection.
> > 
> > 
> > > You don't make any effort to understand what we are saying and
> > > you make no effort to understand what is this doc directory.
> > > You prefer crying that your patch is not applied.
> > No effort?  How many emails have I written contesting your opinions, presenting
> > supporting evidence, only to be met with assertions?  I don't think I'm the one
> > not making an effort here.
> 
> At the end, I accept your point of view and will apply the patchset.
> 
> > > And I still don't understand if you are willing to work on a test tool for ABI?
> > > 
> > From this email
> > http://dpdk.org/ml/archives/dev/2015-January/011306.html
> > 
> > =======================================================
> > > 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.
> > =========================================================
> > 
> > I'm not sure how thats unclear, but in the event that it wasn't, yes, I will
> > gladly work on such a tool.
> 
> OK thanks, it would be helpful to have it in release 2.0.
> 
Its not going to make 2.0, its a big undertaking.  If you wanted it in 2.0 that
would have been something to bring up 5 months ago.

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

* Re: [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning
  2015-01-15 19:35 ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                     ` (2 preceding siblings ...)
  2015-01-15 19:35   ` [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-30 17:13   ` Gray, Mark D
  3 siblings, 0 replies; 99+ messages in thread
From: Gray, Mark D @ 2015-01-30 17:13 UTC (permalink / raw)
  To: Neil Horman, dev

I agree in principle with this patchset. OVS links with DPDK and providing stability in the ABI/API (and the Policy to manage this) makes deployment easier for OVS when linking with shared dpdk libs. It should also be easy for us to track changes in the API through the deprecation notices making development easier! 

Good job.

Acked-by: Mark D. Gray <mark.d.gray@intel.com>

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Thursday, January 15, 2015 7:35 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support
> symbol versioning
> 
> 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] 99+ messages in thread

* Re: [dpdk-dev] [PATCH v9 4/4] docs: Add ABI documentation
       [not found]   ` <1422898822-16422-4-git-send-email-nhorman@tuxdriver.com>
@ 2015-02-03 15:24     ` Thomas Monjalon
  0 siblings, 0 replies; 99+ messages in thread
From: Thomas Monjalon @ 2015-02-03 15:24 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>

Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>

Thanks Neil for writing the policy.

The version 2.0 will be the first to have a versioned ABI with LIBABIVER := 1.
Starting from there, we'll have to consider this ABI policy when preparing
next versions.

-- 
Thomas

^ permalink raw reply	[flat|nested] 99+ 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
                   ` (13 preceding siblings ...)
       [not found] ` <1422898822-16422-1-git-send-email-nhorman@tuxdriver.com>
@ 2015-02-03 16:01 ` Thomas Monjalon
  2015-02-03 20:20   ` Neil Horman
  14 siblings, 1 reply; 99+ messages in thread
From: Thomas Monjalon @ 2015-02-03 16:01 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-20 16:01, Neil Horman:
> 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>

After updating to version 2.0, and sorting symbol lists,
Applied

It's probably an important change which makes 2.0 number meaningful.
Thanks
-- 
Thomas

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

* Re: [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
  2015-02-03 16:01 ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Thomas Monjalon
@ 2015-02-03 20:20   ` Neil Horman
  0 siblings, 0 replies; 99+ messages in thread
From: Neil Horman @ 2015-02-03 20:20 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Feb 03, 2015 at 05:01:51PM +0100, Thomas Monjalon wrote:
> 2014-12-20 16:01, Neil Horman:
> > 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>
> 
> After updating to version 2.0, and sorting symbol lists,
> Applied
> 
> It's probably an important change which makes 2.0 number meaningful.
> Thanks
> -- 
> Thomas
> 
Thank you Thomas!  Just as a heads up, there may be some inconsistencies
resulting from patches that you merged between the time of my last repost and
the time of this merge.  They'll be easy to fix as they will just amount to
symbol additions/removals from the various version map file.  So please cc me on
any sucpicious build breaks in the next few days when building shared objects,
and I'll fix them up ASAP.

Neil

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

end of thread, other threads:[~2015-02-03 20:20 UTC | newest]

Thread overview: 99+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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-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
2014-12-22 19:00         ` Neil Horman
2014-12-22 20:04           ` 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 ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
2014-12-20 21:01 ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
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-23 13:05     ` Gonzalez Monroy, Sergio
2014-12-23 15:50       ` Neil Horman
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
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
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-29 16:21     ` Sergio Gonzalez Monroy
2015-01-14 15:29     ` Thomas Monjalon
2015-01-14 16:24       ` Neil Horman
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
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
2015-01-16 13:34         ` 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
2015-01-14 20:29     ` Neil Horman
2015-01-09 12:35 ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
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   ` [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
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   ` [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 13:46         ` Thomas Monjalon
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:50               ` Butler, Siobhan A
2015-01-20 15:30                 ` Neil Horman
2015-01-20 14:32           ` O'driscoll, Tim
2015-01-20 14:00     ` Thomas Monjalon
2015-01-20 14:37       ` Neil Horman
2015-01-20 15:06         ` Thomas Monjalon
2015-01-20 15:35           ` Neil Horman
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   ` [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
2015-01-21 16:05         ` Thomas Monjalon
2015-01-21 19:43           ` Neil Horman
2015-01-21 22:24             ` Thomas Monjalon
2015-01-22 19:21               ` Neil Horman
2015-01-21 20:57 ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 02/26] mk: fix link to static combined library Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 03/26] eal: fix check for power of 2 in 0 case Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 04/26] ethdev: fix missing parenthesis in mac check Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 05/26] mem: search only dpdk hugetlbfs maps Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 06/26] log: remove unnecessary stubs Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 07/26] vfio: avoid enabling while the module is not loaded Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 08/26] bond: fix vlan flag interpretation Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 09/26] app/testpmd: remove duplicated function for list parsing Neil Horman
2015-01-21 20:57   ` [dpdk-dev] [PATCH v7 10/26] nic_uio: fix thread structure compatibility for future FreeBSD Neil Horman
2015-01-21 20:58   ` [dpdk-dev] [PATCH v7 01/26] version: 2.0.0-rc0 Neil Horman
2015-01-21 20:59 ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 2/4] Provide initial versioning for all DPDK libraries Neil Horman
2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 3/4] Add library version extenstion Neil Horman
2015-01-21 20:59   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
2015-01-22 10:56     ` Iremonger, Bernard
2015-01-22 15:37       ` Neil Horman
2015-01-22 15:49 ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 2/4] Provide initial versioning for all DPDK libraries Neil Horman
2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 3/4] Add library version extenstion Neil Horman
2015-01-22 15:49   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
2015-01-22 16:46     ` Butler, Siobhan A
     [not found] ` <1422898822-16422-1-git-send-email-nhorman@tuxdriver.com>
     [not found]   ` <1422898822-16422-4-git-send-email-nhorman@tuxdriver.com>
2015-02-03 15:24     ` [dpdk-dev] [PATCH v9 " Thomas Monjalon
2015-02-03 16:01 ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Thomas Monjalon
2015-02-03 20:20   ` Neil Horman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).