[binutils-gdb] VMS/BFD: Fix a sign extension issue with archive symbol lookup
Maciej W. Rozycki
macro@sourceware.org
Mon Dec 15 19:11:30 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=66eb41a42b3931e37c7b5660c84c37bf24469e59
commit 66eb41a42b3931e37c7b5660c84c37bf24469e59
Author: Maciej W. Rozycki <macro@redhat.com>
Date: Mon Dec 15 19:04:30 2025 +0000
VMS/BFD: Fix a sign extension issue with archive symbol lookup
Symbol binary search code for VMS archive files uses plain `char' data
type to cast a difference between characters to data of the `int' type.
Consequently the difference is consider unsigned in the range between 0
and 255 on hosts where plain `char' data type is unsigned, resulting in
symbol lookup failures, such as with the test expansion included with
this change causing regressions as follows:
FAIL: Regular archive link
FAIL: Thin archive link
FAIL: Regular archive plus regular link
FAIL: Regular archive plus thin link
FAIL: Thin archive plus regular link
FAIL: Thin archive plus thin link
owing to link failures such as:
.../ld/ld-new: tmpdir/abc.o:($DATA$+0x0): undefined reference to `aa'
.../ld/ld-new: tmpdir/ab.a(b.obj):($DATA$+0x10): undefined reference to `aa'
.../ld/ld-new: tmpdir/abc.o:($DATA$+0x0): undefined reference to `aa'
.../ld/ld-new: tmpdir/ab.a(b.obj):($DATA$+0x10): undefined reference to `aa'
with the `alpha-dec-vms' target on the `powerpc64le-linux-gnu' host.
Use explicit `signed char' data type for the cast then, removing the
failures.
Diff:
---
bfd/vms-lib.c | 2 +-
ld/testsuite/ld-archive/archive.exp | 12 ++++++------
ld/testsuite/ld-archive/x.s | 4 ++++
ld/testsuite/ld-archive/y.s | 4 ++++
4 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c
index 2ffb4e4acf9..3c1f8ef007a 100644
--- a/bfd/vms-lib.c
+++ b/bfd/vms-lib.c
@@ -800,7 +800,7 @@ _bfd_vms_lib_find_symbol (bfd *abfd, const char *name)
int mid = lo + (hi - lo) / 2;
int diff;
- diff = (char)(name[0] - syms[mid].name[0]);
+ diff = (signed char) (name[0] - syms[mid].name[0]);
if (diff == 0)
diff = strcmp (name, syms[mid].name);
if (diff == 0)
diff --git a/ld/testsuite/ld-archive/archive.exp b/ld/testsuite/ld-archive/archive.exp
index b8685e94f42..035b271f775 100644
--- a/ld/testsuite/ld-archive/archive.exp
+++ b/ld/testsuite/ld-archive/archive.exp
@@ -23,12 +23,12 @@ remote_file host delete \
"tmpdir/abn.a" "tmpdir/abnt.a"
run_ld_link_tests {
- {"First regular archive create" "" "" "" {a.s b.s} {} "ab.a" }
- {"Second regular archive create" "" "" "" {c.s d.s} {} "cd.a" }
- {"First thin archive create" "T" "" "" {a.s b.s} {} "abt.a" }
- {"Second thin archive create" "T" "" "" {c.s d.s} {} "cdt.a" }
- {"Regular archive w/o index create" "S" "" "" {a.s b.s} {} "abn.a" }
- {"Thin archive w/o index create" "ST" "" "" {a.s b.s} {} "abnt.a"}
+ {"First regular archive create" "" "" "" {a.s b.s x.s} {} "ab.a" }
+ {"Second regular archive create" "" "" "" {c.s d.s y.s} {} "cd.a" }
+ {"First thin archive create" "T" "" "" {a.s b.s x.s} {} "abt.a" }
+ {"Second thin archive create" "T" "" "" {c.s d.s y.s} {} "cdt.a" }
+ {"Regular archive w/o index create" "S" "" "" {a.s b.s x.s} {} "abn.a" }
+ {"Thin archive w/o index create" "ST" "" "" {a.s b.s x.s} {} "abnt.a" }
}
set old_ldflags $LDFLAGS
diff --git a/ld/testsuite/ld-archive/x.s b/ld/testsuite/ld-archive/x.s
new file mode 100644
index 00000000000..49ace626872
--- /dev/null
+++ b/ld/testsuite/ld-archive/x.s
@@ -0,0 +1,4 @@
+ .data
+ .globl xx
+xx:
+ .dc.a 0
diff --git a/ld/testsuite/ld-archive/y.s b/ld/testsuite/ld-archive/y.s
new file mode 100644
index 00000000000..45d7ec7eef9
--- /dev/null
+++ b/ld/testsuite/ld-archive/y.s
@@ -0,0 +1,4 @@
+ .data
+ .globl yy
+yy:
+ .dc.a 0
More information about the Binutils-cvs
mailing list