This is the mail archive of the binutils@sourceware.cygnus.com 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]

[PATCH] linker BLOCK/ALIGN/LMA memory region functions


This patch adds the following functions to the linker:

1) Blocking: a weak sort of alignment.  Insist that a section fit within
the blocking size, or be aligned to the blocking size if it doesn't.
2) Alignment into a memory region.  Allow specification of an alignment
boundary for a section output into a memory region.
NOTE: reviewing the docs, it looks like NEXT(EXP) may already do this.
Please comment if you're familiar with this area.  If NEXT(EXP) does the
same job, this section would be removed.
3) Load-time memory regions.  Allow linking into a load-time memory
region instead of a specific load-time address.

* ld/ld.h: Add BLOCK_N macro for setting a blocking address.
* ld/ld.texinfo: Add documentation for new linker script commands.
* ld/ldexp.c (exp_fold_tree): Handle BLOCK expression type.
* ld/ldgram.y: Add handling of new tokens.
* ld/ldlang.c (lang_output_section_statement_lookup): Make use of LMA
region, if available.
  (os_region_check): New function to verify an output section fits
within a region.
  (lang_size_sectiosn): Apply section blocking instead of ALIGN_N no-op.
Use
   os_region-check on vma and lma regions.
  (lang_leave_output_section_statement): Handle align and blocking
parameters.
  (lang_leave_overlay_section): Ditto.
  (lang_leav_overlay): Ditto.
* ld/ldlang.h: Add lma_region and new prototypes.
* ld/mri.c (mri_draw_tree): Add extra align/block parameters.
* ld/emultempl/armelf.em, elf32.em, pe.em: Add default values for new
align/block parameters to
  lang_leave_output_section_statement() calls.






Index: ld.h
===================================================================
RCS file: /cvs/src/src/ld/ld.h,v
retrieving revision 1.3
diff -d -c -p -r1.3 ld.h
*** ld.h	2000/01/05 14:12:23	1.3
--- ld.h	2000/02/09 15:49:59
*************** typedef struct  user_section_struct
*** 96,101 ****
--- 96,107 ----
  #define ALIGN_N(this, boundary) \
    ((( (this) + ((boundary) -1)) & (~((boundary)-1))))
  
+ /* align only if the start and end addresses fail to fall within the blocking
+    value */
+ #define BLOCK_N(start, len, blocking) \
+ (((((start)+(len)) & ~((blocking)-1)) == ((start) & ~((blocking)-1))) ? \
+  (start) : ALIGN_N(start, blocking))
+ 
  typedef struct
  {
    /* 1 => assign space to common symbols even if `relocatable_output'.  */
Index: ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.10
diff -d -c -p -r1.10 ld.texinfo
*** ld.texinfo	2000/01/07 19:46:04	1.10
--- ld.texinfo	2000/02/09 15:50:00
*************** The full description of an output sectio
*** 2127,2133 ****
      @var{output-section-command}
      @var{output-section-command}
      @dots{}
!   @} [>@var{region}] [:@var{phdr} :@var{phdr} @dots{}] [=@var{fillexp}]
  @end group
  @end smallexample
  
--- 2127,2133 ----
      @var{output-section-command}
      @var{output-section-command}
      @dots{}
!   @} [>@var{region}] [AT>@var{lma_region}] [:@var{phdr} :@var{phdr} @dots{}] [=@var{fillexp}] [ALIGN(@var{align})] [FIT(@var{block})]
  @end group
  @end smallexample
  
*************** set to precisely that.  If you provide n
*** 2183,2189 ****
  current value of the location counter aligned to the alignment
  requirements of the output section.  The alignment requirement of the
  output section is the strictest alignment of any input section contained
! within the output section.
  
  For example,
  @smallexample
--- 2183,2190 ----
  current value of the location counter aligned to the alignment
  requirements of the output section.  The alignment requirement of the
  output section is the strictest alignment of any input section contained
! within the output section.  The section alignment may also be set with
! @var{align}.  
  
  For example,
  @smallexample
*************** like this:
*** 2632,2638 ****
      @var{output-section-command}
      @var{output-section-command}
      @dots{}
