This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Change in .ld syntax or a bug?


On Fri, Sep 16, 2005 at 09:32:39AM +0200, Andrew Lunn wrote:
> On Fri, Sep 16, 2005 at 11:56:47AM +0930, Alan Modra wrote:
> > On Thu, Sep 15, 2005 at 03:33:22PM +0200, Andrew Lunn wrote:
> > > So it looks like ld cannot correctly follow on from an empty section.
> > 
> > Would you mind checking whether mainline CVS has this bug?  If you find
> > it does, I'll see about fixing the problem.
> 
> I just tried anoncvs trunk and it has the same problem.

Please let me know whether this cures the problem.

	* ldlang.c (lang_size_sections_1): Process addr_tree earlier,
	so that unused output section statements affect dot.

Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.195
diff -u -p -r1.195 ldlang.c
--- ld/ldlang.c	4 Aug 2005 06:22:12 -0000	1.195
+++ ld/ldlang.c	19 Sep 2005 02:36:44 -0000
@@ -3973,10 +3973,30 @@ lang_size_sections_1
 	    bfd_vma newdot, after;
 	    lang_output_section_statement_type *os;
 
+	    newdot = dot;
 	    os = &s->output_section_statement;
+	    if (os->addr_tree != NULL)
+	      {
+		os->processed = -1;
+		exp_fold_tree (os->addr_tree, bfd_abs_section_ptr,
+			       &newdot);
+		os->processed = 0;
+
+		if (!expld.result.valid_p
+		    && expld.phase != lang_mark_phase_enum)
+		  einfo (_("%F%S: non constant or forward reference"
+			   " address expression for section %s\n"),
+			 os->name);
+
+		newdot = expld.result.value + expld.result.section->vma;
+	      }
+
 	    if (os->bfd_section == NULL)
-	      /* This section was removed or never actually created.  */
-	      break;
+	      {
+		/* This section was removed or never actually created.  */
+		dot = newdot;
+		break;
+	      }
 
 	    /* If this is a COFF shared library section, use the size and
 	       address from the input section.  FIXME: This is COFF
@@ -4074,22 +4094,6 @@ lang_size_sections_1
 				 os->name, (unsigned long) (newdot - savedot));
 		      }
 		  }
-		else
-		  {
-		    newdot = dot;
-		    os->processed = -1;
-		    exp_fold_tree (os->addr_tree, bfd_abs_section_ptr,
-				   &newdot);
-		    os->processed = 0;
-
-		    if (!expld.result.valid_p
-			&& expld.phase != lang_mark_phase_enum)
-		      einfo (_("%F%S: non constant or forward reference"
-			       " address expression for section %s\n"),
-			     os->name);
-
-		    newdot = expld.result.value + expld.result.section->vma;
-		  }
 
 		/* The section starts here.
 		   First, align to what the section needs.  */

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]