Add support for COFF secidx relocations

bfd	* coff-i386.c (in_reloc_p): Add R_SECTION.
	(howto_table): Add R_SECTION.
	(coff_pe_i386_relocation_section): Add support for R_SECTION.
	(coff_i386_reloc_type_lookup): Add support for
	BFD_RELOC_16_SECCIDX.
	* coff-x86_64.c (in_reloc_p): Add R_SECTION.
	(howto_table): Add R_SECTION.
	(coff_pe_amd64_relocation_section): Add support for R_SECTION.
	(coff_amd64_reloc_type_lookup): Add support for
	BFD_RELOC_16_SECCIDX.
	* reloc.c: Add BFD_RELOC_16_SECIDX.
	* bfd-in2.h: Regenerate.
	* libbfd.h: Regenerate.

gas	* config/tc-i386.c (pe_directive_secidx): New function.
	(md_pseudo_table): Add support for secidx.
	(x86_cons_fix_new): Likewise.
	(tc_gen_reloc): Likewise.
	* expr.c (op_rank): Add O_secidx.
	* expr.h (operatorT): Likewise.
	* symbols.c (resolve_symbol_value): Add support for O_secidx.
	* testsuite/gas/i386/secidx.s: New test source file.
	* testsuite/gas/i386/secidx.d: New test driver file.
	* testsuite/gas/i386/i386.exp: Run new test.

include	* coff/i386.h: Define R_SECTION.
	* coff/x86_64.h: Likewise.

ld	* testsuite/ld-pe/secidx1.s: New test source file.
	* testsuite/ld-pe/secidx2.s: New test source file.
	* testsuite/ld-pe/secidx.d: New test driver file.
	* testsuite/ld-pe/secidx_64.d: New test driver file.
	* testsuite/ld-pe/pe.exp: Add new tests.
This commit is contained in:
Mark Harmstone
2022-04-07 14:47:17 +01:00
committed by Nick Clifton
parent 591cc9fbbf
commit 145667f8d9
23 changed files with 576 additions and 35 deletions

View File

@@ -18,28 +18,27 @@
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
/*
* By popular demand, we define a struct to represent an expression.
* This will no doubt mutate as expressions become baroque.
*
* Currently, we support expressions like "foo OP bar + 42". In other
* words we permit a (possibly undefined) symbol, a (possibly
* undefined) symbol and the operation used to combine the symbols,
* and an (absolute) augend. RMS says this is so we can have 1-pass
* assembly for any compiler emissions, and a 'case' statement might
* emit 'undefined1 - undefined2'.
*
* The type of an expression used to be stored as a segment. That got
* confusing because it overloaded the concept of a segment. I added
* an operator field, instead.
*/
/* By popular demand, we define a struct to represent an expression.
This will no doubt mutate as expressions become baroque.
Currently, we support expressions like "foo OP bar + 42". In other
words we permit a (possibly undefined) symbol, a (possibly
undefined) symbol and the operation used to combine the symbols,
and an (absolute) augend. RMS says this is so we can have 1-pass
assembly for any compiler emissions, and a 'case' statement might
emit 'undefined1 - undefined2'.
The type of an expression used to be stored as a segment. That got
confusing because it overloaded the concept of a segment. I added
an operator field, instead. */
/* This is the type of an expression. The operator types are also
used while parsing an expression.
NOTE: This enumeration must match the op_rank array in expr.c. */
typedef enum {
typedef enum
{
/* An illegal expression. */
O_illegal,
/* A nonexistent expression. */
@@ -50,6 +49,8 @@ typedef enum {
O_symbol,
/* X_add_symbol + X_add_number - the base address of the image. */
O_symbol_rva,
/* The section index of X_add_symbol. */
O_secidx,
/* A register (X_add_number is register number). */
O_register,
/* A big value. If X_add_number is negative or 0, the value is in
@@ -112,7 +113,8 @@ typedef enum {
O_max
} operatorT;
typedef struct expressionS {
typedef struct expressionS
{
/* The main symbol. */
symbolS *X_add_symbol;
/* The second symbol, if needed. */
@@ -182,12 +184,10 @@ extern unsigned int get_single_number (void);
extern symbolS *make_expr_symbol (expressionS * expressionP);
extern int expr_symbol_where (symbolS *, const char **, unsigned int *);
extern void current_location (expressionS *);
extern symbolS *expr_build_uconstant (offsetT);
extern symbolS *expr_build_dot (void);
extern uint32_t generic_bignum_to_int32 (void);
extern uint64_t generic_bignum_to_int64 (void);
int resolve_expression (expressionS *);
extern int resolve_expression (expressionS *);
extern bool literal_prefix_dollar_hex;