From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5849 invoked by alias); 20 Sep 2010 12:34:29 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 5057 invoked by uid 9514); 20 Sep 2010 12:34:26 -0000 Date: Mon, 20 Sep 2010 12:34:00 -0000 Message-ID: <20100920123426.5030.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] master: Merge remote branch 'gdb/master' X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: cf7b7b38fd5f32865f0c91d1b6f929c08e04ff0a X-Git-Newrev: 537e20cf693b1dc7723d036d85fbc014cfa2cad8 X-SW-Source: 2010-q3/txt/msg00105.txt.bz2 List-Id: The branch, master has been updated via 537e20cf693b1dc7723d036d85fbc014cfa2cad8 (commit) via 998a835316aca40a3df80a9991fd73b802cbe50f (commit) via 7b7b712ff734469249d45c6cc98146f10d45a16a (commit) via 8365ae81b6bc04f6aa0f6b159324ad410fcde9e1 (commit) via c7465b74e0390c3561c74222075347b70b656e80 (commit) via 8fc8ce88b9e5d37fd7d56d6316befe8d0b34934e (commit) via 6bf0f2b7d2a68e073be94bea605df7d8de208e7e (commit) via ba28cdd5101969ea7cfd37beb751ba4b16cd9b5d (commit) via b14ca9d327450399370cd8eed3443feeb1373de5 (commit) via cb6b882dbc1402600f7d5d651ff3e1df151de886 (commit) via 780f02f612dece92f3f88fbccf30b6cd4762da2c (commit) via b3be260c7c271e8040c28f1ef613f8b17b2558d6 (commit) via 8d61ca616c147122a84210098a56d5ccc717fd20 (commit) via 0a4da4bd5cb49f922ecc723bfdd6d5fd654e17cb (commit) from cf7b7b38fd5f32865f0c91d1b6f929c08e04ff0a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 537e20cf693b1dc7723d036d85fbc014cfa2cad8 Merge: cf7b7b3 998a835 Author: Phil Muldoon Date: Mon Sep 20 13:33:59 2010 +0100 Merge remote branch 'gdb/master' commit 998a835316aca40a3df80a9991fd73b802cbe50f Author: gdbadmin Date: Mon Sep 20 00:00:32 2010 +0000 *** empty log message *** commit 7b7b712ff734469249d45c6cc98146f10d45a16a Author: Alan Modra Date: Mon Sep 20 00:00:05 2010 +0000 daily update commit 8365ae81b6bc04f6aa0f6b159324ad410fcde9e1 Author: Richard Sandiford Date: Sun Sep 19 10:52:17 2010 +0000 bfd/ * elfxx-mips.c (mips_elf_link_hash_entry): Add got_only_for_calls. (mips_elf_link_hash_newfunc): Initialize it. (mips_elf_record_global_got_symbol): Add a for_call parameter. (mips_elf_count_got_symbols): Check SYMBOL_CALLS_LOCAL rather than SYMBOL_REFERENCES_LOCAL if the GOT entry is only used for calls. Try to remove .got entries in favour of .got.plt entries on VxWorks. (_bfd_mips_elf_check_relocs): Do not try to avoid allocating a global GOT entry for VxWorks calls. Update uses of mips_elf_record_global_got_symbol. (allocate_dynrelocs): Set got_only_for_calls to false if the GOT entry is used for dynamic relocations. commit c7465b74e0390c3561c74222075347b70b656e80 Author: Richard Sandiford Date: Sun Sep 19 10:26:27 2010 +0000 bfd/ * elfxx-mips.c (mips_got_entry): Adjust commentary. (mips_elf_create_local_got_entry): If given a symbol, check that it has been assigned to the local part of the GOT. (mips_elf_count_got_symbols): Take the bfd_link_info as argument instead of the master GOT. Put all locally-binding symbols in the local area. (mips_elf_make_got_per_bfd): Use global_got_area to decide whether a symbol lives in the local or global area. (mips_elf_local_relocation_p): Remove check_forced argument and retain only the !check_forced behavior. (mips_elf_calculate_relocation): Adjust call accordingly. Use global_got_area to decide whether an output relocation should be local or global. Explicitly decay R_MIPS_GOT_PAGE into R_MIPS_GOT_DISP where appropriate. Fix selection of local vs. global semantics for R_MIPS*_26. Remove redundant reevaluation of what is stored in was_local_p. (mips_elf_create_dynamic_relocation): Use global_got_area to decide whether the relocation should be against a global or local symbol. (mips_elf_lay_out_got): Update the GOT traversal after the above change to mips_elf_count_got_symbols. (mips_elf_adjust_addend): Adjust call to mips_elf_local_relocation_p. (_bfd_mips_elf_relocate_section): Likewise. (_bfd_mips_elf_finish_dynamic_symbol): Use global_got_area to decide whether the symbol has a global got entry. (_bfd_mips_vxworks_finish_dynamic_symbol): Likewise. ld/testsuite/ * ld-mips-elf/elf-rel-got-n32.d: Swap two local GOT entries and remove some duplication between the global and local GOT entries. Adjust GP offsets accordingly. * ld-mips-elf/elf-rel-got-n64-linux.d: Likewise. * ld-mips-elf/elf-rel-xgot-n32.d: Reorder GOT entries and update GP offsets accordingly. * ld-mips-elf/elf-rel-xgot-n64-linux.d: Likewise. * ld-mips-elf/mips16-pic-1.gd: Move all global GOT entries to the local GOT. * ld-mips-elf/mips16-pic-1.dd: Update GP offsets accordingly. * ld-mips-elf/multi-got-no-shared.d: Adjust GP setup for smaller GOT sizes. commit 8fc8ce88b9e5d37fd7d56d6316befe8d0b34934e Author: Richard Sandiford Date: Sun Sep 19 10:07:30 2010 +0000 bfd/ * elfxx-mips.c (allocate_dynrelocs): Don't add relocation symbols to the global GOT on VxWorks. commit 6bf0f2b7d2a68e073be94bea605df7d8de208e7e Author: Richard Sandiford Date: Sun Sep 19 10:03:28 2010 +0000 bfd/ * elfxx-mips.c (_bfd_mips_elf_check_relocs): On VxWorks, exclude __GOTT_BASE__ and __GOTT_INDEX__ from the warning about HI/LO relocations in shared objects. commit ba28cdd5101969ea7cfd37beb751ba4b16cd9b5d Author: gdbadmin Date: Sun Sep 19 00:00:34 2010 +0000 *** empty log message *** commit b14ca9d327450399370cd8eed3443feeb1373de5 Author: Alan Modra Date: Sun Sep 19 00:00:06 2010 +0000 daily update commit cb6b882dbc1402600f7d5d651ff3e1df151de886 Author: Alan Modra Date: Sat Sep 18 00:00:05 2010 +0000 daily update commit 780f02f612dece92f3f88fbccf30b6cd4762da2c Author: gdbadmin Date: Sat Sep 18 00:00:03 2010 +0000 *** empty log message *** commit b3be260c7c271e8040c28f1ef613f8b17b2558d6 Author: mgretton Date: Fri Sep 17 10:13:40 2010 +0000 2010-09-17 Tejas Belagod * config/tc-arm.c (insns): Change MRC entry to accept APSR_RR instead of just RR. 2010-09-17 Tejas Belagod * gas/arm/copro.s: Add test for APSR_nzcv as a MRC operand. * gas/arm/copro.d: Change pc in MRC to disassemble as APSR_nzcv. Also add disassembly for test added in copro.s 2010-09-17 Tejas Belagod * arm_dis.c (coprocessor_opcodes): Add MRC entry for APSR_nzcv. commit 8d61ca616c147122a84210098a56d5ccc717fd20 Author: gdbadmin Date: Fri Sep 17 00:00:32 2010 +0000 *** empty log message *** commit 0a4da4bd5cb49f922ecc723bfdd6d5fd654e17cb Author: Alan Modra Date: Fri Sep 17 00:00:04 2010 +0000 daily update ----------------------------------------------------------------------- Summary of changes: bfd/ChangeLog | 53 ++++++++++++++ bfd/elfxx-mips.c | 198 ++++++++++++++++++++++++++++------------------------- bfd/version.h | 2 +- gdb/version.in | 2 +- opcodes/ChangeLog | 4 + opcodes/arm-dis.c | 1 + 6 files changed, 164 insertions(+), 96 deletions(-) First 500 lines of diff: diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2627e77..545c603 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,56 @@ +2010-09-19 Richard Sandiford + + * elfxx-mips.c (mips_elf_link_hash_entry): Add got_only_for_calls. + (mips_elf_link_hash_newfunc): Initialize it. + (mips_elf_record_global_got_symbol): Add a for_call parameter. + (mips_elf_count_got_symbols): Check SYMBOL_CALLS_LOCAL rather + than SYMBOL_REFERENCES_LOCAL if the GOT entry is only used for calls. + Try to remove .got entries in favour of .got.plt entries on VxWorks. + (_bfd_mips_elf_check_relocs): Do not try to avoid allocating + a global GOT entry for VxWorks calls. Update uses of + mips_elf_record_global_got_symbol. + (allocate_dynrelocs): Set got_only_for_calls to false if the GOT + entry is used for dynamic relocations. + +2010-09-19 Richard Sandiford + + * elfxx-mips.c (mips_got_entry): Adjust commentary. + (mips_elf_create_local_got_entry): If given a symbol, check that it + has been assigned to the local part of the GOT. + (mips_elf_count_got_symbols): Take the bfd_link_info as argument + instead of the master GOT. Put all locally-binding symbols in + the local area. + (mips_elf_make_got_per_bfd): Use global_got_area to decide whether + a symbol lives in the local or global area. + (mips_elf_local_relocation_p): Remove check_forced argument and + retain only the !check_forced behavior. + (mips_elf_calculate_relocation): Adjust call accordingly. + Use global_got_area to decide whether an output relocation + should be local or global. Explicitly decay R_MIPS_GOT_PAGE + into R_MIPS_GOT_DISP where appropriate. Fix selection of + local vs. global semantics for R_MIPS*_26. Remove redundant + reevaluation of what is stored in was_local_p. + (mips_elf_create_dynamic_relocation): Use global_got_area to decide + whether the relocation should be against a global or local symbol. + (mips_elf_lay_out_got): Update the GOT traversal after the above + change to mips_elf_count_got_symbols. + (mips_elf_adjust_addend): Adjust call to mips_elf_local_relocation_p. + (_bfd_mips_elf_relocate_section): Likewise. + (_bfd_mips_elf_finish_dynamic_symbol): Use global_got_area to decide + whether the symbol has a global got entry. + (_bfd_mips_vxworks_finish_dynamic_symbol): Likewise. + +2010-09-19 Richard Sandiford + + * elfxx-mips.c (allocate_dynrelocs): Don't add relocation symbols + to the global GOT on VxWorks. + +2010-09-19 Richard Sandiford + + * elfxx-mips.c (_bfd_mips_elf_check_relocs): On VxWorks, + exclude __GOTT_BASE__ and __GOTT_INDEX__ from the warning + about HI/LO relocations in shared objects. + 2010-09-16 Alan Modra * elf32-spu.c (spu_elf_size_sections): Omit fixups for non-alloc diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 78f96c1..1ee9289 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -53,7 +53,7 @@ (abfd == NULL) (2) SYMBOL + OFFSET addresses, where SYMBOL is local to an input bfd (abfd != NULL, symndx >= 0) - (3) global and forced-local symbols + (3) SYMBOL addresses, where SYMBOL is not local to an input bfd (abfd != NULL, symndx == -1) Type (3) entries are treated differently for different types of GOT. @@ -94,8 +94,9 @@ struct mips_got_entry that should be added to the symbol value. */ bfd_vma addend; /* If abfd != NULL && symndx == -1, the hash table entry - corresponding to a global symbol in the got (or, local, if - h->forced_local). */ + corresponding to symbol in the GOT. The symbol's entry + is in the local area if h->global_got_area is GGA_NONE, + otherwise it is in the global area. */ struct mips_elf_link_hash_entry *h; } d; @@ -373,6 +374,11 @@ struct mips_elf_link_hash_entry /* The highest GGA_* value that satisfies all references to this symbol. */ unsigned int global_got_area : 2; + /* True if all GOT relocations against this symbol are for calls. This is + a looser condition than no_fn_stub below, because there may be other + non-call non-GOT relocations against the symbol. */ + unsigned int got_only_for_calls : 1; + /* True if one of the relocations described by possibly_dynamic_relocs is against a readonly section. */ unsigned int readonly_reloc : 1; @@ -1072,6 +1078,7 @@ mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry, ret->call_fp_stub = NULL; ret->tls_type = GOT_NORMAL; ret->global_got_area = GGA_NONE; + ret->got_only_for_calls = TRUE; ret->readonly_reloc = FALSE; ret->has_static_relocs = FALSE; ret->no_fn_stub = FALSE; @@ -3202,8 +3209,8 @@ mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info, } /* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE. - EXTERNAL is true if the relocation was against a global symbol - that has been forced local. */ + EXTERNAL is true if the relocation was originally against a global + symbol that binds locally. */ static bfd_vma mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info, @@ -3281,11 +3288,9 @@ mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info, BFD_ASSERT (g != NULL); } - /* We might have a symbol, H, if it has been forced local. Use the - global entry then. It doesn't matter whether an entry is local - or global for TLS, since the dynamic linker does not - automatically relocate TLS GOT entries. */ - BFD_ASSERT (h == NULL || h->root.forced_local); + /* This function shouldn't be called for symbols that live in the global + area of the GOT. */ + BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE); if (TLS_RELOC_P (r_type)) { struct mips_got_entry *p; @@ -3478,11 +3483,13 @@ mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data) /* If H is a symbol that needs a global GOT entry, but has a dynamic symbol table index lower than any we've seen to date, record it for - posterity. */ + posterity. FOR_CALL is true if the caller is only interested in + using the GOT entry for calls. */ static bfd_boolean mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h, bfd *abfd, struct bfd_link_info *info, + bfd_boolean for_call, unsigned char tls_flag) { struct mips_elf_link_hash_table *htab; @@ -3494,6 +3501,8 @@ mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h, BFD_ASSERT (htab != NULL); hmips = (struct mips_elf_link_hash_entry *) h; + if (!for_call) + hmips->got_only_for_calls = FALSE; /* A global symbol in the GOT must also be in the dynamic symbol table. */ @@ -3850,25 +3859,49 @@ mips_elf_resolve_final_got_entries (struct mips_got_info *g) } /* A mips_elf_link_hash_traverse callback for which DATA points - to a mips_got_info. Count the number of type (3) entries. */ + to the link_info structure. Count the number of type (3) entries + in the master GOT. */ static int mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data) { + struct bfd_link_info *info; + struct mips_elf_link_hash_table *htab; struct mips_got_info *g; - g = (struct mips_got_info *) data; + info = (struct bfd_link_info *) data; + htab = mips_elf_hash_table (info); + g = htab->got_info; if (h->global_got_area != GGA_NONE) { - if (h->root.forced_local || h->root.dynindx == -1) - { - /* We no longer need this entry if it was only used for - relocations; those relocations will be against the - null or section symbol instead of H. */ + /* Make a final decision about whether the symbol belongs in the + local or global GOT. Symbols that bind locally can (and in the + case of forced-local symbols, must) live in the local GOT. + Those that are aren't in the dynamic symbol table must also + live in the local GOT. + + Note that the former condition does not always imply the + latter: symbols do not bind locally if they are completely + undefined. We'll report undefined symbols later if appropriate. */ + if (h->root.dynindx == -1 + || (h->got_only_for_calls + ? SYMBOL_CALLS_LOCAL (info, &h->root) + : SYMBOL_REFERENCES_LOCAL (info, &h->root))) + { + /* The symbol belongs in the local GOT. We no longer need this + entry if it was only used for relocations; those relocations + will be against the null or section symbol instead of H. */ if (h->global_got_area != GGA_RELOC_ONLY) g->local_gotno++; h->global_got_area = GGA_NONE; } + else if (htab->is_vxworks + && h->got_only_for_calls + && h->root.plt.offset != MINUS_ONE) + /* On VxWorks, calls can refer directly to the .got.plt entry; + they don't need entries in the regular GOT. .got.plt entries + will be allocated by _bfd_mips_elf_adjust_dynamic_symbol. */ + h->global_got_area = GGA_NONE; else { g->global_gotno++; @@ -4010,7 +4043,7 @@ mips_elf_make_got_per_bfd (void **entryp, void *p) if (entry->tls_type & GOT_TLS_IE) g->tls_gotno += 1; } - else if (entry->symndx >= 0 || entry->d.h->root.forced_local) + else if (entry->symndx >= 0 || entry->d.h->global_got_area == GGA_NONE) ++g->local_gotno; else ++g->global_gotno; @@ -4557,17 +4590,15 @@ mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type, return NULL; } -/* Return whether a relocation is against a local symbol. */ +/* Return whether an input relocation is against a local symbol. */ static bfd_boolean mips_elf_local_relocation_p (bfd *input_bfd, const Elf_Internal_Rela *relocation, - asection **local_sections, - bfd_boolean check_forced) + asection **local_sections) { unsigned long r_symndx; Elf_Internal_Shdr *symtab_hdr; - struct mips_elf_link_hash_entry *h; size_t extsymoff; r_symndx = ELF_R_SYM (input_bfd, relocation->r_info); @@ -4579,20 +4610,6 @@ mips_elf_local_relocation_p (bfd *input_bfd, if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL) return TRUE; - if (check_forced) - { - /* Look up the hash table to check whether the symbol - was forced local. */ - h = (struct mips_elf_link_hash_entry *) - elf_sym_hashes (input_bfd) [r_symndx - extsymoff]; - /* Find the real hash-table entry for this symbol. */ - while (h->root.root.type == bfd_link_hash_indirect - || h->root.root.type == bfd_link_hash_warning) - h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link; - if (h->root.forced_local) - return TRUE; - } - return FALSE; } @@ -4900,7 +4917,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, used in the array of hash table entries. */ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; local_p = mips_elf_local_relocation_p (input_bfd, relocation, - local_sections, FALSE); + local_sections); was_local_p = local_p; if (! elf_bad_symtab (input_bfd)) extsymoff = symtab_hdr->sh_info; @@ -5134,8 +5151,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, || ((r_type == R_MIPS_26 || r_type == R_MIPS_JALR) && target_is_16_bit_code_p)); - local_p = mips_elf_local_relocation_p (input_bfd, relocation, - local_sections, TRUE); + local_p = h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->root); gp0 = _bfd_get_gp_value (input_bfd); gp = _bfd_get_gp_value (abfd); @@ -5145,19 +5161,18 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, if (gnu_local_gp_p) symbol = gp; + /* Global R_MIPS_GOT_PAGE relocations are equivalent to R_MIPS_GOT_DISP. + The addend is applied by the corresponding R_MIPS_GOT_OFST. */ + if (r_type == R_MIPS_GOT_PAGE && !local_p) + { + r_type = R_MIPS_GOT_DISP; + addend = 0; + } + /* If we haven't already determined the GOT offset, oand we're going to need it, get it now. */ switch (r_type) { - case R_MIPS_GOT_PAGE: - case R_MIPS_GOT_OFST: - /* We need to decay to GOT_DISP/addend if the symbol doesn't - bind locally. */ - local_p = local_p || _bfd_elf_symbol_refs_local_p (&h->root, info, 1); - if (local_p || r_type == R_MIPS_GOT_OFST) - break; - /* Fall through. */ - case R_MIPS16_CALL16: case R_MIPS16_GOT16: case R_MIPS_CALL16: @@ -5193,21 +5208,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, } else { - /* GOT_PAGE may take a non-zero addend, that is ignored in a - GOT_PAGE relocation that decays to GOT_DISP because the - symbol turns out to be global. The addend is then added - as GOT_OFST. */ - BFD_ASSERT (addend == 0 || r_type == R_MIPS_GOT_PAGE); + BFD_ASSERT (addend == 0); g = mips_elf_global_got_index (dynobj, input_bfd, &h->root, r_type, info); if (h->tls_type == GOT_NORMAL - && (! elf_hash_table(info)->dynamic_sections_created - || (info->shared - && (info->symbolic || h->root.forced_local) - && h->root.def_regular))) - /* This is a static link or a -Bsymbolic link. The - symbol is defined locally, or was forced to be local. - We must initialize this entry in the GOT. */ + && !elf_hash_table (info)->dynamic_sections_created) + /* This is a static link. We must initialize the GOT entry. */ MIPS_ELF_PUT_WORD (dynobj, symbol, htab->sgot->contents + g); } } @@ -5321,7 +5327,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, mips_elf_perform_relocation. So, we just fall through to the R_MIPS_26 case here. */ case R_MIPS_26: - if (local_p) + if (was_local_p) value = ((addend | ((p + 4) & 0xf0000000)) + symbol) >> 2; else { @@ -5447,12 +5453,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, R_MIPS*_GOT16; every relocation evaluates to "G". */ if (!htab->is_vxworks && local_p) { - bfd_boolean forced; - - forced = ! mips_elf_local_relocation_p (input_bfd, relocation, - local_sections, FALSE); value = mips_elf_got16_entry (abfd, input_bfd, info, - symbol + addend, forced); + symbol + addend, !was_local_p); if (value == MINUS_ONE) return bfd_reloc_outofrange; value @@ -5467,7 +5469,6 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, case R_MIPS_TLS_GOTTPREL: case R_MIPS_TLS_LDM: case R_MIPS_GOT_DISP: - got_disp: value = g; overflowed_p = mips_elf_overflow_p (value, 16); break; @@ -5502,11 +5503,6 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, break; case R_MIPS_GOT_PAGE: - /* GOT_PAGE relocations that reference non-local symbols decay - to GOT_DISP. The corresponding GOT_OFST relocation decays to - 0. */ - if (! local_p) - goto got_disp; value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL); if (value == MINUS_ONE) return bfd_reloc_outofrange; @@ -5757,6 +5753,7 @@ mips_elf_create_dynamic_relocation (bfd *output_bfd, in the relocation. */ if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root)) { + BFD_ASSERT (htab->is_vxworks || h->global_got_area != GGA_NONE); indx = h->root.dynindx; if (SGI_COMPAT (output_bfd)) defined_p = h->root.def_regular; @@ -7679,11 +7676,10 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_MIPS_CALL_LO16: if (h != NULL) { - /* VxWorks call relocations point at the function's .got.plt - entry, which will be allocated by adjust_dynamic_symbol. - Otherwise, this symbol requires a global GOT entry. */ - if ((!htab->is_vxworks || h->forced_local) - && !mips_elf_record_global_got_symbol (h, abfd, info, 0)) + /* Make sure there is room in the regular GOT to hold the + function's address. We may eliminate it in favour of + a .got.plt entry later; see mips_elf_count_got_symbols. */ + if (!mips_elf_record_global_got_symbol (h, abfd, info, TRUE, 0)) return FALSE; /* We need a stub, not a plt entry for the undefined @@ -7743,7 +7739,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, /* Fall through. */ case R_MIPS_GOT_DISP: - if (h && !mips_elf_record_global_got_symbol (h, abfd, info, 0)) + if (h && !mips_elf_record_global_got_symbol (h, abfd, info, + FALSE, 0)) return FALSE; break; @@ -7775,8 +7772,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, (struct mips_elf_link_hash_entry *) h; hmips->tls_type |= flag; - if (h && !mips_elf_record_global_got_symbol (h, abfd, - info, flag)) + if (h && !mips_elf_record_global_got_symbol (h, abfd, info, + FALSE, flag)) return FALSE; } else @@ -7930,6 +7927,10 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, && strcmp (h->root.root.string, "_gp_disp") == 0) break; + /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks. */ + if (is_gott_symbol (info, h)) + break; + /* FALLTHROUGH */ case R_MIPS16_26: @@ -8168,10 +8169,19 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) if (do_copy) { /* Even though we don't directly need a GOT entry for this symbol, - a symbol must have a dynamic symbol table index greater that - DT_MIPS_GOTSYM if there are dynamic relocations against it. */ - if (hmips->global_got_area > GGA_RELOC_ONLY) - hmips->global_got_area = GGA_RELOC_ONLY; + the SVR4 psABI requires it to have a dynamic symbol table + index greater that DT_MIPS_GOTSYM if there are dynamic + relocations against it. + + VxWorks does not enforce the same mapping between the GOT + and the symbol table, so the same requirement does not + apply there. */ + if (!htab->is_vxworks) + { + if (hmips->global_got_area > GGA_RELOC_ONLY) + hmips->global_got_area = GGA_RELOC_ONLY; + hmips->got_only_for_calls = FALSE; + } mips_elf_allocate_dynamic_relocations (dynobj, info, hmips->possibly_dynamic_relocs); @@ -8454,7 +8464,7 @@ mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info) return FALSE; /* Count the number of GOT symbols. */ - mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, g); + mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info); /* Calculate the total loadable size of the output. That will give us the maximum number of GOT_PAGE entries @@ -8913,7 +8923,7 @@ mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info, Elf_Internal_Sym *sym; asection *sec; - if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE)) + if (mips_elf_local_relocation_p (input_bfd, rel, local_sections)) { r_type = ELF_R_TYPE (output_bfd, rel->r_info); if (r_type == R_MIPS16_GPREL @@ -8983,7 +8993,7 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, r_symndx = ELF_R_SYM (input_bfd, rel->r_info); symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE)) + if (mips_elf_local_relocation_p (input_bfd, rel, local_sections)) { sec = local_sections[r_symndx]; h = NULL; @@ -9048,7 +9058,7 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (hi16_reloc_p (r_type) || (got16_reloc_p (r_type) && mips_elf_local_relocation_p (input_bfd, rel, - local_sections, FALSE))) + local_sections))) { if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend, contents, &addend)) @@ -9574,8 +9584,7 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd, /* Run through the global symbol table, creating GOT entries for all the symbols that need them. */ - if (g->global_gotsym != NULL - && h->dynindx >= g->global_gotsym->dynindx) hooks/post-receive -- Repository for Project Archer.