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]

[vms/committed] Create an absolute section if needed


Hi,

unlike most other object formats, absolute section must be explicitly declared.  This patch makes sure
that an absolute section exists if one is referenced.

Tristan.

bfd/
2010-06-25  Tristan Gingold  <gingold@adacore.com>

	* vms-alpha.c (_bfd_vms_write_egsd): Check absolute section with
	its flags.  Create an absolute section if needed.


Index: vms-alpha.c
===================================================================
RCS file: /cvs/src/src/bfd/vms-alpha.c,v
retrieving revision 1.27
diff -c -r1.27 vms-alpha.c
*** vms-alpha.c	25 Jun 2010 15:21:48 -0000	1.27
--- vms-alpha.c	25 Jun 2010 15:35:27 -0000
***************
*** 3281,3287 ****
    unsigned int symnum;
    const char *sname;
    flagword new_flags, old_flags;
!   int abs_section_index = 0;
    unsigned int target_index = 0;
    struct vms_rec_wr *recwr = &PRIV (recwr);
  
--- 3281,3287 ----
    unsigned int symnum;
    const char *sname;
    flagword new_flags, old_flags;
!   int abs_section_index = -1;
    unsigned int target_index = 0;
    struct vms_rec_wr *recwr = &PRIV (recwr);
  
***************
*** 3344,3353 ****
  	  else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
  	    sname = EVAX_LITERAL_NAME;
  	  else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
! 	    {
! 	      sname = EVAX_LITERALS_NAME;
! 	      abs_section_index = section->target_index;
! 	    }
  	  else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
  	    sname = EVAX_COMMON_NAME;
  	  else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
--- 3344,3350 ----
  	  else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
  	    sname = EVAX_LITERAL_NAME;
  	  else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
!             sname = EVAX_LITERALS_NAME;
  	  else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
  	    sname = EVAX_COMMON_NAME;
  	  else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
***************
*** 3356,3364 ****
        else
  	sname = _bfd_vms_length_hash_symbol (abfd, sname, EOBJ__C_SECSIZ);
  
-       _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
-       _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
- 
        if (bfd_is_com_section (section))
  	new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
  		     | EGPS__V_WRT | EGPS__V_NOMOD | EGPS__V_COM);
--- 3353,3358 ----
***************
*** 3377,3386 ****
--- 3371,3387 ----
        vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
                     new_flags, (unsigned long)section->size));
  
+       _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
+       _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
        _bfd_vms_output_short (recwr, new_flags);
        _bfd_vms_output_long (recwr, (unsigned long) section->size);
        _bfd_vms_output_counted (recwr, sname);
        _bfd_vms_output_end_subrec (recwr);
+ 
+       /* If the section is an obsolute one, remind its index as it will be
+          used later for absolute symbols.  */
+       if ((new_flags & EGPS__V_REL) == 0 && abs_section_index < 0)
+         abs_section_index = section->target_index;
      }
  
    /* Output symbols.  */
***************
*** 3395,3401 ****
        symbol = abfd->outsymbols[symnum];
        old_flags = symbol->flags;
  
!       /* Work-around a missing feature:  consider __main as the main entry point.  */
        if (*(symbol->name) == '_')
  	{
  	  if (strcmp (symbol->name, "__main") == 0)
--- 3396,3403 ----
        symbol = abfd->outsymbols[symnum];
        old_flags = symbol->flags;
  
!       /* Work-around a missing feature:  consider __main as the main entry
!          point.  */
        if (*(symbol->name) == '_')
  	{
  	  if (strcmp (symbol->name, "__main") == 0)
***************
*** 3416,3429 ****
              continue;
          }
  
!       /* 13 bytes egsd, max 64 chars name -> should be 77 bytes.  */
!       if (_bfd_vms_output_check (recwr, 80) < 0)
  	{
  	  _bfd_vms_output_end (abfd, recwr);
  	  _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
  	  _bfd_vms_output_long (recwr, 0);
  	}
  
        _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
  
        /* Data type, alignment.  */
--- 3418,3449 ----
              continue;
          }
  
!       /* 13 bytes egsd, max 64 chars name -> should be 77 bytes.  Add 16 more
!          bytes for a possible ABS section.  */
!       if (_bfd_vms_output_check (recwr, 80 + 16) < 0)
  	{
  	  _bfd_vms_output_end (abfd, recwr);
  	  _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
  	  _bfd_vms_output_long (recwr, 0);
  	}
  
+       if ((old_flags & BSF_GLOBAL) != 0
+           && bfd_is_abs_section (symbol->section)
+           && abs_section_index <= 0)
+         {
+           /* Create an absolute section if none was defined.  It is highly
+              unlikely that the name $ABS$ clashes with a user defined
+              non-absolute section name.  */
+           _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
+           _bfd_vms_output_short (recwr, 4);
+           _bfd_vms_output_short (recwr, EGPS__V_SHR);
+           _bfd_vms_output_long (recwr, 0);
+           _bfd_vms_output_counted (recwr, "$ABS$");
+           _bfd_vms_output_end_subrec (recwr);
+ 
+           abs_section_index = target_index++;
+         }
+ 
        _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
  
        /* Data type, alignment.  */


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