!   @} [>@var{region}] [:@var{phdr} :@var{phdr} @dots{}] [=@var{fillexp}]
  @end group
  @end smallexample
  We've already described @var{section}, @var{address}, and
--- 2633,2639 ----
      @var{output-section-command}
      @var{output-section-command}
      @dots{}
!   @} [>@var{region}] [AT>@var{lma_region}] [:@var{phdr} :@var{phdr} @dots{}] [=@var{fillexp}] [ALIGN(@var{align})] [BLOCK(@var{block})]
  @end group
  @end smallexample
  We've already described @var{section}, @var{address}, and
*************** remaining section attributes.
*** 2645,2650 ****
--- 2646,2653 ----
  * Output Section Region::	Output section region
  * Output Section Phdr::		Output section phdr
  * Output Section Fill::		Output section fill
+ * Output Section Alignment::    Output section alignment
+ * Output Section Blocking::     Output section blocking
  @end menu
  
  @node Output Section Type
*************** SECTIONS @{
*** 2686,2691 ****
--- 2689,2695 ----
  
  @node Output Section LMA
  @subsubsection Output section LMA
+ @kindex AT>@var{lma_region}
  @kindex AT(@var{lma})
  @cindex load address
  @cindex section load address
*************** Address}).
*** 2696,2702 ****
  
  The linker will normally set the LMA equal to the VMA.  You can change
  that by using the @code{AT} keyword.  The expression @var{lma} that
! follows the @code{AT} keyword specifies the load address of the section.
  
  @cindex ROM initialized data
  @cindex initialized data in ROM
--- 2700,2708 ----
  
  The linker will normally set the LMA equal to the VMA.  You can change
  that by using the @code{AT} keyword.  The expression @var{lma} that
! follows the @code{AT} keyword specifies the load address of the
! section.  Alternatively, with @samp{AT>@var{lma_region}} expression,
! you may specify a memory region for the section's load address. @xref{MEMORY}.
  
  @cindex ROM initialized data
  @cindex initialized data in ROM
*************** Here is a simple example:
*** 2803,2808 ****
--- 2809,2830 ----
  SECTIONS @{ .text : @{ *(.text) @} =0x9090 @}
  @end group
  @end smallexample
+ 
+ @node Output Section Alignment
+ @subsubsection Output section alignment
+ @kindex ALIGN(@var{exp})
+ @cindex aligment, output section
+ You can set the alignment of the output section here.  The alignment
+ value is in bytes and should be a power of two.
+ 
+ @node Output Section Blocking
+ @subsubsection Output section blocking
+ @kindex BLOCK(@var{exp})
+ @cindex blocking, output section
+ The blocking value indicates that the section, if smaller than the
+ blocking value, should not cross a blocking boundary, or, if larger than
+ the blocking value, should be aligned at a block boundary.  The blocking
+ value is in bytes and should be a power of two.
  
  @node Overlay Description
  @subsection Overlay description
