This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: linker crash in arm stub generation
Hi Phil and Nick,
On 12.06.2009 14:35, Nick Clifton wrote:
Hi Phil,
This testcase causes the linker (CVS head from a couple of days ago,
arm-linuxgnueabi target) to segfault in arm_build_one_stub():
Please could you open a bug report for this bug ?
Once you have done that, please try out this patch which I think should
solve the problem.
I think your patch is not adequate: it will prevent the stub code from
being generated, but the user code will still jump to the stub. So the
link won't fail, but the result will be wrong.
Instead, I propose this patch, which prevents mode-switching stub
generation when the call goes through a PLT entry.
I think there should already be a test for this in the testsuite, I have
probably forgotten this configuration.
Christophe.
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.196
diff -p -c -u -r1.196 elf32-arm.c
--- bfd/elf32-arm.c 22 May 2009 11:58:44 -0000 1.196
+++ bfd/elf32-arm.c 12 Jun 2009 13:18:20 -0000
@@ -3175,11 +3175,15 @@ arm_type_of_stub (struct bfd_link_info *
/* We have an extra 2-bytes reach because of
the mode change (bit 24 (H) of BLX encoding). */
+ /* A stub is needed only if this call is not throught a PLT
+ entry, because PLT stubs handle mode switching
+ already. */
if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
|| (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
- || ((r_type == R_ARM_CALL) && !globals->use_blx)
- || (r_type == R_ARM_JUMP24)
- || (r_type == R_ARM_PLT32))
+ || ( (((r_type == R_ARM_CALL) && !globals->use_blx)
+ || (r_type == R_ARM_JUMP24)
+ || (r_type == R_ARM_PLT32))
+ && !use_plt))
{
stub_type = (info->shared | globals->pic_veneer)
/* PIC stubs. */