ARM: Fix generation of older veneers

Daniel Jacobowitz drow@false.org
Thu Mar 19 20:10:00 GMT 2009


We've encountered a couple of cases where the linker would generate a
__foo_from_arm stub that was zeroed out.

Nathan Sidwell discovered that the ARM linker backend found the file
containing the last section in the link and added glue sections there.
Actually it adds the glue sections to every input file, but it only
uses the copy it adds to that last file - leading to lots of noise in
map files - but that's not the bug.

This scheme doesn't always work because they get attached to an output
section and written out along with the rest of that output section.
So by the time we are done filling in trampolines we might have
already written them out.  They are never written out again.

I'm not sure why we never used to have this problem.  I suspect that
link order was perturbed by some other linker change in the past year.
Maybe the new stubs file; I don't know.

This patch puts those glue sections into the new stub file used by
long call veneers.  They are now marked SEC_LINKER_CREATED and they
are not in the dynobj (which might not be set) so they are
not output by the common code in the ELF linker.  So we add an
elf32_arm_final_link to write them.

This caused changes to the order of veneers (I do not really
understand why, but I've had this problem before).  It also
necessitated a workaround in the EABI object attribute merging code;
I'll start a separate discussion about that.  I've tested this on
arm-none-eabi with the binutils testsuites, and on our local tree with
complete toolchain testing too.

Any comments on this patch?

-- 
Daniel Jacobowitz
CodeSourcery

2009-03-18  Daniel Jacobowitz  <dan@codesourcery.com>

	ld/
	* emultempl/armelf.em (bfd_for_interwork, arm_elf_after_open)
	(arm_elf_set_bfd_for_interworking): Delete.
	(arm_elf_before_allocation): Do not set the interworking BFD.
	Move allocation inside not-dynamic block.
	(arm_elf_create_output_section_statements): Create glue sections
	and set the interworking BFD here.
	(LDEMUL_AFTER_OPEN): Delete.

	ld/testsuite/
	* ld-arm/farcall-mix.d, ld-arm/farcall-mix2.d,
	ld-arm/farcall-group-size2.d, ld-arm/farcall-group.d: Update for
	linker changes.

	bfd/
	* elf32-arm.c (elf32_arm_write_section): Declare early.
	(elf32_arm_size_stubs): Skip non-stub sections in the stub BFD.
	(arm_allocate_glue_section_space): Exclude empty sections.
	(ARM_GLUE_SECTION_FLAGS): Add SEC_LINKER_CREATED.
	(bfd_elf32_arm_add_glue_sections_to_bfd): Do not skip the stub
	BFD.
	(elf32_arm_output_glue_section, elf32_arm_final_link): New.
	(elf32_arm_merge_eabi_attributes): Skip the stub BFD.
	(elf32_arm_size_dynamic_sections): Allocate interworking
	sections here.
	(bfd_elf32_bfd_final_link): Define.

Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.182
diff -u -p -r1.182 elf32-arm.c
--- bfd/elf32-arm.c	17 Mar 2009 14:50:48 -0000	1.182
+++ bfd/elf32-arm.c	19 Mar 2009 20:05:30 -0000
@@ -61,6 +61,11 @@
 
 static struct elf_backend_data elf32_arm_vxworks_bed;
 
+static bfd_boolean elf32_arm_write_section (bfd *output_bfd,
+					    struct bfd_link_info *link_info,
+					    asection *sec,
+					    bfd_byte *contents);
+
 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
    R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
    in that slot.  */
@@ -3905,7 +3910,13 @@ elf32_arm_size_stubs (bfd *output_bfd,
       for (stub_sec = htab->stub_bfd->sections;
 	   stub_sec != NULL;
 	   stub_sec = stub_sec->next)
-	stub_sec->size = 0;
+	{
+	  /* Ignore non-stub sections.  */
+	  if (!strstr (stub_sec->name, STUB_SUFFIX))
+	    continue;
+
+	  stub_sec->size = 0;
+	}
 
       bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
 
@@ -4103,7 +4114,16 @@ arm_allocate_glue_section_space (bfd * a
   bfd_byte * contents;
 
   if (size == 0)
-    return;
+    {
+      /* Do not include empty glue sections in the output.  */
+      if (abfd != NULL)
+	{
+	  s = bfd_get_section_by_name (abfd, name);
+	  if (s != NULL)
+	    s->flags |= SEC_EXCLUDE;
+	}
+      return;
+    }
 
   BFD_ASSERT (abfd != NULL);
 
@@ -4505,11 +4525,9 @@ record_vfp11_erratum_veneer (struct bfd_
   return val;
 }
 
-/* Note: we do not include the flag SEC_LINKER_CREATED, as that
-   would prevent elf_link_input_bfd() from processing the contents
-   of the section.  */
 #define ARM_GLUE_SECTION_FLAGS \
-  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY)
+  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE \
+   | SEC_READONLY | SEC_LINKER_CREATED)
 
 /* Create a fake section for use by the ARM backend of the linker.  */
 
@@ -4548,10 +4566,6 @@ bfd_elf32_arm_add_glue_sections_to_bfd (
   if (info->relocatable)
     return TRUE;
 
-  /* Linker stubs don't need glue.  */
-  if (!strcmp (abfd->filename, "linker stubs"))
-    return TRUE;
-
   return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
     && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
     && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
@@ -8191,6 +8205,64 @@ elf32_arm_relocate_section (bfd *       
   return TRUE;
 }
 
+static bfd_boolean
+elf32_arm_output_glue_section (struct bfd_link_info *info, bfd *obfd,
+			       bfd *ibfd, const char *name)
+{
+  asection *sec, *osec;
+
+  sec = bfd_get_section_by_name (ibfd, name);
+  if (sec == NULL || (sec->flags & SEC_EXCLUDE) != 0)
+    return TRUE;
+
+  osec = sec->output_section;
+  if (elf32_arm_write_section (obfd, info, sec, sec->contents))
+    return TRUE;
+
+  if (! bfd_set_section_contents (obfd, osec, sec->contents,
+				  sec->output_offset, sec->size))
+    return FALSE;
+
+  return TRUE;
+}
+
+static bfd_boolean
+elf32_arm_final_link (bfd *abfd, struct bfd_link_info *info)
+{
+  struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
+
+  /* Invoke the regular ELF backend linker to do all the work.  */
+  if (!bfd_elf_final_link (abfd, info))
+    return FALSE;
+
+  /* Write out any glue sections now that we have created all the
+     stubs.  */
+  if (globals->bfd_of_glue_owner != NULL)
+    {
+      if (! elf32_arm_output_glue_section (info, abfd,
+					   globals->bfd_of_glue_owner,
+					   ARM2THUMB_GLUE_SECTION_NAME))
+	return FALSE;
+
+      if (! elf32_arm_output_glue_section (info, abfd,
+					   globals->bfd_of_glue_owner,
+					   THUMB2ARM_GLUE_SECTION_NAME))
+	return FALSE;
+
+      if (! elf32_arm_output_glue_section (info, abfd,
+					   globals->bfd_of_glue_owner,
+					   VFP11_ERRATUM_VENEER_SECTION_NAME))
+	return FALSE;
+
+      if (! elf32_arm_output_glue_section (info, abfd,
+					   globals->bfd_of_glue_owner,
+					   ARM_BX_GLUE_SECTION_NAME))
+	return FALSE;
+    }
+
+  return TRUE;
+}
+
 /* Set the right machine number.  */
 
 static bfd_boolean
@@ -8582,6 +8654,12 @@ elf32_arm_merge_eabi_attributes (bfd *ib
   int i;
   bfd_boolean result = TRUE;
 
+  /* Skip the linker stubs file.  This preserves previous behavior
+     of accepting unknown attributes in the first input file - but
+     is that a bug?  */
+  if (ibfd->flags & BFD_LINKER_CREATED)
+    return TRUE;
+
   if (!elf_known_obj_attributes_proc (obfd)[0].i)
     {
       /* This is the first object.  Copy the attributes.  */
@@ -10740,6 +10818,9 @@ elf32_arm_size_dynamic_sections (bfd * o
 			    ibfd->filename);
     }
 
+  /* Allocate space for the glue sections now that we've sized them.  */
+  bfd_elf32_arm_allocate_interworking_sections (info);
+
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
@@ -12478,6 +12559,7 @@ const struct elf_size_info elf32_arm_siz
 #define bfd_elf32_bfd_is_target_special_symbol	elf32_arm_is_target_special_symbol
 #define bfd_elf32_close_and_cleanup             elf32_arm_close_and_cleanup
 #define bfd_elf32_bfd_free_cached_info          elf32_arm_bfd_free_cached_info
+#define bfd_elf32_bfd_final_link		elf32_arm_final_link
 
 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
Index: ld/emultempl/armelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/armelf.em,v
retrieving revision 1.70
diff -u -p -r1.70 armelf.em
--- ld/emultempl/armelf.em	24 Feb 2009 22:43:09 -0000	1.70
+++ ld/emultempl/armelf.em	19 Mar 2009 20:05:32 -0000
@@ -31,7 +31,6 @@ fragment <<EOF
 #include "elf/arm.h"
 
 static char *thumb_entry_symbol = NULL;
-static bfd *bfd_for_interwork;
 static int byteswap_code = 0;
 static int target1_is_rel = 0${TARGET1_IS_REL};
 static char *target2_type = "${TARGET2_TYPE}";
@@ -53,61 +52,8 @@ gld${EMULATION_NAME}_before_parse (void)
 }
 
 static void
-arm_elf_after_open (void)
-{
-  {
-    LANG_FOR_EACH_INPUT_STATEMENT (is)
-      {
-	bfd_elf32_arm_add_glue_sections_to_bfd (is->the_bfd, & link_info);
-      }
-  }
-
-  /* Call the standard elf routine.  */
-  gld${EMULATION_NAME}_after_open ();
-}
-
-static void
-arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement)
-{
-  if (statement->header.type == lang_input_section_enum)
-    {
-      asection *i = statement->input_section.section;
-
-      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
-	  && (i->flags & SEC_EXCLUDE) == 0)
-	{
-	  asection *output_section = i->output_section;
-
-	  ASSERT (output_section->owner == link_info.output_bfd);
-
-	  /* Don't attach the interworking stubs to a dynamic object, to
-	     an empty section, etc.  */
-	  if ((output_section->flags & SEC_HAS_CONTENTS) != 0
-	      && (i->flags & SEC_NEVER_LOAD) == 0
-	      && ! (i->owner->flags & DYNAMIC))
-	    bfd_for_interwork = i->owner;
-	}
-    }
-}
-
-static void
 arm_elf_before_allocation (void)
 {
-  if (link_info.input_bfds != NULL)
-    {
-      /* The interworking bfd must be the last one in the link.  */
-      bfd_for_interwork = NULL;
-
-      lang_for_each_statement (arm_elf_set_bfd_for_interworking);
-
-      /* If bfd_for_interwork is NULL, then there are no loadable sections
-	 with real contents to be linked, so we are not going to have to
-	 create any interworking stubs, so it is OK not to call
-	 bfd_elf32_arm_get_bfd_for_interworking.  */
-      if (bfd_for_interwork != NULL)
-	bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info);
-    }
-
   bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code);
 
   /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary
