[Bug] DWARF-5 section names in PE/PEP and weak symbols

Achim Gratz Stromeko@nexgo.de
Wed Dec 8 18:27:06 GMT 2021


The commit

--8<---------------cut here---------------start------------->8---
commit ba6eb62ff0ea9843a018cfd7cd06777bd66ae0a0
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Mar 1 16:25:06 2021 +0000

    Add DWARF-5 section names to PE and PEP linker scripts.
    
            PR 27268
            * scripttempl/pe.sc: Add DWARF-5 section names.
            * scripttempl/pep.sc: Likewise.
--8<---------------cut here---------------end--------------->8---

changed the behaviour of weak symbols in Cygwin.  The following test
from gnulib that should fail.  In other words fputs should have a symbol
value of 0x0 and the resulting executable should not be able to run
since the Windows loader does not resolve weak symbols):

--8<--weak.c-------cut here---------------start------------->8---
#include <stdio.h>
#pragma weak fputs
int main ()
{
  return (fputs == NULL);
}
--8<---------------cut here---------------end--------------->8---

$ gcc -o weak weak.c # w/ binutils 2.36.1
$ ./weak ; echo $?
./weak: ./weak: cannot execute binary file
126

Instead, starting with the above commit, the test succeeds since fputs
has the (expected) value from cygwin1.dll.  This then leads to
horrendous crashes in applications that attempt to actually use "real"
weak symbols based on the (probably too simplistic) test from gnulib:

$ gcc -o weak weak.c # w/ binutils 2.37
$ ./weak ; echo $?
0

I've narrowed it down to just one of the new DWARF5 sections and
removing them from the linker scripts restores the correct behaviour of
weak symbols in Cygwin (I have no idea if that triggers problems
elsewhere):

--8<---------------cut here---------------start------------->8---
diff --git a/ld/scripttempl/pe.sc b/ld/scripttempl/pe.sc
index e9d1f78cb32..2e64a681850 100644
--- a/ld/scripttempl/pe.sc
+++ b/ld/scripttempl/pe.sc
@@ -447,10 +447,12 @@ SECTIONS
   {
     *(.zdebug_line_str)
   }
+/* ===
   .debug_loclists ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
   {
     *(.debug_loclists)
   }
+=== */
   .zdebug_loclists ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
   {
     *(.zdebug_loclists)
diff --git a/ld/scripttempl/pep.sc b/ld/scripttempl/pep.sc
index afa2d23871c..dbb657c2090 100644
--- a/ld/scripttempl/pep.sc
+++ b/ld/scripttempl/pep.sc
@@ -452,10 +452,12 @@ SECTIONS
   {
     *(.zdebug_line_str)
   }
+/* ===
   .debug_loclists ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
   {
     *(.debug_loclists)
   }
+=== */
   .zdebug_loclists ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
   {
     *(.zdebug_loclists)
--8<---------------cut here---------------end--------------->8---


Regards,
Achim.
-- 
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+

Waldorf MIDI Implementation & additional documentation:
http://Synth.Stromeko.net/Downloads.html#WaldorfDocs


More information about the Binutils mailing list