Blob Blame History Raw
X-Git-Url: https://sourceware.org/git/?p=dwz.git;a=blobdiff_plain;f=dwz.c;h=9e39824d0f1fec950c811357c62e6a0caa1880d7;hp=6f34a0c7f84d00aa74750ea7d60c882967d252c0;hb=4a89e2c78e57b1b05ff71a8e32b2219e02d30425;hpb=815ac613209fa8cbcdda57302a0a1ab0366923ad

diff --git a/dwz.c b/dwz.c
index 6f34a0c..9e39824 100644
--- a/dwz.c
+++ b/dwz.c
@@ -2357,10 +2357,33 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die)
 		}
 	      if (unlikely (op_multifile) && ref->die_collapsed_child)
 		ref = ref->die_parent;
-	      assert (((!op_multifile && !rd_multifile && !fi_multifile)
-		       || cu != die_cu (ref))
-		      && (!op_multifile
-			  || cu->cu_chunk == die_cu (ref)->cu_chunk));
+	      if (cu == die_cu (ref))
+		{
+		  /* The reference was encoded using a section-relative
+		     encoding, while if it could have been encoded using
+		     CU-relative encoding.  Typically, the latter is used,
+		     because:
+		     - it's potentially smaller, and
+		     - it doesn't require a link-time relocation.  */
+
+		  /* Assert that the multifile only contains section-relative
+		     encoding when necessary.  */
+		  assert (!op_multifile && !rd_multifile);
+
+		  if (fi_multifile)
+		    {
+		      /* It's possible that the input DWARF contains this
+			 sub-optimal reference.  We currently don't optimize
+			 this during single-file optimization, so it will still
+			 be there during finalize_multifile.  Bail out to handle
+			 this conservatively.  */
+		      die->die_ck_state = CK_BAD;
+		      return 0;
+		    }
+		}
+	      /* Assert that during op_multifile, die belongs to the same object
+		 as ref.  */
+	      assert (!op_multifile || cu->cu_chunk == die_cu (ref)->cu_chunk);
 	      handled = true;
 	      break;
 	    }