[PATCH] x86: fix gas' relocation type selection
Jan Beulich
JBeulich@novell.com
Mon Jul 18 13:49:00 GMT 2005
Relocation type selection up to now was dependent on the current code
size
model, but it instead should exclusively depend on the output file
format
(for example, even when in 64-bit code but in a 32-bit object, i386
relocations should be used rather than x86-64 ones [or perhaps a
mixture of
both]).
Built and tested on x86_64-unknown-linux-gnu.
Jan
gas/
2005-07-18 Jan Beulich <jbeulich@novell.com>
* config/tc-i386.c (use_rela_relocations): Change type to
unsigned.
(output_disp): Use use_rela_relocations for relocation type
determination.
(output_imm): Likewise.
(i386_validate_fix): Likewise.
(tc_gen_reloc): Likewise.
(lex_got): Likewise. Remove static mode_name. Change array size
of gotrel's rel field, and adjust its initializer. Adjust
diagnostic.
(x86_cons): Use use_rela_relocations for deciding whether quad
fields
can have relocations.
---
/home/jbeulich/src/binutils/mainline/2005-07-18/gas/config/tc-i386.c 2005-07-18
08:26:50.000000000 +0200
+++ 2005-07-18/gas/config/tc-i386.c 2005-07-18 13:46:49.045072752
+0200
@@ -284,7 +284,7 @@ enum flag_code {
#define NUM_FLAG_CODE ((int) CODE_64BIT + 1)
static enum flag_code flag_code;
-static int use_rela_relocations = 0;
+static unsigned int use_rela_relocations = 0;
/* The names used to print error messages. */
static const char *flag_code_names[] =
@@ -3591,7 +3591,7 @@ output_disp (insn_start_frag, insn_start
add += p - frag_now->fr_literal;
}
- if (flag_code != CODE_64BIT)
+ if (!use_rela_relocations)
reloc_type = BFD_RELOC_386_GOTPC;
else
reloc_type = BFD_RELOC_X86_64_GOTPC32;
@@ -3728,7 +3728,7 @@ output_imm (insn_start_frag, insn_start_
add += p - frag_now->fr_literal;
}
- if (flag_code != CODE_64BIT)
+ if (!use_rela_relocations)
reloc_type = BFD_RELOC_386_GOTPC;
else
reloc_type = BFD_RELOC_X86_64_GOTPC32;
@@ -3756,25 +3756,24 @@ lex_got (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 enum bfd_reloc_code_real rel[2];
const unsigned int types64;
} gotrel[] = {
- { "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 }
+ { "PLT", { BFD_RELOC_386_PLT32, BFD_RELOC_X86_64_PLT32
}, Imm32|Imm32S|Disp32 },
+ { "GOTOFF", { BFD_RELOC_386_GOTOFF,
BFD_RELOC_X86_64_GOTOFF64 }, Imm64|Disp64 },
+ { "GOTPCREL", { 0,
BFD_RELOC_X86_64_GOTPCREL }, Imm32|Imm32S|Disp32 },
+ { "TLSGD", { BFD_RELOC_386_TLS_GD, BFD_RELOC_X86_64_TLSGD
}, Imm32|Imm32S|Disp32 },
+ { "TLSLDM", { BFD_RELOC_386_TLS_LDM, 0
}, 0 },
+ { "TLSLD", { 0, BFD_RELOC_X86_64_TLSLD
}, Imm32|Imm32S|Disp32 },
+ { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32,
BFD_RELOC_X86_64_GOTTPOFF }, Imm32|Imm32S|Disp32 },
+ { "TPOFF", { BFD_RELOC_386_TLS_LE_32, BFD_RELOC_X86_64_TPOFF32
}, Imm32|Imm32S|Imm64|Disp32|Disp64 },
+ { "NTPOFF", { BFD_RELOC_386_TLS_LE, 0
}, 0 },
+ { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32,
BFD_RELOC_X86_64_DTPOFF32 }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
+ { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE, 0
}, 0 },
+ { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE, 0
}, 0 },
+ { "GOT", { BFD_RELOC_386_GOT32, BFD_RELOC_X86_64_GOT32
}, Imm32|Imm32S|Disp32 }
};
char *cp;
unsigned int j;
@@ -3790,12 +3789,12 @@ lex_got (enum bfd_reloc_code_real *reloc
len = strlen (gotrel[j].str);
if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
{
- if (gotrel[j].rel[(unsigned int) flag_code] != 0)
+ if (gotrel[j].rel[use_rela_relocations] != 0)
{
int first, second;
char *tmpbuf, *past_reloc;
- *reloc = gotrel[j].rel[(unsigned int) flag_code];
+ *reloc = gotrel[j].rel[use_rela_relocations];
if (adjust)
*adjust = len;
@@ -3834,8 +3833,8 @@ lex_got (enum bfd_reloc_code_real *reloc
return tmpbuf;
}
- as_bad (_("@%s reloc is not supported in %s bit mode"),
- gotrel[j].str, mode_name[(unsigned int) flag_code]);
+ as_bad (_("@%s reloc is not supported with %d-bit output
format"),
+ gotrel[j].str, 1 << (5 + use_rela_relocations));
return NULL;
}
}
@@ -3865,7 +3864,7 @@ x86_cons (exp, size)
expressionS *exp;
int size;
{
- if (size == 4 || (flag_code == CODE_64BIT && size == 8))
+ if (size == 4 || (use_rela_relocations && size == 8))
{
/* Handle @GOTOFF and the like in an expression. */
char *save;
@@ -5451,13 +5450,13 @@ i386_validate_fix (fixp)
{
if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
{
- if (flag_code != CODE_64BIT)
+ if (!use_rela_relocations)
abort ();
fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
}
else
{
- if (flag_code != CODE_64BIT)
+ if (!use_rela_relocations)
fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
else
fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
@@ -5559,7 +5558,7 @@ tc_gen_reloc (section, fixp)
&& GOT_symbol
&& fixp->fx_addsy == GOT_symbol)
{
- if (flag_code != CODE_64BIT)
+ if (!use_rela_relocations)
code = BFD_RELOC_386_GOTPC;
else
code = BFD_RELOC_X86_64_GOTPC32;
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: binutils-mainline-x86-reloc-type.patch
URL: <https://sourceware.org/pipermail/binutils/attachments/20050718/3d2e1715/attachment.ksh>
More information about the Binutils
mailing list