[0/3] PE-COFF: Fix weak external symbol resolution bugs

Message ID 20260530191522.57144-1-peter0x44@disroot.org
Headers
Series PE-COFF: Fix weak external symbol resolution bugs |

Message

Peter0x44 May 30, 2026, 7:15 p.m. UTC
  This series fixes two bugs in the PE COFF weak external symbol
resolution in the BFD linker, plus adds testsuite coverage.

The first patch fixes the case where a strong undefined reference is
seen before the weak external definition. The linker was losing the
weak's aux record and failing to resolve the fallback alias.

The second patch fixes the case where two weak externals for the same
symbol meet. The linker always kept the first one's fallback
regardless of whether it pointed to a real definition or NULL.  This
matches lld's behavior after:
  https://github.com/llvm/llvm-project/commit/7ca5698b4c3698d06065e0941df7f23d72913d23

The third patch adds  tests covering a wide matrix
of weak/strong interactions, based on testcases by Martin Storsjo.

Peter Damianov (3):
  PE-COFF: Fix weak external symbol resolution when strong undef is seen
    first
  PE-COFF: Prefer weak external with defined fallback over null fallback
  ld/testsuite: Add comprehensive PE COFF weak external tests

 bfd/cofflink.c                                | 118 ++++++++++++++++--
 ld/testsuite/ld-pe/pe-compile.exp             |  88 +++++++++++++
 .../ld-pe/weak-ext-add1-weak-chained.c        |  13 ++
 ld/testsuite/ld-pe/weak-ext-add2.c            |   8 ++
 ld/testsuite/ld-pe/weak-ext-dummy.c           |   5 +
 ld/testsuite/ld-pe/weak-ext-expected1.c       |   1 +
 .../ld-pe/weak-ext-expected3-add1-weak.c      |   9 ++
 ld/testsuite/ld-pe/weak-ext-expected3.c       |   1 +
 ld/testsuite/ld-pe/weak-ext-expected5.c       |   1 +
 ld/testsuite/ld-pe/weak-ext-main-weak-def.c   |  26 ++++
 ld/testsuite/ld-pe/weak-ext-main-weak.c       |  22 ++++
 ld/testsuite/ld-pe/weak-ext-main.c            |  21 ++++
 12 files changed, 304 insertions(+), 9 deletions(-)
 create mode 100644 ld/testsuite/ld-pe/weak-ext-add1-weak-chained.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-add2.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-dummy.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-expected1.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-expected3-add1-weak.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-expected3.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-expected5.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-main-weak-def.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-main-weak.c
 create mode 100644 ld/testsuite/ld-pe/weak-ext-main.c