> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Neil Horman > Sent: Thursday, June 25, 2015 4:36 PM > To: dev at dpdk.org > Subject: [dpdk-dev] [PATCHv3 2/3] rte_compat: Add MAP_STATIC_SYMBOL > macro > > It was pointed out in my examples that doing shared library symbol versioning > by > partitioning symbols to version specific functions (as opposed to leaving the > latest symol version at the base symbol name), neglects to take into account > static builds. Add a macro to handle that. If you choose a versioning > approach > that uniquely names every version of the symbol, then this macro lets you map > your symbol choice to the base name when building a static library > > Also, while I'm at it, since we're documenting this in the guide, take the > abbreviated example out of the header > > Signed-off-by: Neil Horman <nhorman at tuxdriver.com> > CC: thomas.monjalon at 6wind.com
Acked-by: Maciej Gajdzica <maciejx.t.gajdzica at intel.com> > --- > lib/librte_compat/rte_compat.h | 35 ++++++++++++++++++----------------- > 1 file changed, 18 insertions(+), 17 deletions(-) > > diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h > index 75920a1..d7768d5 100644 > --- a/lib/librte_compat/rte_compat.h > +++ b/lib/librte_compat/rte_compat.h > @@ -49,22 +49,8 @@ > * Assumptions: DPDK 2.(X) contains a function int foo(char *string) > * DPDK 2.(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_2.(X+1) node, in > which > - * foo is exported as a global symbol. > - * > - * 2) rename the existing function int foo(char *string) to > - * int foo_v20(char *string) > - * > - * 3) Add this macro immediately below the function > - * VERSION_SYMBOL(foo, _v20, 2.0); > - * > - * 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, _v21, 2.1); > - * > + * Refer to the guidelines document in the docs subdirectory for > + details on the > + * use of these macros > */ > > /* > @@ -72,6 +58,8 @@ > * b - function base name > * e - function version extension, to be concatenated with base name > * n - function symbol version string to be applied > + * f - function prototype > + * p - full function symbol name > */ > > /* > @@ -96,6 +84,19 @@ > #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)) > > +/* > + * MAP_STATIC_SYMBOL > + * If a function has been bifurcated into multiple versions, none of > +which > + * are defined as the exported symbol name in the map file, this macro > +can be > + * used to alias a specific version of the symbol to its exported name. > +For > + * example, if you have 2 versions of a function foo_v1 and foo_v2, > +where the > + * former is mapped to foo at DPDK_1 and the latter is mapped to > +foo at DPDK_2 when > + * building a shared library, this macro can be used to map either > +foo_v1 or > + * foo_v2 to the symbol foo when building a static library, e.g.: > + * MAP_STATIC_SYMBOL(void foo(), foo_v2); */ #define > +MAP_STATIC_SYMBOL(f, p) > + > #else > /* > * No symbol versioning in use > @@ -104,7 +105,7 @@ > #define __vsym > #define BASE_SYMBOL(b, n) > #define BIND_DEFAULT_SYMBOL(b, e, n) > - > +#define MAP_STATIC_SYMBOL(f, p) f __attribute__((alias( RTE_STR(p)))) > /* > * RTE_BUILD_SHARED_LIB=n > */ > -- > 2.1.0