[PATCH] x86: fix assembler's @got-style relocation handling

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] x86: fix assembler's @got-style relocation handling

Jan Beulich
This fixes various cases where relocations and relocated field didn't fit
together. The diff is against a tree with the previously submitted patch
to add a few newer x86-64 relocation types already applied (since there
are some code areas that the earlier patch touches and that this one also
has to adjust). For x86-64 it additionally requires the previously
submitted patch to adjust the overflow complaint types on some relocations
(otherwise one of the new tests will fail).

Built and tested on i686-pc-linux-gnu and x86_64-unknown-linux-gnu.

Jan

gas/
2005-06-16  Jan Beulich  <[hidden email]>

        * config/tc-i386.c (reloc): Change first parameter to unsigned.
        Parameter sign now is tristate - zero/positive mean unsigned/signed,
        negative means signedness doesn't matter. Check field size,
        signedness, and pcrel-ness are in agreement between relocated field
        and relocation type. Adjust diagnostics.
        (optimize_imm): And type mask of operand instead of overwriting it.
        (lex_got): Add third parameter. Add new field to local structure and
        initialize gotrel accordingly. Pass caller as mask of types that the
        operator can match.
        (x86_cons_fix_new): Let reloc know that signedness of relocation
        doesn't matter.
        (x86_pe_cons_fix_new): Likewise.
        (x86_cons): Pass additional argument to lex_got.
        (i386_immediate): New local variable 'types'. Pass its address as
        additional argument to lex_got. Mask out operand types not supported
        befoe returning.
        (i386_displacement): Likewise. Set bigdisp to all types supported in
        64-bit mode, combining the previously split initialization.

gas/testsuite/
2005-06-16  Jan Beulich  <[hidden email]>

        * gas/i386/reloc32.[sdl]: New.
        * gas/i386/reloc64.[sdl]: New.
        * gas/i386/i386.exp: Run new tests.

--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/config/tc-i386.c 2005-06-08 14:50:49.000000000 +0200
+++ 2005-06-16/gas/config/tc-i386.c 2005-06-16 16:01:18.006910784 +0200
@@ -1201,22 +1201,54 @@ pt (t)
 #endif /* DEBUG386 */
 
 static bfd_reloc_code_real_type reloc
-  PARAMS ((int, int, int, bfd_reloc_code_real_type));
+  PARAMS ((unsigned int, int, int, bfd_reloc_code_real_type));
 
 static bfd_reloc_code_real_type
 reloc (size, pcrel, sign, other)
-     int size;
+     unsigned int size;
      int pcrel;
      int sign;
      bfd_reloc_code_real_type other;
 {
   if (other != NO_RELOC)
-    return other;
+    {
+      reloc_howto_type *reloc;
+
+      if (size == 8)
+ switch (other)
+  {
+    case BFD_RELOC_X86_64_TPOFF32:
+      other = BFD_RELOC_X86_64_TPOFF64;
+      break;
+    case BFD_RELOC_X86_64_DTPOFF32:
+      other = BFD_RELOC_X86_64_DTPOFF64;
+      break;
+    default:
+      break;
+  }
+      reloc = bfd_reloc_type_lookup (stdoutput, other);
+      if (!reloc)
+ as_bad (_("unknown relocation (%u)"), other);
+      else if (size != bfd_get_reloc_size (reloc))
+ as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
+ bfd_get_reloc_size (reloc),
+ size);
+      else if (pcrel && !reloc->pc_relative)
+ as_bad (_("non-pc-relative relocation for pc-relative field"));
+      else if ((reloc->complain_on_overflow == complain_overflow_signed
+ && !sign)
+       || (reloc->complain_on_overflow == complain_overflow_unsigned
+ && sign > 0))
+ as_bad (_("relocated field and relocation type differ in signedness"));
+      else
+ return other;
+      return NO_RELOC;
+    }
 
   if (pcrel)
     {
       if (!sign)
- as_bad (_("There are no unsigned pc-relative relocations"));
+ as_bad (_("there are no unsigned pc-relative relocations"));
       switch (size)
  {
  case 1: return BFD_RELOC_8_PCREL;
@@ -1224,11 +1256,11 @@ reloc (size, pcrel, sign, other)
  case 4: return BFD_RELOC_32_PCREL;
  case 8: return BFD_RELOC_64_PCREL;
  }
-      as_bad (_("can not do %d byte pc-relative relocation"), size);
+      as_bad (_("cannot do %u byte pc-relative relocation"), size);
     }
   else
     {
-      if (sign)
+      if (sign > 0)
  switch (size)
   {
   case 4: return BFD_RELOC_X86_64_32S;
@@ -1241,8 +1273,8 @@ reloc (size, pcrel, sign, other)
   case 4: return BFD_RELOC_32;
   case 8: return BFD_RELOC_64;
   }
-      as_bad (_("can not do %s %d byte relocation"),
-      sign ? "signed" : "unsigned", size);
+      as_bad (_("cannot do %s %u byte relocation"),
+      sign > 0 ? "signed" : "unsigned", size);
     }
 
   abort ();
@@ -2041,16 +2073,16 @@ optimize_imm ()
     switch (guess_suffix)
       {
       case QWORD_MNEM_SUFFIX:
- i.types[op] = Imm64 | Imm32S;
+ i.types[op] &= Imm64 | Imm32S;
  break;
       case LONG_MNEM_SUFFIX:
- i.types[op] = Imm32;
+ i.types[op] &= Imm32;
  break;
       case WORD_MNEM_SUFFIX:
- i.types[op] = Imm16;
+ i.types[op] &= Imm16;
  break;
       case BYTE_MNEM_SUFFIX:
- i.types[op] = Imm8 | Imm8S;
+ i.types[op] &= Imm8 | Imm8S;
  break;
       }
     break;
