* elf32-mips.c (mips_elf_calculate_relocation): Undefined weak

symbols are considered to have the value zero.
	(_bfd_mips_elf_relocate_section): Don't try to perform a
	relocation for an undefined symbol.
	(_bfd_mips_elf_check_relocs): Allocate locate GOT space for local
	GOT16 relocations.
This commit is contained in:
Mark Mitchell
1999-08-01 20:58:19 +00:00
parent a11c78e7dd
commit 972875741c
2 changed files with 26 additions and 8 deletions

View File

@ -1,3 +1,12 @@
1999-08-01 Mark Mitchell <mark@codesourcery.com>
* elf32-mips.c (mips_elf_calculate_relocation): Undefined weak
symbols are considered to have the value zero.
(_bfd_mips_elf_relocate_section): Don't try to perform a
relocation for an undefined symbol.
(_bfd_mips_elf_check_relocs): Allocate locate GOT space for local
GOT16 relocations.
1999-07-30 Jakub Jelinek <jj@ultra.linux.cz> 1999-07-30 Jakub Jelinek <jj@ultra.linux.cz>
* elf64-sparc.c (sparc64_elf_build_plt): Cosmetic change - ABI * elf64-sparc.c (sparc64_elf_build_plt): Cosmetic change - ABI

View File

@ -5870,6 +5870,12 @@ mips_elf_calculate_relocation (abfd,
else else
symbol = h->root.root.u.def.value; symbol = h->root.root.u.def.value;
} }
else if (h->root.root.type == bfd_link_hash_undefweak)
/* We allow relocations against undefined weak symbols, giving
it the value zero, so that you can undefined weak functions
and check to see if they exist by looking at their
addresses. */
symbol = 0;
else else
{ {
(*info->callbacks->undefined_symbol) (*info->callbacks->undefined_symbol)
@ -6637,8 +6643,10 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
case bfd_reloc_undefined: case bfd_reloc_undefined:
/* mips_elf_calculate_relocation already called the /* mips_elf_calculate_relocation already called the
undefined_symbol callback. */ undefined_symbol callback. There's no real point in
break; trying to perform the relocation at this point, so we
just skip ahead to the next relocation. */
continue;
case bfd_reloc_notsupported: case bfd_reloc_notsupported:
abort (); abort ();
@ -7331,14 +7339,15 @@ _bfd_mips_elf_check_relocs (abfd, info, sec, relocs)
if (!h && (r_type == R_MIPS_CALL_LO16 if (!h && (r_type == R_MIPS_CALL_LO16
|| r_type == R_MIPS_GOT_LO16 || r_type == R_MIPS_GOT_LO16
|| r_type == R_MIPS_GOT_DISP)) || r_type == R_MIPS_GOT_DISP
|| r_type == R_MIPS_GOT16))
{ {
/* We may need a local GOT entry for this relocation. We /* We may need a local GOT entry for this relocation. We
don't count R_MIPS_HI16 or R_MIPS_GOT16 relocations don't count R_MIPS_GOT_PAGE because we can estimate the
because they are always followed by a R_MIPS_LO16 maximum number of pages needed by looking at the size of
relocation for the value. We don't R_MIPS_GOT_PAGE the segment. We don't count R_MIPS_GOT_HI16, or
because we can estimate the maximum number of pages R_MIPS_CALL_HI16 because these are always followed by an
needed by looking at the size of the segment. R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16.
This estimation is very conservative since we can merge This estimation is very conservative since we can merge
duplicate entries in the GOT. In order to be less duplicate entries in the GOT. In order to be less