Subversion Repositories Kolibri OS

Rev

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)