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]

Stopping GAS from resolving IFUNC symbols itself


One problem I've hit while working on the ARM STT_GNU_IFUNC support is
that things like:

	.type	foo,%gnu_indirect_function
foo:
	...
	.size	foo,.-foo
	...
	.4byte  foo-.		# still in same section as foo

get resolved at assembly time, and don't produce a relocation.

This situtation probably doesn't occur in practice for x86 and x86_64.
The reloc would generally be in a read-only data section rather than in
.text itself, and in that situation, gas does of course produce a
relocation.  References from the same section could reasonably be used
in ARM constant tables though.

I think this points to a more general bug: we're treating references to
indirect function symbols in the same way that we treat references to
weak and (on ELF targets) global symbols.  They seem fundamentally
different though.  If the assembler sees something like:

	.globl	foo
foo:

then it has no idea whether the user wants to be able to override
foo or not.  The final link might not even be dynamic.  So if the
code also contains:

	.globl	bar
bar:
	.4byte	bar - foo

then the assembler should resolve foo locally rather than emit
a fatal error.

The weak case is less obvious, but there are cases where it's the same.
A program might optionally link in a file foo.o that defines F.  Other
objects might then treat F as weak so that they don't need to be
recompiled depending on the presence of foo.o.  But the user might know
that foo.o's F is the only real definition that will ever be used, and a
header file might nevertheless cause foo.o to define F as weak.  It would
then be wrong for the assembler to reject "foo - F" in foo.o.

In short, the definition that gas sees for ordinary weak and global
symbols _could_ also be the definition that the linker uses to resolve
relocations.  That's never true for ifunc symbols though, because the
linker will use a PLT instead.  Gas should never resolve ifunc symbols
itself.

I think this means that S_FORCE_RELOC is wrong: the check for indirect
functions shouldn't be restricted to strict mode.  Also, various parts
of GAS assume that locally-defined symbols can always be used.  Now that
we have a case where that isn't true, those pieces of code should check
S_FORCE_RELOC as well.

One decision was whether to push these S_FORCE_RELOC checks into
the TC_FORCE_RELOCATION_*s that are missing them (particularly
the SUB ones), or whether to check them in fixup_segment itself.
I went for the latter because I can't see any situation in which
a target would want to override this behaviour.

Patch tested on x86_64-linux-gnu.  Since the patch touches only
target-independent code, I intend to commit it in a couple of days
unless there are objections.

Richard


gas/
	* symbols.c (S_FORCE_RELOC): Return true for indirect functions
	even if !strict.
	* expr.c (operand): Don't convert absolute symbols to constants
	if S_FORCE_RELOC is true.
	(expr): Only reduce subtractions between different symbols if
	S_FORCE_RELOC is false for both of them.
	* write.c (fixup_segment): Don't remove symbols if S_FORCE_RELOC
	is true for them, regardless of their segment.

gas/testsuite/
	* gas/i386/ifunc-2.s, gas/i386/ifunc-2.l: New test.
	* gas/i386/ifunc-3.s, gas/i386/ifunc-3.d: Likeise.
	* gas/i386/i386.exp: Run them.

Index: gas/symbols.c
===================================================================
--- gas/symbols.c	2010-11-29 14:40:49.000000000 +0000
+++ gas/symbols.c	2010-11-29 14:42:36.000000000 +0000
@@ -2052,9 +2052,9 @@ S_FORCE_RELOC (symbolS *s, int strict)
 
   return ((strict
 	   && ((s->bsym->flags & BSF_WEAK) != 0
-	       || (s->bsym->flags & BSF_GNU_INDIRECT_FUNCTION) != 0
 	       || (EXTERN_FORCE_RELOC
 		   && (s->bsym->flags & BSF_GLOBAL) != 0)))
+	  || (s->bsym->flags & BSF_GNU_INDIRECT_FUNCTION) != 0
 	  || s->bsym->section == undefined_section
 	  || bfd_is_com_section (s->bsym->section));
 }
