bfd/
authorTristan Gingold <gingold@adacore.com>
Tue, 1 Jun 2010 09:52:28 +0000 (09:52 +0000)
committerTristan Gingold <gingold@adacore.com>
Tue, 1 Jun 2010 09:52:28 +0000 (09:52 +0000)
2010-06-01  Tristan Gingold  <gingold@adacore.com>

* vms-alpha.c (struct vms_private_data_struct): Add
transfer_address field.  Remove unused dst_info field.
(alpha_vms_write_exec): Use transfer_address.
(_bfd_vms_write_egsd): Add a comment about LIB$INITIALIZE.
(alpha_vms_bfd_final_link): Set transfer_address.

ld/
2010-06-01  Tristan Gingold  <gingold@adacore.com>

* scripttempl/alphavms.sc: Add comments. Move $LINK$ to the
readonly output-section. Handle LIB$INITIALIZE and sections
created by gcc.
* emultempl/vms.em (vms_place_orphan): Add comments.

bfd/ChangeLog
bfd/vms-alpha.c
ld/ChangeLog
ld/emultempl/vms.em
ld/scripttempl/alphavms.sc

index dec1fe629a526c2a15fafa6534e08d59468e2566..69d1240b7f5c8989104d1cbb5f057a27708a7999 100644 (file)
@@ -1,3 +1,11 @@
+2010-06-01  Tristan Gingold  <gingold@adacore.com>
+
+       * vms-alpha.c (struct vms_private_data_struct): Add
+       transfer_address field.  Remove unused dst_info field.
+       (alpha_vms_write_exec): Use transfer_address.
+       (_bfd_vms_write_egsd): Add a comment about LIB$INITIALIZE.
+       (alpha_vms_bfd_final_link): Set transfer_address.
+
 2010-05-31  Tristan Gingold  <gingold@adacore.com>
 
        * vms-lib.c (credat_lo, credat_hi): New fields.
index e4ca931c97c24ac987d32927f4ba1c1621b07402..d881e2fb3415145cb671ec2d3b038a33943be53d 100644 (file)
@@ -273,6 +273,9 @@ struct vms_private_data_struct
   struct hdr_struct hdr_data;          /* data from HDR/EMH record  */
   struct eom_struct eom_data;          /* data from EOM/EEOM record  */
 
+  /* Transfer addresses (entry points).  */
+  bfd_vma transfer_address[4];
+
   /* Array of GSD sections to get the correspond BFD one.  */
   unsigned int section_max;            /* Size of the sections array.  */
   unsigned int section_count;          /* Number of GSD sections.  */
@@ -301,7 +304,6 @@ struct vms_private_data_struct
 
   struct module *modules;              /* list of all compilation units */
 
-  struct dst_info *dst_info;
   asection *dst_section;
 
   unsigned int dst_ptr_offsets_count;  /* # of offsets in following array  */
@@ -2983,11 +2985,10 @@ alpha_vms_write_exec (bfd *abfd)
 
   bfd_putl32 (sizeof (struct vms_eiha), eiha->size);
   bfd_putl32 (0, eiha->spare);
-  bfd_putl32 (0x00000340, eiha->tfradr1);      /* SYS$IMGACT */
-  bfd_putl32 (0xffffffff, eiha->tfradr1_h);
-  bfd_putl64 (bfd_get_start_address (abfd), eiha->tfradr2);
-  bfd_putl64 (0, eiha->tfradr3);
-  bfd_putl64 (0, eiha->tfradr4);
+  bfd_putl64 (PRIV (transfer_address[0]), eiha->tfradr1);
+  bfd_putl64 (PRIV (transfer_address[1]), eiha->tfradr2);
+  bfd_putl64 (PRIV (transfer_address[2]), eiha->tfradr3);
+  bfd_putl64 (PRIV (transfer_address[3]), eiha->tfradr4);
   bfd_putl64 (0, eiha->inishr);
 
   /* Alloc EIHI.  */
@@ -3389,21 +3390,28 @@ done:
       char *hash;
 
       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)
            bfd_set_start_address (abfd, (bfd_vma)symbol->value);
        }
-      old_flags = symbol->flags;
 
+      /* Only put in the GSD the global and the undefined symbols.  */
       if (old_flags & BSF_FILE)
        continue;
 