Index: ldexp.c
===================================================================
RCS file: /cvs/src/src/ld/ldexp.c,v
retrieving revision 1.3
diff -d -c -p -r1.3 ldexp.c
*** ldexp.c	2000/02/03 18:24:46	1.3
--- ldexp.c	2000/02/09 15:50:01
*************** exp_fold_tree (tree, current_section, al
*** 526,531 ****
--- 526,535 ----
  	{
  	  switch (tree->type.node_code) 
  	    {
+             case BLOCK:
+               /* simply record the requested value for later processing */
+               current_section->block_value = result.value;
+               break;
  	    case ALIGN_K:
  	      if (allocation_done != lang_first_phase_enum)
  		result = new_rel_from_section (ALIGN_N (dot, result.value),
Index: ldgram.y
===================================================================
RCS file: /cvs/src/src/ld/ldgram.y,v
retrieving revision 1.3
diff -d -c -p -r1.3 ldgram.y
*** ldgram.y	2000/01/05 14:12:23	1.3
--- ldgram.y	2000/02/09 15:50:01
*************** static int error_index;
*** 92,97 ****
--- 92,99 ----
  %type <integer> fill_opt
  %type <name_list> exclude_name_list
  %type <name> memspec_opt casesymlist
+ %type <name> memspec_at_opt
+ %type <etree> align_opt block_opt
  %type <cname> wildcard_name
  %type <wildcard> wildcard_spec
  %token <integer> INT  
*************** exp	:
*** 799,804 ****
--- 801,821 ----
  	;
  
  
+ align_opt:
+                 /* empty */ { $$ = (etree_type *)NULL; }
+         |       ALIGN_K '(' exp ')' { $$ = exp_unop(ALIGN_K,$3); }
+         ;
+ 
+ block_opt:
+                 /* empty */ { $$ = (etree_type *)NULL; }
+         |       BLOCK '(' exp ')' { $$ = exp_unop(BLOCK,$3); }
+         ;
+ 
+ memspec_at_opt:
+                 AT '>' NAME { $$ = $3; }
+         |       { $$ = "*default*"; }
+         ;
+ 
  opt_at:
  		AT '(' exp ')' { $$ = $3; }
  	|	{ $$ = 0; }
*************** section:	NAME 		{ ldlex_expression(); }
*** 815,824 ****
  			}
  		statement_list_opt 	
   		'}' { ldlex_popstate (); ldlex_expression (); }
! 		memspec_opt phdr_opt fill_opt
  		{
  		  ldlex_popstate ();
! 		  lang_leave_output_section_statement ($13, $11, $12);
  		}
  		opt_comma
  	|	OVERLAY
--- 832,843 ----
  			}
  		statement_list_opt 	
   		'}' { ldlex_popstate (); ldlex_expression (); }
! 		memspec_opt memspec_at_opt phdr_opt fill_opt
!                 align_opt block_opt
  		{
  		  ldlex_popstate ();
! 		  lang_leave_output_section_statement ($14, $11, $13, $12,
!                                                        $15, $16);
  		}
  		opt_comma
  	|	OVERLAY
*************** section:	NAME 		{ ldlex_expression(); }
*** 832,841 ****
  		overlay_section
  		'}'
  			{ ldlex_popstate (); ldlex_expression (); }
! 		memspec_opt phdr_opt fill_opt
  			{
  			  ldlex_popstate ();
! 			  lang_leave_overlay ($14, $12, $13);
  			}
  		opt_comma
  	|	/* The GROUP case is just enough to support the gcc
--- 851,861 ----
  		overlay_section
  		'}'
  			{ ldlex_popstate (); ldlex_expression (); }
! 		memspec_opt memspec_at_opt phdr_opt fill_opt
!                 align_opt block_opt
  			{
  			  ldlex_popstate ();
! 			  lang_leave_overlay ($15, $12, $14, $13, $16, $17);
  			}
  		opt_comma
  	|	/* The GROUP case is just enough to support the gcc
Index: ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.22
diff -d -c -p -r1.22 ldlang.c
*** ldlang.c	2000/02/09 14:42:48	1.22
--- ldlang.c	2000/02/09 15:50:01
*************** lang_output_section_statement_lookup (na
*** 682,687 ****
--- 682,688 ----
        lookup = (lang_output_section_statement_type *)
  	new_stat (lang_output_section_statement, stat_ptr);
        lookup->region = (lang_memory_region_type *) NULL;
+       lookup->lma_region = (lang_memory_region_type *) NULL;
        lookup->fill = 0;
        lookup->block_value = 1;
        lookup->name = name;
*************** _("%X%P: section %s [%V -> %V] overlaps 
*** 2695,2700 ****
--- 2696,2732 ----
  
  static boolean relax_again;
  
+ static void
+ os_region_check (os, region, tree)
+   lang_output_section_statement_type *os;
+   struct memory_region_struct *region;
+   etree_type *tree;
+ {
+   if (os->region->current < os->region->origin
+       || (os->region->current - os->region->origin
+           > os->region->length))
+     {
+       if (tree != (etree_type *) NULL)
+         {
+           einfo (_("%X%P: address 0x%v of %B section %s is not within "
+                    "region %s\n"),
+                  os->region->current,
+                  os->bfd_section->owner,
+                  os->bfd_section->name,
+                  os->region->name);
+         }
+       else
+         {
+           einfo (_("%X%P: region %s is full (%B section %s)\n"),
+                  os->region->name,
+                  os->bfd_section->owner,
+                  os->bfd_section->name);
+         }
+       /* Reset the region pointer.  */
+       os->region->current = os->region->origin;
+     }
+ }
+ 
  /* Set the sizes for all the output sections.  */
  
  bfd_vma
