public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* som.c reloc sanity checking
@ 2022-10-26  5:10 Alan Modra
  2022-10-27 17:48 ` John David Anglin
  0 siblings, 1 reply; 2+ messages in thread
From: Alan Modra @ 2022-10-26  5:10 UTC (permalink / raw)
  To: binutils; +Cc: Dave Anglin, Jeff Law

This patch checks that relocations emitted in som_write_fixups have
offsets that are monotonic and within a section.  To do that properly
using bfd_reloc_offset_in_range it is necessary to set the reloc howto
size field, which isn't used otherwise by the som backend.  Note that
the sizes used are not exactly those in the old sizing switch
statement deleted from som_write_fixups, but all relocs handled by the
main switch statement there get the same size.  Most unhandled relocs
get a zero size (exceptions being R_RELOCATION, R_SPACE_REF,
R_MILLI_REL, R_BREAKPOINT which all involve writing one word according
to my SOM reference).  I figure it doesn't matter since any unhandled
reloc is converted to 0xff R_RESERVED, and a default of zero is better
for a "don't know" reloc.

Besides tidying the code, stringizing name from type in SOM_HOWTO
fixes R_REPEATED_INIT name.

	* som.c (SOM_HOWTO): Add SIZE arg, delete NAME.  Stringize type
	to name.
	(som_hppa_howto_table): Update with sizes.
	(som_write_fixups): Delete sizing switch statement.  Sanity check
	bfd_reloc address against subsection size.

diff --git a/bfd/som.c b/bfd/som.c
index b9114e630fe..b3a72e36ede 100644
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -635,267 +635,268 @@ static const int comp3_opcodes[] =
 #define R_SHORT_PCREL_MODE 0x3e
 #endif
 
-#define SOM_HOWTO(TYPE, NAME)	\
-  HOWTO(TYPE, 0, 0, 32, false, 0, 0, hppa_som_reloc, NAME, false, 0, 0, false)
+#define SOM_HOWTO(SIZE, TYPE)	\
+  HOWTO(TYPE, 0, SIZE, 32, false, 0, 0, hppa_som_reloc, \
+	#TYPE, false, 0, 0, false)
 
 static reloc_howto_type som_hppa_howto_table[] =
 {
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
-  SOM_HOWTO (R_ZEROES, "R_ZEROES"),
-  SOM_HOWTO (R_ZEROES, "R_ZEROES"),
-  SOM_HOWTO (R_UNINIT, "R_UNINIT"),
-  SOM_HOWTO (R_UNINIT, "R_UNINIT"),
-  SOM_HOWTO (R_RELOCATION, "R_RELOCATION"),
-  SOM_HOWTO (R_DATA_ONE_SYMBOL, "R_DATA_ONE_SYMBOL"),
-  SOM_HOWTO (R_DATA_ONE_SYMBOL, "R_DATA_ONE_SYMBOL"),
-  SOM_HOWTO (R_DATA_PLABEL, "R_DATA_PLABEL"),
-  SOM_HOWTO (R_DATA_PLABEL, "R_DATA_PLABEL"),
-  SOM_HOWTO (R_SPACE_REF, "R_SPACE_REF"),
-  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
-  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
-  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
-  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
-  SOM_HOWTO (R_SHORT_PCREL_MODE, "R_SHORT_PCREL_MODE"),
-  SOM_HOWTO (R_LONG_PCREL_MODE, "R_LONG_PCREL_MODE"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
-  SOM_HOWTO (R_DATA_GPREL, "R_DATA_GPREL"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_DLT_REL, "R_DLT_REL"),
-  SOM_HOWTO (R_DLT_REL, "R_DLT_REL"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_MILLI_REL, "R_MILLI_REL"),
-  SOM_HOWTO (R_MILLI_REL, "R_MILLI_REL"),
-  SOM_HOWTO (R_CODE_PLABEL, "R_CODE_PLABEL"),
-  SOM_HOWTO (R_CODE_PLABEL, "R_CODE_PLABEL"),
-  SOM_HOWTO (R_BREAKPOINT, "R_BREAKPOINT"),
-  SOM_HOWTO (R_ENTRY, "R_ENTRY"),
-  SOM_HOWTO (R_ENTRY, "R_ENTRY"),
-  SOM_HOWTO (R_ALT_ENTRY, "R_ALT_ENTRY"),
-  SOM_HOWTO (R_EXIT, "R_EXIT"),
-  SOM_HOWTO (R_BEGIN_TRY, "R_BEGIN_TRY"),
-  SOM_HOWTO (R_END_TRY, "R_END_TRY"),
-  SOM_HOWTO (R_END_TRY, "R_END_TRY"),
-  SOM_HOWTO (R_END_TRY, "R_END_TRY"),
-  SOM_HOWTO (R_BEGIN_BRTAB, "R_BEGIN_BRTAB"),
-  SOM_HOWTO (R_END_BRTAB, "R_END_BRTAB"),
-  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),
-  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),
-  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),
-  SOM_HOWTO (R_DATA_EXPR, "R_DATA_EXPR"),
-  SOM_HOWTO (R_CODE_EXPR, "R_CODE_EXPR"),
-  SOM_HOWTO (R_FSEL, "R_FSEL"),
-  SOM_HOWTO (R_LSEL, "R_LSEL"),
-  SOM_HOWTO (R_RSEL, "R_RSEL"),
-  SOM_HOWTO (R_N_MODE, "R_N_MODE"),
-  SOM_HOWTO (R_S_MODE, "R_S_MODE"),
-  SOM_HOWTO (R_D_MODE, "R_D_MODE"),
-  SOM_HOWTO (R_R_MODE, "R_R_MODE"),
-  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
-  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
-  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
-  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
-  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
-  SOM_HOWTO (R_TRANSLATED, "R_TRANSLATED"),
-  SOM_HOWTO (R_AUX_UNWIND, "R_AUX_UNWIND"),
-  SOM_HOWTO (R_COMP1, "R_COMP1"),
-  SOM_HOWTO (R_COMP2, "R_COMP2"),
-  SOM_HOWTO (R_COMP3, "R_COMP3"),
-  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
-  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
-  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
-  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
-  SOM_HOWTO (R_SEC_STMT, "R_SEC_STMT"),
-  SOM_HOWTO (R_N0SEL, "R_N0SEL"),
-  SOM_HOWTO (R_N1SEL, "R_N1SEL"),
-  SOM_HOWTO (R_LINETAB, "R_LINETAB"),
-  SOM_HOWTO (R_LINETAB_ESC, "R_LINETAB_ESC"),
-  SOM_HOWTO (R_LTP_OVERRIDE, "R_LTP_OVERRIDE"),
-  SOM_HOWTO (R_COMMENT, "R_COMMENT"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
-  SOM_HOWTO (R_RESERVED, "R_RESERVED")
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_NO_RELOCATION),
+  SOM_HOWTO (0, R_ZEROES),
+  SOM_HOWTO (0, R_ZEROES),
+  SOM_HOWTO (0, R_UNINIT),
+  SOM_HOWTO (0, R_UNINIT),
+  SOM_HOWTO (4, R_RELOCATION),
+  SOM_HOWTO (4, R_DATA_ONE_SYMBOL),
+  SOM_HOWTO (4, R_DATA_ONE_SYMBOL),
+  SOM_HOWTO (4, R_DATA_PLABEL),
+  SOM_HOWTO (4, R_DATA_PLABEL),
+  SOM_HOWTO (4, R_SPACE_REF),
+  SOM_HOWTO (0, R_REPEATED_INIT),
+  SOM_HOWTO (0, R_REPEATED_INIT),
+  SOM_HOWTO (0, R_REPEATED_INIT),
+  SOM_HOWTO (0, R_REPEATED_INIT),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (4, R_PCREL_CALL),
+  SOM_HOWTO (0, R_SHORT_PCREL_MODE),
+  SOM_HOWTO (0, R_LONG_PCREL_MODE),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (4, R_ABS_CALL),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DP_RELATIVE),
+  SOM_HOWTO (4, R_DATA_GPREL),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (4, R_DLT_REL),
+  SOM_HOWTO (4, R_DLT_REL),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (4, R_MILLI_REL),
+  SOM_HOWTO (4, R_MILLI_REL),
+  SOM_HOWTO (4, R_CODE_PLABEL),
+  SOM_HOWTO (4, R_CODE_PLABEL),
+  SOM_HOWTO (4, R_BREAKPOINT),
+  SOM_HOWTO (0, R_ENTRY),
+  SOM_HOWTO (0, R_ENTRY),
+  SOM_HOWTO (0, R_ALT_ENTRY),
+  SOM_HOWTO (0, R_EXIT),
+  SOM_HOWTO (0, R_BEGIN_TRY),
+  SOM_HOWTO (0, R_END_TRY),
+  SOM_HOWTO (0, R_END_TRY),
+  SOM_HOWTO (0, R_END_TRY),
+  SOM_HOWTO (0, R_BEGIN_BRTAB),
+  SOM_HOWTO (0, R_END_BRTAB),
+  SOM_HOWTO (0, R_STATEMENT),
+  SOM_HOWTO (0, R_STATEMENT),
+  SOM_HOWTO (0, R_STATEMENT),
+  SOM_HOWTO (4, R_DATA_EXPR),
+  SOM_HOWTO (4, R_CODE_EXPR),
+  SOM_HOWTO (0, R_FSEL),
+  SOM_HOWTO (0, R_LSEL),
+  SOM_HOWTO (0, R_RSEL),
+  SOM_HOWTO (0, R_N_MODE),
+  SOM_HOWTO (0, R_S_MODE),
+  SOM_HOWTO (0, R_D_MODE),
+  SOM_HOWTO (0, R_R_MODE),
+  SOM_HOWTO (0, R_DATA_OVERRIDE),
+  SOM_HOWTO (0, R_DATA_OVERRIDE),
+  SOM_HOWTO (0, R_DATA_OVERRIDE),
+  SOM_HOWTO (0, R_DATA_OVERRIDE),
+  SOM_HOWTO (0, R_DATA_OVERRIDE),
+  SOM_HOWTO (0, R_TRANSLATED),
+  SOM_HOWTO (0, R_AUX_UNWIND),
+  SOM_HOWTO (0, R_COMP1),
+  SOM_HOWTO (0, R_COMP2),
+  SOM_HOWTO (0, R_COMP3),
+  SOM_HOWTO (0, R_PREV_FIXUP),
+  SOM_HOWTO (0, R_PREV_FIXUP),
+  SOM_HOWTO (0, R_PREV_FIXUP),
+  SOM_HOWTO (0, R_PREV_FIXUP),
+  SOM_HOWTO (0, R_SEC_STMT),
+  SOM_HOWTO (0, R_N0SEL),
+  SOM_HOWTO (0, R_N1SEL),
+  SOM_HOWTO (0, R_LINETAB),
+  SOM_HOWTO (0, R_LINETAB_ESC),
+  SOM_HOWTO (0, R_LTP_OVERRIDE),
+  SOM_HOWTO (0, R_COMMENT),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED),
+  SOM_HOWTO (0, R_RESERVED)
 };
 
 /* Initialize the SOM relocation queue.  By definition the queue holds
@@ -2943,7 +2944,7 @@ som_write_fixups (bfd *abfd,
 	   subsection != NULL;
 	   subsection = subsection->next)
 	{
-	  int reloc_offset;
+	  unsigned int reloc_offset;
 	  unsigned int current_rounding_mode;
 #ifndef NO_PCREL_MODES
 	  unsigned int current_call_mode;
@@ -2994,6 +2995,31 @@ som_write_fixups (bfd *abfd,
 	      unsigned int skip;
 	      int sym_num;
 
+	      if (bfd_reloc->address < reloc_offset)
+		{
+		  _bfd_error_handler
+		    /* xgettext:c-format */
+		    (_("%pB(%pA+%#" PRIx64 "): "
+		       "%s relocation offset out of order"),
+		     abfd, subsection, (uint64_t) bfd_reloc->address,
+		     bfd_reloc->howto->name);
+		  bfd_set_error (bfd_error_bad_value);
+		  return false;
+		}
+	      if (!bfd_reloc_offset_in_range (bfd_reloc->howto,
+					      abfd, subsection,
+					      bfd_reloc->address))
+		{
+		  _bfd_error_handler
+		    /* xgettext:c-format */
+		    (_("%pB(%pA+%#" PRIx64 "): "
+		       "%s relocation offset out of range"),
+		     abfd, subsection, (uint64_t) bfd_reloc->address,
+		     bfd_reloc->howto->name);
+		  bfd_set_error (bfd_error_bad_value);
+		  return false;
+		}
+
 	      /* Get the symbol number.  Remember it's stored in a
 		 special place for section symbols.  */
 	      if ((*bfd_reloc->sym_ptr_ptr)->flags & BSF_SECTION_SYM)
@@ -3026,42 +3052,8 @@ som_write_fixups (bfd *abfd,
 	      p = som_reloc_skip (abfd, skip, p,
 				  &subspace_reloc_size, reloc_queue);
 
-	      /* Update reloc_offset for the next iteration.
-
-		 Many relocations do not consume input bytes.  They
-		 are markers, or set state necessary to perform some
-		 later relocation.  */
-	      switch (bfd_reloc->howto->type)
-		{
-		case R_ENTRY:
-		case R_ALT_ENTRY:
-		case R_EXIT:
-		case R_N_MODE:
-		case R_S_MODE:
-		case R_D_MODE:
-		case R_R_MODE:
-		case R_FSEL:
-		case R_LSEL:
-		case R_RSEL:
-		case R_COMP1:
-		case R_COMP2:
-		case R_BEGIN_BRTAB:
-		case R_END_BRTAB:
-		case R_BEGIN_TRY:
-		case R_END_TRY:
-		case R_N0SEL:
-		case R_N1SEL:
-#ifndef NO_PCREL_MODES
-		case R_SHORT_PCREL_MODE:
-		case R_LONG_PCREL_MODE:
-#endif
-		  reloc_offset = bfd_reloc->address;
-		  break;
-
-		default:
-		  reloc_offset = bfd_reloc->address + 4;
-		  break;
-		}
+	      /* Update reloc_offset for the next iteration.  */
+	      reloc_offset = bfd_reloc->address + bfd_reloc->howto->size;
 
 	      /* Now the actual relocation we care about.  */
 	      switch (bfd_reloc->howto->type)

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: som.c reloc sanity checking
  2022-10-26  5:10 som.c reloc sanity checking Alan Modra
@ 2022-10-27 17:48 ` John David Anglin
  0 siblings, 0 replies; 2+ messages in thread
