From 4a14403c9fbe855d3aaae73126a3e87001402b4c Mon Sep 17 00:00:00 2001 From: Thiemo Seufer Date: Mon, 1 Jul 2002 10:01:01 +0000 Subject: [PATCH] * elfxx-mips.c (ABI_64_P): Fix comment. (MIPS_ELF_OPTIONS_SECTION_NAME,MIPS_ELF_STUB_SECTION_NAME): Use the new section names for N64 ABI. (mips_elf_output_extsym): No special _gp_disp handling for NewABI. (mips_elf_calculate_relocation): Code formatting. (mips_elf_create_dynamic_relocation): Likewise. (_bfd_mips_elf_fake_sections): IRIX6 needs this hack, too. (_bfd_mips_elf_size_dynamic_sections): Handle GOT_PAGE for any NewABI. (_bfd_mips_elf_relocate_section): No special handling for R_MIPS_64 in any NewABI. (_bfd_mips_elf_finish_dynamic_symbol): No special _gp_disp handling for NewABI. (_bfd_mips_elf_modify_segment_map): Handle any N64 ABI. (_bfd_mips_elf_gc_sweep_hook): NewABI GOT relocs should be handled here, too. --- bfd/ChangeLog | 18 ++++++++++++++++++ bfd/elfxx-mips.c | 41 ++++++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f1f83f7b68f..89d813c7f46 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,21 @@ +2002-07-01 Thiemo Seufer + + * elfxx-mips.c (ABI_64_P): Fix comment. + (MIPS_ELF_OPTIONS_SECTION_NAME,MIPS_ELF_STUB_SECTION_NAME): Use the + new section names for N64 ABI. + (mips_elf_output_extsym): No special _gp_disp handling for NewABI. + (mips_elf_calculate_relocation): Code formatting. + (mips_elf_create_dynamic_relocation): Likewise. + (_bfd_mips_elf_fake_sections): IRIX6 needs this hack, too. + (_bfd_mips_elf_size_dynamic_sections): Handle GOT_PAGE for any NewABI. + (_bfd_mips_elf_relocate_section): No special handling for R_MIPS_64 + in any NewABI. + (_bfd_mips_elf_finish_dynamic_symbol): No special _gp_disp handling + for NewABI. + (_bfd_mips_elf_modify_segment_map): Handle any N64 ABI. + (_bfd_mips_elf_gc_sweep_hook): NewABI GOT relocs should be handled + here, too. + 2002-07-01 Andreas Schwab * elf64-x86-64.c (elf64_x86_64_relocate_section): Only convert diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index bbcce619521..7b3bcc65bfa 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -373,26 +373,28 @@ static bfd *reldyn_sorting_bfd; #define ABI_N32_P(abfd) \ ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0) -/* Nonzero if ABFD is using the 64-bit ABI. */ +/* Nonzero if ABFD is using the N64 ABI. */ #define ABI_64_P(abfd) \ ((get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64) != 0) +/* Nonzero if ABFD is using NewABI conventions. */ +#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd)) + +/* The IRIX compatibility level we are striving for. */ #define IRIX_COMPAT(abfd) \ (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd)) -#define NEWABI_P(abfd) (ABI_N32_P(abfd) || ABI_64_P(abfd)) - /* Whether we are trying to be compatible with IRIX at all. */ #define SGI_COMPAT(abfd) \ (IRIX_COMPAT (abfd) != ict_none) /* The name of the options section. */ #define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \ - (IRIX_COMPAT (abfd) == ict_irix6 ? ".MIPS.options" : ".options") + (ABI_64_P (abfd) ? ".MIPS.options" : ".options") /* The name of the stub section. */ #define MIPS_ELF_STUB_SECTION_NAME(abfd) \ - (IRIX_COMPAT (abfd) == ict_irix6 ? ".MIPS.stubs" : ".stub") + (ABI_64_P (abfd) ? ".MIPS.stubs" : ".stub") /* The size of an external REL relocation. */ #define MIPS_ELF_REL_SIZE(abfd) \ @@ -1242,7 +1244,7 @@ mips_elf_output_extsym (h, data) h->esym.asym.value = mips_elf_hash_table (einfo->info)->procedure_count; } - else if (strcmp (name, "_gp_disp") == 0) + else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd)) { h->esym.asym.sc = scAbs; h->esym.asym.st = stLabel; @@ -2473,8 +2475,7 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info, return bfd_reloc_outofrange; value = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj, - abfd, - value); + abfd, value); overflowed_p = mips_elf_overflow_p (value, 16); break; } @@ -2516,8 +2517,7 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info, if (value == MINUS_ONE) return bfd_reloc_outofrange; value = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj, - abfd, - value); + abfd, value); overflowed_p = mips_elf_overflow_p (value, 16); break; @@ -2830,8 +2830,7 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec, r_type = ELF_R_TYPE (output_bfd, rel->r_info); dynobj = elf_hash_table (info)->dynobj; - sreloc - = bfd_get_section_by_name (dynobj, ".rel.dyn"); + sreloc = bfd_get_section_by_name (dynobj, ".rel.dyn"); BFD_ASSERT (sreloc != NULL); BFD_ASSERT (sreloc->contents != NULL); BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd) @@ -3641,7 +3640,8 @@ _bfd_mips_elf_fake_sections (abfd, hdr, sec) sh_offset == object size, and ld doesn't allow that. While the check is arguably bogus for empty or SHT_NOBITS sections, it can easily be avoided by not emitting those useless sections in the first place. */ - if (IRIX_COMPAT (abfd) != ict_irix5 && (sec->flags & SEC_RELOC) != 0) + if ((IRIX_COMPAT (abfd) != ict_irix5 && (IRIX_COMPAT (abfd) != ict_irix6)) + && (sec->flags & SEC_RELOC) != 0) { struct bfd_elf_section_data *esd; bfd_size_type amt = sizeof (Elf_Internal_Shdr); @@ -4769,7 +4769,7 @@ _bfd_mips_elf_size_dynamic_sections (output_bfd, info) /* Assume there are two loadable segments consisting of contiguous sections. Is 5 enough? */ local_gotno = (loadable_size >> 16) + 5; - if (IRIX_COMPAT (output_bfd) == ict_irix6) + if (NEWABI_P (output_bfd)) /* It's possible we will need GOT_PAGE entries as well as GOT16 entries. Often, these will be able to share GOT entries, but not always. */ @@ -5004,7 +5004,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, const char * msg = (const char *) NULL; /* Find the relocation howto for this relocation. */ - if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd)) + if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd)) { /* Some 32-bit code uses R_MIPS_64. In particular, people use 64-bit code, but make sure all their addresses are in the @@ -5121,7 +5121,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, Elf_Internal_Sym *sym; unsigned long r_symndx; - if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd) + if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd) && bfd_big_endian (input_bfd)) rel->r_offset -= 4; @@ -5297,7 +5297,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, continue; } - if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd)) + if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)) /* See the comment above about using R_MIPS_64 in the 32-bit ABI. Until now, we've been using the HOWTO for R_MIPS_32; that calculated the right value. Now, however, we @@ -5525,7 +5525,7 @@ _bfd_mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym) sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION); sym->st_value = 1; } - else if (strcmp (name, "_gp_disp") == 0) + else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd)) { sym->st_shndx = SHN_ABS; sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION); @@ -6105,7 +6105,7 @@ _bfd_mips_elf_modify_segment_map (abfd) .dynamic end up in PT_DYNAMIC. However, we do have to insert a PT_OPTIONS segement immediately following the program header table. */ - if (IRIX_COMPAT (abfd) == ict_irix6) + if (ABI_64_P (abfd)) { for (s = abfd->sections; s; s = s->next) if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS) @@ -6343,6 +6343,9 @@ _bfd_mips_elf_gc_sweep_hook (abfd, info, sec, relocs) case R_MIPS_CALL_LO16: case R_MIPS_GOT_HI16: case R_MIPS_GOT_LO16: + case R_MIPS_GOT_DISP: + case R_MIPS_GOT_PAGE: + case R_MIPS_GOT_OFST: /* ??? It would seem that the existing MIPS code does no sort of reference counting or whatnot on its GOT and PLT entries, so it is not possible to garbage collect them at this time. */ -- 2.30.2