*************** lang_size_sections (s, output_section_st
*** 2822,2839 ****
  	    (void) lang_size_sections (os->children.head, os, &os->children.head,
  				       os->fill, dot, relax);
  	    
              /* put the section within the requested block size, or align at
                 the block boundary */
! 	    after = ALIGN_N (os->bfd_section->vma
! 			     + os->bfd_section->_raw_size / opb,
  			     /* The coercion here is important, see ld.h.  */
  			     (bfd_vma) os->block_value);
  
  	    if (bfd_is_abs_section (os->bfd_section))
  	      ASSERT (after == os->bfd_section->vma);
  	    else
! 	      os->bfd_section->_raw_size = 
!                 (after - os->bfd_section->vma) * opb;
  	    dot = os->bfd_section->vma + os->bfd_section->_raw_size / opb;
  	    os->processed = true;
  
--- 2854,2882 ----
  	    (void) lang_size_sections (os->children.head, os, &os->children.head,
  				       os->fill, dot, relax);
  	    
+             /* This used to be ALIGN_N, and os->block_value was always
+                set to one, which resolved to a no-op.  I've changed this to do
+                blocking instead. */ 
              /* put the section within the requested block size, or align at
                 the block boundary */
! 	    after = BLOCK_N (os->bfd_section->vma,
! 			     os->bfd_section->_raw_size / opb,
  			     /* The coercion here is important, see ld.h.  */
  			     (bfd_vma) os->block_value);
  
  	    if (bfd_is_abs_section (os->bfd_section))
  	      ASSERT (after == os->bfd_section->vma);
  	    else
!               {
!                 if (after != os->bfd_section->vma 
!                     && config.warn_section_align)
!                   einfo (_("%P: warning: blocking changed start of section %s "
!                            "by %u bytes\n"), os->name, 
!                            (unsigned) (after - os->bfd_section->vma));
!                   
!                 bfd_set_section_vma (0, os->bfd_section, after);
!               }
! 
  	    dot = os->bfd_section->vma + os->bfd_section->_raw_size / opb;
  	    os->processed = true;
  
*************** lang_size_sections (s, output_section_st
*** 2853,2889 ****
  	      {
  		os->region->current = dot;
  		
! 		/* Make sure the new address is within the region.  We
!                    explicitly permit the current address to be at the
!                    exact end of the region when the VMA is non-zero,
!                    in case the region is at the end of addressable
!                    memory and the calculation wraps around.  */
! 		if ((os->region->current < os->region->origin
! 		     || (os->region->current - os->region->origin
! 			 > os->region->length))
! 		    && ((os->region->current
! 			 != os->region->origin + os->region->length)
! 			|| os->bfd_section->vma == 0))
  
! 		  {
! 		    if (os->addr_tree != (etree_type *) NULL)
! 		      {
! 			einfo (_("%X%P: address 0x%v of %B section %s is not within region %s\n"),
! 			       os->region->current,
! 			       os->bfd_section->owner,
! 			       os->bfd_section->name,
! 			       os->region->name);
! 		      }
! 		    else
! 		      {
! 			einfo (_("%X%P: region %s is full (%B section %s)\n"),
! 			       os->region->name,
! 			       os->bfd_section->owner,
! 			       os->bfd_section->name);
! 		      }
! 		    /* Reset the region pointer.  */
! 		    os->region->current = os->region->origin;
! 		  }
  	      }
  	  }
  	  break;
--- 2896,2929 ----
  	      {
  		os->region->current = dot;
  		
! 		/* Make sure this isn't silly.  */
!                 os_region_check (os, os->region, os->addr_tree);
  
!                 /* if there's no load address specified, use the run region as
!                    the load region */
!                 if (os->lma_region == NULL && os->load_base == NULL)
!                     os->lma_region = os->region;
! 
!                 if (os->lma_region != NULL)
!                   {
!                     if (os->load_base != NULL)
!                       {
!                         einfo (_("%X%P: use an absolute load address "
!                                  "or a load memory region, not both\n"));
!                       }
!                     else
!                       {
!                         /* don't allocate twice */
!                         if (os->lma_region != os->region)
!                           {
!                             /* set load_base, which will be handled later */
!                             os->load_base = exp_intop (os->lma_region->current);
!                             os->lma_region->current += 
!                               os->bfd_section->_raw_size / opb;
!                             os_region_check (os, os->lma_region, NULL);
!                           }
!                       }
!                   }
  	      }
  	  }
  	  break;
