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. */
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 */
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. */
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)
}
}
+ /* 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;
{
${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 : {