diff options
author | Tristan Gingold <gingold@adacore.com> | 2010-06-01 09:52:28 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2010-06-01 09:52:28 +0000 |
commit | 46d00b8af141a8ef29f4b9cd49ab70839b6e5ba8 (patch) | |
tree | e21b5728192b70bdcb1f073c6d12901fc803721a /bfd/vms-alpha.c | |
parent | b1797dc84a941058fdf6761390a990dba38cd22d (diff) | |
download | gdb-46d00b8af141a8ef29f4b9cd49ab70839b6e5ba8.zip gdb-46d00b8af141a8ef29f4b9cd49ab70839b6e5ba8.tar.gz gdb-46d00b8af141a8ef29f4b9cd49ab70839b6e5ba8.tar.bz2 |
bfd/
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.
Diffstat (limited to 'bfd/vms-alpha.c')
-rw-r--r-- | bfd/vms-alpha.c | 48 |
1 files changed, 36 insertions, 12 deletions
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; |