@@ -3683,7 +3715,9 @@ output_imm (insn_start_frag, insn_start_
 }
 
 #ifndef LEX_AT
-static char *lex_got PARAMS ((enum bfd_reloc_code_real *, int *));
+static char *lex_got PARAMS ((enum bfd_reloc_code_real *,
+      int *,
+      unsigned int *));
 
 /* Parse operands of the form
    <symbol>@GOTOFF+<nnn>
@@ -3695,28 +3729,30 @@ static char *lex_got PARAMS ((enum bfd_r
    is non-null set it to the length of the string we removed from the
    input line.  Otherwise return NULL.  */
 static char *
-lex_got (reloc, adjust)
+lex_got (reloc, adjust, types)
      enum bfd_reloc_code_real *reloc;
      int *adjust;
+     unsigned int *types;
 {
   static const char * const mode_name[NUM_FLAG_CODE] = { "32", "16", "64" };
   static const struct {
     const char *str;
     const enum bfd_reloc_code_real rel[NUM_FLAG_CODE];
+    const unsigned int types64;
   } gotrel[] = {
-    { "PLT",      { BFD_RELOC_386_PLT32,      0, BFD_RELOC_X86_64_PLT32    } },
-    { "GOTOFF",   { BFD_RELOC_386_GOTOFF,     0, BFD_RELOC_X86_64_GOTOFF64 } },
-    { "GOTPCREL", { 0,                        0, BFD_RELOC_X86_64_GOTPCREL } },
-    { "TLSGD",    { BFD_RELOC_386_TLS_GD,     0, BFD_RELOC_X86_64_TLSGD    } },
-    { "TLSLDM",   { BFD_RELOC_386_TLS_LDM,    0, 0                         } },
-    { "TLSLD",    { 0,                        0, BFD_RELOC_X86_64_TLSLD    } },
-    { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32,  0, BFD_RELOC_X86_64_GOTTPOFF } },
-    { "TPOFF",    { BFD_RELOC_386_TLS_LE_32,  0, BFD_RELOC_X86_64_TPOFF32  } },
-    { "NTPOFF",   { BFD_RELOC_386_TLS_LE,     0, 0                         } },
-    { "DTPOFF",   { BFD_RELOC_386_TLS_LDO_32, 0, BFD_RELOC_X86_64_DTPOFF32 } },
-    { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE,  0, 0                         } },
-    { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE,     0, 0                         } },
-    { "GOT",      { BFD_RELOC_386_GOT32,      0, BFD_RELOC_X86_64_GOT32    } }
+    { "PLT",      { BFD_RELOC_386_PLT32,      0, BFD_RELOC_X86_64_PLT32    }, Imm32|Imm32S|Disp32 },
+    { "GOTOFF",   { BFD_RELOC_386_GOTOFF,     0, BFD_RELOC_X86_64_GOTOFF64 }, Imm64|Disp64 },
+    { "GOTPCREL", { 0,                        0, BFD_RELOC_X86_64_GOTPCREL }, Imm32|Imm32S|Disp32 },
+    { "TLSGD",    { BFD_RELOC_386_TLS_GD,     0, BFD_RELOC_X86_64_TLSGD    }, Imm32|Imm32S|Disp32 },
+    { "TLSLDM",   { BFD_RELOC_386_TLS_LDM,    0, 0                         }, 0 },
+    { "TLSLD",    { 0,                        0, BFD_RELOC_X86_64_TLSLD    }, Imm32|Imm32S|Disp32 },
+    { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32,  0, BFD_RELOC_X86_64_GOTTPOFF }, Imm32|Imm32S|Disp32 },
+    { "TPOFF",    { BFD_RELOC_386_TLS_LE_32,  0, BFD_RELOC_X86_64_TPOFF32  }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
+    { "NTPOFF",   { BFD_RELOC_386_TLS_LE,     0, 0                         }, 0 },
+    { "DTPOFF",   { BFD_RELOC_386_TLS_LDO_32, 0, BFD_RELOC_X86_64_DTPOFF32 }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
+    { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE,  0, 0                         }, 0 },
+    { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE,     0, 0                         }, 0 },
+    { "GOT",      { BFD_RELOC_386_GOT32,      0, BFD_RELOC_X86_64_GOT32    }, Imm32|Imm32S|Disp32 }
   };
   char *cp;
   unsigned int j;
@@ -3741,6 +3777,14 @@ lex_got (reloc, adjust)
       if (adjust)
  *adjust = len;
 
+      if (types)
+ {
+  if (flag_code != CODE_64BIT)
+    *types = Imm32|Disp32;
+  else
+    *types = gotrel[j].types64;
+ }
+
       if (GOT_symbol == NULL)
  GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
 
@@ -3789,7 +3833,7 @@ x86_cons_fix_new (frag, off, len, exp)
      unsigned int len;
      expressionS *exp;
 {
-  enum bfd_reloc_code_real r = reloc (len, 0, 0, got_reloc);
+  enum bfd_reloc_code_real r = reloc (len, 0, -1, got_reloc);
   got_reloc = NO_RELOC;
   fix_new_exp (frag, off, len, exp, 0, r);
 }
@@ -3807,7 +3851,7 @@ x86_cons (exp, size)
       int adjust;
 
       save = input_line_pointer;
-      gotfree_input_line = lex_got (&got_reloc, &adjust);
+      gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
       if (gotfree_input_line)
  input_line_pointer = gotfree_input_line;
 
