diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-08-01 20:58:19 +0000 |
---|---|---|
committer | Mark Mitchell <mark@codesourcery.com> | 1999-08-01 20:58:19 +0000 |
commit | 972875741c90668bcb6d0f5f78ffdc3f89d4ec19 (patch) | |
tree | f502497d7cc9dc8fe1060c9cd8d45701e2ed2f70 /bfd/elf32-mips.c | |
parent | a11c78e7ddcbb5b7c6d703334a3e5a5cabf1919d (diff) | |
download | gdb-972875741c90668bcb6d0f5f78ffdc3f89d4ec19.zip gdb-972875741c90668bcb6d0f5f78ffdc3f89d4ec19.tar.gz gdb-972875741c90668bcb6d0f5f78ffdc3f89d4ec19.tar.bz2 |
* 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.
Diffstat (limited to 'bfd/elf32-mips.c')
-rw-r--r-- | bfd/elf32-mips.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index b5596bd..6cf85c8 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -5870,6 +5870,12 @@ mips_elf_calculate_relocation (abfd, else 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 { (*info->callbacks->undefined_symbol) @@ -6637,8 +6643,10 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, case bfd_reloc_undefined: /* mips_elf_calculate_relocation already called the - undefined_symbol callback. */ - break; + undefined_symbol callback. There's no real point in + trying to perform the relocation at this point, so we + just skip ahead to the next relocation. */ + continue; case bfd_reloc_notsupported: abort (); @@ -7331,14 +7339,15 @@ _bfd_mips_elf_check_relocs (abfd, info, sec, relocs) if (!h && (r_type == R_MIPS_CALL_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 - don't count R_MIPS_HI16 or R_MIPS_GOT16 relocations - because they are always followed by a R_MIPS_LO16 - relocation for the value. We don't R_MIPS_GOT_PAGE - because we can estimate the maximum number of pages - needed by looking at the size of the segment. + don't count R_MIPS_GOT_PAGE because we can estimate the + maximum number of pages needed by looking at the size of + the segment. We don't count R_MIPS_GOT_HI16, or + R_MIPS_CALL_HI16 because these are always followed by an + R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. This estimation is very conservative since we can merge duplicate entries in the GOT. In order to be less |