This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
RFC: mips STV_PROTECTED bug?
- From: Matt Thomas <matt at 3am-software dot com>
- To: binutils <binutils at sourceware dot org>
- Date: Wed, 29 Feb 2012 09:39:34 -0800
- Subject: RFC: mips STV_PROTECTED bug?
In NetBSD, we recently changed __cerror from being .hidden to .protected and the linker started to generate the following assertions:
mipseb--netbsd/bin/ld: BFD (NetBSD Binutils nb1) 2.21.1 assertion fail [...]/bfd/elfxx-mips.c:3157
mipseb--netbsd/bin/ld: BFD (NetBSD Binutils nb1) 2.21.1 assertion fail [...]/bfd/elfxx-mips.c:3161
This generates the 2nd assert:
.protected __cerror
.abicalls
.global __cerror
.ent __cerror, 0
__cerror:
.frame $29, 0, $31
jr $31
.end __cerror
.global foo
.ent foo, 0
foo:
.frame $29, 0, $31
.set push
.set noreorder
.cpload $25
.set pop
la $25, __cerror
jr $25
.end foo
as -o bug.o bug.s
ld -o bug.so -shared bug.o
I came up with the following patch which seems to do the right thing
but I'm not that familiar with the mips backend so I'm not sure if this
is the right fix. Could someone verify that this is right fix?
Index: elfxx-mips.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-mips.c,v
retrieving revision 1.301
diff -u -p -r1.301 elfxx-mips.c
--- elfxx-mips.c 19 Dec 2011 07:58:00 -0000 1.301
+++ elfxx-mips.c 29 Feb 2012 17:18:56 -0000
@@ -5338,7 +5338,11 @@ mips_elf_calculate_relocation (bfd *abfd
&& (target_is_16_bit_code_p
|| target_is_micromips_code_p))));
- local_p = h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->root);
+ local_p = h == NULL
+ || (h->got_only_for_calls
+ ? SYMBOL_CALLS_LOCAL (info, &h->root)
+ : SYMBOL_REFERENCES_LOCAL (info, &h->root));
+
gp0 = _bfd_get_gp_value (input_bfd);
gp = _bfd_get_gp_value (abfd);