*************** lang_float (maybe)
*** 4259,4273 ****
  }
  
  void
! lang_leave_output_section_statement (fill, memspec, phdrs)
       bfd_vma fill;
       const char *memspec;
       struct lang_output_section_phdr_list *phdrs;
  {
    current_section->fill = fill;
    current_section->region = lang_memory_region_lookup (memspec);
    current_section->phdrs = phdrs;
    stat_ptr = &statement_list;
  }
  
  /*
--- 4299,4345 ----
  }
  
  void
! lang_leave_output_section_statement (fill, memspec, phdrs, lma_memspec, 
!                                      align, block)
       bfd_vma fill;
       const char *memspec;
       struct lang_output_section_phdr_list *phdrs;
+      const char *lma_memspec;
+      etree_type *align;
+      etree_type *block;
  {
    current_section->fill = fill;
    current_section->region = lang_memory_region_lookup (memspec);
+   if (strcmp (lma_memspec, "*default*") != 0)
+     {
+       current_section->lma_region = lang_memory_region_lookup (lma_memspec);
+       /* if no runtime region has been given, but the load region has been,
+          use the load region */
+       if (strcmp (memspec, "*default*") == 0)
+         current_section->region = lang_memory_region_lookup (lma_memspec);
+     }
    current_section->phdrs = phdrs;
    stat_ptr = &statement_list;
+   if (align != NULL)
+     {
+       etree_value_type r;
+       bfd_vma dummy_dot = 0;
+       r = exp_fold_tree (align, abs_output_section,
+                          lang_allocating_phase_enum, dummy_dot, &dummy_dot);
+       if (r.valid_p == false)
+         einfo (_("%F%S: invalid expression for ALIGN\n"));
+       current_section->section_alignment = r.value;
+     }
+   if (block != NULL)
+     {
+       etree_value_type r;
+       bfd_vma dummy_dot = 0;
+       r = exp_fold_tree (block, abs_output_section,
+                          lang_allocating_phase_enum, dummy_dot, &dummy_dot);
+       if (r.valid_p == false)
+         einfo (_("%F%S: invalid expression for BLOCK\n"));
+       current_section->block_value = r.value;
+     }
  }
  
  /*
*************** lang_leave_overlay_section (fill, phdrs)
*** 4644,4650 ****
  
    name = current_section->name;
  
!   lang_leave_output_section_statement (fill, "*default*", phdrs);
  
    /* Define the magic symbols.  */
  
--- 4716,4724 ----
  
    name = current_section->name;
  
!   lang_leave_output_section_statement (fill, "*default*", 
!                                        phdrs, "*default*", 
!                                        (etree_type *)NULL, (etree_type *)NULL);
  
    /* Define the magic symbols.  */
  
*************** lang_leave_overlay_section (fill, phdrs)
*** 4674,4693 ****
     looks through all the sections in the overlay and sets them.  */
  
  void
