X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fpdp11.c;h=74617fc8a771efc130d3c5b3d6aa9dd0a102c18f;hb=46a2d504dd875caf60f9be191a55c9ff676bcd5c;hp=c3fbb41df0ece919f44d26b085cd1ea9d00ecd62;hpb=3db64b009284dda3a1ce10a91beb1297475e60a7;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/pdp11.c b/bfd/pdp11.c index c3fbb41df0..74617fc8a7 100644 --- a/bfd/pdp11.c +++ b/bfd/pdp11.c @@ -1,12 +1,11 @@ /* BFD back-end for PDP-11 a.out binaries. - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright (C) 2001-2016 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,7 +15,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + /* BFD backend for PDP-11, running 2.11BSD in particular. @@ -36,7 +37,7 @@ #define ARCH_SIZE 16 #undef TARGET_IS_BIG_ENDIAN_P -#define TARGET_PAGE_SIZE 1024 +#define TARGET_PAGE_SIZE 256 #define SEGMENT__SIZE TARGET_PAGE_SIZE #define DEFAULT_ARCH bfd_arch_pdp11 @@ -56,19 +57,13 @@ /* The header is not included in the text segment. */ #define N_HEADER_IN_TEXT(x) 0 -/* There are no shared libraries. */ -#define N_SHARED_LIB(x) 0 - /* There is no flags field. */ -#define N_FLAGS(exec) 0 +#define N_FLAGS(execp) 0 -#define N_SET_FLAGS(exec, flags) do { } while (0) -#define N_BADMAG(x) (((x).a_info != OMAGIC) \ - && ((x).a_info != NMAGIC) \ - && ((x).a_info != A_MAGIC3) \ - && ((x).a_info != A_MAGIC4) \ - && ((x).a_info != A_MAGIC5) \ - && ((x).a_info != A_MAGIC6)) +#define N_SET_FLAGS(execp, flags) do { } while (0) +#define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ + && N_MAGIC(x) != NMAGIC \ + && N_MAGIC(x) != ZMAGIC) #include "sysdep.h" #include "bfd.h" @@ -116,11 +111,11 @@ struct pdp11_external_nlist #define EXTERNAL_NLIST_SIZE 8 #define N_TXTOFF(x) (EXEC_BYTES_SIZE) -#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) -#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data) -#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) -#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize) -#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) +#define N_DATOFF(x) (N_TXTOFF(x) + (x)->a_text) +#define N_TRELOFF(x) (N_DATOFF(x) + (x)->a_data) +#define N_DRELOFF(x) (N_TRELOFF(x) + (x)->a_trsize) +#define N_SYMOFF(x) (N_DRELOFF(x) + (x)->a_drsize) +#define N_STROFF(x) (N_SYMOFF(x) + (x)->a_syms) #define WRITE_HEADERS(abfd, execp) pdp11_aout_write_headers (abfd, execp) @@ -256,7 +251,7 @@ HOWTO( 1, 0, 1, 16, TRUE, 0, complain_overflow_signed,0,"DISP16", TRU #define TABLE_SIZE(TABLE) (sizeof(TABLE)/sizeof(TABLE[0])) -static bfd_boolean aout_link_check_archive_element (bfd *, struct bfd_link_info *, bfd_boolean *); +static bfd_boolean aout_link_check_archive_element (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, const char *, bfd_boolean *); static bfd_boolean aout_link_add_object_symbols (bfd *, struct bfd_link_info *); static bfd_boolean aout_link_add_symbols (bfd *, struct bfd_link_info *); static bfd_boolean aout_link_write_symbols (struct aout_final_link_info *, bfd *); @@ -297,11 +292,9 @@ static int pdp11_aout_write_headers (bfd *abfd, struct internal_exec *execp) { struct external_exec exec_bytes; - bfd_size_type text_size; - file_ptr text_end; if (adata(abfd).magic == undecided_magic) - NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end); + NAME (aout, adjust_sizes_and_vmas) (abfd); execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE; execp->a_entry = bfd_get_start_address (abfd); @@ -331,7 +324,7 @@ pdp11_aout_write_headers (bfd *abfd, struct internal_exec *execp) if (bfd_get_outsymbols (abfd) != NULL && bfd_get_symcount (abfd) != 0) { - if (bfd_seek (abfd, (file_ptr) (N_SYMOFF(*execp)), SEEK_SET) != 0) + if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (execp)), SEEK_SET) != 0) return FALSE; if (! NAME (aout, write_syms) (abfd)) @@ -341,10 +334,10 @@ pdp11_aout_write_headers (bfd *abfd, struct internal_exec *execp) if (obj_textsec (abfd)->reloc_count > 0 || obj_datasec (abfd)->reloc_count > 0) { - if (bfd_seek (abfd, (file_ptr) (N_TRELOFF(*execp)), SEEK_SET) != 0 + if (bfd_seek (abfd, (file_ptr) (N_TRELOFF (execp)), SEEK_SET) != 0 || !NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd)) - || bfd_seek (abfd, (file_ptr) (N_DRELOFF(*execp)), SEEK_SET) != 0 - || !NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd))) + || bfd_seek (abfd, (file_ptr) (N_DRELOFF (execp)), SEEK_SET) != 0 + || !NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd))) return FALSE; } @@ -364,12 +357,7 @@ MY(write_object_contents) (bfd *abfd) will normally have been done by set_section_contents, but only if there actually are some section contents. */ if (! abfd->output_has_begun) - { - bfd_size_type text_size; - file_ptr text_end; - - NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end); - } + NAME (aout, adjust_sizes_and_vmas) (abfd); obj_reloc_entry_size (abfd) = RELOC_SIZE; @@ -497,27 +485,20 @@ NAME (aout, some_aout_object_p) (bfd *abfd, /* Setting of EXEC_P has been deferred to the bottom of this function. */ if (execp->a_syms) abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; - if (N_DYNAMIC(*execp)) + if (N_DYNAMIC (execp)) abfd->flags |= DYNAMIC; - if (N_MAGIC (*execp) == ZMAGIC) + if (N_MAGIC (execp) == ZMAGIC) { abfd->flags |= D_PAGED | WP_TEXT; adata (abfd).magic = z_magic; } - else if (N_MAGIC (*execp) == QMAGIC) - { - abfd->flags |= D_PAGED | WP_TEXT; - adata (abfd).magic = z_magic; - adata (abfd).subformat = q_magic_format; - } - else if (N_MAGIC (*execp) == NMAGIC) + else if (N_MAGIC (execp) == NMAGIC) { abfd->flags |= WP_TEXT; adata (abfd).magic = n_magic; } - else if (N_MAGIC (*execp) == OMAGIC - || N_MAGIC (*execp) == BMAGIC) + else if (N_MAGIC (execp) == OMAGIC) adata (abfd).magic = o_magic; else { @@ -574,25 +555,25 @@ NAME (aout, some_aout_object_p) (bfd *abfd, in by the callback: */ struct exec *execp = exec_hdr (abfd); - obj_textsec (abfd)->size = N_TXTSIZE(*execp); + obj_textsec (abfd)->size = N_TXTSIZE (execp); /* Data and bss are already filled in since they're so standard. */ /* The virtual memory addresses of the sections. */ - obj_textsec (abfd)->vma = N_TXTADDR(*execp); - obj_datasec (abfd)->vma = N_DATADDR(*execp); - obj_bsssec (abfd)->vma = N_BSSADDR(*execp); + obj_textsec (abfd)->vma = N_TXTADDR (execp); + obj_datasec (abfd)->vma = N_DATADDR (execp); + obj_bsssec (abfd)->vma = N_BSSADDR (execp); /* The file offsets of the sections. */ - obj_textsec (abfd)->filepos = N_TXTOFF(*execp); - obj_datasec (abfd)->filepos = N_DATOFF(*execp); + obj_textsec (abfd)->filepos = N_TXTOFF (execp); + obj_datasec (abfd)->filepos = N_DATOFF (execp); /* The file offsets of the relocation info. */ - obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp); - obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp); + obj_textsec (abfd)->rel_filepos = N_TRELOFF (execp); + obj_datasec (abfd)->rel_filepos = N_DRELOFF (execp); /* The file offsets of the string table and symbol table. */ - obj_str_filepos (abfd) = N_STROFF (*execp); - obj_sym_filepos (abfd) = N_SYMOFF (*execp); + obj_str_filepos (abfd) = N_STROFF (execp); + obj_sym_filepos (abfd) = N_SYMOFF (execp); /* Determine the architecture and machine type of the object file. */ abfd->obj_arch = bfd_arch_obscure; @@ -872,7 +853,7 @@ adjust_o_magic (bfd *abfd, struct internal_exec *execp) execp->a_text = obj_textsec (abfd)->size; execp->a_data = obj_datasec (abfd)->size; execp->a_bss = obj_bsssec (abfd)->size; - N_SET_MAGIC (*execp, OMAGIC); + N_SET_MAGIC (execp, OMAGIC); } static void @@ -956,10 +937,7 @@ adjust_z_magic (bfd *abfd, struct internal_exec *execp) execp->a_text = obj_textsec(abfd)->size; if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted))) execp->a_text += adata(abfd).exec_bytes_size; - if (obj_aout_subformat (abfd) == q_magic_format) - N_SET_MAGIC (*execp, QMAGIC); - else - N_SET_MAGIC (*execp, ZMAGIC); + N_SET_MAGIC (execp, ZMAGIC); /* Spec says data section should be rounded up to page boundary. */ obj_datasec(abfd)->size @@ -1026,13 +1004,11 @@ adjust_n_magic (bfd *abfd, struct internal_exec *execp) execp->a_text = obj_textsec(abfd)->size; execp->a_data = obj_datasec(abfd)->size; execp->a_bss = obj_bsssec(abfd)->size; - N_SET_MAGIC (*execp, NMAGIC); + N_SET_MAGIC (execp, NMAGIC); } bfd_boolean -NAME (aout, adjust_sizes_and_vmas) (bfd *abfd, - bfd_size_type *text_size, - file_ptr * text_end ATTRIBUTE_UNUSED) +NAME (aout, adjust_sizes_and_vmas) (bfd *abfd) { struct internal_exec *execp = exec_hdr (abfd); @@ -1046,7 +1022,6 @@ NAME (aout, adjust_sizes_and_vmas) (bfd *abfd, align_power(obj_textsec(abfd)->size, obj_textsec(abfd)->alignment_power); - *text_size = obj_textsec (abfd)->size; /* Rule (heuristic) for when to pad to a new page. Note that there are (at least) two ways demand-paged (ZMAGIC) files have been handled. Most Berkeley-based systems start the text segment at @@ -1157,12 +1132,9 @@ NAME (aout, set_section_contents) (bfd *abfd, file_ptr offset, bfd_size_type count) { - file_ptr text_end; - bfd_size_type text_size; - if (! abfd->output_has_begun) { - if (! NAME (aout, adjust_sizes_and_vmas) (abfd, & text_size, & text_end)) + if (! NAME (aout, adjust_sizes_and_vmas) (abfd)) return FALSE; } @@ -1187,6 +1159,14 @@ NAME (aout, set_section_contents) (bfd *abfd, if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0 || bfd_bwrite (location, count, abfd) != count) return FALSE; + + /* If necessary, pad the section to its aligned size. */ + if ((section == obj_datasec (abfd) + || section == obj_textsec (abfd)) + && count < section->size + && (bfd_seek (abfd, section->filepos + offset + section->size - 1, SEEK_SET) != 0 + || bfd_bwrite ("", 1, abfd) != 1)) + return FALSE; } return TRUE; @@ -1204,6 +1184,14 @@ aout_get_external_symbols (bfd *abfd) count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE; + /* PR 17512: file: 011f5a08. */ + if (count == 0) + { + obj_aout_external_syms (abfd) = NULL; + obj_aout_external_sym_count (abfd) = count; + return TRUE; + } + #ifdef USE_MMAP if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd), exec_hdr (abfd)->a_syms, @@ -1444,13 +1432,13 @@ asymbol * NAME (aout, make_empty_symbol) (bfd *abfd) { bfd_size_type amt = sizeof (aout_symbol_type); - aout_symbol_type *new = bfd_zalloc (abfd, amt); + aout_symbol_type *new_symbol_type = bfd_zalloc (abfd, amt); - if (!new) + if (!new_symbol_type) return NULL; - new->symbol.the_bfd = abfd; + new_symbol_type->symbol.the_bfd = abfd; - return &new->symbol; + return &new_symbol_type->symbol; } /* Translate a set of internal symbols into external symbols. */ @@ -1583,7 +1571,7 @@ add_to_stringtab (bfd *abfd, bfd_boolean copy) { bfd_boolean hash; - bfd_size_type index; + bfd_size_type str_index; /* An index of 0 always means the empty string. */ if (str == 0 || *str == '\0') @@ -1595,14 +1583,14 @@ add_to_stringtab (bfd *abfd, if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0) hash = FALSE; - index = _bfd_stringtab_add (tab, str, hash, copy); + str_index = _bfd_stringtab_add (tab, str, hash, copy); - if (index != (bfd_size_type) -1) + if (str_index != (bfd_size_type) -1) /* Add BYTES_IN_LONG to the return value to account for the space taken up by the string table size. */ - index += BYTES_IN_LONG; + str_index += BYTES_IN_LONG; - return index; + return str_index; } /* Write out a strtab. ABFD is already at the right location in the @@ -2197,12 +2185,13 @@ NAME (aout, minisymbol_to_symbol) (bfd *abfd, bfd_boolean NAME (aout, find_nearest_line) (bfd *abfd, - asection *section, asymbol **symbols, + asection *section, bfd_vma offset, const char **filename_ptr, const char **functionname_ptr, - unsigned int *line_ptr) + unsigned int *line_ptr, + unsigned int *discriminator_ptr) { /* Run down the file looking for the filename, function and linenumber. */ asymbol **p; @@ -2219,6 +2208,8 @@ NAME (aout, find_nearest_line) (bfd *abfd, *filename_ptr = abfd->filename; *functionname_ptr = 0; *line_ptr = 0; + if (discriminator_ptr) + *discriminator_ptr = 0; if (symbols != NULL) { @@ -2473,7 +2464,7 @@ NAME (aout, link_hash_table_create) (bfd *abfd) struct aout_link_hash_table *ret; bfd_size_type amt = sizeof (struct aout_link_hash_table); - ret = bfd_alloc (abfd, amt); + ret = bfd_malloc (amt); if (ret == NULL) return NULL; if (! NAME (aout, link_hash_table_init) (ret, abfd, @@ -2559,7 +2550,8 @@ aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) static bfd_boolean aout_link_check_ar_symbols (bfd *abfd, struct bfd_link_info *info, - bfd_boolean *pneeded) + bfd_boolean *pneeded, + bfd **subsbfd) { struct external_nlist *p; struct external_nlist *pend; @@ -2614,8 +2606,9 @@ aout_link_check_ar_symbols (bfd *abfd, but not if it is defined in the .text section. That seems a bit crazy to me, and I haven't implemented it. However, it might be correct. */ - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) - return FALSE; + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) + continue; *pneeded = TRUE; return TRUE; } @@ -2641,8 +2634,8 @@ aout_link_check_ar_symbols (bfd *abfd, outside BFD. We assume that we should link in the object file. This is done for the -u option in the linker. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, name)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -2692,23 +2685,40 @@ aout_link_check_ar_symbols (bfd *abfd, static bfd_boolean aout_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, + struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED, + const char *name ATTRIBUTE_UNUSED, bfd_boolean *pneeded) { - if (! aout_get_external_symbols (abfd)) + bfd *oldbfd; + bfd_boolean needed; + + if (!aout_get_external_symbols (abfd)) return FALSE; - if (! aout_link_check_ar_symbols (abfd, info, pneeded)) + oldbfd = abfd; + if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd)) return FALSE; - if (*pneeded) + needed = *pneeded; + if (needed) { - if (! aout_link_add_symbols (abfd, info)) + /* Potentially, the add_archive_element hook may have set a + substitute BFD for us. */ + if (abfd != oldbfd) + { + if (!info->keep_memory + && !aout_link_free_symbols (oldbfd)) + return FALSE; + if (!aout_get_external_symbols (abfd)) + return FALSE; + } + if (!aout_link_add_symbols (abfd, info)) return FALSE; } - if (! info->keep_memory || ! *pneeded) + if (!info->keep_memory || !needed) { - if (! aout_link_free_symbols (abfd)) + if (!aout_link_free_symbols (abfd)) return FALSE; } @@ -2783,7 +2793,9 @@ aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info) switch (type) { default: - abort (); + /* Anything else should be a debugging symbol. */ + BFD_ASSERT ((type & N_STAB) != 0); + continue; case N_UNDF: case N_ABS: @@ -2887,9 +2899,10 @@ aout_link_includes_newfunc (struct bfd_hash_entry *entry, } static bfd_boolean -aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data) +aout_link_write_other_symbol (struct bfd_hash_entry *bh, void *data) { - struct aout_final_link_info *finfo = (struct aout_final_link_info *) data; + struct aout_link_hash_entry *h = (struct aout_link_hash_entry *) bh; + struct aout_final_link_info *flaginfo = (struct aout_final_link_info *) data; bfd *output_bfd; int type; bfd_vma val; @@ -2904,12 +2917,12 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data) return TRUE; } - output_bfd = finfo->output_bfd; + output_bfd = flaginfo->output_bfd; if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL) { if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol) - (output_bfd, finfo->info, h))) + (output_bfd, flaginfo->info, h))) { /* FIXME: No way to handle errors. */ abort (); @@ -2923,9 +2936,9 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data) /* An indx of -2 means the symbol must be written. */ if (h->indx != -2 - && (finfo->info->strip == strip_all - || (finfo->info->strip == strip_some - && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string, + && (flaginfo->info->strip == strip_all + || (flaginfo->info->strip == strip_some + && bfd_hash_lookup (flaginfo->info->keep_hash, h->root.root.string, FALSE, FALSE) == NULL))) return TRUE; @@ -2980,7 +2993,7 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data) } H_PUT_8 (output_bfd, type, outsym.e_type); - indx = add_to_stringtab (output_bfd, finfo->strtab, h->root.root.string, + indx = add_to_stringtab (output_bfd, flaginfo->strtab, h->root.root.string, FALSE); if (indx == (bfd_size_type) -1) /* FIXME: No way to handle errors. */ @@ -2990,12 +3003,12 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data) PUT_WORD (output_bfd, val, outsym.e_value); amt = EXTERNAL_NLIST_SIZE; - if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0 + if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0 || bfd_bwrite ((void *) &outsym, amt, output_bfd) != amt) /* FIXME: No way to handle errors. */ abort (); - finfo->symoff += amt; + flaginfo->symoff += amt; h->indx = obj_aout_external_sym_count (output_bfd); ++obj_aout_external_sym_count (output_bfd); @@ -3005,7 +3018,7 @@ aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data) /* Handle a link order which is supposed to generate a reloc. */ static bfd_boolean -aout_link_reloc_link_order (struct aout_final_link_info *finfo, +aout_link_reloc_link_order (struct aout_final_link_info *flaginfo, asection *o, struct bfd_link_order *p) { @@ -3027,7 +3040,7 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, r_index = N_ABS | N_EXT; else { - BFD_ASSERT (pr->u.section->owner == finfo->output_bfd); + BFD_ASSERT (pr->u.section->owner == flaginfo->output_bfd); r_index = pr->u.section->target_index; } } @@ -3038,7 +3051,7 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, BFD_ASSERT (p->type == bfd_symbol_reloc_link_order); r_extern = 1; h = ((struct aout_link_hash_entry *) - bfd_wrapped_link_hash_lookup (finfo->output_bfd, finfo->info, + bfd_wrapped_link_hash_lookup (flaginfo->output_bfd, flaginfo->info, pr->u.name, FALSE, FALSE, TRUE)); if (h != NULL && h->indx >= 0) @@ -3051,35 +3064,34 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, symbol. */ h->indx = -2; h->written = FALSE; - if (! aout_link_write_other_symbol (h, (void *) finfo)) + if (!aout_link_write_other_symbol (&h->root.root, flaginfo)) return FALSE; r_index = h->indx; } else { - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0))) - return FALSE; + (*flaginfo->info->callbacks->unattached_reloc) + (flaginfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0); r_index = 0; } } - howto = bfd_reloc_type_lookup (finfo->output_bfd, pr->reloc); + howto = bfd_reloc_type_lookup (flaginfo->output_bfd, pr->reloc); if (howto == 0) { bfd_set_error (bfd_error_bad_value); return FALSE; } - if (o == obj_textsec (finfo->output_bfd)) - reloff_ptr = &finfo->treloff; - else if (o == obj_datasec (finfo->output_bfd)) - reloff_ptr = &finfo->dreloff; + if (o == obj_textsec (flaginfo->output_bfd)) + reloff_ptr = &flaginfo->treloff; + else if (o == obj_datasec (flaginfo->output_bfd)) + reloff_ptr = &flaginfo->dreloff; else abort (); #ifdef MY_put_reloc - MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto, + MY_put_reloc(flaginfo->output_bfd, r_extern, r_index, p->offset, howto, &srel); #else { @@ -3097,8 +3109,8 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, r_relative = (howto->type & 32) != 0; r_length = howto->size; - PUT_WORD (finfo->output_bfd, p->offset, srel.r_address); - if (bfd_header_big_endian (finfo->output_bfd)) + PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address); + if (bfd_header_big_endian (flaginfo->output_bfd)) { srel.r_index[0] = r_index >> 16; srel.r_index[1] = r_index >> 8; @@ -3142,9 +3154,9 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, size = bfd_get_reloc_size (howto); buf = bfd_zmalloc (size); - if (buf == NULL) + if (buf == NULL && size != 0) return FALSE; - r = MY_relocate_contents (howto, finfo->output_bfd, + r = MY_relocate_contents (howto, flaginfo->output_bfd, pr->addend, buf); switch (r) { @@ -3154,21 +3166,17 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, case bfd_reloc_outofrange: abort (); case bfd_reloc_overflow: - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, NULL, - (p->type == bfd_section_reloc_link_order - ? bfd_section_name (finfo->output_bfd, - pr->u.section) - : pr->u.name), - howto->name, pr->addend, NULL, - (asection *) NULL, (bfd_vma) 0))) - { - free (buf); - return FALSE; - } + (*flaginfo->info->callbacks->reloc_overflow) + (flaginfo->info, NULL, + (p->type == bfd_section_reloc_link_order + ? bfd_section_name (flaginfo->output_bfd, + pr->u.section) + : pr->u.name), + howto->name, pr->addend, NULL, + (asection *) NULL, (bfd_vma) 0); break; } - ok = bfd_set_section_contents (finfo->output_bfd, o, + ok = bfd_set_section_contents (flaginfo->output_bfd, o, (void *) buf, (file_ptr) p->offset, size); @@ -3177,19 +3185,19 @@ aout_link_reloc_link_order (struct aout_final_link_info *finfo, return FALSE; } - rel_size = obj_reloc_entry_size (finfo->output_bfd); - if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0 - || bfd_bwrite (rel_ptr, rel_size, finfo->output_bfd) != rel_size) + rel_size = obj_reloc_entry_size (flaginfo->output_bfd); + if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0 + || bfd_bwrite (rel_ptr, rel_size, flaginfo->output_bfd) != rel_size) return FALSE; *reloff_ptr += rel_size; /* Assert that the relocs have not run into the symbols, and that n the text relocs have not run into the data relocs. */ - BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd) - && (reloff_ptr != &finfo->treloff + BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd) + && (reloff_ptr != &flaginfo->treloff || (*reloff_ptr - <= obj_datasec (finfo->output_bfd)->rel_filepos))); + <= obj_datasec (flaginfo->output_bfd)->rel_filepos))); return TRUE; } @@ -3211,7 +3219,7 @@ aout_reloc_type_to_section (bfd *abfd, int type) } static bfd_boolean -pdp11_aout_link_input_section (struct aout_final_link_info *finfo, +pdp11_aout_link_input_section (struct aout_final_link_info *flaginfo, bfd *input_bfd, asection *input_section, bfd_byte *relocs, @@ -3228,24 +3236,22 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, char *strings; struct aout_link_hash_entry **sym_hashes; int *symbol_map; - bfd_size_type reloc_count; bfd_byte *rel; bfd_byte *rel_end; - output_bfd = finfo->output_bfd; + output_bfd = flaginfo->output_bfd; check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc; BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_SIZE); BFD_ASSERT (input_bfd->xvec->header_byteorder == output_bfd->xvec->header_byteorder); - relocatable = finfo->info->relocatable; + relocatable = bfd_link_relocatable (flaginfo->info); syms = obj_aout_external_syms (input_bfd); strings = obj_aout_external_strings (input_bfd); sym_hashes = obj_aout_sym_hashes (input_bfd); - symbol_map = finfo->symbol_map; + symbol_map = flaginfo->symbol_map; - reloc_count = rel_size / RELOC_SIZE; rel = relocs; rel_end = rel + rel_size; for (; rel < rel_end; rel += RELOC_SIZE) @@ -3332,8 +3338,8 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, { h->indx = -2; h->written = FALSE; - if (! aout_link_write_other_symbol (h, - (void *) finfo)) + if (!aout_link_write_other_symbol (&h->root.root, + flaginfo)) return FALSE; } r_index = h->indx; @@ -3344,10 +3350,9 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, name = strings + GET_WORD (input_bfd, syms[r_index].e_strx); - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, name, input_bfd, input_section, - r_addr))) - return FALSE; + (*flaginfo->info->callbacks->unattached_reloc) + (flaginfo->info, name, input_bfd, input_section, + r_addr); r_index = 0; } } @@ -3440,7 +3445,7 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, bfd_boolean skip; if (! ((*check_dynamic_reloc) - (finfo->info, input_bfd, input_section, h, + (flaginfo->info, input_bfd, input_section, h, (void *) rel, contents, &skip, &relocation))) return FALSE; if (skip) @@ -3450,7 +3455,7 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, /* Now warn if a global symbol is undefined. We could not do this earlier, because check_dynamic_reloc might want to skip this reloc. */ - if (hundef && ! finfo->info->shared) + if (hundef && ! bfd_link_pic (flaginfo->info)) { const char *name; @@ -3458,10 +3463,9 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, name = h->root.root.string; else name = strings + GET_WORD (input_bfd, syms[r_index].e_strx); - if (! ((*finfo->info->callbacks->undefined_symbol) - (finfo->info, name, input_bfd, input_section, - r_addr, TRUE))) - return FALSE; + (*flaginfo->info->callbacks->undefined_symbol) + (flaginfo->info, name, input_bfd, input_section, + r_addr, TRUE); } r = MY_final_link_relocate (howto, @@ -3493,11 +3497,9 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, s = aout_reloc_type_to_section (input_bfd, r_type); name = bfd_section_name (input_bfd, s); } - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, (h ? &h->root : NULL), name, - howto->name, (bfd_vma) 0, input_bfd, - input_section, r_addr))) - return FALSE; + (*flaginfo->info->callbacks->reloc_overflow) + (flaginfo->info, (h ? &h->root : NULL), name, howto->name, + (bfd_vma) 0, input_bfd, input_section, r_addr); } break; } @@ -3510,7 +3512,7 @@ pdp11_aout_link_input_section (struct aout_final_link_info *finfo, /* Link an a.out section into the output file. */ static bfd_boolean -aout_link_input_section (struct aout_final_link_info *finfo, +aout_link_input_section (struct aout_final_link_info *flaginfo, bfd *input_bfd, asection *input_section, file_ptr *reloff_ptr, @@ -3522,7 +3524,7 @@ aout_link_input_section (struct aout_final_link_info *finfo, /* Get the section contents. */ input_size = input_section->size; if (! bfd_get_section_contents (input_bfd, input_section, - (void *) finfo->contents, + (void *) flaginfo->contents, (file_ptr) 0, input_size)) return FALSE; @@ -3532,7 +3534,7 @@ aout_link_input_section (struct aout_final_link_info *finfo, relocs = aout_section_data (input_section)->relocs; else { - relocs = finfo->relocs; + relocs = flaginfo->relocs; if (rel_size > 0) { if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0 @@ -3542,36 +3544,36 @@ aout_link_input_section (struct aout_final_link_info *finfo, } /* Relocate the section contents. */ - if (! pdp11_aout_link_input_section (finfo, input_bfd, input_section, + if (! pdp11_aout_link_input_section (flaginfo, input_bfd, input_section, (bfd_byte *) relocs, - rel_size, finfo->contents)) + rel_size, flaginfo->contents)) return FALSE; /* Write out the section contents. */ - if (! bfd_set_section_contents (finfo->output_bfd, + if (! bfd_set_section_contents (flaginfo->output_bfd, input_section->output_section, - (void *) finfo->contents, + (void *) flaginfo->contents, (file_ptr) input_section->output_offset, input_size)) return FALSE; /* If we are producing relocatable output, the relocs were modified, and we now write them out. */ - if (finfo->info->relocatable && rel_size > 0) + if (bfd_link_relocatable (flaginfo->info) && rel_size > 0) { - if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0) + if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0) return FALSE; - if (bfd_bwrite (relocs, rel_size, finfo->output_bfd) != rel_size) + if (bfd_bwrite (relocs, rel_size, flaginfo->output_bfd) != rel_size) return FALSE; *reloff_ptr += rel_size; /* Assert that the relocs have not run into the symbols, and that if these are the text relocs they have not run into the data relocs. */ - BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd) - && (reloff_ptr != &finfo->treloff + BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd) + && (reloff_ptr != &flaginfo->treloff || (*reloff_ptr - <= obj_datasec (finfo->output_bfd)->rel_filepos))); + <= obj_datasec (flaginfo->output_bfd)->rel_filepos))); } return TRUE; @@ -3580,28 +3582,24 @@ aout_link_input_section (struct aout_final_link_info *finfo, /* Link an a.out input BFD into the output file. */ static bfd_boolean -aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd) +aout_link_input_bfd (struct aout_final_link_info *flaginfo, bfd *input_bfd) { - bfd_size_type sym_count; - BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object); /* If this is a dynamic object, it may need special handling. */ if ((input_bfd->flags & DYNAMIC) != 0 && aout_backend_info (input_bfd)->link_dynamic_object != NULL) return ((*aout_backend_info (input_bfd)->link_dynamic_object) - (finfo->info, input_bfd)); + (flaginfo->info, input_bfd)); /* Get the symbols. We probably have them already, unless - finfo->info->keep_memory is FALSE. */ + flaginfo->info->keep_memory is FALSE. */ if (! aout_get_external_symbols (input_bfd)) return FALSE; - sym_count = obj_aout_external_sym_count (input_bfd); - /* Write out the symbols and get a map of the new indices. The map - is placed into finfo->symbol_map. */ - if (! aout_link_write_symbols (finfo, input_bfd)) + is placed into flaginfo->symbol_map. */ + if (! aout_link_write_symbols (flaginfo, input_bfd)) return FALSE; /* Relocate and write out the sections. These functions use the @@ -3610,17 +3608,17 @@ aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd) link, which will normally be the case. */ if (obj_textsec (input_bfd)->linker_mark) { - if (! aout_link_input_section (finfo, input_bfd, + if (! aout_link_input_section (flaginfo, input_bfd, obj_textsec (input_bfd), - &finfo->treloff, + &flaginfo->treloff, exec_hdr (input_bfd)->a_trsize)) return FALSE; } if (obj_datasec (input_bfd)->linker_mark) { - if (! aout_link_input_section (finfo, input_bfd, + if (! aout_link_input_section (flaginfo, input_bfd, obj_datasec (input_bfd), - &finfo->dreloff, + &flaginfo->dreloff, exec_hdr (input_bfd)->a_drsize)) return FALSE; } @@ -3628,7 +3626,7 @@ aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd) /* If we are not keeping memory, we don't need the symbols any longer. We still need them if we are keeping memory, because the strings in the hash table point into them. */ - if (! finfo->info->keep_memory) + if (! flaginfo->info->keep_memory) { if (! aout_link_free_symbols (input_bfd)) return FALSE; @@ -3639,7 +3637,7 @@ aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd) /* Do the final link step. This is called on the output BFD. The INFO structure should point to a list of BFDs linked through the - link_next field which can be used to find each BFD which takes part + link.next field which can be used to find each BFD which takes part in the output. Also, each section in ABFD should point to a list of bfd_link_order structures which list all the input sections for the output section. */ @@ -3656,13 +3654,11 @@ NAME (aout, final_link) (bfd *abfd, bfd_size_type max_contents_size; bfd_size_type max_relocs_size; bfd_size_type max_sym_count; - bfd_size_type text_size; - file_ptr text_end; struct bfd_link_order *p; asection *o; bfd_boolean have_link_order_relocs; - if (info->shared) + if (bfd_link_pic (info)) abfd->flags |= DYNAMIC; aout_info.info = info; @@ -3686,11 +3682,11 @@ NAME (aout, final_link) (bfd *abfd, max_contents_size = 0; max_relocs_size = 0; max_sym_count = 0; - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) + for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) { size_t sz; - if (info->relocatable) + if (bfd_link_relocatable (info)) { if (bfd_get_flavour (sub) == bfd_target_aout_flavour) { @@ -3734,7 +3730,7 @@ NAME (aout, final_link) (bfd *abfd, } } - if (info->relocatable) + if (bfd_link_relocatable (info)) { if (obj_textsec (abfd) != NULL) trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd) @@ -3753,7 +3749,7 @@ NAME (aout, final_link) (bfd *abfd, /* Adjust the section sizes and vmas according to the magic number. This sets a_text, a_data and a_bss in the exec_hdr and sets the filepos for each section. */ - if (! NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end)) + if (! NAME (aout, adjust_sizes_and_vmas) (abfd)) goto error_return; /* The relocation and symbol file positions differ among a.out @@ -3800,7 +3796,7 @@ NAME (aout, final_link) (bfd *abfd, h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC", FALSE, FALSE, FALSE); if (h != NULL) - aout_link_write_other_symbol (h, &aout_info); + aout_link_write_other_symbol (&h->root.root, &aout_info); } /* The most time efficient way to do the link would be to read all @@ -3824,7 +3820,7 @@ NAME (aout, final_link) (bfd *abfd, We use the output_has_begun field of the input BFDs to see whether we have already handled it. */ - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) + for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) sub->output_has_begun = FALSE; /* Mark all sections which are to be included in the link. This @@ -3872,9 +3868,9 @@ NAME (aout, final_link) (bfd *abfd, } /* Write out any symbols that we have not already written out. */ - aout_link_hash_traverse (aout_hash_table (info), - aout_link_write_other_symbol, - (void *) &aout_info); + bfd_hash_traverse (&info->hash->table, + aout_link_write_other_symbol, + &aout_info); /* Now handle any relocs we were asked to create by the linker. These did not come from any input file. We must do these after @@ -3982,7 +3978,7 @@ NAME (aout, final_link) (bfd *abfd, symbol indices into a symbol_map. */ static bfd_boolean -aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) +aout_link_write_symbols (struct aout_final_link_info *flaginfo, bfd *input_bfd) { bfd *output_bfd; bfd_size_type sym_count; @@ -3998,23 +3994,23 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) bfd_boolean pass; bfd_boolean skip_next; - output_bfd = finfo->output_bfd; + output_bfd = flaginfo->output_bfd; sym_count = obj_aout_external_sym_count (input_bfd); strings = obj_aout_external_strings (input_bfd); - strip = finfo->info->strip; - discard = finfo->info->discard; - outsym = finfo->output_syms; + strip = flaginfo->info->strip; + discard = flaginfo->info->discard; + outsym = flaginfo->output_syms; /* First write out a symbol for this object file, unless we are discarding such symbols. */ if (strip != strip_all && (strip != strip_some - || bfd_hash_lookup (finfo->info->keep_hash, input_bfd->filename, + || bfd_hash_lookup (flaginfo->info->keep_hash, input_bfd->filename, FALSE, FALSE) != NULL) && discard != discard_all) { H_PUT_8 (output_bfd, N_TEXT, outsym->e_type); - strtab_index = add_to_stringtab (output_bfd, finfo->strtab, + strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab, input_bfd->filename, FALSE); if (strtab_index == (bfd_size_type) -1) return FALSE; @@ -4033,7 +4029,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) sym = obj_aout_external_syms (input_bfd); sym_end = sym + sym_count; sym_hash = obj_aout_sym_hashes (input_bfd); - symbol_map = finfo->symbol_map; + symbol_map = flaginfo->symbol_map; memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map); for (; sym < sym_end; sym++, sym_hash++, symbol_map++) { @@ -4132,7 +4128,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) skip = TRUE; break; case strip_some: - if (bfd_hash_lookup (finfo->info->keep_hash, name, FALSE, FALSE) + if (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE, FALSE) == NULL) skip = TRUE; break; @@ -4360,8 +4356,8 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) /* If we have already included a header file with the same value, then replace this one with an N_EXCL symbol. */ - copy = ! finfo->info->keep_memory; - incl_entry = aout_link_includes_lookup (&finfo->includes, + copy = ! flaginfo->info->keep_memory; + incl_entry = aout_link_includes_lookup (&flaginfo->includes, name, TRUE, copy); if (incl_entry == NULL) return FALSE; @@ -4372,7 +4368,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) { /* This is the first time we have seen this header file with this set of stabs strings. */ - t = bfd_hash_allocate (&finfo->includes.root, + t = bfd_hash_allocate (&flaginfo->includes.root, sizeof *t); if (t == NULL) return FALSE; @@ -4419,7 +4415,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) write out. */ H_PUT_8 (output_bfd, type, outsym->e_type); copy = FALSE; - if (! finfo->info->keep_memory) + if (! flaginfo->info->keep_memory) { /* name points into a string table which we are going to free. If there is a hash table entry, use that string. @@ -4429,7 +4425,7 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) else copy = TRUE; } - strtab_index = add_to_stringtab (output_bfd, finfo->strtab, + strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab, name, copy); if (strtab_index == (bfd_size_type) -1) return FALSE; @@ -4441,17 +4437,17 @@ aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd) } /* Write out the output symbols we have just constructed. */ - if (outsym > finfo->output_syms) + if (outsym > flaginfo->output_syms) { bfd_size_type size; - if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0) + if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0) return FALSE; - size = outsym - finfo->output_syms; + size = outsym - flaginfo->output_syms; size *= EXTERNAL_NLIST_SIZE; - if (bfd_bwrite ((void *) finfo->output_syms, size, output_bfd) != size) + if (bfd_bwrite ((void *) flaginfo->output_syms, size, output_bfd) != size) return FALSE; - finfo->symoff += size; + flaginfo->symoff += size; } return TRUE; @@ -4512,6 +4508,7 @@ const bfd_target MY (vec) = MY_symbol_leading_char, AR_PAD_CHAR, /* AR_pad_char. */ 15, /* AR_max_namelen. */ + 0, /* match priority. */ bfd_getl64, bfd_getl_signed_64, bfd_putl64, bfd_getp32, bfd_getp_signed_32, bfd_putp32, bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */