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

Reply via email to