[v3,4/6] devtools: check ms linker map files

Message ID 1740083508-6703-5-git-send-email-andremue@linux.microsoft.com (mailing list archive)
State Changes Requested
Delegated to: David Marchand
Headers
Series mbuf: enable to be compiled with MSVC |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Andre Muezerie Feb. 20, 2025, 8:31 p.m. UTC
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.

Script check-symbol-maps.sh was updated to check these optional files.

Signed-off-by: Andre Muezerie <andremue@linux.microsoft.com>
---
 devtools/check-symbol-maps.sh | 49 +++++++++++++++++++++++++++++------
 1 file changed, 41 insertions(+), 8 deletions(-)
  

Patch

diff --git a/devtools/check-symbol-maps.sh b/devtools/check-symbol-maps.sh
index 6121f78ec6..816d52eae0 100755
--- a/devtools/check-symbol-maps.sh
+++ b/devtools/check-symbol-maps.sh
@@ -21,6 +21,21 @@  find_orphan_symbols ()
                 symsrc=${sym#per_lcore_}
             elif echo $sym | grep -q '^__rte_.*_trace_' ; then
                 symsrc=${sym#__}
+            elif echo $map | grep -Eq '_ms_linker.map$' ; then
+                if echo $sym | grep -q '=' ; then
+                    symsrc=$(echo $sym | awk '
+                        {
+                            idx = index($0, "=")
+                            if (idx > 0) {
+                                # Use only what is on the left side of "="
+                                s = substr($0, 0, idx-1)
+                                print s
+                            } else {
+                                print $0
+                            }
+                        }
+                    ')
+                fi
             else
                 symsrc=$sym
             fi
@@ -79,14 +94,32 @@  find_bad_format_maps ()
     abi_version=$(cut -d'.' -f 1 ABI_VERSION)
     next_abi_version=$((abi_version + 1))
     for map in $@ ; do
-        cat $map | awk '
-            /^(DPDK_('$abi_version'|'$next_abi_version')|EXPERIMENTAL|INTERNAL) \{$/ { next; } # start of a section
-            /^}( DPDK_'$abi_version')?;$/ { next; } # end of a section
-            /^$/ { next; } # empty line
-            /^\t(global:|local: \*;)$/ { next; } # qualifiers
-            /^\t[a-zA-Z_0-9]*;( # WINDOWS_NO_EXPORT)?$/ { next; } # symbols
-            /^\t# added in [0-9]*\.[0-9]*$/ { next; } # version comments
-            { print $0; }' || echo $map
+        if echo $map | grep -Eq '_ms_linker.map$';
+        then
+            # ms linker maps are only used for Windows, so there's no reason for
+            # them to allow WINDOWS_NO_EXPORT.
+            # These .map files accept alias function names, like
+            # rte_net_crc_set_alg=rte_net_crc_set_alg_v26;
+            # Note that alias function names are not allowed in normal .map files.
+            cat $map | awk '
+                /^(DPDK_('$abi_version'|'$next_abi_version')|EXPERIMENTAL|INTERNAL) \{$/ { next; } # start of a section
+                /^}( DPDK_'$abi_version')?;$/ { next; } # end of a section
+                /^$/ { next; } # empty line
+                /^\t(global:|local: \*;)$/ { next; } # qualifiers
+                /^\t[a-zA-Z_0-9]*;$/ { next; } # symbols
+                /^\t[a-zA-Z_0-9]*=[a-zA-Z_0-9]*;$/ { next; } # symbols with aliases
+                /^\t# added in [0-9]*\.[0-9]*$/ { next; } # version comments
+                { print $0; }' || echo $map
+        else
+            cat $map | awk '
+                /^(DPDK_('$abi_version'|'$next_abi_version')|EXPERIMENTAL|INTERNAL) \{$/ { next; } # start of a section
+                /^}( DPDK_'$abi_version')?;$/ { next; } # end of a section
+                /^$/ { next; } # empty line
+                /^\t(global:|local: \*;)$/ { next; } # qualifiers
+                /^\t[a-zA-Z_0-9]*;( # WINDOWS_NO_EXPORT)?$/ { next; } # symbols
+                /^\t# added in [0-9]*\.[0-9]*$/ { next; } # version comments
+                { print $0; }' || echo $map
+        fi
     done
 }