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 */
|
---|