From 46d00b8af141a8ef29f4b9cd49ab70839b6e5ba8 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Tue, 1 Jun 2010 09:52:28 +0000 Subject: [PATCH] bfd/ 2010-06-01 Tristan Gingold * 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 * 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 | 8 ++++++++ bfd/vms-alpha.c | 48 ++++++++++++++++++++++++++++++++++------------ ld/ChangeLog | 7 +++++++ ld/emultempl/vms.em | 5 ++++- ld/scripttempl/alphavms.sc | 17 +++++++++++++++- 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 + + * 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 * 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 + + * 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 * 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 : { -- 2.7.4