📄 som.c
字号:
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_DP_RELATIVE, "R_DP_RELATIVE"), 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")};/* Initialize the SOM relocation queue. By definition the queue holds the last four multibyte fixups. */static voidsom_initialize_reloc_queue (queue) struct reloc_queue *queue;{ queue[0].reloc = NULL; queue[0].size = 0; queue[1].reloc = NULL; queue[1].size = 0; queue[2].reloc = NULL; queue[2].size = 0; queue[3].reloc = NULL; queue[3].size = 0;}/* Insert a new relocation into the relocation queue. */static voidsom_reloc_queue_insert (p, size, queue) unsigned char *p; unsigned int size; struct reloc_queue *queue;{ queue[3].reloc = queue[2].reloc; queue[3].size = queue[2].size; queue[2].reloc = queue[1].reloc; queue[2].size = queue[1].size; queue[1].reloc = queue[0].reloc; queue[1].size = queue[0].size; queue[0].reloc = p; queue[0].size = size;}/* When an entry in the relocation queue is reused, the entry moves to the front of the queue. */static voidsom_reloc_queue_fix (queue, index) struct reloc_queue *queue; unsigned int index;{ if (index == 0) return; if (index == 1) { unsigned char *tmp1 = queue[0].reloc; unsigned int tmp2 = queue[0].size; queue[0].reloc = queue[1].reloc; queue[0].size = queue[1].size; queue[1].reloc = tmp1; queue[1].size = tmp2; return; } if (index == 2) { unsigned char *tmp1 = queue[0].reloc; unsigned int tmp2 = queue[0].size; queue[0].reloc = queue[2].reloc; queue[0].size = queue[2].size; queue[2].reloc = queue[1].reloc; queue[2].size = queue[1].size; queue[1].reloc = tmp1; queue[1].size = tmp2; return; } if (index == 3) { unsigned char *tmp1 = queue[0].reloc; unsigned int tmp2 = queue[0].size; queue[0].reloc = queue[3].reloc; queue[0].size = queue[3].size; queue[3].reloc = queue[2].reloc; queue[3].size = queue[2].size; queue[2].reloc = queue[1].reloc; queue[2].size = queue[1].size; queue[1].reloc = tmp1; queue[1].size = tmp2; return; } abort ();}/* Search for a particular relocation in the relocation queue. */static intsom_reloc_queue_find (p, size, queue) unsigned char *p; unsigned int size; struct reloc_queue *queue;{ if (queue[0].reloc && !memcmp (p, queue[0].reloc, size) && size == queue[0].size) return 0; if (queue[1].reloc && !memcmp (p, queue[1].reloc, size) && size == queue[1].size) return 1; if (queue[2].reloc && !memcmp (p, queue[2].reloc, size) && size == queue[2].size) return 2; if (queue[3].reloc && !memcmp (p, queue[3].reloc, size) && size == queue[3].size) return 3; return -1;}static unsigned char *try_prev_fixup (abfd, subspace_reloc_sizep, p, size, queue) bfd *abfd ATTRIBUTE_UNUSED; int *subspace_reloc_sizep; unsigned char *p; unsigned int size; struct reloc_queue *queue;{ int queue_index = som_reloc_queue_find (p, size, queue); if (queue_index != -1) { /* Found this in a previous fixup. Undo the fixup we just built and use R_PREV_FIXUP instead. We saved a total of size - 1 bytes in the fixup stream. */ bfd_put_8 (abfd, R_PREV_FIXUP + queue_index, p); p += 1; *subspace_reloc_sizep += 1; som_reloc_queue_fix (queue, queue_index); } else { som_reloc_queue_insert (p, size, queue); *subspace_reloc_sizep += size; p += size; } return p;}/* Emit the proper R_NO_RELOCATION fixups to map the next SKIP bytes without any relocation. Update the size of the subspace relocation stream via SUBSPACE_RELOC_SIZE_P; also return the current pointer into the relocation stream. */static unsigned char *som_reloc_skip (abfd, skip, p, subspace_reloc_sizep, queue) bfd *abfd; unsigned int skip; unsigned char *p; unsigned int *subspace_reloc_sizep; struct reloc_queue *queue;{ /* Use a 4 byte R_NO_RELOCATION entry with a maximal value then R_PREV_FIXUPs to get the difference down to a reasonable size. */ if (skip >= 0x1000000) { skip -= 0x1000000; bfd_put_8 (abfd, R_NO_RELOCATION + 31, p); bfd_put_8 (abfd, 0xff, p + 1); bfd_put_16 (abfd, 0xffff, p + 2); p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 4, queue); while (skip >= 0x1000000) { skip -= 0x1000000; bfd_put_8 (abfd, R_PREV_FIXUP, p); p++; *subspace_reloc_sizep += 1; /* No need to adjust queue here since we are repeating the most recent fixup. */ } } /* The difference must be less than 0x1000000. Use one more R_NO_RELOCATION entry to get to the right difference. */ if ((skip & 3) == 0 && skip <= 0xc0000 && skip > 0) { /* Difference can be handled in a simple single-byte R_NO_RELOCATION entry. */ if (skip <= 0x60) { bfd_put_8 (abfd, R_NO_RELOCATION + (skip >> 2) - 1, p); *subspace_reloc_sizep += 1; p++; } /* Handle it with a two byte R_NO_RELOCATION entry. */ else if (skip <= 0x1000)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -