[PATCH] x86: Report invalid TLS relocation name
Jan Beulich
jbeulich@suse.com
Wed Aug 28 05:39:19 GMT 2024
On 27.08.2024 22:15, H.J. Lu wrote:
> On Tue, Aug 27, 2024 at 9:57 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>> --- a/gas/config/tc-i386.c
>> +++ b/gas/config/tc-i386.c
>> @@ -1293,6 +1293,94 @@ static htab_t op_hash;
>>
>> /* Hash table for register lookup. */
>> static htab_t reg_hash;
>> +
>> +static const struct
>> +{
>> + const char *str;
>> + int len;
As it is being moved, please conver to unsigned int.
>> + const enum bfd_reloc_code_real rel[2];
>> + const i386_operand_type types64;
>> + bool need_GOT_symbol;
>> +}
>> +gotrel[] =
>> +{
>> +#define OPERAND_TYPE_IMM32_32S_DISP32 { .bitfield = \
>> + { .imm32 = 1, .imm32s = 1, .disp32 = 1 } }
>> +#define OPERAND_TYPE_IMM32_32S_64_DISP32 { .bitfield = \
>> + { .imm32 = 1, .imm32s = 1, .imm64 = 1, .disp32 = 1 } }
>> +#define OPERAND_TYPE_IMM32_32S_64_DISP32_64 { .bitfield = \
>> + { .imm32 = 1, .imm32s = 1, .imm64 = 1, .disp32 = 1, .disp64 = 1 } }
>> +#define OPERAND_TYPE_IMM64_DISP64 { .bitfield = \
>> + { .imm64 = 1, .disp64 = 1 } }
>> +
>> +#ifndef TE_PE
>> +#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
>> + { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
>> + BFD_RELOC_SIZE32 },
>> + { .bitfield = { .imm32 = 1, .imm64 = 1 } }, false },
>> +#endif
>> + { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
>> + BFD_RELOC_X86_64_PLTOFF64 },
>> + { .bitfield = { .imm64 = 1 } }, true },
>> + { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
>> + BFD_RELOC_X86_64_PLT32 },
>> + OPERAND_TYPE_IMM32_32S_DISP32, false },
>> + { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
>> + BFD_RELOC_X86_64_GOTPLT64 },
>> + OPERAND_TYPE_IMM64_DISP64, true },
>> + { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
>> + BFD_RELOC_X86_64_GOTOFF64 },
>> + OPERAND_TYPE_IMM64_DISP64, true },
>> + { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
>> + BFD_RELOC_X86_64_GOTPCREL },
>> + OPERAND_TYPE_IMM32_32S_DISP32, true },
>> + { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
>> + BFD_RELOC_X86_64_TLSGD },
>> + OPERAND_TYPE_IMM32_32S_DISP32, true },
>> + { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
>> + _dummy_first_bfd_reloc_code_real },
>> + OPERAND_TYPE_NONE, true },
>> + { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
>> + BFD_RELOC_X86_64_TLSLD },
>> + OPERAND_TYPE_IMM32_32S_DISP32, true },
>> + { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
>> + BFD_RELOC_X86_64_GOTTPOFF },
>> + OPERAND_TYPE_IMM32_32S_DISP32, true },
>> + { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
>> + BFD_RELOC_X86_64_TPOFF32 },
>> + OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
>> + { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
>> + _dummy_first_bfd_reloc_code_real },
>> + OPERAND_TYPE_NONE, true },
>> + { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
>> + BFD_RELOC_X86_64_DTPOFF32 },
>> + OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
>> + { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
>> + _dummy_first_bfd_reloc_code_real },
>> + OPERAND_TYPE_NONE, true },
>> + { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
>> + _dummy_first_bfd_reloc_code_real },
>> + OPERAND_TYPE_NONE, true },
>> + { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
>> + BFD_RELOC_X86_64_GOT32 },
>> + OPERAND_TYPE_IMM32_32S_64_DISP32, true },
>> + { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
>> + BFD_RELOC_X86_64_GOTPC32_TLSDESC },
>> + OPERAND_TYPE_IMM32_32S_DISP32, true },
>> + { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
>> + BFD_RELOC_X86_64_TLSDESC_CALL },
>> + OPERAND_TYPE_IMM32_32S_DISP32, true },
>> +#else /* TE_PE */
>> + { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
>> + BFD_RELOC_32_SECREL },
>> + OPERAND_TYPE_IMM32_32S_64_DISP32_64, false },
>> +#endif
>> +
>> +#undef OPERAND_TYPE_IMM32_32S_DISP32
>> +#undef OPERAND_TYPE_IMM32_32S_64_DISP32
>> +#undef OPERAND_TYPE_IMM32_32S_64_DISP32_64
>> +#undef OPERAND_TYPE_IMM64_DISP64
>> +};
>>
>> /* Various efficient no-op patterns for aligning code labels.
>> Note: Don't try to assemble the instructions in the comments.
>> @@ -6586,8 +6674,16 @@ i386_assemble (char *line)
>> case BFD_RELOC_X86_64_GOTTPOFF:
>> case BFD_RELOC_386_TLS_GOTIE:
>> case BFD_RELOC_X86_64_TLSLD:
>> - as_bad (_("TLS relocation cannot be used with `%s'"), insn_name (&i.tm));
>> - return;
>> + for (unsigned int k = 0; k < ARRAY_SIZE (gotrel); k++)
>> + {
>> + if (gotrel[k].rel[object_64bit] == i.reloc[j])
>> + {
>> + as_bad (_("%s relocation cannot be used with `%s'"),
>> + gotrel[k].str, insn_name (&i.tm));
Please can you make this @%s to match what's used in source? That'll
at least somewhat disambiguate the name space (as "relocation" could
also mean other things).
> This is what I am checking in.
I'm sorry for repeating myself, but can you please, please wait some
before committing patches? How in the world am I to respond if you
send a patch after my workday ended and you commit it just a couple
of hours later? Just mention it once again - I am usually giving it
a week for people to comment. I'd really expect the same from you.
Jan
More information about the Binutils
mailing list