Index: gas/expr.c
===================================================================
--- gas/expr.c	2010-11-29 14:40:49.000000000 +0000
+++ gas/expr.c	2010-11-29 14:42:36.000000000 +0000
@@ -1325,7 +1325,9 @@ operand (expressionS *expressionP, enum 
 	  /* If we have an absolute symbol or a reg, then we know its
 	     value now.  */
 	  segment = S_GET_SEGMENT (symbolP);
-	  if (mode != expr_defer && segment == absolute_section)
+	  if (mode != expr_defer
+	      && segment == absolute_section
+	      && !S_FORCE_RELOC (symbolP, 0))
 	    {
 	      expressionP->X_op = O_constant;
 	      expressionP->X_add_number = S_GET_VALUE (symbolP);
@@ -1835,7 +1837,9 @@ expr (int rankarg,		/* Larger # is highe
 #ifdef md_allow_local_subtract
 	       && md_allow_local_subtract (resultP, & right, rightseg)
 #endif
-	       && (SEG_NORMAL (rightseg)
+	       && ((SEG_NORMAL (rightseg)
+		    && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
+		    && !S_FORCE_RELOC (right.X_add_symbol, 0))
 		   || right.X_add_symbol == resultP->X_add_symbol)
 	       && frag_offset_fixed_p (symbol_get_frag (resultP->X_add_symbol),
 				       symbol_get_frag (right.X_add_symbol),
@@ -1949,7 +1953,10 @@ expr (int rankarg,		/* Larger # is highe
 	  else if (op_left == O_subtract)
 	    {
 	      resultP->X_add_number -= right.X_add_number;
-	      if (retval == rightseg && SEG_NORMAL (retval))
+	      if (retval == rightseg
+		  && SEG_NORMAL (retval)
+		  && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
+		  && !S_FORCE_RELOC (right.X_add_symbol, 0))
 		{
 		  retval = absolute_section;
 		  rightseg = absolute_section;
Index: gas/write.c
===================================================================
--- gas/write.c	2010-11-29 14:40:49.000000000 +0000
+++ gas/write.c	2010-11-29 14:57:53.000000000 +0000
@@ -932,6 +932,8 @@ fixup_segment (fixS *fixP, segT this_seg
 	  sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
 	  if (fixP->fx_addsy != NULL
 	      && sub_symbol_segment == add_symbol_segment
+	      && !S_FORCE_RELOC (fixP->fx_addsy, 0)
+	      && !S_FORCE_RELOC (fixP->fx_subsy, 0)
 	      && !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
 	    {
 	      add_number += S_GET_VALUE (fixP->fx_addsy);
@@ -945,6 +947,7 @@ fixup_segment (fixS *fixP, segT this_seg
 #endif
 	    }
 	  else if (sub_symbol_segment == absolute_section
+		   && !S_FORCE_RELOC (fixP->fx_subsy, 0)
 		   && !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment))
 	    {
 	      add_number -= S_GET_VALUE (fixP->fx_subsy);
@@ -952,6 +955,7 @@ fixup_segment (fixS *fixP, segT this_seg
 	      fixP->fx_subsy = NULL;
 	    }
 	  else if (sub_symbol_segment == this_segment
+		   && !S_FORCE_RELOC (fixP->fx_subsy, 0)
 		   && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP, add_symbol_segment))
 	    {
 	      add_number -= S_GET_VALUE (fixP->fx_subsy);
@@ -994,6 +998,7 @@ fixup_segment (fixS *fixP, segT this_seg
       if (fixP->fx_addsy)
 	{
 	  if (add_symbol_segment == this_segment
+	      && !S_FORCE_RELOC (fixP->fx_addsy, 0)
 	      && !TC_FORCE_RELOCATION_LOCAL (fixP))
 	    {
 	      /* This fixup was made when the symbol's segment was
@@ -1007,6 +1012,7 @@ fixup_segment (fixS *fixP, segT this_seg
 	      fixP->fx_pcrel = 0;
 	    }
 	  else if (add_symbol_segment == absolute_section
+		   && !S_FORCE_RELOC (fixP->fx_addsy, 0)
 		   && !TC_FORCE_RELOCATION_ABS (fixP))
 	    {
 	      add_number += S_GET_VALUE (fixP->fx_addsy);
Index: gas/testsuite/gas/i386/ifunc-2.s
===================================================================
--- /dev/null	2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-2.s	2010-11-29 14:50:24.000000000 +0000
@@ -0,0 +1,100 @@
+	.section .text.1,"ax",@progbits
+
+start1:
+	.long	bar1-foo1
+	.long	bar2-foo2
+	.long	bar1-bar2
+	.long	bar2-bar1
+	.long	start1-bar1
+	.long	start1-bar2
+	.long	bar1-abs1
+	.long	abs1-bar1
+	.long	.-bar1
+
+	.type	foo1,%gnu_indirect_function
+foo1:
+	ret
+	.size	foo1,.-foo1
+
+	.long	bar1-foo1
+	.long	bar2-foo2
+	.long	bar1-bar2
+	.long	bar2-bar1
+	.long	start1-bar1
+	.long	start1-bar2
+	.long	bar1-abs1
+	.long	abs1-bar1
+	.long	.-bar1
+
+	.type	bar1,%gnu_indirect_function
+bar1:
+	ret
+	.size	bar1,.-bar1
+
+	.long	bar1-foo1
+	.long	bar2-foo2
+	.long	bar1-bar2
+	.long	bar2-bar1
+	.long	start1-bar1
+	.long	start1-bar2
+	.long	bar1-abs1
+	.long	abs1-bar1
+	.long	.-bar1
+
+	.long	abs1-abs2
+	.long	abs2-abs1
+
+	.equ	abs1,0x11223300
+	.type	abs1,%gnu_indirect_function
+
+	.long	abs1-abs2
+	.long	abs2-abs1
+
+	.equ	abs2,0x11223380
+	.type	abs2,%gnu_indirect_function
+
+	.long	abs1-abs2
+	.long	abs2-abs1
+
+	.section .text.2,"ax",@progbits
+
+start2:
+	.long	bar1-foo1
+	.long	bar2-foo2
+	.long	bar1-bar2
+	.long	bar2-bar1
+	.long	start2-bar1
+	.long	start2-bar2
+	.long	bar2-abs1
+	.long	abs1-bar2
+	.long	.-bar2
+
+	.type	foo2,%gnu_indirect_function
+foo2:
+	ret
+	.size	foo2,.-foo2
+
+	.long	bar1-foo1
+	.long	bar2-foo2
+	.long	bar1-bar2
+	.long	bar2-bar1
+	.long	start2-bar1
+	.long	start2-bar2
+	.long	bar2-abs1
+	.long	abs1-bar2
+	.long	.-bar2
+
+	.type	bar2,%gnu_indirect_function
+bar2:
+	ret
+	.size	bar2,.-bar2
+
+	.long	bar1-foo1
+	.long	bar2-foo2
+	.long	bar1-bar2
+	.long	bar2-bar1
+	.long	start2-bar1
+	.long	start2-bar2
+	.long	bar2-abs1
+	.long	abs1-bar2
+	.long	.-bar2
Index: gas/testsuite/gas/i386/ifunc-2.l
===================================================================
--- /dev/null	2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-2.l	2010-11-29 14:48:20.000000000 +0000
@@ -0,0 +1,61 @@
+.*/ifunc-2\.s: Assembler messages:
+.*/ifunc-2\.s:4: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:5: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:6: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:7: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:8: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:9: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:10: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:11: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:12: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:19: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:20: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:21: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:22: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:23: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:24: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:25: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:26: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:27: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:34: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:35: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:36: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:37: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:38: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:39: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:40: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:41: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:42: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:44: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
+.*/ifunc-2\.s:45: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:50: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
+.*/ifunc-2\.s:51: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:56: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
+.*/ifunc-2\.s:57: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:62: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:63: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:64: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:65: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:66: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:67: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:68: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:69: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:70: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:77: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:78: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:79: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:80: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:81: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:82: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:83: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:84: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:85: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:92: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:93: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:94: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:95: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:96: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:97: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:98: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:99: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:100: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
Index: gas/testsuite/gas/i386/ifunc-3.s
===================================================================
--- /dev/null	2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-3.s	2010-11-29 15:03:48.000000000 +0000
@@ -0,0 +1,54 @@
+	.section .text.1,"ax",@progbits
+
+start1:
+	.long	bar1-.
+	.long	bar2-.
+	.long	bar1-start1
+	.long	bar2-start1
+	.long	bar1-base
+
+	.type	bar1,%gnu_indirect_function
+bar1:
+	ret
+	.size	bar1,.-bar1
+	.align	4
+
+	.long	bar1-.
+	.long	bar2-.
+	.long	bar1-start1
+	.long	bar2-start1
+	.long	bar1-base
+
+	.long	abs1-.
+	.long	abs1-start1
+	.long	abs1-base
+
+	.equ	abs1,0x11223300
+	.type	abs1,%gnu_indirect_function
+
+	.long	abs1-.
+	.long	abs1-start1
+	.long	abs1-base
+
+	.section .text.2,"ax",@progbits
+
+start2:
+	.long	bar1-.
+	.long	bar2-.
+	.long	bar1-start2
+	.long	bar2-start2
+	.long	bar2-base
+
+	.type	bar2,%gnu_indirect_function
+bar2:
+	ret
+	.size	bar2,.-bar2
+	.align	4
+
+	.long	bar1-.
+	.long	bar2-.
+	.long	bar1-start2
+	.long	bar2-start2
+	.long	bar2-base
+
+	.equ	base,0xabc0
Index: gas/testsuite/gas/i386/ifunc-3.d
===================================================================
--- /dev/null	2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-3.d	2010-11-29 15:27:21.000000000 +0000
@@ -0,0 +1,57 @@
+#readelf: --relocs --syms -x .text.1 -x .text.2
+#name: i386 ifunc 3
+
+Relocation section '\.rel\.text\.1' at offset .* contains .* entries:
+ Offset     Info    Type            Sym.Value  Sym. Name
+00000000  ........ R_386_PC32        bar1\(\)     bar1
+00000004  ........ R_386_PC32        bar2\(\)     bar2
+00000008  ........ R_386_PC32        bar1\(\)     bar1
+0000000c  ........ R_386_PC32        bar2\(\)     bar2
+00000010  ........ R_386_32          bar1\(\)     bar1
+00000018  ........ R_386_PC32        bar1\(\)     bar1
+0000001c  ........ R_386_PC32        bar2\(\)     bar2
+00000020  ........ R_386_PC32        bar1\(\)     bar1
+00000024  ........ R_386_PC32        bar2\(\)     bar2
+00000028  ........ R_386_32          bar1\(\)     bar1
+0000002c  ........ R_386_PC32        abs1\(\)     abs1
+00000030  ........ R_386_PC32        abs1\(\)     abs1
+00000034  ........ R_386_32          abs1\(\)     abs1
+00000038  ........ R_386_PC32        abs1\(\)     abs1
+0000003c  ........ R_386_PC32        abs1\(\)     abs1
+00000040  ........ R_386_32          abs1\(\)     abs1
+
+Relocation section '\.rel\.text\.2' at offset .* contains .* entries:
+ Offset     Info    Type            Sym.Value  Sym. Name
+00000000  ........ R_386_PC32        bar1\(\)     bar1
+00000004  ........ R_386_PC32        bar2\(\)     bar2
+00000008  ........ R_386_PC32        bar1\(\)     bar1
+0000000c  ........ R_386_PC32        bar2\(\)     bar2
+00000010  ........ R_386_32          bar2\(\)     bar2
+00000018  ........ R_386_PC32        bar1\(\)     bar1
+0000001c  ........ R_386_PC32        bar2\(\)     bar2
+00000020  ........ R_386_PC32        bar1\(\)     bar1
+00000024  ........ R_386_PC32        bar2\(\)     bar2
+00000028  ........ R_386_32          bar2\(\)     bar2
+
+Symbol table '.symtab' contains .* entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+#...
+.*: 00000014     1 IFUNC   LOCAL  DEFAULT   .* bar1
+.*: 00000014     1 IFUNC   LOCAL  DEFAULT   .* bar2
+#...
+.*: 11223300     0 IFUNC   LOCAL  DEFAULT  ABS abs1
+#...
+
+Hex dump of section '\.text\.1':
+ NOTE: This section has relocations against it, but these have NOT been applied to this dump\.
+  0x00000000 00000000 00000000 08000000 0c000000 .*
+  0x00000010 4054ffff c38d7600 00000000 00000000 .*
+  0x00000020 20000000 24000000 4054ffff 00000000 .*
+  0x00000030 30000000 4054ffff 00000000 3c000000 .*
+  0x00000040 4054ffff                            .*
+
+Hex dump of section '\.text\.2':
+ NOTE: This section has relocations against it, but these have NOT been applied to this dump\.
+  0x00000000 00000000 00000000 08000000 0c000000 .*
+  0x00000010 4054ffff c38d7600 00000000 00000000 .*
+  0x00000020 20000000 24000000 4054ffff          .*
Index: gas/testsuite/gas/i386/i386.exp
===================================================================
--- gas/testsuite/gas/i386/i386.exp	2010-11-05 17:12:13.000000000 +0000
+++ gas/testsuite/gas/i386/i386.exp	2010-11-29 14:44:35.000000000 +0000
@@ -215,6 +215,8 @@ if [expr ([istarget "i*86-*-*"] ||  [ist
 	run_list_test "inval-equ-1" "-al"
 	run_list_test "inval-equ-2" "-al"
 	run_dump_test "ifunc"
+	run_list_test "ifunc-2"
+	run_dump_test "ifunc-3"
 	run_list_test "l1om-inval" "-march=l1om --32"
 	run_dump_test "localpic"
 	run_dump_test "debug1"


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