diff --git a/.gitignore b/.gitignore index 800352c0c14..8201d5092d5 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ *.pyc *.so *.suo +**/*.sym *~ *,cover .#* diff --git a/.travis/build.sh b/.travis/build.sh index 1bf08154852..7043c40a0d3 100755 --- a/.travis/build.sh +++ b/.travis/build.sh @@ -24,6 +24,8 @@ function install_dpdk() cd dpdk-1.7.1 find ./ -type f | xargs sed -i 's/max-inline-insns-single=100/max-inline-insns-single=400/' sed -ri 's,(CONFIG_RTE_BUILD_COMBINE_LIBS=).*,\1y,' config/common_linuxapp + sed -ri '/CONFIG_RTE_LIBNAME/a CONFIG_RTE_BUILD_FPIC=y' config/common_linuxapp + sed -ri '/EXECENV_CFLAGS = -pthread -fPIC/{s/$/\nelse ifeq ($(CONFIG_RTE_BUILD_FPIC),y)/;s/$/\nEXECENV_CFLAGS = -pthread -fPIC/}' mk/exec-env/linuxapp/rte.vars.mk make config CC=gcc T=x86_64-native-linuxapp-gcc make CC=gcc RTE_KERNELDIR=$KERNELSRC echo "Installed DPDK source in $(pwd)" diff --git a/AUTHORS b/AUTHORS index a15665a890f..2d30cb1f62e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -131,6 +131,7 @@ Samuel Ghinet sghinet@cloudbasesolutions.com Sanjay Sane ssane@nicira.com Saurabh Shah ssaurabh@nicira.com Scott Lowe scott.lowe@scottlowe.org +Scott Mann sdmnix@gmail.com Selvamuthukumar smkumar@merunetworks.com Shan Wei davidshan@tencent.com Shih-Hao Li shli@nicira.com diff --git a/configure.ac b/configure.ac index 62224b9867d..c3b26ecf773 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,41 @@ AC_SYS_LARGEFILE LT_INIT([disable-shared]) m4_pattern_forbid([LT_INIT]) dnl Make autoconf fail if libtool is missing. +# The following explanation may help to understand the use of the +# version number fields: current, revision, and age. +# +# Consider that there are three possible kinds of reactions from +# users of your library to changes in a shared library: +# +# 1. Programs using the previous version may use the new version as drop-in +# replacement, and programs using the new version can also work with the +# previous one. In other words, no recompiling nor relinking is needed. +# In short, there are no changes to any symbols, no symbols removed, +# and no symbols added. In this case, bump revision only, don't touch +# current nor age. +# +# 2. Programs using the previous version may use the new version as drop-in +# replacement, but programs using the new version may use APIs not +# present in the previous one. In other words, new symbols have been +# added and a program linking against the new version may fail with +# “unresolved symbols.” If linking against the old version at runtime: +# set revision to 0, bump current and age. +# +# 3. Programs may need to be changed, recompiled, relinked in order to use +# the new version. This is the case when symbols have been modified or +# deleted. Bump current, set revision and age to 0. + +m4_define([libopenvswitch_lt_current], [1]) +m4_define([libopenvswitch_lt_revision], [0]) +m4_define([libopenvswitch_lt_age], [0]) + +LT_CURRENT=libopenvswitch_lt_current +AC_SUBST([LT_CURRENT]) +LT_REVISION=libopenvswitch_lt_revision +AC_SUBST([LT_REVISION]) +LT_AGE=libopenvswitch_lt_age +AC_SUBST([LT_AGE]) + AC_SEARCH_LIBS([pow], [m]) AC_SEARCH_LIBS([clock_gettime], [rt]) AC_SEARCH_LIBS([timer_create], [rt]) @@ -94,7 +129,13 @@ OVS_CHECK_LINUX_HOST AX_FUNC_POSIX_MEMALIGN OVS_CHECK_INCLUDE_NEXT([stdio.h string.h]) -AC_CONFIG_FILES([lib/stdio.h lib/string.h]) +AC_CONFIG_FILES([ + lib/stdio.h + lib/string.h + ovsdb/libovsdb.sym + ofproto/libofproto.sym + lib/libsflow.sym + lib/libopenvswitch.sym]) OVS_ENABLE_OPTION([-Wall]) OVS_ENABLE_OPTION([-Wextra]) diff --git a/lib/automake.mk b/lib/automake.mk index 783e6573b96..f30459c89ac 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -13,7 +13,9 @@ if WIN32 lib_libopenvswitch_la_LIBADD += ${PTHREAD_LIBS} endif -lib_libopenvswitch_la_LDFLAGS = -release $(VERSION) +lib_libopenvswitch_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/lib/libopenvswitch.sym lib_libopenvswitch_la_SOURCES = \ lib/aes128.c \ @@ -291,7 +293,9 @@ nodist_lib_libopenvswitch_la_SOURCES = \ CLEANFILES += $(nodist_lib_libopenvswitch_la_SOURCES) lib_LTLIBRARIES += lib/libsflow.la -lib_libsflow_la_LDFLAGS = -release $(VERSION) +lib_libsflow_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/lib/libsflow.sym lib_libsflow_la_SOURCES = \ lib/sflow_api.h \ lib/sflow.h \ diff --git a/lib/libopenvswitch.sym.in b/lib/libopenvswitch.sym.in new file mode 100644 index 00000000000..fdfc5bb72ad --- /dev/null +++ b/lib/libopenvswitch.sym.in @@ -0,0 +1,4 @@ +libopenvswitch_@LT_CURRENT@ { +global: + *; +}; diff --git a/lib/libsflow.sym.in b/lib/libsflow.sym.in new file mode 100644 index 00000000000..88b9cc13c57 --- /dev/null +++ b/lib/libsflow.sym.in @@ -0,0 +1,4 @@ +libsflow_@LT_CURRENT@ { +global: + *; +}; diff --git a/lib/util.c b/lib/util.c index fb2ff51bdfa..1b9eea6ce03 100644 --- a/lib/util.c +++ b/lib/util.c @@ -471,9 +471,15 @@ set_program_name__(const char *argv0, const char *version, const char *date, assert_single_threaded(); free(program_name); + /* Remove libtool prefix, if it is there */ + if (strncmp(basename, "lt-", 3) == 0) { + char *tmp_name = basename; + basename = xstrdup(basename + 3); + free(tmp_name); + } program_name = basename; - free(program_version); + free(program_version); if (!strcmp(version, VERSION)) { program_version = xasprintf("%s (Open vSwitch) "VERSION"\n" "Compiled %s %s\n", diff --git a/ofproto/automake.mk b/ofproto/automake.mk index 399f2b68d4c..bb4bc7e1311 100644 --- a/ofproto/automake.mk +++ b/ofproto/automake.mk @@ -6,7 +6,9 @@ # without warranty of any kind. lib_LTLIBRARIES += ofproto/libofproto.la -ofproto_libofproto_la_LDFLAGS = -release $(VERSION) +ofproto_libofproto_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/ofproto/libofproto.sym ofproto_libofproto_la_SOURCES = \ ofproto/bond.c \ ofproto/bond.h \ diff --git a/ofproto/libofproto.sym.in b/ofproto/libofproto.sym.in new file mode 100644 index 00000000000..cdd43274079 --- /dev/null +++ b/ofproto/libofproto.sym.in @@ -0,0 +1,4 @@ +libofproto_@LT_CURRENT@ { +global: + *; +}; diff --git a/ovsdb/automake.mk b/ovsdb/automake.mk index 00a0b01bae2..7a8d7d241fa 100644 --- a/ovsdb/automake.mk +++ b/ovsdb/automake.mk @@ -1,6 +1,8 @@ # libovsdb lib_LTLIBRARIES += ovsdb/libovsdb.la -ovsdb_libovsdb_la_LDFLAGS = -release $(VERSION) +ovsdb_libovsdb_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/ovsdb/libovsdb.sym ovsdb_libovsdb_la_SOURCES = \ ovsdb/column.c \ ovsdb/column.h \ diff --git a/ovsdb/libovsdb.sym.in b/ovsdb/libovsdb.sym.in new file mode 100644 index 00000000000..71ae4e87b14 --- /dev/null +++ b/ovsdb/libovsdb.sym.in @@ -0,0 +1,4 @@ +libovsdb_@LT_CURRENT@ { +global: + *; +};