@@ -130,13 +76,13 @@ arm_elf_before_allocation (void)
 	    /* xgettext:c-format */
 	    einfo (_("Errors encountered processing file %s"), is->filename);
 	}
+
+      /* We have seen it all.  Allocate it, and carry on.  */
+      bfd_elf32_arm_allocate_interworking_sections (& link_info);
     }
 
   /* Call the standard elf routine.  */
   gld${EMULATION_NAME}_before_allocation ();
-
-  /* We have seen it all. Allocate it, and carry on.  */
-  bfd_elf32_arm_allocate_interworking_sections (& link_info);
 }
 
 static void
@@ -461,6 +407,10 @@ arm_elf_create_output_section_statements
  
   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
   ldlang_add_file (stub_file);
+
+  /* Also use the stub file for stubs placed in a single output section.  */
+  bfd_elf32_arm_add_glue_sections_to_bfd (stub_file->the_bfd, &link_info);
+  bfd_elf32_arm_get_bfd_for_interworking (stub_file->the_bfd, &link_info);
 }
 
 /* Avoid processing the fake stub_file in vercheck, stat_needed and
@@ -620,9 +570,8 @@ PARSE_AND_LIST_ARGS_CASES='
       break;
 '
 
-# We have our own after_open and before_allocation functions, but they call
+# We have our own before_allocation etc. functions, but they call
 # the standard routines, so give them a different name.
-LDEMUL_AFTER_OPEN=arm_elf_after_open
 LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
 LDEMUL_AFTER_ALLOCATION=arm_elf_after_allocation
 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements
Index: ld/testsuite/ld-arm/farcall-group-size2.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-group-size2.d,v
retrieving revision 1.3
diff -u -p -r1.3 farcall-group-size2.d
--- ld/testsuite/ld-arm/farcall-group-size2.d	24 Feb 2009 22:43:10 -0000	1.3
+++ ld/testsuite/ld-arm/farcall-group-size2.d	19 Mar 2009 20:05:32 -0000
@@ -4,32 +4,32 @@
 Disassembly of section .text:
 
 00001000 <_start>:
-    1000:	eb000002 	bl	1010 <__bar_from_arm>
-    1004:	ebffffff 	bl	1008 <__bar2_veneer>
-00001008 <__bar2_veneer>:
-    1008:	e51ff004 	ldr	pc, \[pc, #-4\]	; 100c <__bar2_veneer\+0x4>
-    100c:	02003024 	.word	0x02003024
-00001010 <__bar_from_arm>:
-    1010:	e59fc000 	ldr	ip, \[pc, #0\]	; 1018 <__bar_from_arm\+0x8>
-    1014:	e12fff1c 	bx	ip
-    1018:	02003021 	.word	0x02003021
+    1000:	eb000000 	bl	1008 <__bar_from_arm>
+    1004:	eb000002 	bl	1014 <__bar2_veneer>
+00001008 <__bar_from_arm>:
+    1008:	e59fc000 	ldr	ip, \[pc, #0\]	; 1010 <__bar_from_arm\+0x8>
+    100c:	e12fff1c 	bx	ip
+    1010:	02003021 	.word	0x02003021
+00001014 <__bar2_veneer>:
+    1014:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1018 <__bar2_veneer\+0x4>
+    1018:	02003024 	.word	0x02003024
     101c:	00000000 	.word	0x00000000
 00001020 <myfunc>:
-    1020:	eb000002 	bl	1030 <__bar3_veneer>
-    1024:	eb000006 	bl	1044 <__bar4_from_arm>
-    1028:	eb000002 	bl	1038 <__bar5_from_arm>
+    1020:	eb000008 	bl	1048 <__bar3_veneer>
+    1024:	eb000004 	bl	103c <__bar4_from_arm>
+    1028:	eb000000 	bl	1030 <__bar5_from_arm>
     102c:	00000000 	andeq	r0, r0, r0
-00001030 <__bar3_veneer>:
-    1030:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1034 <__bar3_veneer\+0x4>
-    1034:	02003028 	.word	0x02003028
-00001038 <__bar5_from_arm>:
-    1038:	e59fc000 	ldr	ip, \[pc, #0\]	; 1040 <__bar5_from_arm\+0x8>
-    103c:	e12fff1c 	bx	ip
-    1040:	0200302f 	.word	0x0200302f
-00001044 <__bar4_from_arm>:
-    1044:	e59fc000 	ldr	ip, \[pc, #0\]	; 104c <__bar4_from_arm\+0x8>
-    1048:	e12fff1c 	bx	ip
-    104c:	0200302d 	.word	0x0200302d
+00001030 <__bar5_from_arm>:
+    1030:	e59fc000 	ldr	ip, \[pc, #0\]	; 1038 <__bar5_from_arm\+0x8>
+    1034:	e12fff1c 	bx	ip
+    1038:	0200302f 	.word	0x0200302f
+0000103c <__bar4_from_arm>:
+    103c:	e59fc000 	ldr	ip, \[pc, #0\]	; 1044 <__bar4_from_arm\+0x8>
+    1040:	e12fff1c 	bx	ip
+    1044:	0200302d 	.word	0x0200302d
+00001048 <__bar3_veneer>:
+    1048:	e51ff004 	ldr	pc, \[pc, #-4\]	; 104c <__bar3_veneer\+0x4>
+    104c:	02003028 	.word	0x02003028
 	...
 
 Disassembly of section .foo:
Index: ld/testsuite/ld-arm/farcall-group.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-group.d,v
retrieving revision 1.3
diff -u -p -r1.3 farcall-group.d
--- ld/testsuite/ld-arm/farcall-group.d	24 Feb 2009 22:43:10 -0000	1.3
+++ ld/testsuite/ld-arm/farcall-group.d	19 Mar 2009 20:05:32 -0000
@@ -4,12 +4,12 @@
 Disassembly of section .text:
 
 00001000 <_start>:
-    1000:	eb000007 	bl	1024 <__bar_from_arm>
-    1004:	eb00000c 	bl	103c <__bar2_veneer>
+    1000:	eb00000c 	bl	1038 <__bar_from_arm>
+    1004:	eb00000e 	bl	1044 <__bar2_veneer>
 
 00001008 <myfunc>:
-    1008:	eb00000d 	bl	1044 <__bar3_veneer>
-    100c:	eb000007 	bl	1030 <__bar4_from_arm>
+    1008:	eb000008 	bl	1030 <__bar3_veneer>
+    100c:	eb000004 	bl	1024 <__bar4_from_arm>
     1010:	eb000000 	bl	1018 <__bar5_from_arm>
     1014:	00000000 	andeq	r0, r0, r0
 
@@ -17,20 +17,20 @@ Disassembly of section .text:
     1018:	e59fc000 	ldr	ip, \[pc, #0\]	; 1020 <__bar5_from_arm\+0x8>
     101c:	e12fff1c 	bx	ip
     1020:	0200302f 	.word	0x0200302f
-00001024 <__bar_from_arm>:
-    1024:	e59fc000 	ldr	ip, \[pc, #0\]	; 102c <__bar_from_arm\+0x8>
+00001024 <__bar4_from_arm>:
+    1024:	e59fc000 	ldr	ip, \[pc, #0\]	; 102c <__bar4_from_arm\+0x8>
     1028:	e12fff1c 	bx	ip
-    102c:	02003021 	.word	0x02003021
-00001030 <__bar4_from_arm>:
-    1030:	e59fc000 	ldr	ip, \[pc, #0\]	; 1038 <__bar4_from_arm\+0x8>
-    1034:	e12fff1c 	bx	ip
-    1038:	0200302d 	.word	0x0200302d
-0000103c <__bar2_veneer>:
-    103c:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1040 <__bar2_veneer\+0x4>
-    1040:	02003024 	.word	0x02003024
-00001044 <__bar3_veneer>:
-    1044:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1048 <__bar3_veneer\+0x4>
-    1048:	02003028 	.word	0x02003028
+    102c:	0200302d 	.word	0x0200302d
+00001030 <__bar3_veneer>:
+    1030:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1034 <__bar3_veneer\+0x4>
+    1034:	02003028 	.word	0x02003028
+00001038 <__bar_from_arm>:
+    1038:	e59fc000 	ldr	ip, \[pc, #0\]	; 1040 <__bar_from_arm\+0x8>
+    103c:	e12fff1c 	bx	ip
+    1040:	02003021 	.word	0x02003021
+00001044 <__bar2_veneer>:
+    1044:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1048 <__bar2_veneer\+0x4>
+    1048:	02003024 	.word	0x02003024
 	...
 Disassembly of section .foo:
 
Index: ld/testsuite/ld-arm/farcall-mix.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mix.d,v
retrieving revision 1.3
diff -u -p -r1.3 farcall-mix.d
--- ld/testsuite/ld-arm/farcall-mix.d	24 Feb 2009 22:43:10 -0000	1.3
+++ ld/testsuite/ld-arm/farcall-mix.d	19 Mar 2009 20:05:32 -0000
@@ -4,27 +4,27 @@
 Disassembly of section .text:
 
 00001000 <_start>:
-    1000:	eb000004 	bl	1018 <__bar_from_arm>
-    1004:	eb000006 	bl	1024 <__bar2_veneer>
-    1008:	eb00000a 	bl	1038 <__bar3_veneer>
+    1000:	eb000009 	bl	102c <__bar_from_arm>
+    1004:	eb00000b 	bl	1038 <__bar2_veneer>
+    1008:	eb000005 	bl	1024 <__bar3_veneer>
     100c:	eb00000b 	bl	1040 <__bar4_from_arm>
-    1010:	eb000005 	bl	102c <__bar5_from_arm>
+    1010:	eb000000 	bl	1018 <__bar5_from_arm>
     1014:	00000000 	andeq	r0, r0, r0
 
-00001018 <__bar_from_arm>:
-    1018:	e59fc000 	ldr	ip, \[pc, #0\]	; 1020 <__bar_from_arm\+0x8>
+00001018 <__bar5_from_arm>:
+    1018:	e59fc000 	ldr	ip, \[pc, #0\]	; 1020 <__bar5_from_arm\+0x8>
     101c:	e12fff1c 	bx	ip
-    1020:	02002021 	.word	0x02002021
-00001024 <__bar2_veneer>:
-    1024:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1028 <__bar2_veneer\+0x4>
-    1028:	02002024 	.word	0x02002024
-0000102c <__bar5_from_arm>:
-    102c:	e59fc000 	ldr	ip, \[pc, #0\]	; 1034 <__bar5_from_arm\+0x8>
+    1020:	0200202f 	.word	0x0200202f
+00001024 <__bar3_veneer>:
+    1024:	e51ff004 	ldr	pc, \[pc, #-4\]	; 1028 <__bar3_veneer\+0x4>
+    1028:	02002028 	.word	0x02002028
+0000102c <__bar_from_arm>:
+    102c:	e59fc000 	ldr	ip, \[pc, #0\]	; 1034 <__bar_from_arm\+0x8>
     1030:	e12fff1c 	bx	ip
-    1034:	0200202f 	.word	0x0200202f
-00001038 <__bar3_veneer>:
-    1038:	e51ff004 	ldr	pc, \[pc, #-4\]	; 103c <__bar3_veneer\+0x4>
-    103c:	02002028 	.word	0x02002028
+    1034:	02002021 	.word	0x02002021
+00001038 <__bar2_veneer>:
+    1038:	e51ff004 	ldr	pc, \[pc, #-4\]	; 103c <__bar2_veneer\+0x4>
+    103c:	02002024 	.word	0x02002024
 00001040 <__bar4_from_arm>:
     1040:	e59fc000 	ldr	ip, \[pc, #0\]	; 1048 <__bar4_from_arm\+0x8>
     1044:	e12fff1c 	bx	ip
Index: ld/testsuite/ld-arm/farcall-mix2.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/farcall-mix2.d,v
retrieving revision 1.3
diff -u -p -r1.3 farcall-mix2.d
--- ld/testsuite/ld-arm/farcall-mix2.d	24 Feb 2009 22:43:10 -0000	1.3
+++ ld/testsuite/ld-arm/farcall-mix2.d	19 Mar 2009 20:05:32 -0000
@@ -18,21 +18,21 @@ Disassembly of section .text:
 Disassembly of section .mytext:
 
 00002000 <__bar5_from_arm-0x10>:
-    2000:	eb000005 	bl	201c <__bar3_veneer>
-    2004:	eb000006 	bl	2024 <__bar4_from_arm>
+    2000:	eb000008 	bl	2028 <__bar3_veneer>
+    2004:	eb000004 	bl	201c <__bar4_from_arm>
     2008:	eb000000 	bl	2010 <__bar5_from_arm>
     200c:	00000000 	andeq	r0, r0, r0
 00002010 <__bar5_from_arm>:
     2010:	e59fc000 	ldr	ip, \[pc, #0\]	; 2018 <__bar5_from_arm\+0x8>
     2014:	e12fff1c 	bx	ip
     2018:	0200302f 	.word	0x0200302f
-0000201c <__bar3_veneer>:
-    201c:	e51ff004 	ldr	pc, \[pc, #-4\]	; 2020 <__bar3_veneer\+0x4>
-    2020:	02003028 	.word	0x02003028
-00002024 <__bar4_from_arm>:
-    2024:	e59fc000 	ldr	ip, \[pc, #0\]	; 202c <__bar4_from_arm\+0x8>
-    2028:	e12fff1c 	bx	ip
-    202c:	0200302d 	.word	0x0200302d
+0000201c <__bar4_from_arm>:
+    201c:	e59fc000 	ldr	ip, \[pc, #0\]	; 2024 <__bar4_from_arm\+0x8>
+    2020:	e12fff1c 	bx	ip
+    2024:	0200302d 	.word	0x0200302d
+00002028 <__bar3_veneer>:
+    2028:	e51ff004 	ldr	pc, \[pc, #-4\]	; 202c <__bar3_veneer\+0x4>
+    202c:	02003028 	.word	0x02003028
 	...
 Disassembly of section .foo:
 



More information about the Binutils mailing list