On Thu, Mar 06, 2025 at 01:59:34PM +0100, David Marchand wrote: > 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. >
I like what you're proposing. This makes DPDK less coupled with the GNU linker and therefore easier to be supported by other toolsets. > > -- > David Marchand