From e1a23db7d5a87cbc737386c4bf64c2957721473d Mon Sep 17 00:00:00 2001 From: Harishmcw Date: Fri, 17 Oct 2025 18:03:44 +0530 Subject: [PATCH] Fix .def file generation for ARM64EC builds on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When building DLLs on ARM64EC, the default use of `dumpbin -linkermember:1` fails because ARM64EC static libraries use a different linker member format. Use `-linkermember:32` for ARM64EC to correctly extract symbols. Additionally, MSVC inserts $exit_thunk and $entry_thunk symbols for ARM64EC to handle x64 ↔ ARM64 transitions. These are internal thunks and must not be exported. Filter them out when generating the .def file to avoid unresolved symbols or invalid exports. Trim out the leading '#' on ARM64EC function symbols. This is only relevant on ARM64EC, but it is benign to do that filtering on all architectures (such symbols aren't expected on other architectures). Simplify the sed command by removing the symbol address with a sed expression instead of a later "cut" command. This ensures correct symbol extraction and stable DLL generation on ARM64EC targets, while keeping behavior unchanged for other Windows architectures. Signed-off-by: Harishmcw --- compat/windows/makedef | 25 ++++++++++++++++++++----- configure | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/compat/windows/makedef b/compat/windows/makedef index add8222d13..af42f08fd5 100755 --- a/compat/windows/makedef +++ b/compat/windows/makedef @@ -48,7 +48,13 @@ trap 'rm -f -- $libname' EXIT if [ -n "$AR" ]; then $AR rcs ${libname} $@ >/dev/null else - lib.exe -out:${libname} $@ >/dev/null + machine_flag="" + case "$LDFLAGS" in + *"machine:arm64ec"*) + machine_flag="-machine:arm64ec" + ;; + esac + lib.exe ${machine_flag} -out:${libname} $@ >/dev/null fi if [ $? != 0 ]; then echo "Could not create temporary library." >&2 @@ -106,12 +112,21 @@ if [ -n "$NM" ]; then grep -v : | grep -v ^$ | cut -d' ' -f3 | - sed -e "s/^${prefix}//") + sed -e "s/^${prefix}//" -e "s/^#//" | + grep -v '\$entry_thunk' | + grep -v '\$exit_thunk') else - dump=$(dumpbin.exe -linkermember:1 ${libname} | - sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' | + member=1 + case "$LDFLAGS" in + *"machine:arm64ec"*) + member=32 + ;; + esac + dump=$(dumpbin.exe -linkermember:${member} ${libname} | + sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e 's/^[[:space:]]*[0-9A-Fa-f]\{1,\}[[:space:]]\{1,\}//' -e "s/^${prefix}//" -e 's/^#//' | tail -n +2 | - cut -d' ' -f3) + grep -v '\$entry_thunk' | + grep -v '\$exit_thunk') fi rm ${libname} diff --git a/configure b/configure index 39e69d217d..db18aa2c28 100755 --- a/configure +++ b/configure @@ -6079,7 +6079,7 @@ case $target_os in SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' - SLIB_CREATE_DEF_CMD='EXTERN_PREFIX="$(EXTERN_PREFIX)" $(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)' + SLIB_CREATE_DEF_CMD='LDFLAGS="$(LDFLAGS)" EXTERN_PREFIX="$(EXTERN_PREFIX)" $(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS= SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)' -- 2.43.0