public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] DWARF: Skip if abbrev number isn't found for for DWARF5
@ 2021-03-18  4:25 H.J. Lu
  2021-03-18  6:14 ` Alan Modra
  0 siblings, 1 reply; 6+ messages in thread
From: H.J. Lu @ 2021-03-18  4:25 UTC (permalink / raw)
  To: binutils

Since DWARF5 may have references to other CUs, when scanning CU for
undefined symbols, skip if abbrev number isn't found for DWARF5.

bfd/

	PR ld/27587
	* dwarf2.c (scan_unit_for_symbols): Skip if abbrev number isn't
	found for DWARF5.

ld/

	PR ld/27587
	* testsuite/ld-x86-64/pr27587.err: New file.
	* testsuite/ld-x86-64/pr27587a.obj.bz2: Likewise.
	* testsuite/ld-x86-64/pr27587b.obj.bz2: Likewise.
	* testsuite/ld-x86-64/x86-64.exp: Run PR ld/27587 test.
---
 bfd/dwarf2.c                            |  11 ++++++++---
 ld/testsuite/ld-x86-64/pr27587.err      |   3 +++
 ld/testsuite/ld-x86-64/pr27587a.obj.bz2 | Bin 0 -> 1265 bytes
 ld/testsuite/ld-x86-64/pr27587b.obj.bz2 | Bin 0 -> 913 bytes
 ld/testsuite/ld-x86-64/x86-64.exp       |   5 +++++
 5 files changed, 16 insertions(+), 3 deletions(-)
 create mode 100644 ld/testsuite/ld-x86-64/pr27587.err
 create mode 100644 ld/testsuite/ld-x86-64/pr27587a.obj.bz2
 create mode 100644 ld/testsuite/ld-x86-64/pr27587b.obj.bz2

diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index b42e641aa3b..7a06b177fa3 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -3420,10 +3420,14 @@ scan_unit_for_symbols (struct comp_unit *unit)
 	  /* Avoid multiple reports of the same missing abbrev.  */
 	  if (abbrev_number != previous_failed_abbrev)
 	    {
-	      _bfd_error_handler
-		(_("DWARF error: could not find abbrev number %u"),
-		 abbrev_number);
+	      /* NB: DWARF5 may have references to other CUs.  */
+	      if (unit->version < 5)
+		_bfd_error_handler
+		  (_("DWARF error: could not find abbrev number %u"),
+		   abbrev_number);
 	      previous_failed_abbrev = abbrev_number;
+	      if (unit->version >= 5)
+		goto skip;
 	    }
 	  bfd_set_error (bfd_error_bad_value);
 	  goto fail;
@@ -3743,6 +3747,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
 	}
     }
 
+ skip:
   free (nested_funcs);
   return TRUE;
 
diff --git a/ld/testsuite/ld-x86-64/pr27587.err b/ld/testsuite/ld-x86-64/pr27587.err
new file mode 100644
index 00000000000..fa870790813
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr27587.err
@@ -0,0 +1,3 @@
+#...
+.*pr27587.i:4: undefined reference to `stack_size'
+#...
diff --git a/ld/testsuite/ld-x86-64/pr27587a.obj.bz2 b/ld/testsuite/ld-x86-64/pr27587a.obj.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..eebcf54d44d7709431a4f7d1a9dfd2970588373e
GIT binary patch
literal 1265
zcmV<N1P=Q`T4*^jL0KkKStHq+PXGkDfB*mg|Nis;|NmS6+kpS?-}CtZQS5+-5E;=(
z3T#yYXiCrn`d5Oe+q;>exM)Na(duZ@Z48Ep(S*iNQh6F0hK7So8VDFhBMIs-O);Po
zCPPe`4H{vR5usD?srq7#Jfzy2BmfN>7>%R=000dQ00000000^SCMlyPq{1;1*(iE}
z>JL$&f?|4&q|;3r4^Vm|1jzL;4MFNMVK5LhG&Iv81^|o`5vEKdA&6lZOaP1{A(Kpo
zjEq5{fS8yQ5u*VaGGG!V36&m%^){xOX{LZ09*Lj^fuIcrfN0QY&;S4c0002fKvAu!
ztZeGO<3RugVnl`kiJ6eo=<Avm6sR)&>C!B&xRVtoAfKv;@}j03Xz%lKqu{#5-7NQ@
z-w{qjuCUR08bWVm%*-Am0_fC6RyD4w#Y={{)rMBbPAx*jQ)#C{s07aEf)&c}x%)m`
zS9*dAU|Fg!j(V_aNw&?y6h<b9j9Lesw_{-FfQrA(HCFtIbDLBUfc+5+$MaJ6e!kE3
z-P4>uP8(;vCs0AHI0h6zf|3!zp<sa!3Id4qw*6PQeJWHHuXr5!RZ2t=_nt%r<-Kbu
z<g=u3<%UrNA)zAAQ!U)nDIr1(3s^IaE9R%4brMY$Do0-^q^ThRgwj(qiuQm;DWonl
zL62!R8U`eTWYS2Tf;){1oWyJyWcx3#nxa8=7#&t6BNf|75ZEjDgp+9nlSpieZ~{=$
zZ6w-kBBF?d9MQDEz)1@D>`T`hesrNH3)_5zyV?a2M=`(rN3fbPwEAUnTR$OPMh*q7
z-@`%_7Ws6sd6*`+8Z&dEQL(gGLQmr(a}NzfW@jQ&Ko`6g4K~FyOY5WGPWpozynk&@
zdza0E;+jDz+BH>zy<$;Rv}lnCU#D!qT?(JR%%W@&$lOO?=@fpsUpz{MAzx(Wkp}gk
z&pBG8&{%^cd&h}17OY^{CPPVFun~i}?o3KpT|jNvSAV>dT}*<AWQ&NxLb7mSh_`Ft
z<1w@$#t<)_G|VDEF7Si}I*||tPc;JuK>1{&a@=M5(UsRMepp(KAh@{SKJff!_(YWC
z;F8L)#}$$Cr$>ESDk!w(8K6IKF(ABs@2?^N4-~ElTPeU8)kp?0L`N3aGM{z^1t{OR
zr&YBgt9)h8?Lv8J85kunr!3ErIr;+#!Mzq*(6pi-UQgY~OG2lllwm3$6Ujt(n2+!7
zu`%of7v;e@XpG<(AVE*dYK*Bca^_7@U921zcK9#NN==Z9wTWGA7E*vLg}wR3iV=@(
z3f3^i;u{Ijy;e#{s?j-64ZpNPC-Fza5{GOc(;M>RKYrrvu?%2!FQg||6PDvySasQ%
zpJpl(M6+0Gr8N*^Y*LpMj26C|rl^G^wTZ~9nXgPJ$U%6PBw@^0U*({$)^IGvQTk0O
zV7nKhvlRwJ0@gdkMhoJ+Zsvszrs!C?Ocz+Rg%whkk50HvHN%WDS#~1y$pYdFP)KC;
zNHGF7v7S}7d!tFo&a`MbWl&&aOQFCVjcTT|UVbRpz=JtDv$H=Uq!dh%heA$Y3^xop
zL@i)!q|7F@bAd(MfJ_^a68ox-B)Uw>6u2E=J8ubcD~S!h9HQPD4Z#blfJ};(PHEj%
bmOJBb*p#WT$|IAX{(*NSQ-uivJ(;BNi;*>p

literal 0
HcmV?d00001

diff --git a/ld/testsuite/ld-x86-64/pr27587b.obj.bz2 b/ld/testsuite/ld-x86-64/pr27587b.obj.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..8506e4eccdb35862be83beb5bf09365c89683453
GIT binary patch
literal 913
zcmV;C18)36T4*^jL0KkKSq3Q^QUC)hfA#<W{rmR+|NqP7$H2e;-}1ynVZcBTKmY)M
zF#*5>6yOBXq8but6Df)6VrqVqLF%4_c_*mQ@)OZEq3Sd+5MTl_1{pFZrh`*Vrjts4
zsKPZd9*TKJnJ_daL(oh|qyt6?f?y_0nr5R+m<|8{00000$N&HU0000041fYei8Ry<
zrf7^n)6_BpKzf>J2AT~$Kr#R{XlP_;038oJ*B340bY76UAc)318n%+r99Qh*`D9MB
zhx)N55>>s<>54f^pnuM$7?s9hAwz2u!8q(26qjbG>a||wO$hIz1a(Rm=7&J!7&U|!
zl_MdQ!4*zcF<Ym<k@j~)$g<zJw`E|7cRLgWMv_!(!MiE2%)CeoO&Q;w#aX$r_+V{n
z#@ji7yKDj&?2@5bqJqt6*)=g0m<K(i0i4iu+%PI=Gu(zFC80w}7T6ueEhZxspuoz%
zlJu}fQ$jn;NQQ(q4WwbPrIfL;A5O{FkOih?utp2n=11CEx1TD~)iQPJ3)hEk5qX1i
zGh+IUYD^0^^03Q#HZ5CN>QJ;9k6c%DVHYtg)^ih+fMa{yk|@2=#wSSK^Ww06xSKXi
z7K05clp>1o0PmC~4GQZiV`_$#$dA{)5yBd>&899DfA$u|C2AnAUOZaYWuDS0!N`&=
zUPXsl&8dkpaq82U6S!^U1r2Hjph}`{APS!8&-(=4oCM?}BN7zd+bNeCQ?W8qdAWg?
z;f9_xtni|y3OpXMXG+C;F$Q>tyJg8zd1=5TQ7*JMU~phAwu@kzdA&#cl19*@U7={q
z$v@<Sw8&+4%2PHNmWs<2gwc2mEEtS)4tIaZCkozAafZo8&8J{`7&RER#Hi038VFuc
z8DL975VX^p2(YxEHV~!FcGcT#mtG9V<46pt^!TdVz)fwlxCIq7<vzn9;`(iUVO=3e
zn=!f!PfN7G()+qZn3dsRr#;oFPsA-gCf7k>N+yR~QT8c3LI;kU0Tm@FdefuKTsh(}
zs>sAQl>Frk5QP|d{A--t_rrqh;I~SA6_tjj1j^DNSlUAZkyL8KC<hG)fj9}~iUKI7
z&?=P1Abg~@wu(3I9~7EQ7VC{jsf-64GN70%(VAh%$$_OjLQw+`f}=1X3}b>I1Tq{|
npr}<*RRpHFPO9iG{#qFrlxqoo33rsc-Qw;@rwS4P#UpA!hwz$H

literal 0
HcmV?d00001

diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 232c9dfa3a2..db3bd140193 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -221,6 +221,11 @@ set x86_64tests {
      "-melf_x86_64 -pie -z notext tmpdir/pr20550a.o tmpdir/pr20550b.so"
      ""
      "--64" { dummy.s } {} "pr20550"}
+    {"Build pr27587"
+     "-melf_x86_64 -e main"
+     "" ""
+     { pr27587a.obj.bz2 pr27587b.obj.bz2 }
+     {{ld "pr27587.err"}} "pr27587"}
 }
 
 run_ld_link_tests $x86_64tests
-- 
2.30.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] DWARF: Skip if abbrev number isn't found for for DWARF5
  2021-03-18  4:25 [PATCH] DWARF: Skip if abbrev number isn't found for for DWARF5 H.J. Lu
@ 2021-03-18  6:14 ` Alan Modra
  2021-03-18 13:14   ` [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr H.J. Lu
  0 siblings, 1 reply; 6+ messages in thread
From: Alan Modra @ 2021-03-18  6:14 UTC (permalink / raw)
  To: H.J. Lu; +Cc: binutils

On Wed, Mar 17, 2021 at 09:25:51PM -0700, H.J. Lu via Binutils wrote:
> --- a/bfd/dwarf2.c
> +++ b/bfd/dwarf2.c
> @@ -3420,10 +3420,14 @@ scan_unit_for_symbols (struct comp_unit *unit)
>  	  /* Avoid multiple reports of the same missing abbrev.  */
>  	  if (abbrev_number != previous_failed_abbrev)
>  	    {
> -	      _bfd_error_handler
> -		(_("DWARF error: could not find abbrev number %u"),
> -		 abbrev_number);
> +	      /* NB: DWARF5 may have references to other CUs.  */
> +	      if (unit->version < 5)
> +		_bfd_error_handler
> +		  (_("DWARF error: could not find abbrev number %u"),
> +		   abbrev_number);
>  	      previous_failed_abbrev = abbrev_number;
> +	      if (unit->version >= 5)
> +		goto skip;
>  	    }
>  	  bfd_set_error (bfd_error_bad_value);
>  	  goto fail;

This doesn't feel right to me.  Why are we looking for an abbrev in
the wrong CU?  Presumably if the reader can do that, then it might
interpret a lower number abbrev wrongly.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr
  2021-03-18  6:14 ` Alan Modra
@ 2021-03-18 13:14   ` H.J. Lu
  2021-03-19  1:32     ` Alan Modra
  0 siblings, 1 reply; 6+ messages in thread
From: H.J. Lu @ 2021-03-18 13:14 UTC (permalink / raw)
  To: Alan Modra; +Cc: Binutils

[-- Attachment #1: Type: text/plain, Size: 1371 bytes --]

On Wed, Mar 17, 2021 at 11:14 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Wed, Mar 17, 2021 at 09:25:51PM -0700, H.J. Lu via Binutils wrote:
> > --- a/bfd/dwarf2.c
> > +++ b/bfd/dwarf2.c
> > @@ -3420,10 +3420,14 @@ scan_unit_for_symbols (struct comp_unit *unit)
> >         /* Avoid multiple reports of the same missing abbrev.  */
> >         if (abbrev_number != previous_failed_abbrev)
> >           {
> > -           _bfd_error_handler
> > -             (_("DWARF error: could not find abbrev number %u"),
> > -              abbrev_number);
> > +           /* NB: DWARF5 may have references to other CUs.  */
> > +           if (unit->version < 5)
> > +             _bfd_error_handler
> > +               (_("DWARF error: could not find abbrev number %u"),
> > +                abbrev_number);
> >             previous_failed_abbrev = abbrev_number;
> > +           if (unit->version >= 5)
> > +             goto skip;
> >           }
> >         bfd_set_error (bfd_error_bad_value);
> >         goto fail;
>
> This doesn't feel right to me.  Why are we looking for an abbrev in
> the wrong CU?  Presumably if the reader can do that, then it might
> interpret a lower number abbrev wrongly.

Here is the updated patch to replace

if (unit->version == 3 || unit->version == 4)

with

if (unit->version >= 3)

for DWARF5 or above.  OK for master?

Thanks.

-- 
H.J.

[-- Attachment #2: v2-0001-DWARF-Check-version-3-for-DW_FORM_ref_addr.patch --]
[-- Type: text/x-patch, Size: 5803 bytes --]

From a8e9ae296020dd2015f939a778d32007fef72f3b Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Wed, 17 Mar 2021 21:18:55 -0700
Subject: [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr

Check version >= 3, instead of version == 3 || version == 4, for
DW_FORM_ref_addr.

bfd/

	PR ld/27587
	* dwarf2.c (read_attribute_value): Check version >= 3 for
	DW_FORM_ref_addr.

ld/

	PR ld/27587
	* testsuite/ld-x86-64/pr27587.err: New file.
	* testsuite/ld-x86-64/pr27587a.obj.bz2: Likewise.
	* testsuite/ld-x86-64/pr27587b.obj.bz2: Likewise.
	* testsuite/ld-x86-64/x86-64.exp: Run PR ld/27587 test.

Fix
---
 bfd/dwarf2.c                            |   2 +-
 ld/testsuite/ld-x86-64/pr27587.err      |   3 +++
 ld/testsuite/ld-x86-64/pr27587a.obj.bz2 | Bin 0 -> 1265 bytes
 ld/testsuite/ld-x86-64/pr27587b.obj.bz2 | Bin 0 -> 913 bytes
 ld/testsuite/ld-x86-64/x86-64.exp       |   5 +++++
 5 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 ld/testsuite/ld-x86-64/pr27587.err
 create mode 100644 ld/testsuite/ld-x86-64/pr27587a.obj.bz2
 create mode 100644 ld/testsuite/ld-x86-64/pr27587b.obj.bz2

diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index b42e641aa3b..1d5ddef3329 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -1213,7 +1213,7 @@ read_attribute_value (struct attribute *  attr,
     case DW_FORM_ref_addr:
       /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
 	 DWARF3.  */
-      if (unit->version == 3 || unit->version == 4)
+      if (unit->version >= 3)
 	{
 	  if (unit->offset_size == 4)
 	    attr->u.val = read_4_bytes (unit->abfd, info_ptr, info_ptr_end);
diff --git a/ld/testsuite/ld-x86-64/pr27587.err b/ld/testsuite/ld-x86-64/pr27587.err
new file mode 100644
index 00000000000..fa870790813
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr27587.err
@@ -0,0 +1,3 @@
+#...
+.*pr27587.i:4: undefined reference to `stack_size'
+#...
diff --git a/ld/testsuite/ld-x86-64/pr27587a.obj.bz2 b/ld/testsuite/ld-x86-64/pr27587a.obj.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..eebcf54d44d7709431a4f7d1a9dfd2970588373e
GIT binary patch
literal 1265
zcmV<N1P=Q`T4*^jL0KkKStHq+PXGkDfB*mg|Nis;|NmS6+kpS?-}CtZQS5+-5E;=(
z3T#yYXiCrn`d5Oe+q;>exM)Na(duZ@Z48Ep(S*iNQh6F0hK7So8VDFhBMIs-O);Po
zCPPe`4H{vR5usD?srq7#Jfzy2BmfN>7>%R=000dQ00000000^SCMlyPq{1;1*(iE}
z>JL$&f?|4&q|;3r4^Vm|1jzL;4MFNMVK5LhG&Iv81^|o`5vEKdA&6lZOaP1{A(Kpo
zjEq5{fS8yQ5u*VaGGG!V36&m%^){xOX{LZ09*Lj^fuIcrfN0QY&;S4c0002fKvAu!
ztZeGO<3RugVnl`kiJ6eo=<Avm6sR)&>C!B&xRVtoAfKv;@}j03Xz%lKqu{#5-7NQ@
z-w{qjuCUR08bWVm%*-Am0_fC6RyD4w#Y={{)rMBbPAx*jQ)#C{s07aEf)&c}x%)m`
zS9*dAU|Fg!j(V_aNw&?y6h<b9j9Lesw_{-FfQrA(HCFtIbDLBUfc+5+$MaJ6e!kE3
z-P4>uP8(;vCs0AHI0h6zf|3!zp<sa!3Id4qw*6PQeJWHHuXr5!RZ2t=_nt%r<-Kbu
z<g=u3<%UrNA)zAAQ!U)nDIr1(3s^IaE9R%4brMY$Do0-^q^ThRgwj(qiuQm;DWonl
zL62!R8U`eTWYS2Tf;){1oWyJyWcx3#nxa8=7#&t6BNf|75ZEjDgp+9nlSpieZ~{=$
zZ6w-kBBF?d9MQDEz)1@D>`T`hesrNH3)_5zyV?a2M=`(rN3fbPwEAUnTR$OPMh*q7
z-@`%_7Ws6sd6*`+8Z&dEQL(gGLQmr(a}NzfW@jQ&Ko`6g4K~FyOY5WGPWpozynk&@
zdza0E;+jDz+BH>zy<$;Rv}lnCU#D!qT?(JR%%W@&$lOO?=@fpsUpz{MAzx(Wkp}gk
z&pBG8&{%^cd&h}17OY^{CPPVFun~i}?o3KpT|jNvSAV>dT}*<AWQ&NxLb7mSh_`Ft
z<1w@$#t<)_G|VDEF7Si}I*||tPc;JuK>1{&a@=M5(UsRMepp(KAh@{SKJff!_(YWC
z;F8L)#}$$Cr$>ESDk!w(8K6IKF(ABs@2?^N4-~ElTPeU8)kp?0L`N3aGM{z^1t{OR
zr&YBgt9)h8?Lv8J85kunr!3ErIr;+#!Mzq*(6pi-UQgY~OG2lllwm3$6Ujt(n2+!7
zu`%of7v;e@XpG<(AVE*dYK*Bca^_7@U921zcK9#NN==Z9wTWGA7E*vLg}wR3iV=@(
z3f3^i;u{Ijy;e#{s?j-64ZpNPC-Fza5{GOc(;M>RKYrrvu?%2!FQg||6PDvySasQ%
zpJpl(M6+0Gr8N*^Y*LpMj26C|rl^G^wTZ~9nXgPJ$U%6PBw@^0U*({$)^IGvQTk0O
zV7nKhvlRwJ0@gdkMhoJ+Zsvszrs!C?Ocz+Rg%whkk50HvHN%WDS#~1y$pYdFP)KC;
zNHGF7v7S}7d!tFo&a`MbWl&&aOQFCVjcTT|UVbRpz=JtDv$H=Uq!dh%heA$Y3^xop
zL@i)!q|7F@bAd(MfJ_^a68ox-B)Uw>6u2E=J8ubcD~S!h9HQPD4Z#blfJ};(PHEj%
bmOJBb*p#WT$|IAX{(*NSQ-uivJ(;BNi;*>p

literal 0
HcmV?d00001

diff --git a/ld/testsuite/ld-x86-64/pr27587b.obj.bz2 b/ld/testsuite/ld-x86-64/pr27587b.obj.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..8506e4eccdb35862be83beb5bf09365c89683453
GIT binary patch
literal 913
zcmV;C18)36T4*^jL0KkKSq3Q^QUC)hfA#<W{rmR+|NqP7$H2e;-}1ynVZcBTKmY)M
zF#*5>6yOBXq8but6Df)6VrqVqLF%4_c_*mQ@)OZEq3Sd+5MTl_1{pFZrh`*Vrjts4
zsKPZd9*TKJnJ_daL(oh|qyt6?f?y_0nr5R+m<|8{00000$N&HU0000041fYei8Ry<
zrf7^n)6_BpKzf>J2AT~$Kr#R{XlP_;038oJ*B340bY76UAc)318n%+r99Qh*`D9MB
zhx)N55>>s<>54f^pnuM$7?s9hAwz2u!8q(26qjbG>a||wO$hIz1a(Rm=7&J!7&U|!
zl_MdQ!4*zcF<Ym<k@j~)$g<zJw`E|7cRLgWMv_!(!MiE2%)CeoO&Q;w#aX$r_+V{n
z#@ji7yKDj&?2@5bqJqt6*)=g0m<K(i0i4iu+%PI=Gu(zFC80w}7T6ueEhZxspuoz%
zlJu}fQ$jn;NQQ(q4WwbPrIfL;A5O{FkOih?utp2n=11CEx1TD~)iQPJ3)hEk5qX1i
zGh+IUYD^0^^03Q#HZ5CN>QJ;9k6c%DVHYtg)^ih+fMa{yk|@2=#wSSK^Ww06xSKXi
z7K05clp>1o0PmC~4GQZiV`_$#$dA{)5yBd>&899DfA$u|C2AnAUOZaYWuDS0!N`&=
zUPXsl&8dkpaq82U6S!^U1r2Hjph}`{APS!8&-(=4oCM?}BN7zd+bNeCQ?W8qdAWg?
z;f9_xtni|y3OpXMXG+C;F$Q>tyJg8zd1=5TQ7*JMU~phAwu@kzdA&#cl19*@U7={q
z$v@<Sw8&+4%2PHNmWs<2gwc2mEEtS)4tIaZCkozAafZo8&8J{`7&RER#Hi038VFuc
z8DL975VX^p2(YxEHV~!FcGcT#mtG9V<46pt^!TdVz)fwlxCIq7<vzn9;`(iUVO=3e
zn=!f!PfN7G()+qZn3dsRr#;oFPsA-gCf7k>N+yR~QT8c3LI;kU0Tm@FdefuKTsh(}
zs>sAQl>Frk5QP|d{A--t_rrqh;I~SA6_tjj1j^DNSlUAZkyL8KC<hG)fj9}~iUKI7
z&?=P1Abg~@wu(3I9~7EQ7VC{jsf-64GN70%(VAh%$$_OjLQw+`f}=1X3}b>I1Tq{|
npr}<*RRpHFPO9iG{#qFrlxqoo33rsc-Qw;@rwS4P#UpA!hwz$H

literal 0
HcmV?d00001

diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 232c9dfa3a2..db3bd140193 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -221,6 +221,11 @@ set x86_64tests {
      "-melf_x86_64 -pie -z notext tmpdir/pr20550a.o tmpdir/pr20550b.so"
      ""
      "--64" { dummy.s } {} "pr20550"}
+    {"Build pr27587"
+     "-melf_x86_64 -e main"
+     "" ""
+     { pr27587a.obj.bz2 pr27587b.obj.bz2 }
+     {{ld "pr27587.err"}} "pr27587"}
 }
 
 run_ld_link_tests $x86_64tests
-- 
2.30.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr
  2021-03-18 13:14   ` [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr H.J. Lu
@ 2021-03-19  1:32     ` Alan Modra
  2021-03-22 13:22       ` H.J. Lu
  0 siblings, 1 reply; 6+ messages in thread
From: Alan Modra @ 2021-03-19  1:32 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Binutils

On Thu, Mar 18, 2021 at 06:14:02AM -0700, H.J. Lu wrote:
> On Wed, Mar 17, 2021 at 11:14 PM Alan Modra <amodra@gmail.com> wrote:
> >
> > On Wed, Mar 17, 2021 at 09:25:51PM -0700, H.J. Lu via Binutils wrote:
> > > --- a/bfd/dwarf2.c
> > > +++ b/bfd/dwarf2.c
> > > @@ -3420,10 +3420,14 @@ scan_unit_for_symbols (struct comp_unit *unit)
> > >         /* Avoid multiple reports of the same missing abbrev.  */
> > >         if (abbrev_number != previous_failed_abbrev)
> > >           {
> > > -           _bfd_error_handler
> > > -             (_("DWARF error: could not find abbrev number %u"),
> > > -              abbrev_number);
> > > +           /* NB: DWARF5 may have references to other CUs.  */
> > > +           if (unit->version < 5)
> > > +             _bfd_error_handler
> > > +               (_("DWARF error: could not find abbrev number %u"),
> > > +                abbrev_number);
> > >             previous_failed_abbrev = abbrev_number;
> > > +           if (unit->version >= 5)
> > > +             goto skip;
> > >           }
> > >         bfd_set_error (bfd_error_bad_value);
> > >         goto fail;
> >
> > This doesn't feel right to me.  Why are we looking for an abbrev in
> > the wrong CU?  Presumably if the reader can do that, then it might
> > interpret a lower number abbrev wrongly.
> 
> Here is the updated patch to replace
> 
> if (unit->version == 3 || unit->version == 4)
> 
> with
> 
> if (unit->version >= 3)
> 
> for DWARF5 or above.  OK for master?

Yes thanks.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr
  2021-03-19  1:32     ` Alan Modra
@ 2021-03-22 13:22       ` H.J. Lu
  2021-03-22 17:08         ` [2.35] [PATCH] " H.J. Lu
  0 siblings, 1 reply; 6+ messages in thread
From: H.J. Lu @ 2021-03-22 13:22 UTC (permalink / raw)
  To: Alan Modra, Nick Clifton; +Cc: Binutils

On Thu, Mar 18, 2021 at 6:32 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Thu, Mar 18, 2021 at 06:14:02AM -0700, H.J. Lu wrote:
> > On Wed, Mar 17, 2021 at 11:14 PM Alan Modra <amodra@gmail.com> wrote:
> > >
> > > On Wed, Mar 17, 2021 at 09:25:51PM -0700, H.J. Lu via Binutils wrote:
> > > > --- a/bfd/dwarf2.c
> > > > +++ b/bfd/dwarf2.c
> > > > @@ -3420,10 +3420,14 @@ scan_unit_for_symbols (struct comp_unit *unit)
> > > >         /* Avoid multiple reports of the same missing abbrev.  */
> > > >         if (abbrev_number != previous_failed_abbrev)
> > > >           {
> > > > -           _bfd_error_handler
> > > > -             (_("DWARF error: could not find abbrev number %u"),
> > > > -              abbrev_number);
> > > > +           /* NB: DWARF5 may have references to other CUs.  */
> > > > +           if (unit->version < 5)
> > > > +             _bfd_error_handler
> > > > +               (_("DWARF error: could not find abbrev number %u"),
> > > > +                abbrev_number);
> > > >             previous_failed_abbrev = abbrev_number;
> > > > +           if (unit->version >= 5)
> > > > +             goto skip;
> > > >           }
> > > >         bfd_set_error (bfd_error_bad_value);
> > > >         goto fail;
> > >
> > > This doesn't feel right to me.  Why are we looking for an abbrev in
> > > the wrong CU?  Presumably if the reader can do that, then it might
> > > interpret a lower number abbrev wrongly.
> >
> > Here is the updated patch to replace
> >
> > if (unit->version == 3 || unit->version == 4)
> >
> > with
> >
> > if (unit->version >= 3)
> >
> > for DWARF5 or above.  OK for master?
>
> Yes thanks.
>

I am backporting it to 2.36 branch.

-- 
H.J.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [2.35] [PATCH] DWARF: Check version >= 3 for DW_FORM_ref_addr
  2021-03-22 13:22       ` H.J. Lu
@ 2021-03-22 17:08         ` H.J. Lu
  0 siblings, 0 replies; 6+ messages in thread
From: H.J. Lu @ 2021-03-22 17:08 UTC (permalink / raw)
  To: Alan Modra, Nick Clifton; +Cc: Binutils

[-- Attachment #1: Type: text/plain, Size: 1891 bytes --]

On Mon, Mar 22, 2021 at 6:22 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Thu, Mar 18, 2021 at 6:32 PM Alan Modra <amodra@gmail.com> wrote:
> >
> > On Thu, Mar 18, 2021 at 06:14:02AM -0700, H.J. Lu wrote:
> > > On Wed, Mar 17, 2021 at 11:14 PM Alan Modra <amodra@gmail.com> wrote:
> > > >
> > > > On Wed, Mar 17, 2021 at 09:25:51PM -0700, H.J. Lu via Binutils wrote:
> > > > > --- a/bfd/dwarf2.c
> > > > > +++ b/bfd/dwarf2.c
> > > > > @@ -3420,10 +3420,14 @@ scan_unit_for_symbols (struct comp_unit *unit)
> > > > >         /* Avoid multiple reports of the same missing abbrev.  */
> > > > >         if (abbrev_number != previous_failed_abbrev)
> > > > >           {
> > > > > -           _bfd_error_handler
> > > > > -             (_("DWARF error: could not find abbrev number %u"),
> > > > > -              abbrev_number);
> > > > > +           /* NB: DWARF5 may have references to other CUs.  */
> > > > > +           if (unit->version < 5)
> > > > > +             _bfd_error_handler
> > > > > +               (_("DWARF error: could not find abbrev number %u"),
> > > > > +                abbrev_number);
> > > > >             previous_failed_abbrev = abbrev_number;
> > > > > +           if (unit->version >= 5)
> > > > > +             goto skip;
> > > > >           }
> > > > >         bfd_set_error (bfd_error_bad_value);
> > > > >         goto fail;
> > > >
> > > > This doesn't feel right to me.  Why are we looking for an abbrev in
> > > > the wrong CU?  Presumably if the reader can do that, then it might
> > > > interpret a lower number abbrev wrongly.
> > >
> > > Here is the updated patch to replace
> > >
> > > if (unit->version == 3 || unit->version == 4)
> > >
> > > with
> > >
> > > if (unit->version >= 3)
> > >
> > > for DWARF5 or above.  OK for master?
> >
> > Yes thanks.
> >
>
> I am backporting it to 2.36 branch.
>

I also checked this into 2.35 branch.

-- 
H.J.

[-- Attachment #2: 0001-DWARF-Check-version-3-for-DW_FORM_ref_addr.patch --]
[-- Type: text/x-patch, Size: 1449 bytes --]

From d8768ca6a736699e67e85e395b0b6e8058704456 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 18 Mar 2021 18:34:38 -0700
Subject: [2.35] [PATCH] DWARF: Check version >= 3 for DW_FORM_ref_addr

Check version >= 3, instead of version == 3 || version == 4, for
DW_FORM_ref_addr.

bfd/

	PR ld/27587
	* dwarf2.c (read_attribute_value): Check version >= 3 for
	DW_FORM_ref_addr.

(cherry picked from commit 51f6e7a9f4210aed0f8156c1d2e348de6f96f37d)
---
 bfd/ChangeLog | 6 ++++++
 bfd/dwarf2.c  | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 13d36704607..2ef920052cd 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2021-03-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/27587
+	* dwarf2.c (read_attribute_value): Check version >= 3 for
+	DW_FORM_ref_addr.
+
 2021-01-30  Nick Clifton  <nickc@redhat.com>
 
 	* development.sh (development): Set to true.
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 767e9731199..c7561cdeeec 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -1182,7 +1182,7 @@ read_attribute_value (struct attribute *  attr,
     case DW_FORM_ref_addr:
       /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
 	 DWARF3.  */
-      if (unit->version == 3 || unit->version == 4)
+      if (unit->version >= 3)
 	{
 	  if (unit->offset_size == 4)
 	    attr->u.val = read_4_bytes (unit->abfd, info_ptr, info_ptr_end);
-- 
2.30.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-03-22 17:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-18  4:25 [PATCH] DWARF: Skip if abbrev number isn't found for for DWARF5 H.J. Lu
2021-03-18  6:14 ` Alan Modra
2021-03-18 13:14   ` [PATCH v2] DWARF: Check version >= 3 for DW_FORM_ref_addr H.J. Lu
2021-03-19  1:32     ` Alan Modra
2021-03-22 13:22       ` H.J. Lu
2021-03-22 17:08         ` [2.35] [PATCH] " H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).