[PATCH] objcopy: Fix a test case on Windows/MSYS2
Jan Dubiec
jdx@o2.pl
Thu Nov 6 15:22:29 GMT 2025
When running binutils tests on Windows/MSYS2, one of objcopy test cases
fails:
[...]
Executing on host:
/d/Works/xcomp/build-binutils-arm-mingw/binutils/objcopy -I binary -B
arm -O elf32-littlearm
/d/Works/binutils/binutils/testsuite/binutils-all/version.s
tmpdir/binary_implicit.o (timeout = 300)
spawn -ignore SIGHUP
/d/Works/xcomp/build-binutils-arm-mingw/binutils/objcopy -I binary -B
arm -O elf32-littlearm
/d/Works/binutils/binutils/testsuite/binutils-all/version.s
tmpdir/binary_implicit.o
/d/Works/xcomp/build-binutils-arm-mingw/binutils/nm-new -a
tmpdir/binary_implicit.o
Executing on host:
/d/Works/xcomp/build-binutils-arm-mingw/binutils/nm-new -a
tmpdir/binary_implicit.o (timeout = 300)
spawn -ignore SIGHUP
/d/Works/xcomp/build-binutils-arm-mingw/binutils/nm-new -a
tmpdir/binary_implicit.o
00000018 D
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_end
00000018 A
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_size
00000000 D
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_start
00000018 D
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_end
00000018 A
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_size
00000000 D
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_start
expected:
_binary__d_Works_binutils_binutils_testsuite_binutils_all_version_s_end
_binary__d_Works_binutils_binutils_testsuite_binutils_all_version_s_size
_binary__d_Works_binutils_binutils_testsuite_binutils_all_version_s_start,
actual:
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_end
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_size
_binary_D__Works_binutils_binutils_testsuite_binutils_all_version_s_start
FAIL: binary symbol (implicit)
As you can see, objcopy generates slightly different symbol names than
those expected in the test case. I didn't even look into the sources,
but objcopy likely gets from a syscall a path like D:\Works\binutils...
and uses it to generate the symbol names (replacing non-alphanumeric
characters with underscores). This is 100% OK in my opinion. On the
other hand, TCL/DejaGnu gets from the "middleware" (MSYS2) a path like
/d/Works/binutils... and uses it to generate expected symbol names by
replacing slashes with underscores. The attached patch fixes the issue –
see also the comment inside the patch.
/J.D.
binutils/
* testsuite/binutils-all/objcopy.exp: Fix "binary symbol
(implicit)" test case on Windows/MSYS2.
Signed-off-by: Jan Dubiec <jdx@o2.pl>
-------------- next part --------------
binutils/testsuite/binutils-all/objcopy.exp | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index e6fcf5f7f12..c5cfde646a2 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -1639,5 +1639,17 @@ proc binary_symbol {name file args symbol} {
pass $test
}
-binary_symbol implicit $srcdir/$subdir/version.s "" _binary_[regsub -all {[^0-9a-zA-Z]} $srcdir/$subdir/version.s _]
+if {[string match "*-mingw*" ${host_triplet}]} {
+ # On Windows objcopy writes symbols like _binary_X__subdir1_subdir2...
+ # where X is the "drive letter" while TCL gets from the system (MSYS2)
+ # something like /x/subdir1/subdir2... So we just do a minor trick
+ # and replace "/x" with "X/" in $srcdir.
+ regexp {^/([a-z])/(.*)} $srcdir -> drive rest
+ set winpath "[string toupper $drive]//$rest"
+ binary_symbol implicit $srcdir/$subdir/version.s "" _binary_[regsub -all {[^0-9a-zA-Z]} $winpath/$subdir/version.s _]
+} else {
+ # Call the test for Unix-like hosts
+ binary_symbol implicit $srcdir/$subdir/version.s "" _binary_[regsub -all {[^0-9a-zA-Z]} $srcdir/$subdir/version.s _]
+}
+
binary_symbol explicit $srcdir/$subdir/version.s "--binary-symbol-prefix symbol1" symbol1
More information about the Binutils
mailing list