@@ -3838,7 +3882,7 @@ x86_pe_cons_fix_new (frag, off, len, exp
      unsigned int len;
      expressionS *exp;
 {
-  enum bfd_reloc_code_real r = reloc (len, 0, 0, NO_RELOC);
+  enum bfd_reloc_code_real r = reloc (len, 0, -1, NO_RELOC);
 
   if (exp->X_op == O_secrel)
     {
@@ -3883,6 +3927,7 @@ i386_immediate (imm_start)
 #endif
   segT exp_seg = 0;
   expressionS *exp;
+  unsigned int types = ~0U;
 
   if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
     {
@@ -3900,7 +3945,7 @@ i386_immediate (imm_start)
   input_line_pointer = imm_start;
 
 #ifndef LEX_AT
-  gotfree_input_line = lex_got (&i.reloc[this_operand], NULL);
+  gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
   if (gotfree_input_line)
     input_line_pointer = gotfree_input_line;
 #endif
@@ -3955,6 +4000,7 @@ i386_immediate (imm_start)
  determined later, depending on destination register,
  suffix, or the default for the section.  */
       i.types[this_operand] |= Imm8 | Imm16 | Imm32 | Imm32S | Imm64;
+      i.types[this_operand] &= types;
     }
 
   return 1;
@@ -4025,11 +4071,12 @@ i386_displacement (disp_start, disp_end)
   char *gotfree_input_line;
 #endif
   int bigdisp = Disp32;
+  unsigned int types = Disp;
 
   if (flag_code == CODE_64BIT)
     {
       if (i.prefix[ADDR_PREFIX] == 0)
- bigdisp = Disp64;
+ bigdisp = Disp64 | Disp32S | Disp32;
     }
   else if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
     bigdisp = Disp16;
@@ -4087,7 +4134,7 @@ i386_displacement (disp_start, disp_end)
     }
 #endif
 #ifndef LEX_AT
-  gotfree_input_line = lex_got (&i.reloc[this_operand], NULL);
+  gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
   if (gotfree_input_line)
     input_line_pointer = gotfree_input_line;
 #endif
@@ -4161,8 +4208,10 @@ i386_displacement (disp_start, disp_end)
       return 0;
     }
 #endif
-  else if (flag_code == CODE_64BIT)
-    i.types[this_operand] |= Disp32S | Disp32;
+
+  if (!(i.types[this_operand] & ~Disp))
+    i.types[this_operand] &= types;
+
   return 1;
 }
 
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/i386.exp 2005-05-09 08:31:39.000000000 +0200
+++ 2005-06-16/gas/testsuite/gas/i386/i386.exp 2005-06-16 16:02:10.741893848 +0200
@@ -101,6 +101,8 @@ if [expr ([istarget "i*86-*-*"] ||  [ist
  run_dump_test "tlspic"
  run_dump_test "tlsnopic"
  run_dump_test "bss"
+ run_dump_test "reloc32"
+ run_list_test "reloc32" "--defsym _bad_=1"
     }
 
     # This is a PE specific test.
@@ -137,5 +139,11 @@ if [expr ([istarget "i*86-*-*"] || [ista
  run_dump_test "x86-64-unwind"
     }
 
+    # ELF specific tests
+    if [is_elf_format] then {
+ run_dump_test "reloc64"
+ run_list_test "reloc64" "--defsym _bad_=1"
+    }
+
     set ASFLAGS "$old_ASFLAGS"
 }
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/reloc32.d 1970-01-01 01:00:00.000000000 +0100
+++ 2005-06-16/gas/testsuite/gas/i386/reloc32.d 2005-06-16 12:24:41.000000000 +0200
@@ -0,0 +1,67 @@
+#objdump: -Drw
+#name: i386 relocs
+
+.*: +file format .*i386.*
+
+Disassembly of section \.text:
+#...
+.*[ ]+R_386_32[ ]+xtrn
+.*[ ]+R_386_16[ ]+xtrn
+.*[ ]+R_386_8[ ]+xtrn
+.*[ ]+R_386_32[ ]+xtrn
+.*[ ]+R_386_16[ ]+xtrn
+.*[ ]+R_386_PC32[ ]+xtrn
+.*[ ]+R_386_PC16[ ]+xtrn
+.*[ ]+R_386_PC8[ ]+xtrn
+.*[ ]+R_386_PC32[ ]+xtrn
+.*[ ]+R_386_PC16[ ]+xtrn
+.*[ ]+R_386_PC32[ ]+xtrn
+.*[ ]+R_386_PC8[ ]+xtrn
+.*[ ]+R_386_GOT32[ ]+xtrn
+.*[ ]+R_386_GOT32[ ]+xtrn
+.*[ ]+R_386_GOTOFF[ ]+xtrn
+.*[ ]+R_386_GOTOFF[ ]+xtrn
+.*[ ]+R_386_GOTPC[ ]+_GLOBAL_OFFSET_TABLE_
+.*[ ]+R_386_GOTPC[ ]+_GLOBAL_OFFSET_TABLE_
+.*[ ]+R_386_PLT32[ ]+xtrn
+.*[ ]+R_386_PLT32[ ]+xtrn
+.*[ ]+R_386_PLT32[ ]+xtrn
+.*[ ]+R_386_TLS_GD[ ]+xtrn
+.*[ ]+R_386_TLS_GD[ ]+xtrn
+.*[ ]+R_386_TLS_GOTIE[ ]+xtrn
+.*[ ]+R_386_TLS_GOTIE[ ]+xtrn
+.*[ ]+R_386_TLS_IE[ ]+xtrn
+.*[ ]+R_386_TLS_IE[ ]+xtrn
+.*[ ]+R_386_TLS_IE_32[ ]+xtrn
+.*[ ]+R_386_TLS_IE_32[ ]+xtrn
+.*[ ]+R_386_TLS_LDM[ ]+xtrn
+.*[ ]+R_386_TLS_LDM[ ]+xtrn
+.*[ ]+R_386_TLS_LDO_32[ ]+xtrn
+.*[ ]+R_386_TLS_LDO_32[ ]+xtrn
+.*[ ]+R_386_TLS_LE[ ]+xtrn
+.*[ ]+R_386_TLS_LE[ ]+xtrn
+.*[ ]+R_386_TLS_LE_32[ ]+xtrn
+.*[ ]+R_386_TLS_LE_32[ ]+xtrn
+Disassembly of section \.data:
+#...
+.*[ ]+R_386_32[ ]+xtrn
+.*[ ]+R_386_PC32[ ]+xtrn
+.*[ ]+R_386_GOT32[ ]+xtrn
+.*[ ]+R_386_GOTOFF[ ]+xtrn
+.*[ ]+R_386_GOTPC[ ]+_GLOBAL_OFFSET_TABLE_
+.*[ ]+R_386_GOTPC[ ]+_GLOBAL_OFFSET_TABLE_
+.*[ ]+R_386_PLT32[ ]+xtrn
+#...
+.*[ ]+R_386_TLS_GD[ ]+xtrn
+#...
+.*[ ]+R_386_TLS_GOTIE[ ]+xtrn
+.*[ ]+R_386_TLS_IE[ ]+xtrn
+.*[ ]+R_386_TLS_IE_32[ ]+xtrn
+.*[ ]+R_386_TLS_LDM[ ]+xtrn
+.*[ ]+R_386_TLS_LDO_32[ ]+xtrn
+.*[ ]+R_386_TLS_LE[ ]+xtrn
+.*[ ]+R_386_TLS_LE_32[ ]+xtrn
+.*[ ]+R_386_16[ ]+xtrn
+.*[ ]+R_386_PC16[ ]+xtrn
+.*[ ]+R_386_8[ ]+xtrn
+.*[ ]+R_386_PC8[ ]+xtrn
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/reloc32.l 1970-01-01 01:00:00.000000000 +0100
+++ 2005-06-16/gas/testsuite/gas/i386/reloc32.l 2005-06-16 11:16:51.000000000 +0200
@@ -0,0 +1,67 @@
+.*: Assembler messages:
+.*:30: Error: .*
+.*:31: Error: .*
+.*:33: Error: .*
+.*:34: Error: .*
+.*:37: Error: .*
+.*:38: Error: .*
+.*:40: Error: .*
+.*:41: Error: .*
+.*:51: Error: .*
+.*:52: Error: .*
+.*:54: Error: .*
+.*:56: Error: .*
+.*:59: Error: .*
+.*:60: Error: .*
+.*:62: Error: .*
+.*:63: Error: .*
+.*:66: Error: .*
+.*:67: Error: .*
+.*:69: Error: .*
+.*:70: Error: .*
+.*:73: Error: .*
+.*:74: Error: .*
+.*:76: Error: .*
+.*:77: Error: .*
+.*:80: Error: .*
+.*:81: Error: .*
+.*:83: Error: .*
+.*:84: Error: .*
+.*:87: Error: .*
+.*:88: Error: .*
+.*:90: Error: .*
+.*:91: Error: .*
+.*:94: Error: .*
+.*:95: Error: .*
+.*:97: Error: .*
+.*:98: Error: .*
+.*:101: Error: .*
+.*:102: Error: .*
+.*:104: Error: .*
+.*:105: Error: .*
+.*:108: Error: .*
+.*:109: Error: .*
+.*:111: Error: .*
+.*:112: Error: .*
+.*:133: Error: .*
+.*:134: Error: .*
+.*:137: Error: .*
+.*:138: Error: .*
+.*:139: Error: .*
+.*:140: Error: .*
+.*:141: Error: .*
+.*:142: Error: .*
+.*:143: Error: .*
+.*:144: Error: .*
+.*:145: Error: .*
+.*:149: Error: .*
+.*:150: Error: .*
+.*:153: Error: .*
+.*:154: Error: .*
+.*:155: Error: .*
+.*:156: Error: .*
+.*:157: Error: .*
+.*:158: Error: .*
+.*:159: Error: .*
+.*:160: Error: .*
+.*:161: Error: .*
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/reloc32.s 1970-01-01 01:00:00.000000000 +0100
+++ 2005-06-16/gas/testsuite/gas/i386/reloc32.s 2005-06-16 12:04:45.000000000 +0200
@@ -0,0 +1,161 @@
+ .macro bad args:vararg
+  .ifdef _bad_
+ \args
+  .endif
+ .endm
+
+ .macro ill args:vararg
+  # This is used to mark entries that aren't handled consistently,
+  # and thus shouldn't currently be checked for.
+  # \args
+ .endm
+
+ .text
+_start:
+ mov $xtrn, %eax
+ mov $xtrn, %ax
+ mov $xtrn, %al
+ mov xtrn(%ebx), %eax
+ mov xtrn(%bx), %eax
+
+ mov $(xtrn - .), %eax
+ mov $(xtrn - .), %ax
+ mov $(xtrn - .), %al
+ mov xtrn - .(%ebx), %eax
+ mov xtrn - .(%bx), %eax
+ call xtrn
+ jecxz xtrn
+
+ mov $xtrn@got, %eax
+bad mov $xtrn@got, %ax
+bad mov $xtrn@got, %al
+ mov xtrn@got(%ebx), %eax
+bad mov xtrn@got(%bx), %eax
+bad call xtrn@got
+
+ mov $xtrn@gotoff, %eax
+bad mov $xtrn@gotoff, %ax
+bad mov $xtrn@gotoff, %al
+ mov xtrn@gotoff(%ebx), %eax
+bad mov xtrn@gotoff(%bx), %eax
+bad call xtrn@gotoff
+
+ add $_GLOBAL_OFFSET_TABLE_, %eax
+ill add $_GLOBAL_OFFSET_TABLE_, %ax
+ill add $_GLOBAL_OFFSET_TABLE_, %al
+ add $(_GLOBAL_OFFSET_TABLE_ - .), %eax
+ill add $(_GLOBAL_OFFSET_TABLE_ - .), %ax
+ill add $(_GLOBAL_OFFSET_TABLE_ - .), %al
+
+ mov $xtrn@plt, %eax
+bad mov $xtrn@plt, %ax
+bad mov $xtrn@plt, %al
+ mov xtrn@plt(%ebx), %eax
+bad mov xtrn@plt(%bx), %eax
+ call xtrn@plt
+bad jecxz xtrn@plt
+
+ mov $xtrn@tlsgd, %eax
+bad mov $xtrn@tlsgd, %ax
+bad mov $xtrn@tlsgd, %al
+ mov xtrn@tlsgd(%ebx), %eax
+bad mov xtrn@tlsgd(%bx), %eax
+bad call xtrn@tlsgd
+
+ mov $xtrn@gotntpoff, %eax
+bad mov $xtrn@gotntpoff, %ax
+bad mov $xtrn@gotntpoff, %al
+ mov xtrn@gotntpoff(%ebx), %eax
+bad mov xtrn@gotntpoff(%bx), %eax
+bad call xtrn@gotntpoff
+
+ mov $xtrn@indntpoff, %eax
+bad mov $xtrn@indntpoff, %ax
+bad mov $xtrn@indntpoff, %al
+ mov xtrn@indntpoff(%ebx), %eax
+bad mov xtrn@indntpoff(%bx), %eax
+bad call xtrn@indntpoff
+
+ mov $xtrn@gottpoff, %eax
+bad mov $xtrn@gottpoff, %ax
+bad mov $xtrn@gottpoff, %al
+ mov xtrn@gottpoff(%ebx), %eax
+bad mov xtrn@gottpoff(%bx), %eax
+bad call xtrn@gottpoff
+
+ mov $xtrn@tlsldm, %eax
+bad mov $xtrn@tlsldm, %ax
+bad mov $xtrn@tlsldm, %al
+ mov xtrn@tlsldm(%ebx), %eax
+bad mov xtrn@tlsldm(%bx), %eax
+bad call xtrn@tlsldm
+
+ mov $xtrn@dtpoff, %eax
+bad mov $xtrn@dtpoff, %ax
+bad mov $xtrn@dtpoff, %al
+ mov xtrn@dtpoff(%ebx), %eax
+bad mov xtrn@dtpoff(%bx), %eax
+bad call xtrn@dtpoff
+
+ mov $xtrn@ntpoff, %eax
+bad mov $xtrn@ntpoff, %ax
+bad mov $xtrn@ntpoff, %al
+ mov xtrn@ntpoff(%ebx), %eax
+bad mov xtrn@ntpoff(%bx), %eax
+bad call xtrn@ntpoff
+
+ mov $xtrn@tpoff, %eax
+bad mov $xtrn@tpoff, %ax
+bad mov $xtrn@tpoff, %al
+ mov xtrn@tpoff(%ebx), %eax
+bad mov xtrn@tpoff(%bx), %eax
+bad call xtrn@tpoff
+
+ .data
+ .long xtrn
+ .long xtrn - .
+ .long xtrn@got
+ .long xtrn@gotoff
+ .long _GLOBAL_OFFSET_TABLE_
+ .long _GLOBAL_OFFSET_TABLE_ - .
+ .long xtrn@plt
+ .long xtrn@tlsgd
+ .long xtrn@gotntpoff
+ .long xtrn@indntpoff
+ .long xtrn@gottpoff
+ .long xtrn@tlsldm
+ .long xtrn@dtpoff
+ .long xtrn@ntpoff
+ .long xtrn@tpoff
+
+ .word xtrn
+ .word xtrn - .
+bad .word xtrn@got
+bad .word xtrn@gotoff
+ill .word _GLOBAL_OFFSET_TABLE_
+ill .word _GLOBAL_OFFSET_TABLE_ - .
+bad .word xtrn@plt
+bad .word xtrn@tlsgd
+bad .word xtrn@gotntpoff
+bad .word xtrn@indntpoff
+bad .word xtrn@gottpoff
+bad .word xtrn@tlsldm
+bad .word xtrn@dtpoff
+bad .word xtrn@ntpoff
+bad .word xtrn@tpoff
+
+ .byte xtrn
+ .byte xtrn - .
+bad .byte xtrn@got
+bad .byte xtrn@gotoff
+ill .byte _GLOBAL_OFFSET_TABLE_
+ill .byte _GLOBAL_OFFSET_TABLE_ - .
+bad .byte xtrn@plt
+bad .byte xtrn@tlsgd
+bad .byte xtrn@gotntpoff
+bad .byte xtrn@indntpoff
+bad .byte xtrn@gottpoff
+bad .byte xtrn@tlsldm
+bad .byte xtrn@dtpoff
+bad .byte xtrn@ntpoff
+bad .byte xtrn@tpoff
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/reloc64.d 1970-01-01 01:00:00.000000000 +0100
+++ 2005-06-16/gas/testsuite/gas/i386/reloc64.d 2005-06-16 12:44:57.000000000 +0200
@@ -0,0 +1,71 @@
+#objdump: -Drw
+#name: x86-64 relocs
+
+.*: +file format .*x86-64.*
+
+Disassembly of section \.text:
+#...
+.*[ ]+R_X86_64_64[ ]+xtrn
+.*[ ]+R_X86_64_32S[ ]+xtrn
+.*[ ]+R_X86_64_32[ ]+xtrn
+.*[ ]+R_X86_64_16[ ]+xtrn
+.*[ ]+R_X86_64_8[ ]+xtrn
+.*[ ]+R_X86_64_32S[ ]+xtrn
+.*[ ]+R_X86_64_32[ ]+xtrn
+.*[ ]+R_X86_64_PC64[ ]+xtrn\+0x0*2
+.*[ ]+R_X86_64_PC32[ ]+xtrn\+0x0*2
+.*[ ]+R_X86_64_PC16[ ]+xtrn\+0x0*2
+.*[ ]+R_X86_64_PC8[ ]+xtrn\+0x0*1
+.*[ ]+R_X86_64_PC32[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_PC32[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_PC8[ ]+xtrn\+0xf+f
+.*[ ]+R_X86_64_GOT32[ ]+xtrn
+.*[ ]+R_X86_64_GOT32[ ]+xtrn
+.*[ ]+R_X86_64_GOTOFF64[ ]+xtrn
+.*[ ]+R_X86_64_GOTPCREL[ ]+xtrn
+.*[ ]+R_X86_64_GOTPCREL[ ]+xtrn
+.*[ ]+R_X86_64_GOTPCREL[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0x0*2
+.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0xf+f
+.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_\+0x0*2
+.*[ ]+R_X86_64_PLT32[ ]+xtrn
+.*[ ]+R_X86_64_PLT32[ ]+xtrn
+.*[ ]+R_X86_64_PLT32[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_TLSGD[ ]+xtrn
+.*[ ]+R_X86_64_TLSGD[ ]+xtrn
+.*[ ]+R_X86_64_TLSGD[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_GOTTPOFF[ ]+xtrn
+.*[ ]+R_X86_64_GOTTPOFF[ ]+xtrn
+.*[ ]+R_X86_64_GOTTPOFF[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_TLSLD[ ]+xtrn
+.*[ ]+R_X86_64_TLSLD[ ]+xtrn
+.*[ ]+R_X86_64_TLSLD[ ]+xtrn\+0xf+c
+.*[ ]+R_X86_64_DTPOFF64[ ]+xtrn
+.*[ ]+R_X86_64_DTPOFF32[ ]+xtrn
+.*[ ]+R_X86_64_DTPOFF32[ ]+xtrn
+.*[ ]+R_X86_64_TPOFF64[ ]+xtrn
+.*[ ]+R_X86_64_TPOFF32[ ]+xtrn
+.*[ ]+R_X86_64_TPOFF32[ ]+xtrn
+Disassembly of section \.data:
+#...
+.*[ ]+R_X86_64_64[ ]+xtrn
+.*[ ]+R_X86_64_PC64[ ]+xtrn
+.*[ ]+R_X86_64_GOTOFF64[ ]+xtrn
+.*[ ]+R_X86_64_DTPOFF64[ ]+xtrn
+.*[ ]+R_X86_64_TPOFF64[ ]+xtrn
+.*[ ]+R_X86_64_32[ ]+xtrn
+.*[ ]+R_X86_64_PC32[ ]+xtrn
+.*[ ]+R_X86_64_GOT32[ ]+xtrn
+.*[ ]+R_X86_64_GOTPCREL[ ]+xtrn
+.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_
+.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_
+.*[ ]+R_X86_64_PLT32[ ]+xtrn
+.*[ ]+R_X86_64_TLSGD[ ]+xtrn
+.*[ ]+R_X86_64_GOTTPOFF[ ]+xtrn
+.*[ ]+R_X86_64_TLSLD[ ]+xtrn
+.*[ ]+R_X86_64_DTPOFF32[ ]+xtrn
+.*[ ]+R_X86_64_TPOFF32[ ]+xtrn
+.*[ ]+R_X86_64_16[ ]+xtrn
+.*[ ]+R_X86_64_PC16[ ]+xtrn
+.*[ ]+R_X86_64_8[ ]+xtrn
+.*[ ]+R_X86_64_PC8[ ]+xtrn
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/reloc64.l 1970-01-01 01:00:00.000000000 +0100
+++ 2005-06-16/gas/testsuite/gas/i386/reloc64.l 2005-06-16 12:47:27.000000000 +0200
@@ -0,0 +1,77 @@
+.*: Assembler messages:
+.*:29: Error: .*
+.*:33: Error: .*
+.*:35: Error: .*
+.*:36: Error: .*
+.*:37: Error: .*
+.*:39: Error: .*
+.*:40: Error: .*
+.*:43: Error: .*
+.*:44: Error: .*
+.*:45: Error: .*
+.*:46: Error: .*
+.*:47: Error: .*
+.*:48: Error: .*
+.*:49: Error: .*
+.*:51: Error: .*
+.*:53: Error: .*
+.*:54: Error: .*
+.*:55: Error: .*
+.*:57: Error: .*
+.*:66: Error: .*
+.*:73: Error: .*
+.*:75: Error: .*
+.*:76: Error: .*
+.*:77: Error: .*
+.*:79: Error: .*
+.*:81: Error: .*
+.*:83: Error: .*
+.*:85: Error: .*
+.*:86: Error: .*
+.*:87: Error: .*
+.*:89: Error: .*
+.*:92: Error: .*
+.*:94: Error: .*
+.*:95: Error: .*
+.*:96: Error: .*
+.*:98: Error: .*
+.*:101: Error: .*
+.*:103: Error: .*
+.*:104: Error: .*
+.*:105: Error: .*
+.*:107: Error: .*
+.*:112: Error: .*
+.*:113: Error: .*
+.*:114: Error: .*
+.*:116: Error: .*
+.*:117: Error: .*
+.*:121: Error: .*
+.*:122: Error: .*
+.*:123: Error: .*
+.*:125: Error: .*
+.*:126: Error: .*
+.*:131: Error: .*
+.*:133: Error: .*
+.*:136: Error: .*
+.*:137: Error: .*
+.*:138: Error: .*
+.*:139: Error: .*
+.*:146: Error: .*
+.*:159: Error: .*
+.*:160: Error: .*
+.*:161: Error: .*
+.*:164: Error: .*
+.*:165: Error: .*
+.*:166: Error: .*
+.*:167: Error: .*
+.*:168: Error: .*
+.*:169: Error: .*
+.*:173: Error: .*
+.*:174: Error: .*
+.*:175: Error: .*
+.*:178: Error: .*
+.*:179: Error: .*
+.*:180: Error: .*
+.*:181: Error: .*
+.*:182: Error: .*
+.*:183: Error: .*
--- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/testsuite/gas/i386/reloc64.s 1970-01-01 01:00:00.000000000 +0100
+++ 2005-06-16/gas/testsuite/gas/i386/reloc64.s 2005-06-16 12:43:35.000000000 +0200
@@ -0,0 +1,183 @@
+ .macro bad args:vararg
+  .ifdef _bad_
+ \args
+  .endif
+ .endm
+
+ .macro ill args:vararg
+  # This is used to mark entries that aren't handled consistently,
+  # and thus shouldn't currently be checked for.
+  # \args
+ .endm
+
+ .text
+_start:
+ movabs $xtrn, %rax
+ add $xtrn, %rax
+ mov $xtrn, %eax
+ mov $xtrn, %ax
+ mov $xtrn, %al
+ mov xtrn(%rbx), %eax
+ mov xtrn(%ebx), %eax
+
+ movabs $(xtrn - .), %rax
+ add $(xtrn - .), %rax
+ill mov $(xtrn - .), %eax
+ mov $(xtrn - .), %ax
+ mov $(xtrn - .), %al
+ mov xtrn(%rip), %eax
+bad mov xtrn(%eip), %eax
+ call xtrn
+ jrcxz xtrn
+
+bad movabs $xtrn@got, %rax
+ add $xtrn@got, %rax
+bad mov $xtrn@got, %eax
+bad mov $xtrn@got, %ax
+bad mov $xtrn@got, %al
+ mov xtrn@got(%rbx), %eax
+bad mov xtrn@got(%ebx), %eax
+bad call xtrn@got
+
+ movabs $xtrn@gotoff, %rax
+bad add $xtrn@gotoff, %rax
+bad mov $xtrn@gotoff, %eax
+bad mov $xtrn@gotoff, %ax
+bad mov $xtrn@gotoff, %al
+bad mov xtrn@gotoff(%rbx), %eax
+bad mov xtrn@gotoff(%ebx), %eax
+bad call xtrn@gotoff
+
+bad movabs $xtrn@gotpcrel, %rax
+ add $xtrn@gotpcrel, %rax
+bad mov $xtrn@gotpcrel, %eax
+bad mov $xtrn@gotpcrel, %ax
+bad mov $xtrn@gotpcrel, %al
+ mov xtrn@gotpcrel(%rbx), %eax
+bad mov xtrn@gotpcrel(%ebx), %eax
+ call xtrn@gotpcrel
+
+ill movabs $_GLOBAL_OFFSET_TABLE_, %rax
+ add $_GLOBAL_OFFSET_TABLE_, %rax
+ill add $_GLOBAL_OFFSET_TABLE_, %eax
+ill add $_GLOBAL_OFFSET_TABLE_, %ax
+ill add $_GLOBAL_OFFSET_TABLE_, %al
+ lea _GLOBAL_OFFSET_TABLE_(%rip), %rax #???
+bad lea _GLOBAL_OFFSET_TABLE_(%eip), %rax
+ill movabs $(_GLOBAL_OFFSET_TABLE_ - .), %rax
+ add $(_GLOBAL_OFFSET_TABLE_ - .), %rax
+ill add $(_GLOBAL_OFFSET_TABLE_ - .), %eax
+ill add $(_GLOBAL_OFFSET_TABLE_ - .), %ax
+ill add $(_GLOBAL_OFFSET_TABLE_ - .), %al
+
+bad movabs $xtrn@plt, %rax
+ add $xtrn@plt, %rax
+bad mov $xtrn@plt, %eax
+bad mov $xtrn@plt, %ax
+bad mov $xtrn@plt, %al
+ mov xtrn@plt(%rbx), %eax
+bad mov xtrn@plt(%ebx), %eax
+ call xtrn@plt
+bad jrcxz xtrn@plt
+
+bad movabs $xtrn@tlsgd, %rax
+ add $xtrn@tlsgd, %rax
+bad mov $xtrn@tlsgd, %eax
+bad mov $xtrn@tlsgd, %ax
+bad mov $xtrn@tlsgd, %al
+ mov xtrn@tlsgd(%rbx), %eax
+bad mov xtrn@tlsgd(%ebx), %eax
+ call xtrn@tlsgd
+
+bad movabs $xtrn@gottpoff, %rax
+ add $xtrn@gottpoff, %rax
+bad mov $xtrn@gottpoff, %eax
+bad mov $xtrn@gottpoff, %ax
+bad mov $xtrn@gottpoff, %al
+ mov xtrn@gottpoff(%rbx), %eax
+bad mov xtrn@gottpoff(%ebx), %eax
+ call xtrn@gottpoff
+
+bad movabs $xtrn@tlsld, %rax
+ add $xtrn@tlsld, %rax
+bad mov $xtrn@tlsld, %eax
+bad mov $xtrn@tlsld, %ax
+bad mov $xtrn@tlsld, %al
+ mov xtrn@tlsld(%rbx), %eax
+bad mov xtrn@tlsld(%ebx), %eax
+ call xtrn@tlsld
+
+ movabs $xtrn@dtpoff, %rax
+ add $xtrn@dtpoff, %rax
+bad mov $xtrn@dtpoff, %eax
+bad mov $xtrn@dtpoff, %ax
+bad mov $xtrn@dtpoff, %al
+ mov xtrn@dtpoff(%rbx), %eax
+bad mov xtrn@dtpoff(%ebx), %eax
+bad call xtrn@dtpoff
+
+ movabs $xtrn@tpoff, %rax
+ add $xtrn@tpoff, %rax
+bad mov $xtrn@tpoff, %eax
+bad mov $xtrn@tpoff, %ax
+bad mov $xtrn@tpoff, %al
+ mov xtrn@tpoff(%rbx), %eax
+bad mov xtrn@tpoff(%ebx), %eax
+bad call xtrn@tpoff
+
+ .data
+ .quad xtrn
+ .quad xtrn - .
+bad .quad xtrn@got
+ .quad xtrn@gotoff
+bad .quad xtrn@gotpcrel
+ill .quad _GLOBAL_OFFSET_TABLE_
+ill .quad _GLOBAL_OFFSET_TABLE_ - .
+bad .quad xtrn@plt
+bad .quad xtrn@tlsgd
+bad .quad xtrn@gottpoff
+bad .quad xtrn@tlsld
+ .quad xtrn@dtpoff
+ .quad xtrn@tpoff
+
+ .long xtrn
+ .long xtrn - .
+ .long xtrn@got
+bad .long xtrn@gotoff
+ .long xtrn@gotpcrel
+ .long _GLOBAL_OFFSET_TABLE_
+ .long _GLOBAL_OFFSET_TABLE_ - .
+ .long xtrn@plt
+ .long xtrn@tlsgd
+ .long xtrn@gottpoff
+ .long xtrn@tlsld
+ .long xtrn@dtpoff
+ .long xtrn@tpoff
+
+ .word xtrn
+ .word xtrn - .
+bad .word xtrn@got
+bad .word xtrn@gotoff
+bad .word xtrn@gotpcrel
+ill .word _GLOBAL_OFFSET_TABLE_
+ill .word _GLOBAL_OFFSET_TABLE_ - .
+bad .word xtrn@plt
+bad .word xtrn@tlsgd
+bad .word xtrn@gottpoff
+bad .word xtrn@tlsld
+bad .word xtrn@dtpoff
+bad .word xtrn@tpoff
+
+ .byte xtrn
+ .byte xtrn - .
+bad .byte xtrn@got
+bad .byte xtrn@gotoff
+bad .byte xtrn@gotpcrel
+ill .byte _GLOBAL_OFFSET_TABLE_
+ill .byte _GLOBAL_OFFSET_TABLE_ - .
+bad .byte xtrn@plt
+bad .byte xtrn@tlsgd
+bad .byte xtrn@gottpoff
+bad .byte xtrn@tlsld
+bad .byte xtrn@dtpoff
+bad .byte xtrn@tpoff


binutils-mainline-x86-got-reloc.patch (28K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] x86: fix assembler's @got-style relocation handling

H.J. Lu-27
On Thu, Jun 16, 2005 at 08:43:11AM -0600, Jan Beulich wrote:

> --- /home/jbeulich/src/binutils/mainline/2005-06-16/gas/config/tc-i386.c 2005-06-08 14:50:49.000000000 +0200
> +++ 2005-06-16/gas/config/tc-i386.c 2005-06-16 16:01:18.006910784 +0200
> @@ -1201,22 +1201,54 @@ pt (t)
>  #endif /* DEBUG386 */
>  
>  static bfd_reloc_code_real_type reloc
> -  PARAMS ((int, int, int, bfd_reloc_code_real_type));
> +  PARAMS ((unsigned int, int, int, bfd_reloc_code_real_type));
>  
>  static bfd_reloc_code_real_type
>  reloc (size, pcrel, sign, other)
> -     int size;
> +     unsigned int size;
>       int pcrel;
>       int sign;
>       bfd_reloc_code_real_type other;

Could you please change those functions to C90 while you are on it?

Thanks.

H.J.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] x86: fix assembler's @got-style relocation handling

Jan Beulich
In reply to this post by Jan Beulich
>Could you please change those functions to C90 while you are on it?

Wouldn't it make more sense to do this for the whole file, and as a separate checkin?

Jan

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] x86: fix assembler's @got-style relocation handling

H.J. Lu-27
In reply to this post by Jan Beulich
On Thu, Jun 16, 2005 at 08:59:23AM -0600, Jan Beulich wrote:
> >Could you please change those functions to C90 while you are on it?
>
> Wouldn't it make more sense to do this for the whole file, and as a separate checkin?
>

Since you have to change those function prototypes anyway, I don't
feel we should add more K&R stuff.


H.J.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] x86: fix assembler's @got-style relocation handling

Daniel Jacobowitz-2
On Thu, Jun 16, 2005 at 08:06:40AM -0700, H. J. Lu wrote:
> On Thu, Jun 16, 2005 at 08:59:23AM -0600, Jan Beulich wrote:
> > >Could you please change those functions to C90 while you are on it?
> >
> > Wouldn't it make more sense to do this for the whole file, and as a separate checkin?
> >
>
> Since you have to change those function prototypes anyway, I don't
> feel we should add more K&R stuff.

In that case, I recommend doing the conversion to C90 first.  Please
don't do it as part of another patch.

--
Daniel Jacobowitz
CodeSourcery, LLC