aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/vms-alpha.c48
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/emultempl/vms.em5
-rw-r--r--ld/scripttempl/alphavms.sc17
5 files changed, 71 insertions, 14 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index dec1fe6..69d1240 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c
index e4ca931..d881e2f 100644
--- a/bfd/vms-alpha.c
+++ b/bfd/vms-alpha.c
@@ -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;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 446edc6..f08e998 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/emultempl/vms.em b/ld/emultempl/vms.em
index 0b6b059..f21796b 100644
--- a/ld/emultempl/vms.em
+++ b/ld/emultempl/vms.em
@@ -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;
diff --git a/ld/scripttempl/alphavms.sc b/ld/scripttempl/alphavms.sc
index ed4ec68..406a601 100644
--- a/ld/scripttempl/alphavms.sc
+++ b/ld/scripttempl/alphavms.sc
@@ -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 : {