From 21d790b94321db1f489df1e51b97e0a7377e7b24 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Thu, 4 Nov 2010 18:00:54 +0000 Subject: PR ld/10144 * elfxx-mips.c (_bfd_mips_elf_check_relocs) [R_MIPS_32, R_MIPS_REL32, R_MIPS_64]: Ignore relocs from SEC_DEBUGGING sections. --- bfd/elfxx-mips.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'bfd/elfxx-mips.c') diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index bed8ed1..4718dd4 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -7583,6 +7583,25 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, elf_hash_table (info)->dynobj = dynobj = abfd; break; } + /* For sections that are not SEC_ALLOC a copy reloc would be + output if possible (implying questionable semantics for + read-only data objects) or otherwise the final link would + fail as ld.so will not process them and could not therefore + handle any outstanding dynamic relocations. + + For such sections that are also SEC_DEBUGGING, we can avoid + these problems by simply ignoring any relocs as these + sections have a predefined use and we know it is safe to do + so. + + This is needed in cases such as a global symbol definition + in a shared library causing a common symbol from an object + file to be converted to an undefined reference. If that + happens, then all the relocations against this symbol from + SEC_DEBUGGING sections in the object file will resolve to + nil. */ + if ((sec->flags & SEC_DEBUGGING) != 0) + break; /* Fall through. */ default: -- cgit v1.1