From: John David Anglin @ 2022-10-27 17:48 UTC (permalink / raw)
  To: Alan Modra, binutils; +Cc: Jeff Law

There were no testsuite regressions with this change.

Dave

On 2022-10-26 1:10 a.m., Alan Modra wrote:
> This patch checks that relocations emitted in som_write_fixups have
> offsets that are monotonic and within a section.  To do that properly
> using bfd_reloc_offset_in_range it is necessary to set the reloc howto
> size field, which isn't used otherwise by the som backend.  Note that
> the sizes used are not exactly those in the old sizing switch
> statement deleted from som_write_fixups, but all relocs handled by the
> main switch statement there get the same size.  Most unhandled relocs
> get a zero size (exceptions being R_RELOCATION, R_SPACE_REF,
> R_MILLI_REL, R_BREAKPOINT which all involve writing one word according
> to my SOM reference).  I figure it doesn't matter since any unhandled
> reloc is converted to 0xff R_RESERVED, and a default of zero is better
> for a "don't know" reloc.
>
> Besides tidying the code, stringizing name from type in SOM_HOWTO
> fixes R_REPEATED_INIT name.
>
> 	* som.c (SOM_HOWTO): Add SIZE arg, delete NAME.  Stringize type
> 	to name.
> 	(som_hppa_howto_table): Update with sizes.
> 	(som_write_fixups): Delete sizing switch statement.  Sanity check
> 	bfd_reloc address against subsection size.
>
> diff --git a/bfd/som.c b/bfd/som.c
> index b9114e630fe..b3a72e36ede 100644
> --- a/bfd/som.c
> +++ b/bfd/som.c
> @@ -635,267 +635,268 @@ static const int comp3_opcodes[] =
>   #define R_SHORT_PCREL_MODE 0x3e
>   #endif
>   
> -#define SOM_HOWTO(TYPE, NAME)	\
> -  HOWTO(TYPE, 0, 0, 32, false, 0, 0, hppa_som_reloc, NAME, false, 0, 0, false)
> +#define SOM_HOWTO(SIZE, TYPE)	\
> +  HOWTO(TYPE, 0, SIZE, 32, false, 0, 0, hppa_som_reloc, \
> +	#TYPE, false, 0, 0, false)
>   
>   static reloc_howto_type som_hppa_howto_table[] =
>   {
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
> -  SOM_HOWTO (R_ZEROES, "R_ZEROES"),
> -  SOM_HOWTO (R_ZEROES, "R_ZEROES"),
> -  SOM_HOWTO (R_UNINIT, "R_UNINIT"),
> -  SOM_HOWTO (R_UNINIT, "R_UNINIT"),
> -  SOM_HOWTO (R_RELOCATION, "R_RELOCATION"),
> -  SOM_HOWTO (R_DATA_ONE_SYMBOL, "R_DATA_ONE_SYMBOL"),
> -  SOM_HOWTO (R_DATA_ONE_SYMBOL, "R_DATA_ONE_SYMBOL"),
> -  SOM_HOWTO (R_DATA_PLABEL, "R_DATA_PLABEL"),
> -  SOM_HOWTO (R_DATA_PLABEL, "R_DATA_PLABEL"),
> -  SOM_HOWTO (R_SPACE_REF, "R_SPACE_REF"),
> -  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
> -  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
> -  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
> -  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),
> -  SOM_HOWTO (R_SHORT_PCREL_MODE, "R_SHORT_PCREL_MODE"),
> -  SOM_HOWTO (R_LONG_PCREL_MODE, "R_LONG_PCREL_MODE"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
> -  SOM_HOWTO (R_DATA_GPREL, "R_DATA_GPREL"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_DLT_REL, "R_DLT_REL"),
> -  SOM_HOWTO (R_DLT_REL, "R_DLT_REL"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_MILLI_REL, "R_MILLI_REL"),
> -  SOM_HOWTO (R_MILLI_REL, "R_MILLI_REL"),
> -  SOM_HOWTO (R_CODE_PLABEL, "R_CODE_PLABEL"),
> -  SOM_HOWTO (R_CODE_PLABEL, "R_CODE_PLABEL"),
> -  SOM_HOWTO (R_BREAKPOINT, "R_BREAKPOINT"),
> -  SOM_HOWTO (R_ENTRY, "R_ENTRY"),
> -  SOM_HOWTO (R_ENTRY, "R_ENTRY"),
> -  SOM_HOWTO (R_ALT_ENTRY, "R_ALT_ENTRY"),
> -  SOM_HOWTO (R_EXIT, "R_EXIT"),
> -  SOM_HOWTO (R_BEGIN_TRY, "R_BEGIN_TRY"),
> -  SOM_HOWTO (R_END_TRY, "R_END_TRY"),
> -  SOM_HOWTO (R_END_TRY, "R_END_TRY"),
> -  SOM_HOWTO (R_END_TRY, "R_END_TRY"),
> -  SOM_HOWTO (R_BEGIN_BRTAB, "R_BEGIN_BRTAB"),
> -  SOM_HOWTO (R_END_BRTAB, "R_END_BRTAB"),
> -  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),
> -  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),
> -  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),
> -  SOM_HOWTO (R_DATA_EXPR, "R_DATA_EXPR"),
> -  SOM_HOWTO (R_CODE_EXPR, "R_CODE_EXPR"),
> -  SOM_HOWTO (R_FSEL, "R_FSEL"),
> -  SOM_HOWTO (R_LSEL, "R_LSEL"),
> -  SOM_HOWTO (R_RSEL, "R_RSEL"),
> -  SOM_HOWTO (R_N_MODE, "R_N_MODE"),
> -  SOM_HOWTO (R_S_MODE, "R_S_MODE"),
> -  SOM_HOWTO (R_D_MODE, "R_D_MODE"),
> -  SOM_HOWTO (R_R_MODE, "R_R_MODE"),
> -  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
> -  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
> -  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
> -  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
> -  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),
> -  SOM_HOWTO (R_TRANSLATED, "R_TRANSLATED"),
> -  SOM_HOWTO (R_AUX_UNWIND, "R_AUX_UNWIND"),
> -  SOM_HOWTO (R_COMP1, "R_COMP1"),
> -  SOM_HOWTO (R_COMP2, "R_COMP2"),
> -  SOM_HOWTO (R_COMP3, "R_COMP3"),
> -  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
> -  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
> -  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
> -  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),
> -  SOM_HOWTO (R_SEC_STMT, "R_SEC_STMT"),
> -  SOM_HOWTO (R_N0SEL, "R_N0SEL"),
> -  SOM_HOWTO (R_N1SEL, "R_N1SEL"),
> -  SOM_HOWTO (R_LINETAB, "R_LINETAB"),
> -  SOM_HOWTO (R_LINETAB_ESC, "R_LINETAB_ESC"),
> -  SOM_HOWTO (R_LTP_OVERRIDE, "R_LTP_OVERRIDE"),
> -  SOM_HOWTO (R_COMMENT, "R_COMMENT"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED"),
> -  SOM_HOWTO (R_RESERVED, "R_RESERVED")
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_NO_RELOCATION),
> +  SOM_HOWTO (0, R_ZEROES),
> +  SOM_HOWTO (0, R_ZEROES),
> +  SOM_HOWTO (0, R_UNINIT),
> +  SOM_HOWTO (0, R_UNINIT),
> +  SOM_HOWTO (4, R_RELOCATION),
> +  SOM_HOWTO (4, R_DATA_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_DATA_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_DATA_PLABEL),
> +  SOM_HOWTO (4, R_DATA_PLABEL),
> +  SOM_HOWTO (4, R_SPACE_REF),
> +  SOM_HOWTO (0, R_REPEATED_INIT),
> +  SOM_HOWTO (0, R_REPEATED_INIT),
> +  SOM_HOWTO (0, R_REPEATED_INIT),
> +  SOM_HOWTO (0, R_REPEATED_INIT),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (4, R_PCREL_CALL),
> +  SOM_HOWTO (0, R_SHORT_PCREL_MODE),
> +  SOM_HOWTO (0, R_LONG_PCREL_MODE),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (4, R_ABS_CALL),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DP_RELATIVE),
> +  SOM_HOWTO (4, R_DATA_GPREL),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (4, R_DLT_REL),
> +  SOM_HOWTO (4, R_DLT_REL),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (4, R_CODE_ONE_SYMBOL),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (4, R_MILLI_REL),
> +  SOM_HOWTO (4, R_MILLI_REL),
> +  SOM_HOWTO (4, R_CODE_PLABEL),
> +  SOM_HOWTO (4, R_CODE_PLABEL),
> +  SOM_HOWTO (4, R_BREAKPOINT),
> +  SOM_HOWTO (0, R_ENTRY),
> +  SOM_HOWTO (0, R_ENTRY),
> +  SOM_HOWTO (0, R_ALT_ENTRY),
> +  SOM_HOWTO (0, R_EXIT),
> +  SOM_HOWTO (0, R_BEGIN_TRY),
> +  SOM_HOWTO (0, R_END_TRY),
> +  SOM_HOWTO (0, R_END_TRY),
> +  SOM_HOWTO (0, R_END_TRY),
> +  SOM_HOWTO (0, R_BEGIN_BRTAB),
> +  SOM_HOWTO (0, R_END_BRTAB),
> +  SOM_HOWTO (0, R_STATEMENT),
> +  SOM_HOWTO (0, R_STATEMENT),
> +  SOM_HOWTO (0, R_STATEMENT),
> +  SOM_HOWTO (4, R_DATA_EXPR),
> +  SOM_HOWTO (4, R_CODE_EXPR),
> +  SOM_HOWTO (0, R_FSEL),
> +  SOM_HOWTO (0, R_LSEL),
> +  SOM_HOWTO (0, R_RSEL),
> +  SOM_HOWTO (0, R_N_MODE),
> +  SOM_HOWTO (0, R_S_MODE),
> +  SOM_HOWTO (0, R_D_MODE),
> +  SOM_HOWTO (0, R_R_MODE),
> +  SOM_HOWTO (0, R_DATA_OVERRIDE),
> +  SOM_HOWTO (0, R_DATA_OVERRIDE),
> +  SOM_HOWTO (0, R_DATA_OVERRIDE),
> +  SOM_HOWTO (0, R_DATA_OVERRIDE),
> +  SOM_HOWTO (0, R_DATA_OVERRIDE),
> +  SOM_HOWTO (0, R_TRANSLATED),
> +  SOM_HOWTO (0, R_AUX_UNWIND),
> +  SOM_HOWTO (0, R_COMP1),
> +  SOM_HOWTO (0, R_COMP2),
> +  SOM_HOWTO (0, R_COMP3),
> +  SOM_HOWTO (0, R_PREV_FIXUP),
> +  SOM_HOWTO (0, R_PREV_FIXUP),
> +  SOM_HOWTO (0, R_PREV_FIXUP),
> +  SOM_HOWTO (0, R_PREV_FIXUP),
> +  SOM_HOWTO (0, R_SEC_STMT),
> +  SOM_HOWTO (0, R_N0SEL),
> +  SOM_HOWTO (0, R_N1SEL),
> +  SOM_HOWTO (0, R_LINETAB),
> +  SOM_HOWTO (0, R_LINETAB_ESC),
> +  SOM_HOWTO (0, R_LTP_OVERRIDE),
> +  SOM_HOWTO (0, R_COMMENT),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED),
> +  SOM_HOWTO (0, R_RESERVED)
>   };
>   
>   /* Initialize the SOM relocation queue.  By definition the queue holds
> @@ -2943,7 +2944,7 @@ som_write_fixups (bfd *abfd,
>   	   subsection != NULL;
>   	   subsection = subsection->next)
>   	{
> -	  int reloc_offset;
> +	  unsigned int reloc_offset;
>   	  unsigned int current_rounding_mode;
>   #ifndef NO_PCREL_MODES
>   	  unsigned int current_call_mode;
> @@ -2994,6 +2995,31 @@ som_write_fixups (bfd *abfd,
>   	      unsigned int skip;
>   	      int sym_num;
>   
> +	      if (bfd_reloc->address < reloc_offset)
> +		{
> +		  _bfd_error_handler
> +		    /* xgettext:c-format */
> +		    (_("%pB(%pA+%#" PRIx64 "): "
> +		       "%s relocation offset out of order"),
> +		     abfd, subsection, (uint64_t) bfd_reloc->address,
> +		     bfd_reloc->howto->name);
> +		  bfd_set_error (bfd_error_bad_value);
> +		  return false;
> +		}
> +	      if (!bfd_reloc_offset_in_range (bfd_reloc->howto,
> +					      abfd, subsection,
> +					      bfd_reloc->address))
> +		{
> +		  _bfd_error_handler
> +		    /* xgettext:c-format */
> +		    (_("%pB(%pA+%#" PRIx64 "): "
> +		       "%s relocation offset out of range"),
> +		     abfd, subsection, (uint64_t) bfd_reloc->address,
> +		     bfd_reloc->howto->name);
> +		  bfd_set_error (bfd_error_bad_value);
> +		  return false;
> +		}
> +
>   	      /* Get the symbol number.  Remember it's stored in a
>   		 special place for section symbols.  */
>   	      if ((*bfd_reloc->sym_ptr_ptr)->flags & BSF_SECTION_SYM)
> @@ -3026,42 +3052,8 @@ som_write_fixups (bfd *abfd,
>   	      p = som_reloc_skip (abfd, skip, p,
>   				  &subspace_reloc_size, reloc_queue);
>   
> -	      /* Update reloc_offset for the next iteration.
> -
> -		 Many relocations do not consume input bytes.  They
> -		 are markers, or set state necessary to perform some
> -		 later relocation.  */
> -	      switch (bfd_reloc->howto->type)
> -		{
> -		case R_ENTRY:
> -		case R_ALT_ENTRY:
> -		case R_EXIT:
> -		case R_N_MODE:
> -		case R_S_MODE:
> -		case R_D_MODE:
> -		case R_R_MODE:
> -		case R_FSEL:
> -		case R_LSEL:
> -		case R_RSEL:
> -		case R_COMP1:
> -		case R_COMP2:
> -		case R_BEGIN_BRTAB:
> -		case R_END_BRTAB:
> -		case R_BEGIN_TRY:
> -		case R_END_TRY:
> -		case R_N0SEL:
> -		case R_N1SEL:
> -#ifndef NO_PCREL_MODES
> -		case R_SHORT_PCREL_MODE:
> -		case R_LONG_PCREL_MODE:
> -#endif
> -		  reloc_offset = bfd_reloc->address;
> -		  break;
> -
> -		default:
> -		  reloc_offset = bfd_reloc->address + 4;
> -		  break;
> -		}
> +	      /* Update reloc_offset for the next iteration.  */
> +	      reloc_offset = bfd_reloc->address + bfd_reloc->howto->size;
>   
>   	      /* Now the actual relocation we care about.  */
>   	      switch (bfd_reloc->howto->type)
>


-- 
John David Anglin  dave.anglin@bell.net


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-10-27 17:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-26  5:10 som.c reloc sanity checking Alan Modra
2022-10-27 17:48 ` John David Anglin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).