On Wed, Feb 19, 2025 at 2:40 AM Andre Muezerie <andre...@linux.microsoft.com> wrote: > > When compiling with MSVC the error below shows up due to function > versioning: > > ../lib/net/rte_net_crc.c(418): error C2061: syntax error: > identifier '__attribute__' > > MSVC allows alias function names to be exported, but the mechanism is > different than the one used by gcc. It was considered to enhance the logic > in the existing version.map files but that file is also passed to other > tools on Linux, making this challenging. A simpler approach is to have an > optional version.map file to be used only when Microsoft's linker is to be > used. This optional map file is only necessary for libraries that have > versioned code. > > Signed-off-by: Andre Muezerie <andre...@linux.microsoft.com> > --- > lib/eal/include/rte_function_versioning.h | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/lib/eal/include/rte_function_versioning.h > b/lib/eal/include/rte_function_versioning.h > index eb6dd2bc17..aa3165a659 100644 > --- a/lib/eal/include/rte_function_versioning.h > +++ b/lib/eal/include/rte_function_versioning.h > @@ -82,6 +82,13 @@ > */ > #define MAP_STATIC_SYMBOL(f, p) > > +/* > + * MAP_STATIC_BASE_SYMBOL > + * Has the same purpose as MAP_STATIC_SYMBOL, but takes a base function name > + * instead of the whole function prototype. It is used to support MSVC. > + */ > +#define MAP_STATIC_BASE_SYMBOL(b, p) > + > #else > /* > * No symbol versioning in use > @@ -90,7 +97,19 @@ > #define VERSION_SYMBOL_EXPERIMENTAL(b, e) > #define __vsym > #define BIND_DEFAULT_SYMBOL(b, e, n) > + > +#ifdef RTE_TOOLCHAIN_MSVC > +#define MAP_STATIC_SYMBOL(f, p)
I would prefer we trigger an explicit error when some code calling MAP_STATIC_SYMBOL() is built with MSVC. > +#define MAP_STATIC_BASE_SYMBOL(b, p) __pragma(comment(linker, > "/alternatename:" #b "=" #p)) > +/* > + * version.map file should also be updated with "b=p;", like > + * rte_net_crc_set_alg=rte_net_crc_set_alg_v26; > + */ > +#else > #define MAP_STATIC_SYMBOL(f, p) f __attribute__((alias(RTE_STR(p)))) > +#define MAP_STATIC_BASE_SYMBOL(b, p) > +#endif > + But in any case, I don't like as we end up with one macro for each linker. I have been thinking about this topic, and I sent a RFC series, please have a look. https://patchwork.dpdk.org/project/dpdk/list/?series=34798 I hope this type of approach will also make it possible to stop converting from GNU linker type version.map commited in DPDK to Windows linker format. -- David Marchand