⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rh62-binutils-2.13.90.0.2-gotpc.patch

📁 linux下编译交叉工具链的工具源码
💻 PATCH
📖 第 1 页 / 共 2 页
字号:
 			       (i.op[n].imms->X_op_symbol)->X_op) 			      == O_subtract)))) 		{+		  offsetT add;++		  if (insn_start_frag == frag_now)+		    add = (p - frag_now->fr_literal) - insn_start_off;+		  else+		    {+		      fragS *fr;++		      add = insn_start_frag->fr_fix - insn_start_off;+		      for (fr = insn_start_frag->fr_next;+			   fr && fr != frag_now; fr = fr->fr_next)+			add += fr->fr_fix;+		      add += p - frag_now->fr_literal;+		    }+ 		  /* We don't support dynamic linking on x86-64 yet.  */ 		  if (flag_code == CODE_64BIT) 		    abort (); 		  reloc_type = BFD_RELOC_386_GOTPC;-		  i.op[n].imms->X_add_number += 3;+		  i.op[n].imms->X_add_number += add; 		} #endif 	      fix_new_exp (frag_now, p - frag_now->fr_literal, size,@@ -4542,48 +4645,6 @@ md_apply_fix3 (fixP, valP, seg) 	   runtime we merely add the offset to the actual PLT entry.  */ 	value = -4; 	break;-      case BFD_RELOC_386_GOTPC:--/*   This is tough to explain.  We end up with this one if we have- * operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]".  The goal- * here is to obtain the absolute address of the GOT, and it is strongly- * preferable from a performance point of view to avoid using a runtime- * relocation for this.  The actual sequence of instructions often look- * something like:- *- *	call	.L66- * .L66:- *	popl	%ebx- *	addl	$_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx- *- *   The call and pop essentially return the absolute address of- * the label .L66 and store it in %ebx.  The linker itself will- * ultimately change the first operand of the addl so that %ebx points to- * the GOT, but to keep things simple, the .o file must have this operand- * set so that it generates not the absolute address of .L66, but the- * absolute address of itself.  This allows the linker itself simply- * treat a GOTPC relocation as asking for a pcrel offset to the GOT to be- * added in, and the addend of the relocation is stored in the operand- * field for the instruction itself.- *- *   Our job here is to fix the operand so that it would add the correct- * offset so that %ebx would point to itself.  The thing that is tricky is- * that .-.L66 will point to the beginning of the instruction, so we need- * to further modify the operand so that it will point to itself.- * There are other cases where you have something like:- *- *	.long	$_GLOBAL_OFFSET_TABLE_+[.-.L66]- *- * and here no correction would be required.  Internally in the assembler- * we treat operands of this form as not being pcrel since the '.' is- * explicitly mentioned, and I wonder whether it would simplify matters- * to do it this way.  Who knows.  In earlier versions of the PIC patches,- * the pcrel_adjust field was used to store the correction, but since the- * expression is not pcrel, I felt it would be confusing to do it this- * way.  */--	value -= 1;-	break;       case BFD_RELOC_386_GOT32:       case BFD_RELOC_386_TLS_GD:       case BFD_RELOC_386_TLS_LDM:--- binutils/gas/testsuite/gas/i386/gotpc.s.jj	2002-08-02 21:17:57.000000000 +0200+++ binutils/gas/testsuite/gas/i386/gotpc.s	2002-08-03 22:55:47.000000000 +0200@@ -0,0 +1,40 @@+	.text+test:+	addl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax+	addl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx+	addl $_GLOBAL_OFFSET_TABLE_, %eax+	addl $_GLOBAL_OFFSET_TABLE_, %ebx+	leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %ebx+	leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %eax+	leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %eax+	leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %ebx+	subl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax+	subl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx+	subl $_GLOBAL_OFFSET_TABLE_, %eax+	subl $_GLOBAL_OFFSET_TABLE_, %ebx+	orl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax+	orl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx+	orl $_GLOBAL_OFFSET_TABLE_, %eax+	orl $_GLOBAL_OFFSET_TABLE_, %ebx+	movl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax+	movl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx+	movl $_GLOBAL_OFFSET_TABLE_, %eax+	movl $_GLOBAL_OFFSET_TABLE_, %ebx+	movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo+	movl $_GLOBAL_OFFSET_TABLE_+[.-test], %gs:foo+	gs; movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo+	movl $_GLOBAL_OFFSET_TABLE_+[.-test], _GLOBAL_OFFSET_TABLE_+	movl _GLOBAL_OFFSET_TABLE_+[.-test], %eax+	movl _GLOBAL_OFFSET_TABLE_+[.-test], %ebx+	movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test]+	movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test]+	movl %eax, %gs:_GLOBAL_OFFSET_TABLE_+[.-test]+	movl %ebx, %gs:_GLOBAL_OFFSET_TABLE_+[.-test]+	gs; movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test]+	gs; movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test]+	leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax+	leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx+	movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax+	movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx+	.long _GLOBAL_OFFSET_TABLE_+[.-test]+	.long _GLOBAL_OFFSET_TABLE_@GOTOFF--- binutils/gas/testsuite/gas/i386/gotpc.d.jj	2002-08-02 21:18:43.000000000 +0200+++ binutils/gas/testsuite/gas/i386/gotpc.d	2002-08-03 23:05:43.000000000 +0200@@ -0,0 +1,52 @@+#objdump: -drw+#name: i386 gotpc++.*: +file format .*++Disassembly of section .text:++0+000 <test>:+   0:	05 01 00 00 00 [ 	]*add    \$0x1,%eax	1: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+   5:	81 c3 07 00 00 00 [ 	]*add    \$0x7,%ebx	7: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+   b:	05 01 00 00 00 [ 	]*add    \$0x1,%eax	c: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  10:	81 c3 02 00 00 00 [ 	]*add    \$0x2,%ebx	12: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  16:	8d 98 16 00 00 00 [ 	]*lea    0x16\(%eax\),%ebx	18: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE+  1c:	8d 83 1c 00 00 00 [ 	]*lea    0x1c\(%ebx\),%eax	1e: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE+  22:	8d 80 22 00 00 00 [ 	]*lea    0x22\(%eax\),%eax	24: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE+  28:	8d 9b 28 00 00 00 [ 	]*lea    0x28\(%ebx\),%ebx	2a: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE+  2e:	2d 2f 00 00 00 [ 	]*sub    \$0x2f,%eax	2f: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  33:	81 eb 35 00 00 00 [ 	]*sub    \$0x35,%ebx	35: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  39:	2d 01 00 00 00 [ 	]*sub    \$0x1,%eax	3a: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  3e:	81 eb 02 00 00 00 [ 	]*sub    \$0x2,%ebx	40: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  44:	0d 45 00 00 00 [ 	]*or     \$0x45,%eax	45: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  49:	81 cb 4b 00 00 00 [ 	]*or     \$0x4b,%ebx	4b: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  4f:	0d 01 00 00 00 [ 	]*or     \$0x1,%eax	50: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  54:	81 cb 02 00 00 00 [ 	]*or     \$0x2,%ebx	56: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  5a:	b8 5b 00 00 00 [ 	]*mov    \$0x5b,%eax	5b: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  5f:	bb 60 00 00 00 [ 	]*mov    \$0x60,%ebx	60: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  64:	b8 01 00 00 00 [ 	]*mov    \$0x1,%eax	65: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  69:	bb 01 00 00 00 [ 	]*mov    \$0x1,%ebx	6a: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  6e:	c7 05 00 00 00 00 74 00 00 00 [ 	]*movl   \$0x74,0x0	70: (R_386_)?(dir)?32	foo+[ 	]*74: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  78:	65 c7 05 00 00 00 00 7f 00 00 00 [ 	]*movl   \$0x7f,%gs:0x0	7b: (R_386_)?(dir)?32	foo+[ 	]*7f: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  83:	65 c7 05 00 00 00 00 8a 00 00 00 [ 	]*movl   \$0x8a,%gs:0x0	86: (R_386_)?(dir)?32	foo+[ 	]*8a: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  8e:	c7 05 02 00 00 00 94 00 00 00 [ 	]*movl   \$0x94,0x2	90: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+[ 	]*94: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  98:	a1 99 00 00 00 [ 	]*mov    0x99,%eax	99: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  9d:	8b 1d 9f 00 00 00 [ 	]*mov    0x9f,%ebx	9f: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  a3:	a3 a4 00 00 00 [ 	]*mov    %eax,0xa4	a4: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  a8:	89 1d aa 00 00 00 [ 	]*mov    %ebx,0xaa	aa: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  ae:	65 a3 b0 00 00 00 [ 	]*mov    %eax,%gs:0xb0	b0: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  b4:	65 89 1d b7 00 00 00 [ 	]*mov    %ebx,%gs:0xb7	b7: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  bb:	65 a3 bd 00 00 00 [ 	]*mov    %eax,%gs:0xbd	bd: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  c1:	65 89 1d c4 00 00 00 [ 	]*mov    %ebx,%gs:0xc4	c4: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  c8:	8d 83 00 00 00 00 [ 	]*lea    0x0\(%ebx\),%eax	ca: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_+  ce:	8d 9b 00 00 00 00 [ 	]*lea    0x0\(%ebx\),%ebx	d0: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_+  d4:	8b 83 00 00 00 00 [ 	]*mov    0x0\(%ebx\),%eax	d6: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_+  da:	8b 9b 00 00 00 00 [ 	]*mov    0x0\(%ebx\),%ebx	dc: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_+  e0:	e0 00 [ 	]*loopne e2 <test\+0xe2>	e0: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_+  e2:	00 00 [ 	]*add    %al,\(%eax\)+  e4:	00 00 [ 	]*add    %al,\(%eax\)	e4: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_+	...--- binutils/gas/testsuite/gas/i386/i386.exp.jj	2002-07-18 11:35:39.000000000 +0200+++ binutils/gas/testsuite/gas/i386/i386.exp	2002-08-02 21:57:46.000000000 +0200@@ -53,6 +53,7 @@ if [expr ([istarget "i*86-*-*"] ||  [ist     run_dump_test "jump"     run_dump_test "ssemmx2"     run_dump_test "sse2"+    run_dump_test "gotpc"      # PIC is only supported on ELF targets.     if { ([istarget "*-*-elf*"] || [istarget "*-*-linux*"] )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -