When using function versioning and building with LTO, GCC gets confused by the symbol versioning using __asm__. There are no uses of function versioning in upstream repo. This was found when adding additional parameter to rte_eth_dev_get_name_by_port.
Assembler messages: Error: invalid attempt to declare external version name as default in symbol `rte_eth_dev_get_name_by_port@@DPDK_27' The workaround GCC 10 introduced was an additional function attribute; clang doesn't have or need this attribute. No need to backport this to LTS since there is no function versioning in those releases. Signed-off-by: Stephen Hemminger <[email protected]> --- v2 - reword commit message lib/eal/common/eal_export.h | 46 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/lib/eal/common/eal_export.h b/lib/eal/common/eal_export.h index 7e47d34064..1318e6278d 100644 --- a/lib/eal/common/eal_export.h +++ b/lib/eal/common/eal_export.h @@ -30,39 +30,61 @@ * new functionality, behavior, etc. When that occurs, it is desirable to * allow for backwards compatibility for a time with older binaries that are * dynamically linked to the dpdk. + * + * RTE_VERSION_SYMBOL + * Create a symbol version table entry binding symbol <name>@DPDK_<ver> to the internal + * function name <name>_v<ver>. + * + * RTE_VERSION_EXPERIMENTAL_SYMBOL similar to RTE_VERSION_SYMBOL but for experimental API symbols. + * This is mainly used for keeping compatibility for symbols that get promoted to stable ABI. + * + * RTE_DEFAULT_SYMBOL + * Create a symbol version entry instructing the linker to bind references to + * symbol <name> to the internal symbol <name>_v<ver>. */ #ifdef RTE_BUILD_SHARED_LIB -/* - * Create a symbol version table entry binding symbol <name>@DPDK_<ver> to the internal - * function name <name>_v<ver>. - */ +/* Prefer the compiler method of versioning which uses attributes */ +#if __has_attribute(symver) + +#define RTE_VERSION_SYMBOL(ver, type, name, args) VERSIONING_WARN \ + __attribute__((__symver__(RTE_STR(name) "@DPDK_" RTE_STR(ver)))) \ + type name ## _v ## ver args; \ + type name ## _v ## ver args + +#define RTE_VERSION_EXPERIMENTAL_SYMBOL(type, name, args) VERSIONING_WARN \ + __attribute__((__symver__(RTE_STR(name) "@EXPERIMENTAL"))) \ + type name ## _exp args; \ + type name ## _exp args + +#define RTE_DEFAULT_SYMBOL(ver, type, name, args) VERSIONING_WARN \ + __attribute__((__symver__(RTE_STR(name) "@@DPDK_" RTE_STR(ver)))) \ + type name ## _v ## ver args; \ + type name ## _v ## ver args +#else /* !__has_attribute(symver) */ + +/* Use asm tag to create symbol table entry */ #define RTE_VERSION_SYMBOL(ver, type, name, args) VERSIONING_WARN \ __asm__(".symver " RTE_STR(name) "_v" RTE_STR(ver) ", " RTE_STR(name) "@DPDK_" RTE_STR(ver)); \ __rte_used type name ## _v ## ver args; \ type name ## _v ## ver args -/* - * Similar to RTE_VERSION_SYMBOL but for experimental API symbols. - * This is mainly used for keeping compatibility for symbols that get promoted to stable ABI. - */ #define RTE_VERSION_EXPERIMENTAL_SYMBOL(type, name, args) VERSIONING_WARN \ __asm__(".symver " RTE_STR(name) "_exp, " RTE_STR(name) "@EXPERIMENTAL") \ __rte_used type name ## _exp args; \ type name ## _exp args -/* - * Create a symbol version entry instructing the linker to bind references to - * symbol <name> to the internal symbol <name>_v<ver>. - */ #define RTE_DEFAULT_SYMBOL(ver, type, name, args) VERSIONING_WARN \ __asm__(".symver " RTE_STR(name) "_v" RTE_STR(ver) ", " RTE_STR(name) "@@DPDK_" RTE_STR(ver)); \ __rte_used type name ## _v ## ver args; \ type name ## _v ## ver args +#endif /* __has_attribute(symver) */ + #else /* !RTE_BUILD_SHARED_LIB */ +/* static library does not have versioned symbols */ #define RTE_VERSION_SYMBOL(ver, type, name, args) VERSIONING_WARN \ type name ## _v ## ver args; \ type name ## _v ## ver args -- 2.53.0