! lang_leave_overlay (fill, memspec, phdrs)
       bfd_vma fill;
       const char *memspec;
       struct lang_output_section_phdr_list *phdrs;
  {
    lang_memory_region_type *region;
    struct overlay_list *l;
    struct lang_nocrossref *nocrossref;
  
    if (memspec == NULL)
      region = NULL;
    else
      region = lang_memory_region_lookup (memspec);
  
    nocrossref = NULL;
  
    l = overlay_list;
--- 4748,4799 ----
     looks through all the sections in the overlay and sets them.  */
  
  void
! lang_leave_overlay (fill, memspec, phdrs, lma_memspec, align, block)
       bfd_vma fill;
       const char *memspec;
       struct lang_output_section_phdr_list *phdrs;
+      const char *lma_memspec;
+      etree_type *align;
+      etree_type *block;
  {
    lang_memory_region_type *region;
+   lang_memory_region_type *lma_region;
    struct overlay_list *l;
    struct lang_nocrossref *nocrossref;
+   int align_value = -1;
+   int block_value = 1;
  
    if (memspec == NULL)
      region = NULL;
    else
      region = lang_memory_region_lookup (memspec);
  
+   if (lma_memspec == NULL)
+     lma_region = NULL;
+   else
+     lma_region = lang_memory_region_lookup (lma_memspec);
+ 
+   if (align != NULL)
+     {
+       etree_value_type r;
+       bfd_vma dummy_dot = 0;
+       r = exp_fold_tree (align, abs_output_section,
+                          lang_allocating_phase_enum, dummy_dot, &dummy_dot);
+       if (r.valid_p == false)
+         einfo (_("%F%S: invalid expression for ALIGN\n"));
+       align_value = r.value;
+     }
+   if (block != NULL)
+     {
+       etree_value_type r;
+       bfd_vma dummy_dot = 0;
+       r = exp_fold_tree (block, abs_output_section,
+                          lang_allocating_phase_enum, dummy_dot, &dummy_dot);
+       if (r.valid_p == false)
+         einfo (_("%F%S: invalid expression for BLOCK\n"));
+       block_value = r.value;
+     }
+ 
    nocrossref = NULL;
  
    l = overlay_list;
*************** lang_leave_overlay (fill, memspec, phdrs
*** 4699,4706 ****
--- 4805,4817 ----
  	l->os->fill = fill;
        if (region != NULL && l->os->region == NULL)
  	l->os->region = region;
+       if (lma_region != NULL && l->os->lma_region == NULL)
+         l->os->lma_region = lma_region;
        if (phdrs != NULL && l->os->phdrs == NULL)
  	l->os->phdrs = phdrs;
+       if (align_value != -1)
+         l->os->section_alignment = align_value;
+       l->os->block_value = block_value;
  
        if (overlay_nocrossrefs)
  	{
Index: ldlang.h
===================================================================
RCS file: /cvs/src/src/ld/ldlang.h,v
retrieving revision 1.3
diff -d -c -p -r1.3 ldlang.h
*** ldlang.h	2000/01/05 14:12:23	1.3
--- ldlang.h	2000/02/09 15:50:01
*************** typedef struct lang_output_section_state
*** 136,141 ****
--- 136,142 ----
    flagword flags;		/* Or together of all input sections */
    enum section_type sectype;
    struct memory_region_struct *region;
+   struct memory_region_struct *lma_region;
    size_t block_value;
    fill_type fill;
  
*************** extern void lang_add_attribute PARAMS ((
*** 409,415 ****
  extern void lang_startup PARAMS ((const char *));
  extern void lang_float PARAMS ((enum bfd_boolean));
  extern void lang_leave_output_section_statement
!   PARAMS ((bfd_vma, const char *, struct lang_output_section_phdr_list *));
  extern void lang_abs_symbol_at_end_of PARAMS ((const char *, const char *));
  extern void lang_abs_symbol_at_beginning_of PARAMS ((const char *,
  						     const char *));
--- 410,417 ----
  extern void lang_startup PARAMS ((const char *));
  extern void lang_float PARAMS ((enum bfd_boolean));
  extern void lang_leave_output_section_statement
!   PARAMS ((bfd_vma, const char *, struct lang_output_section_phdr_list *,
!            const char *, etree_type *, etree_type *));
  extern void lang_abs_symbol_at_end_of PARAMS ((const char *, const char *));
  extern void lang_abs_symbol_at_beginning_of PARAMS ((const char *,
  						     const char *));
*************** extern void lang_enter_overlay_section P
*** 475,481 ****
  extern void lang_leave_overlay_section
    PARAMS ((bfd_vma, struct lang_output_section_phdr_list *));
  extern void lang_leave_overlay
!   PARAMS ((bfd_vma, const char *, struct lang_output_section_phdr_list *));
  
  extern struct bfd_elf_version_tree *lang_elf_version_info;
  
--- 477,484 ----
  extern void lang_leave_overlay_section
    PARAMS ((bfd_vma, struct lang_output_section_phdr_list *));
  extern void lang_leave_overlay
!   PARAMS ((bfd_vma, const char *, struct lang_output_section_phdr_list *,
!            const char *, etree_type *, etree_type *));
  
  extern struct bfd_elf_version_tree *lang_elf_version_info;
  
Index: mri.c
===================================================================
RCS file: /cvs/src/src/ld/mri.c,v
retrieving revision 1.1.1.1
diff -d -c -p -r1.1.1.1 mri.c
*** mri.c	1999/05/03 07:29:07	1.1.1.1
--- mri.c	2000/02/09 15:50:01
*************** mri_draw_tree ()
*** 266,272 ****
        }
  
        lang_leave_output_section_statement
! 	(0, "*default*", (struct lang_output_section_phdr_list *) NULL);
  
        p = p->next;
      }
--- 266,273 ----
        }
  
        lang_leave_output_section_statement
! 	(0, "*default*", (struct lang_output_section_phdr_list *) NULL, 
!          "*default*", (etree_type *)NULL, (etree_type *)NULL);
  
        p = p->next;
      }
Index: emultempl/armelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/armelf.em,v
retrieving revision 1.12
diff -d -c -p -r1.12 armelf.em
*** armelf.em	2000/01/22 23:22:17	1.12
--- armelf.em	2000/02/09 15:50:02
*************** gld${EMULATION_NAME}_place_orphan (file,
*** 942,948 ****
    wild_doit (&os->children, s, os, file);
  
    lang_leave_output_section_statement
!     ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL);
    stat_ptr = &add;
  
    if (*ps == '\0' && config.build_constructors)
--- 942,949 ----
    wild_doit (&os->children, s, os, file);
  
    lang_leave_output_section_statement
!     ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL,
!      "*default*", (etree_type *)NULL, (etree_type *)NULL);
    stat_ptr = &add;
  
    if (*ps == '\0' && config.build_constructors)
Index: emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.10
diff -d -c -p -r1.10 elf32.em
*** elf32.em	1999/11/04 06:45:07	1.10
--- elf32.em	2000/02/09 15:50:02
*************** gld${EMULATION_NAME}_place_orphan (file,
*** 1024,1030 ****
    wild_doit (&os->children, s, os, file);
  
    lang_leave_output_section_statement
!     ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL);
    stat_ptr = &add;
  
    if (*ps == '\0' && config.build_constructors)
--- 1024,1031 ----
    wild_doit (&os->children, s, os, file);
  
    lang_leave_output_section_statement
!     ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL,
!      "*default*", (etree_type *)NULL, (etree_type *)NULL);
    stat_ptr = &add;
  
    if (*ps == '\0' && config.build_constructors)
Index: emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.17
diff -d -c -p -r1.17 pe.em
*** pe.em	2000/01/04 23:48:31	1.17
--- pe.em	2000/02/09 15:50:02
*************** gld_${EMULATION_NAME}_place_orphan (file
*** 1146,1152 ****
  
        lang_leave_output_section_statement
  	((bfd_vma) 0, "*default*",
! 	 (struct lang_output_section_phdr_list *) NULL);
  
        /* Now stick the new statement list right after PLACE.  */
        if (place != NULL)
--- 1146,1153 ----
  
        lang_leave_output_section_statement
  	((bfd_vma) 0, "*default*",
! 	 (struct lang_output_section_phdr_list *) NULL,
! 	"*default*", (etree_type *)NULL, (etree_type *)NULL);
  
        /* Now stick the new statement list right after PLACE.  */
        if (place != NULL)

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