[331] | 1 | #ifdef TARGET_DEFS_ONLY
|
---|
| 2 |
|
---|
| 3 | #define EM_TCC_TARGET EM_C60
|
---|
| 4 |
|
---|
| 5 | /* relocation type for 32 bit data relocation */
|
---|
| 6 | #define R_DATA_32 R_C60_32
|
---|
| 7 | #define R_DATA_PTR R_C60_32
|
---|
| 8 | #define R_JMP_SLOT R_C60_JMP_SLOT
|
---|
| 9 | #define R_GLOB_DAT R_C60_GLOB_DAT
|
---|
| 10 | #define R_COPY R_C60_COPY
|
---|
| 11 | #define R_RELATIVE R_C60_RELATIVE
|
---|
| 12 |
|
---|
| 13 | #define R_NUM R_C60_NUM
|
---|
| 14 |
|
---|
| 15 | #define ELF_START_ADDR 0x00000400
|
---|
| 16 | #define ELF_PAGE_SIZE 0x1000
|
---|
| 17 |
|
---|
| 18 | #define PCRELATIVE_DLLPLT 0
|
---|
| 19 | #define RELOCATE_DLLPLT 0
|
---|
| 20 |
|
---|
| 21 | #else /* !TARGET_DEFS_ONLY */
|
---|
| 22 |
|
---|
| 23 | #include "tcc.h"
|
---|
| 24 |
|
---|
| 25 | /* Returns 1 for a code relocation, 0 for a data relocation. For unknown
|
---|
| 26 | relocations, returns -1. */
|
---|
| 27 | int code_reloc (int reloc_type)
|
---|
| 28 | {
|
---|
| 29 | switch (reloc_type) {
|
---|
| 30 | case R_C60_32:
|
---|
| 31 | case R_C60LO16:
|
---|
| 32 | case R_C60HI16:
|
---|
| 33 | case R_C60_GOT32:
|
---|
| 34 | case R_C60_GOTOFF:
|
---|
| 35 | case R_C60_GOTPC:
|
---|
| 36 | case R_C60_COPY:
|
---|
| 37 | return 0;
|
---|
| 38 |
|
---|
| 39 | case R_C60_PLT32:
|
---|
| 40 | return 1;
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | tcc_error ("Unknown relocation type: %d", reloc_type);
|
---|
| 44 | return -1;
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | /* Returns an enumerator to describe whether and when the relocation needs a
|
---|
| 48 | GOT and/or PLT entry to be created. See tcc.h for a description of the
|
---|
| 49 | different values. */
|
---|
| 50 | int gotplt_entry_type (int reloc_type)
|
---|
| 51 | {
|
---|
| 52 | switch (reloc_type) {
|
---|
| 53 | case R_C60_32:
|
---|
| 54 | case R_C60LO16:
|
---|
| 55 | case R_C60HI16:
|
---|
| 56 | case R_C60_COPY:
|
---|
| 57 | return NO_GOTPLT_ENTRY;
|
---|
| 58 |
|
---|
| 59 | case R_C60_GOTOFF:
|
---|
| 60 | case R_C60_GOTPC:
|
---|
| 61 | return BUILD_GOT_ONLY;
|
---|
| 62 |
|
---|
| 63 | case R_C60_PLT32:
|
---|
| 64 | case R_C60_GOT32:
|
---|
| 65 | return ALWAYS_GOTPLT_ENTRY;
|
---|
| 66 | }
|
---|
| 67 |
|
---|
| 68 | tcc_error ("Unknown relocation type: %d", reloc_type);
|
---|
| 69 | return -1;
|
---|
| 70 | }
|
---|
| 71 |
|
---|
| 72 | ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr)
|
---|
| 73 | {
|
---|
| 74 | tcc_error("C67 got not implemented");
|
---|
| 75 | return 0;
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | /* relocate the PLT: compute addresses and offsets in the PLT now that final
|
---|
| 79 | address for PLT and GOT are known (see fill_program_header) */
|
---|
| 80 | ST_FUNC void relocate_plt(TCCState *s1)
|
---|
| 81 | {
|
---|
| 82 | uint8_t *p, *p_end;
|
---|
| 83 |
|
---|
| 84 | if (!s1->plt)
|
---|
| 85 | return;
|
---|
| 86 |
|
---|
| 87 | p = s1->plt->data;
|
---|
| 88 | p_end = p + s1->plt->data_offset;
|
---|
| 89 |
|
---|
| 90 | if (p < p_end) {
|
---|
| 91 | /* XXX: TODO */
|
---|
| 92 | while (p < p_end) {
|
---|
| 93 | /* XXX: TODO */
|
---|
| 94 | }
|
---|
| 95 | }
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 | void relocate_init(Section *sr) {}
|
---|
| 99 |
|
---|
| 100 | void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val)
|
---|
| 101 | {
|
---|
| 102 | switch(type) {
|
---|
| 103 | case R_C60_32:
|
---|
| 104 | *(int *)ptr += val;
|
---|
| 105 | break;
|
---|
| 106 | case R_C60LO16:
|
---|
| 107 | {
|
---|
| 108 | uint32_t orig;
|
---|
| 109 |
|
---|
| 110 | /* put the low 16 bits of the absolute address add to what is
|
---|
| 111 | already there */
|
---|
| 112 | orig = ((*(int *)(ptr )) >> 7) & 0xffff;
|
---|
| 113 | orig |= (((*(int *)(ptr+4)) >> 7) & 0xffff) << 16;
|
---|
| 114 |
|
---|
| 115 | /* patch both at once - assumes always in pairs Low - High */
|
---|
| 116 | *(int *) ptr = (*(int *) ptr & (~(0xffff << 7)) ) |
|
---|
| 117 | (((val+orig) & 0xffff) << 7);
|
---|
| 118 | *(int *)(ptr+4) = (*(int *)(ptr+4) & (~(0xffff << 7)) ) |
|
---|
| 119 | ((((val+orig)>>16) & 0xffff) << 7);
|
---|
| 120 | }
|
---|
| 121 | break;
|
---|
| 122 | case R_C60HI16:
|
---|
| 123 | break;
|
---|
| 124 | default:
|
---|
| 125 | fprintf(stderr,"FIXME: handle reloc type %x at %x [%p] to %x\n",
|
---|
| 126 | type, (unsigned) addr, ptr, (unsigned) val);
|
---|
| 127 | break;
|
---|
| 128 | }
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 | #endif /* !TARGET_DEFS_ONLY */
|
---|