-      if ((old_flags & BSF_GLOBAL) == 0                   /* Not xdef...  */
-         && !bfd_is_und_section (symbol->section) /* and not xref... */
-         && !((old_flags & BSF_SECTION_SYM) != 0  /* and not LIB$INITIALIZE.  */
-              && strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
-       continue;
+      if ((old_flags & BSF_GLOBAL) == 0 && !bfd_is_und_section (symbol->section))
+        {
+          /* If the LIB$INITIIALIZE section is present, add a reference to
+             LIB$INITIALIZE symbol.  FIXME: this should be done explicitely
+             in the assembly file.  */
+          if (!((old_flags & BSF_SECTION_SYM) != 0
+                && strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
+            continue;
+        }
 
       /* 13 bytes egsd, max 64 chars name -> should be 77 bytes.  */
       if (_bfd_vms_output_check (recwr, 80) < 0)
@@ -8668,6 +8676,22 @@ alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
         }
     }
 
+  /* Set transfer addresses.  */
+  {
+    int i;
+    struct bfd_link_hash_entry *h;
+
+    i = 0;
+    PRIV (transfer_address[i++]) = 0xffffffff00000340; /* SYS$IMGACT */
+    h = bfd_link_hash_lookup (info->hash, "LIB$INITIALIZE", FALSE, FALSE, TRUE);
+    if (h != NULL && h->type == bfd_link_hash_defined)
+      PRIV (transfer_address[i++]) =
+        alpha_vms_get_sym_value (h->u.def.section, h->u.def.value);
+    PRIV (transfer_address[i++]) = bfd_get_start_address (abfd);
+    while (i < 4)
+      PRIV (transfer_address[i++]) = 0;
+  }
+
   /* Allocate contents.  */
   base_addr = (bfd_vma)-1;
   last_addr = 0;
index 446edc695a5d59c2a8e4ca35ad7800030aada487..f08e998dbd0b6c9e15216d5122d5f0f8e6963a66 100644 (file)
@@ -1,3 +1,10 @@
+2010-06-01  Tristan Gingold  <gingold@adacore.com>
+
+       * scripttempl/alphavms.sc: Add comments. Move $LINK$ to the
+       readonly output-section. Handle LIB$INITIALIZE and sections
+       created by gcc.
+       * emultempl/vms.em (vms_place_orphan): Add comments.
+
 2010-05-28  Nick Clifton  <nickc@redhat.com>
 
        * Makefile.am (eshlelf_fd.c): Fix typo in rule.
index 0b6b059c49b5e74309bade2d0163fa8850434738..f21796b83fc20863d0528f5cb9583b56b9cb0fad 100644 (file)
@@ -94,11 +94,14 @@ vms_place_orphan (asection *s,
       0, 0, 0, 0
     };
 
-  /* We have nothing to say for anything other than a final link.  */
+  /* We have nothing to say for anything other than a final link or an excluded
+     section.  */
   if (link_info.relocatable
       || (s->flags & (SEC_EXCLUDE | SEC_LOAD)) != SEC_LOAD)
     return NULL;
 
+  /* FIXME: we should place sections by VMS program section flags.  */
+
   /* Only handle data sections.  */
   if ((s->flags & SEC_DATA) == 0)
     return NULL;
index ed4ec68d834d4af1376b4f2c6483d4eee2ec0d08..406a601e87277bd272a688974dc3454556cc21cd 100644 (file)
@@ -11,20 +11,35 @@ SECTIONS
 {
   ${RELOCATING+. = ${PAGESIZE};}
 
+  /* RW initialized data.  */
   \$DATA\$ ALIGN (${PAGESIZE}) : {
     *(\$DATA\$)
-    *(\$LINK\$)
   }
+  /* RW data unmodified (zero-initialized).  */
   \$BSS\$ ALIGN (${PAGESIZE}) : {
     *(\$BSS\$)
   }
+  /* RO, executable code.  */
   \$CODE\$ ALIGN (${PAGESIZE}) : {
     *(\$CODE\$)
   }
+  /* RO initialized data.  */
   \$LITERAL\$ ALIGN (${PAGESIZE}) : {
+    *(\$LINK\$)
     *(\$LITERAL\$)
     *(\$READONLY\$)
     *(\$READONLY_ADDR\$)
+    *(eh_frame)
+    *(jcr)
+    *(ctors)
+    *(dtors)
+    *(gcc_except_table)
+
+    /* LIB$INITIALIZE stuff.  */
+    *(LIB\$INITIALIZDZ)        /* Start marker.  */
+    *(LIB\$INITIALIZD_)        /* Hi priority.  */
+    *(LIB\$INITIALIZE) /* User.  */
+    *(LIB\$INITIALIZE$)        /* End marker.  */
   }
 
   \$DST\$ 0 : {