mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			27 lines
		
	
	
		
			902 B
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
		
			902 B
		
	
	
	
		
			Diff
		
	
	
	
	
	
See http://sourceware.org/bugzilla/show_bug.cgi?id=13990 for details.
 | 
						|
---
 | 
						|
--- a/bfd/elf32-arm.c
 | 
						|
+++ b/bfd/elf32-arm.c
 | 
						|
@@ -12046,8 +12046,19 @@ elf32_arm_gc_sweep_hook (bfd *
 | 
						|
       if (may_need_local_target_p
 | 
						|
 	  && elf32_arm_get_plt_info (abfd, eh, r_symndx, &root_plt, &arm_plt))
 | 
						|
 	{
 | 
						|
-	  BFD_ASSERT (root_plt->refcount > 0);
 | 
						|
-	  root_plt->refcount -= 1;
 | 
						|
+	  /* If PLT refcount book-keeping is wrong and too low, we'll
 | 
						|
+	     see a zero value (going to -1) for the root PLT reference
 | 
						|
+	     count.  */
 | 
						|
+	  if (root_plt->refcount >= 0)
 | 
						|
+	    {
 | 
						|
+	      BFD_ASSERT (root_plt->refcount != 0);
 | 
						|
+	      root_plt->refcount -= 1;
 | 
						|
+	    }
 | 
						|
+	  else
 | 
						|
+	    /* A value of -1 means the symbol has become local, forced
 | 
						|
+	       or seeing a hidden definition.  Any other negative value
 | 
						|
+	       is an error.  */
 | 
						|
+	    BFD_ASSERT (root_plt->refcount == -1);
 | 
						|
 
 | 
						|
 	  if (!call_reloc_p)
 | 
						|
 	    arm_plt->noncall_refcount--;
 |