This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: linker crash in arm stub generation


Oops! I forgot to attach the patch, sorry.


On 18.06.2009 16:23, Christophe LYON wrote:
Hi,

After a bit more work, I am able to propose a new patch for this issue.
I have enriched the tests to be sure to check calls inside shared libs to defined/undefined and ARM/Thumb symbols.


Checked with arm-none-eabi and arm-linux-gnueabi with no regression.

Christophe.




2009-06-18  Christophe Lyon  <christophe.lyon@st.com>

	bfd/
	* elf32-arm.c (elf32_arm_size_stubs): Use PLT address as
	destination for defined dynamic symbols when deciding whether to
	insert a stub or not.
	(allocate_dynrelocs): Make sure functions are not marked as Thumb
	when actually accessed through a PLT, even when generating a
	shared lib.

	ld/testsuite:
	* ld-arm/farcall-mixed-app.s: Add new references to check more
	modes switching.
	* ld-arm/farcall-mixed-lib1.s: Likewise.
	* ld-arm/farcall-mixed-app-v5.d: Update expected result.
	* farcall-mixed-app.d: Likewise.
	* ld-arm/farcall-mixed-lib.d: Likewise.
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.200
diff -u -p -r1.200 elf32-arm.c
--- bfd/elf32-arm.c	17 Jun 2009 18:08:34 -0000	1.200
+++ bfd/elf32-arm.c	18 Jun 2009 14:12:33 -0000
@@ -4361,7 +4361,25 @@ elf32_arm_size_stubs (bfd *output_bfd,
 			{
 			  sym_sec = hash->root.root.u.def.section;
 			  sym_value = hash->root.root.u.def.value;
-			  if (sym_sec->output_section != NULL)
+
+			  struct elf32_arm_link_hash_table *globals =
+						  elf32_arm_hash_table (info);
+
+			  /* For a destination in a shared library,
+			     use the PLT stub as target address to
+			     decide whether a branch stub is
+			     needed.  */
+			  if (globals->splt != NULL && hash != NULL
+			      && hash->root.plt.offset != (bfd_vma) -1)
+			    {
+			      sym_sec = globals->splt;
+			      sym_value = hash->root.plt.offset;
+			      if (sym_sec->output_section != NULL)
+				destination = (sym_value
+					       + sym_sec->output_offset
+					       + sym_sec->output_section->vma);
+			    }
+			  else if (sym_sec->output_section != NULL)
 			    destination = (sym_value + irela->r_addend
 					   + sym_sec->output_offset
 					   + sym_sec->output_section->vma);
@@ -11273,14 +11291,14 @@ allocate_dynrelocs (struct elf_link_hash
 	    {
 	      h->root.u.def.section = s;
 	      h->root.u.def.value = h->plt.offset;
-
-	      /* Make sure the function is not marked as Thumb, in case
-		 it is the target of an ABS32 relocation, which will
-		 point to the PLT entry.  */
-	      if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
-		h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
 	    }
 
+	  /* Make sure the function is not marked as Thumb, in case
+	     it is the target of an ABS32 relocation, which will
+	     point to the PLT entry.  */
+	  if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
+	    h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
+
 	  /* Make room for this entry.  */
 	  s->size += htab->plt_entry_size;
 
Index: ld/testsuite/ld-arm/farcall-mixed-app-v5.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mixed-app-v5.d,v
retrieving revision 1.1
diff -u -p -r1.1 farcall-mixed-app-v5.d
--- ld/testsuite/ld-arm/farcall-mixed-app-v5.d	5 Mar 2009 17:28:21 -0000	1.1
+++ ld/testsuite/ld-arm/farcall-mixed-app-v5.d	18 Jun 2009 14:12:36 -0000
@@ -25,11 +25,11 @@ Disassembly of section .text:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
  .*:	eb000008 	bl	.* <__app_func_veneer>
+ .*:	ebfffff8 	bl	.* <_start-0xc>
+ .*:	ebfffff4 	bl	.* <_start-0x18>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
  .*:	e1a00000 	nop			\(mov r0,r0\)
- .*:	e1a00000 	nop			\(mov r0,r0\)
- .*:	e1a00000 	nop			\(mov r0,r0\)
 
 .* <app_tfunc_close>:
  .*:	b500      	push	{lr}
@@ -49,12 +49,12 @@ Disassembly of section .far_arm:
 .* <app_func>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	eb000008 	bl	.* <__lib_func1_veneer>
+ .*:	eb00000a 	bl	.* <__lib_func1_veneer>
+ .*:	eb000007 	bl	.* <__lib_func2_veneer>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
  .*:	e1a00000 	nop			\(mov r0,r0\)
  .*:	e1a00000 	nop			\(mov r0,r0\)
- .*:	e1a00000 	nop			\(mov r0,r0\)
 
 .* <app_func2>:
  .*:	e12fff1e 	bx	lr
@@ -62,8 +62,11 @@ Disassembly of section .far_arm:
  .*:	e1a00000 	nop			\(mov r0,r0\)
  .*:	e1a00000 	nop			\(mov r0,r0\)
 
+.* <__lib_func2_veneer>:
+ .*:	e51ff004 	ldr	pc, \[pc, #-4\]	; 2100034 <__lib_func2_veneer\+0x4>
+ .*:	00008218 	.word	0x00008218
 .* <__lib_func1_veneer>:
- .*:	e51ff004 	ldr	pc, \[pc, #-4\]	; 2100034 <__lib_func1_veneer\+0x4>
+ .*:	e51ff004 	ldr	pc, \[pc, #-4\]	; 210003c <__lib_func1_veneer\+0x4>
  .*:	00008224 	.word	0x00008224
 
 Disassembly of section .far_thumb:
Index: ld/testsuite/ld-arm/farcall-mixed-app.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mixed-app.d,v
retrieving revision 1.1
diff -u -p -r1.1 farcall-mixed-app.d
--- ld/testsuite/ld-arm/farcall-mixed-app.d	5 Mar 2009 17:28:21 -0000	1.1
+++ ld/testsuite/ld-arm/farcall-mixed-app.d	18 Jun 2009 14:12:36 -0000
@@ -27,11 +27,11 @@ Disassembly of section .text:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
  .*:	eb000008 	bl	.* <__app_func_veneer>
+ .*:	ebfffff5 	bl	.* <_start-0x18>
+ .*:	ebfffff1 	bl	.* <_start-0x24>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
  .*:	e1a00000 	nop			\(mov r0,r0\)
- .*:	e1a00000 	nop			\(mov r0,r0\)
- .*:	e1a00000 	nop			\(mov r0,r0\)
 
 .* <app_tfunc_close>:
  .*:	b500      	push	{lr}
@@ -51,12 +51,12 @@ Disassembly of section .far_arm:
 .* <app_func>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	eb000008 	bl	.* <__lib_func1_veneer>
+ .*:	eb00000a 	bl	.* <__lib_func1_veneer>
+ .*:	eb000007 	bl	.* <__lib_func2_veneer>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
  .*:	e1a00000 	nop			\(mov r0,r0\)
  .*:	e1a00000 	nop			\(mov r0,r0\)
- .*:	e1a00000 	nop			\(mov r0,r0\)
 
 .* <app_func2>:
  .*:	e12fff1e 	bx	lr
@@ -64,8 +64,11 @@ Disassembly of section .far_arm:
  .*:	e1a00000 	nop			\(mov r0,r0\)
  .*:	e1a00000 	nop			\(mov r0,r0\)
 
+.* <__lib_func2_veneer>:
+ .*:	e51ff004 	ldr	pc, \[pc, #-4\]	; 2100034 <__lib_func2_veneer\+0x4>
+ .*:	0000821c 	.word	0x0000821c
 .* <__lib_func1_veneer>:
- .*:	e51ff004 	ldr	pc, \[pc, #-4\]	; 2100034 <__lib_func1_veneer\+0x4>
+ .*:	e51ff004 	ldr	pc, \[pc, #-4\]	; 210003c <__lib_func1_veneer\+0x4>
  .*:	00008228 	.word	0x00008228
 
 Disassembly of section .far_thumb:
Index: ld/testsuite/ld-arm/farcall-mixed-app.s
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mixed-app.s,v
retrieving revision 1.1
diff -u -p -r1.1 farcall-mixed-app.s
--- ld/testsuite/ld-arm/farcall-mixed-app.s	5 Mar 2009 17:28:21 -0000	1.1
+++ ld/testsuite/ld-arm/farcall-mixed-app.s	18 Jun 2009 14:12:36 -0000
@@ -5,6 +5,8 @@ _start:
 	mov	ip, sp
 	stmdb	sp!, {r11, ip, lr, pc}
 	bl	app_func
+	bl	lib_func1
+	bl	lib_func2
 	ldmia	sp, {r11, sp, lr}
 	bx lr
 
@@ -30,6 +32,7 @@ app_func:
 	mov	ip, sp
 	stmdb	sp!, {r11, ip, lr, pc}
 	bl	lib_func1
+	bl	lib_func2
 	ldmia	sp, {r11, sp, lr}
 	bx lr
 
Index: ld/testsuite/ld-arm/farcall-mixed-lib.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mixed-lib.d,v
retrieving revision 1.3
diff -u -p -r1.3 farcall-mixed-lib.d
--- ld/testsuite/ld-arm/farcall-mixed-lib.d	21 Apr 2009 22:05:04 -0000	1.3
+++ ld/testsuite/ld-arm/farcall-mixed-lib.d	18 Jun 2009 14:12:36 -0000
@@ -17,6 +17,13 @@ Disassembly of section .plt:
  .*:	e28fc6.* 	add	ip, pc, #.*	; 0x.*
  .*:	e28cca.* 	add	ip, ip, #.*	; 0x.*
  .*:	e5bcf.* 	ldr	pc, \[ip, #.*\]!
+ .*:	e28fc6.* 	add	ip, pc, #.*	; 0x.*
+ .*:	e28cca.* 	add	ip, ip, #.*	; 0x.*
+ .*:	e5bcf.* 	ldr	pc, \[ip, #.*\]!
+ .*:	e28fc6.* 	add	ip, pc, #.*	; 0x.*
+ .*:	e28cca.* 	add	ip, ip, #.*	; 0x.*
+ .*:	e5bcf.* 	ldr	pc, \[ip, #.*\]!
+
 Disassembly of section .text:
 
 .* <lib_func1>:
@@ -24,46 +31,62 @@ Disassembly of section .text:
  .*:	e92dd800 	push	{fp, ip, lr, pc}
  .*:	ebfffff. 	bl	.* <lib_func1-0x..?>
  .*:	ebfffff. 	bl	.* <lib_func1-0x..?>
+ .*:	ebfffff. 	bl	.* <lib_func1-0x..?>
+ .*:	ebfffff. 	bl	.* <lib_func1-0x..?>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
 	...
- .*:	e1a00000 	.word	0xe1a00000
- .*:	e1a00000 	.word	0xe1a00000
 
 .* <lib_func2>:
- .*:	f000 e806 	blx	1000300 <__app_func_from_thumb>
- .*:	f000 e80a 	blx	100030c <__app_func_weak_from_thumb>
+ .*:	f000 e80e 	blx	1000350 <__app_func_from_thumb>
+ .*:	f000 e818 	blx	1000368 <__app_func_weak_from_thumb>
+ .*:	f000 e810 	blx	100035c <__lib_func3_from_thumb>
+ .*:	f000 e81a 	blx	1000374 <__lib_func4_from_thumb>
  .*:	4770      	bx	lr
  .*:	46c0      	nop			\(mov r8, r8\)
  .*:	46c0      	nop			\(mov r8, r8\)
  .*:	46c0      	nop			\(mov r8, r8\)
+ .*:	46c0      	nop			\(mov r8, r8\)
+ .*:	46c0      	nop			\(mov r8, r8\)
+ .*:	46c0      	nop			\(mov r8, r8\)
+ .*:	46c0      	nop			\(mov r8, r8\)
 
 .* <__app_func_from_thumb>:
- .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 1000308 <__app_func_from_thumb\+0x8>
+ .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 1000358 <__app_func_from_thumb\+0x8>
+ .*:	e08ff00c 	add	pc, pc, ip
+ .*:	feffff84 	.word	0xfeffff84
+
+.* <__lib_func3_from_thumb>:
+ .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 1000364 <__lib_func3_from_thumb\+0x8>
  .*:	e08ff00c 	add	pc, pc, ip
- .*:	feffffa8 	.word	0xfeffffa8
+ .*:	feffff90 	.word	0xfeffff90
 
 .* <__app_func_weak_from_thumb>:
- .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 1000314 <__app_func_weak_from_thumb\+0x8>
+ .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 1000370 <__app_func_weak_from_thumb\+0x8>
+ .*:	e08ff00c 	add	pc, pc, ip
+ .*:	feffff78 	.word	0xfeffff78
+
+.* <__lib_func4_from_thumb>:
+ .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 100037c <__lib_func4_from_thumb\+0x8>
  .*:	e08ff00c 	add	pc, pc, ip
- .*:	feffffa8 	.word	0xfeffffa8
+ .*:	feffff84 	.word	0xfeffff84
 	...
 
 .* <lib_func3>:
- .*:	f000 e80c 	blx	200033c <__app_func_from_thumb>
- .*:	f000 e804 	blx	2000330 <__app_func_weak_from_thumb>
+ .*:	f000 e80c 	blx	20003ac <__app_func_from_thumb>
+ .*:	f000 e804 	blx	20003a0 <__app_func_weak_from_thumb>
  .*:	4770      	bx	lr
  .*:	46c0      	nop			\(mov r8, r8\)
  .*:	46c0      	nop			\(mov r8, r8\)
  .*:	46c0      	nop			\(mov r8, r8\)
 
 .* <__app_func_weak_from_thumb>:
- .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 2000338 <__app_func_weak_from_thumb\+0x8>
+ .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 20003a8 <__app_func_weak_from_thumb\+0x8>
  .*:	e08ff00c 	add	pc, pc, ip
- .*:	fdffff84 	.word	0xfdffff84
+ .*:	fdffff40 	.word	0xfdffff40
 
 .* <__app_func_from_thumb>:
- .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 2000344 <__app_func_from_thumb\+0x8>
+ .*:	e59fc000 	ldr	ip, \[pc, #0\]	; 20003b4 <__app_func_from_thumb\+0x8>
  .*:	e08ff00c 	add	pc, pc, ip
- .*:	fdffff6c 	.word	0xfdffff6c
+ .*:	fdffff28 	.word	0xfdffff28
 	...
Index: ld/testsuite/ld-arm/farcall-mixed-lib1.s
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mixed-lib1.s,v
retrieving revision 1.1
diff -u -p -r1.1 farcall-mixed-lib1.s
--- ld/testsuite/ld-arm/farcall-mixed-lib1.s	17 Apr 2009 13:04:41 -0000	1.1
+++ ld/testsuite/ld-arm/farcall-mixed-lib1.s	18 Jun 2009 14:12:36 -0000
@@ -14,6 +14,8 @@ lib_func1:
 	bl	app_func
 	.weak	app_func_weak
 	bl	app_func_weak
+	bl	lib_func3
+	bl	lib_func4
 	ldmia	sp, {r11, sp, lr}
 	bx lr
 	.size lib_func1, . - lib_func1
@@ -27,5 +29,7 @@ lib_func1:
 lib_func2:
 	bl	app_func
 	bl	app_func_weak
+	bl	lib_func3
+	bl	lib_func4
 	bx lr
 	.size lib_func2, . - lib_func2

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]