diff options
author | Alan Modra <amodra@gmail.com> | 2010-02-09 12:08:19 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2010-02-09 12:08:19 +0000 |
commit | d77c8a4bbe737a06b9005f8e241102be365ede38 (patch) | |
tree | 1a86e5dbc1ea8dd1d179b8e6e7d8f92108add197 /bfd/elf64-ppc.c | |
parent | d0fae19df2b768f3a3a1462acd52f03b55ec881a (diff) | |
download | gdb-d77c8a4bbe737a06b9005f8e241102be365ede38.zip gdb-d77c8a4bbe737a06b9005f8e241102be365ede38.tar.gz gdb-d77c8a4bbe737a06b9005f8e241102be365ede38.tar.bz2 |
* elf64-ppc.c (has_small_toc_reloc): Don't define.
(makes_toc_func_call, call_check_in_progress): Shuffle flags.
(struct ppc64_elf_obj_tdata): Add has_small_toc_reloc. Update
code setting the flag.
(ppc64_elf_next_toc_section): Group big-toc sections in
0x80008000 chunks.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r-- | bfd/elf64-ppc.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index f44c733..15ccf32 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -2592,6 +2592,10 @@ struct ppc64_elf_obj_tdata /* A copy of relocs before they are modified for --emit-relocs. */ Elf_Internal_Rela *opd_relocs; + + /* Nonzero if this bfd has small toc/got relocs, ie. that expect + the reloc to be in the range -32768 to 32767. */ + unsigned int has_small_toc_reloc; }; #define ppc64_elf_tdata(bfd) \ @@ -3810,16 +3814,12 @@ struct ppc_link_hash_table /* Nonzero if this section has any toc or got relocs. */ #define has_toc_reloc sec_flg2 -/* Nonzero if this section has small toc/got relocs, ie. that expect - the reloc to be in the range -32768 to 32767. */ -#define has_small_toc_reloc sec_flg3 - /* Nonzero if this section has a call to another section that uses the toc or got. */ -#define makes_toc_func_call sec_flg4 +#define makes_toc_func_call sec_flg3 /* Recursion protection when determining above flag. */ -#define call_check_in_progress sec_flg5 +#define call_check_in_progress sec_flg4 /* Get the ppc64 ELF linker hash table from a link_info structure. */ @@ -5023,7 +5023,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, || r_type == R_PPC64_GOT16_DS) { htab->do_multi_toc = 1; - sec->has_small_toc_reloc = 1; + ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1; } if (ppc64_elf_tdata (abfd)->got == NULL @@ -5124,7 +5124,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_PPC64_TOC16: case R_PPC64_TOC16_DS: htab->do_multi_toc = 1; - sec->has_small_toc_reloc = 1; + ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1; case R_PPC64_TOC16_LO: case R_PPC64_TOC16_HI: case R_PPC64_TOC16_HA: @@ -9790,7 +9790,7 @@ bfd_boolean ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec) { struct ppc_link_hash_table *htab = ppc_hash_table (info); - bfd_vma addr, off; + bfd_vma addr, off, limit; if (htab == NULL) return FALSE; @@ -9806,7 +9806,10 @@ ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec) addr = isec->output_offset + isec->output_section->vma; off = addr - htab->toc_curr; - if (off + isec->size > 0x10000) + limit = 0x80008000; + if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc) + limit = 0x10000; + if (off + isec->size > limit) { addr = (htab->toc_first_sec->output_offset + htab->toc_first_sec->output_section->vma); |