| 86 |
#define elf_check_arch(x) ((x) == EM_ARM) |
#define elf_check_arch(x) ((x) == EM_ARM) |
| 87 |
#define ELF_USES_RELOC |
#define ELF_USES_RELOC |
| 88 |
|
|
| 89 |
|
#elif defined(HOST_M68K) |
| 90 |
|
|
| 91 |
|
#define ELF_CLASS ELFCLASS32 |
| 92 |
|
#define ELF_ARCH EM_68K |
| 93 |
|
#define elf_check_arch(x) ((x) == EM_68K) |
| 94 |
|
#define ELF_USES_RELOCA |
| 95 |
|
|
| 96 |
#else |
#else |
| 97 |
#error unsupported CPU - please update the code |
#error unsupported CPU - please update the code |
| 98 |
#endif |
#endif |
| 582 |
relocs, nb_relocs); |
relocs, nb_relocs); |
| 583 |
break; |
break; |
| 584 |
#endif |
#endif |
| 585 |
|
case EM_68K: |
| 586 |
|
{ |
| 587 |
|
uint8_t *p; |
| 588 |
|
p = (void *)(p_end - 2); |
| 589 |
|
if (p == p_start) |
| 590 |
|
error("empty code for %s", name); |
| 591 |
|
// remove NOP's, probably added for alignment |
| 592 |
|
while ((get16((uint16_t *)p) == 0x4e71) && |
| 593 |
|
(p>p_start)) |
| 594 |
|
p -= 2; |
| 595 |
|
if (get16((uint16_t *)p) != 0x4e75) |
| 596 |
|
error("rts expected at the end of %s", name); |
| 597 |
|
copy_size = p - p_start; |
| 598 |
|
} |
| 599 |
|
break; |
| 600 |
default: |
default: |
| 601 |
error("unknown ELF architecture"); |
error("unknown ELF architecture"); |
| 602 |
} |
} |
| 1083 |
} |
} |
| 1084 |
} |
} |
| 1085 |
} |
} |
| 1086 |
|
} |
| 1087 |
|
#elif defined(HOST_M68K) |
| 1088 |
|
{ |
| 1089 |
|
char name[256]; |
| 1090 |
|
int type; |
| 1091 |
|
int addend; |
| 1092 |
|
Elf32_Sym *sym; |
| 1093 |
|
for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { |
| 1094 |
|
if (rel->r_offset >= start_offset && |
| 1095 |
|
rel->r_offset < start_offset + copy_size) { |
| 1096 |
|
sym = &(symtab[ELFW(R_SYM)(rel->r_info)]); |
| 1097 |
|
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; |
| 1098 |
|
if (strstart(sym_name, "__op_param", &p)) { |
| 1099 |
|
snprintf(name, sizeof(name), "param%s", p); |
| 1100 |
|
} else { |
| 1101 |
|
snprintf(name, sizeof(name), "(long)(&%s)", sym_name); |
| 1102 |
|
} |
| 1103 |
|
type = ELF32_R_TYPE(rel->r_info); |
| 1104 |
|
addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend; |
| 1105 |
|
switch(type) { |
| 1106 |
|
case R_68K_32: |
| 1107 |
|
fprintf(outfile, " /* R_68K_32 RELOC, offset %x */\n", rel->r_offset) ; |
| 1108 |
|
fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %#x;\n", |
| 1109 |
|
rel->r_offset - start_offset, name, addend ); |
| 1110 |
|
break; |
| 1111 |
|
case R_68K_PC32: |
| 1112 |
|
fprintf(outfile, " /* R_68K_PC32 RELOC, offset %x */\n", rel->r_offset); |
| 1113 |
|
fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %#x) + %#x;\n", |
| 1114 |
|
rel->r_offset - start_offset, name, rel->r_offset - start_offset, /*sym->st_value+*/ addend); |
| 1115 |
|
break; |
| 1116 |
|
default: |
| 1117 |
|
error("unsupported m68k relocation (%d)", type); |
| 1118 |
|
} |
| 1119 |
|
} |
| 1120 |
|
} |
| 1121 |
} |
} |
| 1122 |
#else |
#else |
| 1123 |
#error unsupported CPU |
#error unsupported CPU |