Rev 9284 | Rev 9513 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9284 | Rev 9305 | ||
---|---|---|---|
Line 24... | Line 24... | ||
24 | long i_ptr; |
24 | long i_ptr; |
25 | } kx_header; |
25 | } kx_header; |
Line 26... | Line 26... | ||
26 | 26 | ||
Line 27... | Line 27... | ||
27 | static kx_header __kx_header = { 'K','X',0, 0, 0x40, 0 }; |
27 | static kx_header __kx_header = { 'K','X',0, 0, 0x40, 0 }; |
28 | 28 | ||
29 | typedef struct LibraryEntry { |
29 | typedef struct { |
30 | uint32_t ImportEntry; |
30 | uint32_t ImportEntry; |
Line 31... | Line 31... | ||
31 | uint32_t LibraryName; |
31 | uint32_t LibraryName; |
32 | }; |
32 | } LibraryEntry; |
33 | 33 | ||
34 | /*union ImportEntry { |
34 | /*union ImportEntry { |
Line 41... | Line 41... | ||
41 | void kx_build_imports(me_info* me) { |
41 | void kx_build_imports(me_info* me) { |
Line 42... | Line 42... | ||
42 | 42 | ||
43 | ElfW(Sym) *sym; |
43 | ElfW(Sym) *sym; |
44 | int sym_index, sym_end; |
44 | int sym_index, sym_end; |
45 | sym_end = symtab_section->data_offset / sizeof(ElfW(Sym)); |
45 | sym_end = symtab_section->data_offset / sizeof(ElfW(Sym)); |
- | 46 | CString *str_arr, *len_arr, *sym_arr; |
|
46 | CString *str_arr, *len_arr; |
47 | char dll_len; |
47 | int nlib = 0; |
48 | int nlib = 0; |
Line 48... | Line 49... | ||
48 | int i; |
49 | int i; |
49 | 50 | ||
Line 50... | Line 51... | ||
50 | if (me->header.version != 2) |
51 | if (me->header.version != 2) |
51 | return; |
- | |
52 | - | ||
53 | str_arr = tcc_malloc(sizeof(CString) * me->s1->nb_loaded_dlls); |
- | |
Line 54... | Line 52... | ||
54 | if (str_arr == 0) { |
52 | return; |
55 | return; |
- | |
56 | } |
- | |
57 | - | ||
58 | len_arr = tcc_malloc(sizeof(CString)* me->s1->nb_loaded_dlls); |
53 | |
- | 54 | str_arr = tcc_malloc(sizeof(CString) * me->s1->nb_loaded_dlls); |
|
Line 59... | Line 55... | ||
59 | if (len_arr == 0) { |
55 | |
60 | tcc_free(str_arr); |
56 | len_arr = tcc_malloc(sizeof(CString)* me->s1->nb_loaded_dlls); |
61 | return; |
57 | |
62 | } |
58 | sym_arr = tcc_malloc(sizeof(CString)* me->s1->nb_loaded_dlls); |
Line 77... | Line 73... | ||
77 | } |
73 | } |
Line 78... | Line 74... | ||
78 | 74 | ||
79 | // KOS support 32 bit only |
75 | // KOS support 32 bit only |
80 | Elf32_Sym* dyn_sym = &((ElfW(Sym) *)me->s1->dynsymtab_section->data)[dynsym_index]; |
76 | Elf32_Sym* dyn_sym = &((ElfW(Sym) *)me->s1->dynsymtab_section->data)[dynsym_index]; |
- | 77 | DLLReference **dllref = me->s1->loaded_dlls; |
|
81 | DLLReference **dllref = me->s1->loaded_dlls; |
78 | char* dll_name; |
82 | i = dyn_sym->st_size - 1; |
79 | i = dyn_sym->st_size - 1; |
83 | // TCC store dll index in dyn_sym->st_size field |
80 | // TCC store dll index in dyn_sym->st_size field |
84 | if (dllref[i]->level != -1) { |
81 | if (dllref[i]->level != -1) { |
85 | char* dll_name = dllref[i]->name; |
82 | dll_name = dllref[i]->name; |
Line 86... | Line 83... | ||
86 | char dll_len = strlen(dll_name) + 1; |
83 | dll_len = strlen(dll_name) + 1; |
Line 87... | Line 84... | ||
87 | 84 | ||
88 | nlib++; |
85 | nlib++; |
- | 86 | ||
Line 89... | Line 87... | ||
89 | 87 | cstr_new(&str_arr[i]); |
|
90 | cstr_new(&str_arr[i]); |
88 | cstr_new(&len_arr[i]); |
91 | cstr_new(&len_arr[i]); |
89 | cstr_new(&sym_arr[i]); |
92 | 90 | ||
93 | cstr_ccat(&len_arr[i], dll_len); |
91 | cstr_ccat(&len_arr[i], dll_len); |
Line -... | Line 92... | ||
- | 92 | cstr_cat(&str_arr[i], dll_name, dll_len); |
|
- | 93 | //Mark dll as already used |
|
- | 94 | dllref[i]->level = -1; |
|
- | 95 | } |
|
- | 96 | ||
- | 97 | cstr_wccat(&sym_arr[i], (int)name); |
|
- | 98 | ||
94 | cstr_cat(&str_arr[i], dll_name, dll_len); |
99 | // Export defined with prefix? |
95 | //Mark dll as already used |
100 | if (dyn_sym->st_value == -1){ |
96 | dllref[i]->level = -1; |
101 | name += (dll_len - 4); // skip prefix_ |
Line 97... | Line 102... | ||
97 | } |
102 | } |
Line 125... | Line 130... | ||
125 | imp_sect = tcc_mallocz(sizeof(kx_import_table)); |
130 | imp_sect = tcc_mallocz(sizeof(kx_import_table)); |
126 | imp_sect->data = tcc_mallocz(1024); // FIXME!!! |
131 | imp_sect->data = tcc_mallocz(1024); // FIXME!!! |
127 | imp_sect->data_size = 0; |
132 | imp_sect->data_size = 0; |
128 | //imp_sect->sh_addr = me->header.image_size;// +1; |
133 | //imp_sect->sh_addr = me->header.image_size;// +1; |
Line 129... | Line 134... | ||
129 | 134 | ||
Line 130... | Line 135... | ||
130 | long imp_data = imp_sect->data; //FIXME change to long for gcc compatible? |
135 | long imp_data = (long)imp_sect->data; //FIXED changed to long for gcc compatible |
131 | 136 | ||
132 | // Strings |
137 | // Strings |
133 | i = 0; |
138 | i = 0; |
134 | do { |
139 | do { |
135 | memcpy(imp_data, str_arr[i].data, str_arr[i].size); |
140 | memcpy((void*)imp_data, str_arr[i].data, str_arr[i].size); |
Line 136... | Line 141... | ||
136 | imp_data += str_arr[i].size; |
141 | imp_data += str_arr[i].size; |
Line 150... | Line 155... | ||
150 | me->header.image_size + imp_sect->data_size, |
155 | me->header.image_size + imp_sect->data_size, |
151 | 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), |
156 | 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), |
152 | 0, SHN_ABS, __kx_import_table_sym);*/ |
157 | 0, SHN_ABS, __kx_import_table_sym);*/ |
153 | __kx_header.i_ptr = me->header.image_size + imp_sect->data_size; |
158 | __kx_header.i_ptr = me->header.image_size + imp_sect->data_size; |
Line 154... | Line 159... | ||
154 | 159 | ||
155 | struct LibraryEntry lib; |
160 | LibraryEntry lib; |
156 | lib.ImportEntry = me->header.image_size + imp_sect->data_size + (nlib * 8) + 4; |
161 | lib.ImportEntry = me->header.image_size + imp_sect->data_size + (nlib * 8) + 4; |
Line 157... | Line 162... | ||
157 | lib.LibraryName = me->header.image_size + 0; |
162 | lib.LibraryName = me->header.image_size + 0; |
158 | 163 | ||
Line 159... | Line 164... | ||
159 | // LibraryEntry |
164 | // LibraryEntry |
- | 165 | memcpy((void*)imp_data, &lib, sizeof(LibraryEntry)); |
|
160 | memcpy(imp_data, &lib, sizeof(struct LibraryEntry)); |
166 | |
161 | 167 | if (nlib > 1) { |
|
162 | if (nlib > 1) { |
168 | int prev_sum = 0; |
163 | int prev = 0; |
169 | int prev = 0; |
- | 170 | i = 1; |
|
164 | i = 1; |
171 | do { |
165 | do { |
172 | lib.ImportEntry += (len_arr[prev].size - 2) * 4 + 4; //TODO: check that +4 is correct |
166 | lib.ImportEntry += (len_arr[prev].size - 2) * 4 + 4; //TODO: check that +4 is correct |
173 | prev_sum += str_arr[prev].size; |
167 | lib.LibraryName = me->header.image_size + str_arr[prev].size; |
174 | lib.LibraryName = me->header.image_size + prev_sum; // FIXED (was BUG#10) |
Line 168... | Line 175... | ||
168 | imp_data += sizeof(struct LibraryEntry); |
175 | imp_data += sizeof(LibraryEntry); |
169 | imp_sect->data_size += sizeof(struct LibraryEntry); |
176 | imp_sect->data_size += sizeof(LibraryEntry); |
Line 170... | Line 177... | ||
170 | memcpy(imp_data, &lib, sizeof(struct LibraryEntry)); |
177 | memcpy((void*)imp_data, &lib, sizeof(LibraryEntry)); |
171 | 178 | ||
Line 172... | Line 179... | ||
172 | prev++; |
179 | prev++; |
173 | i++; |
180 | i++; |
174 | 181 | ||
Line -... | Line 182... | ||
- | 182 | } while (i < nlib); |
|
175 | } while (i < nlib); |
183 | } |
176 | } |
184 | |
Line 177... | Line 185... | ||
177 | 185 | // End of LibraryEntry |
|
178 | // End of LibraryEntry |
186 | imp_data += sizeof(LibraryEntry) + 4; |
179 | imp_data += sizeof(struct LibraryEntry) + 4; |
187 | imp_sect->data_size += sizeof(LibraryEntry) + 4; |
180 | imp_sect->data_size += sizeof(struct LibraryEntry) + 4; |
188 | |
- | 189 | const char *sym_name; |
|
Line 181... | Line 190... | ||
181 | 190 | char name_len; |
|
182 | char name_len; |
- | |
Line 183... | Line 191... | ||
183 | long l, nl; |
191 | long len_sum; |
- | 192 | ||
184 | 193 | len_sum = me->header.image_size; |
|
Line 185... | Line 194... | ||
185 | l = me->header.image_size; |
194 | i = 0; |
186 | i = 0; |
195 | do { |
187 | do { |
196 | char* len_data = len_arr[i].data; |
188 | char* len_data = len_arr[i].data; |
197 | long* sym_data = sym_arr[i].data; |
189 | 198 | ||
Line 190... | Line 199... | ||
190 | name_len = *len_data++; // Skip library name |
199 | name_len = *len_data++; // Skip library name |
191 | nl = name_len; |
200 | |
Line 192... | Line 201... | ||
192 | 201 | do { |
|
193 | do { |
202 | |
194 | const char *name = (const char *)str_arr[i].data + nl; |
203 | memcpy(&sym_name, sym_data++, 4); |
Line 195... | Line -... | ||
195 | - | ||
196 | add_elf_sym( |
- | |
197 | me->s1->dynsymtab_section, |
204 | |
Line 198... | Line 205... | ||
198 | me->header.image_size + imp_sect->data_size, |
205 | add_elf_sym( |
199 | 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), |
206 | me->s1->dynsymtab_section, |
Line 200... | Line 207... | ||
200 | 0, SHN_ABS, name); |
207 | me->header.image_size + imp_sect->data_size, |
201 | 208 | 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), |
|
Line 202... | Line 209... | ||
202 | l += name_len; |
209 | 0, SHN_ABS, sym_name); |
Line 203... | Line 210... | ||
203 | memcpy(imp_data, &l, 4); |
210 | |
204 | 211 | len_sum += name_len; |
|
Line 205... | Line 212... | ||
205 | imp_data += 4; |
212 | memcpy((void*)imp_data, &len_sum, 4); |
206 | imp_sect->data_size += 4; |
213 | |
- | 214 | imp_data += 4; |
|
Line 207... | Line 215... | ||
207 | name_len = */*++*/len_data/*++*/; //(was BUG#3) |
215 | imp_sect->data_size += 4; |
Line 244... | Line 252... | ||
244 | 252 | ||
245 | //tcc_add_crt(me->s1, "start1.o"); |
253 | //tcc_add_crt(me->s1, "start1.o"); |
Line 246... | Line 254... | ||
246 | } |
254 | } |
247 | 255 | ||
248 | long kx_get_header_length(me_info* me) { |
256 | long kx_get_header_length(me_info* me) { |
Line 249... | Line 257... | ||
249 | if (me->header.version = 2) |
257 | if (me->header.version == 2) |
250 | return sizeof(kx_header); |
258 | return sizeof(kx_header); |
Line 251... | Line 259... | ||
251 | 259 | ||
252 | return 0; |
260 | return 0; |
253 | } |
261 | } |
254 | 262 | ||
Line 255... | Line 263... | ||
255 | void kx_write_header(me_info* me, FILE* f) { |
263 | void kx_write_header(me_info* me, FILE* f) { |
256 | if (me->header.version = 2) |
264 | if (me->header.version == 2) |