]>
Commit | Line | Data |
---|---|---|
252b5132 | 1 | /* obj-format for ieee-695 records. |
f7e42eb4 | 2 | Copyright 1991, 1992, 1993, 1994, 1997, 2000 |
28e4f854 | 3 | Free Software Foundation, Inc. |
252b5132 RH |
4 | |
5 | This file is part of GAS, the GNU Assembler. | |
6 | ||
7 | GAS is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2, or (at your option) | |
10 | any later version. | |
11 | ||
12 | GAS is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GAS; see the file COPYING. If not, write to the Free | |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
28e4f854 | 20 | 02111-1307, USA. */ |
252b5132 | 21 | |
28e4f854 | 22 | /* Created by Steve Chamberlain <[email protected]>. */ |
252b5132 | 23 | |
28e4f854 KH |
24 | /* This will hopefully become the port through which bfd and gas talk, |
25 | for the moment, only ieee is known to work well. */ | |
252b5132 RH |
26 | |
27 | #include "bfd.h" | |
28 | #include "as.h" | |
29 | #include "subsegs.h" | |
30 | #include "output-file.h" | |
31 | #include "frags.h" | |
32 | ||
33 | bfd *abfd; | |
34 | ||
28e4f854 KH |
35 | /* How many addresses does the .align take? */ |
36 | ||
252b5132 RH |
37 | static relax_addressT |
38 | relax_align (address, alignment) | |
28e4f854 KH |
39 | /* Address now. */ |
40 | register relax_addressT address; | |
41 | ||
42 | /* Alignment (binary). */ | |
43 | register long alignment; | |
252b5132 RH |
44 | { |
45 | relax_addressT mask; | |
46 | relax_addressT new_address; | |
47 | ||
48 | mask = ~((~0) << alignment); | |
49 | new_address = (address + mask) & (~mask); | |
50 | return (new_address - address); | |
28e4f854 KH |
51 | } |
52 | ||
53 | /* Calculate the size of the frag chain | |
54 | and create a bfd section to contain all of it. */ | |
252b5132 | 55 | |
252b5132 | 56 | static void |
1994a7c7 | 57 | size_section (abfd, idx) |
28e4f854 | 58 | bfd *abfd; |
1994a7c7 | 59 | unsigned int idx; |
252b5132 RH |
60 | { |
61 | asection *sec; | |
62 | unsigned int size = 0; | |
63 | fragS *frag = segment_info[idx].frag_root; | |
28e4f854 | 64 | |
252b5132 RH |
65 | while (frag) |
66 | { | |
67 | if (frag->fr_address != size) | |
68 | { | |
69 | printf (_("Out of step\n")); | |
70 | size = frag->fr_address; | |
71 | } | |
72 | size += frag->fr_fix; | |
73 | switch (frag->fr_type) | |
74 | { | |
75 | case rs_fill: | |
76 | case rs_org: | |
77 | size += frag->fr_offset * frag->fr_var; | |
78 | break; | |
79 | case rs_align: | |
80 | case rs_align_code: | |
81 | { | |
82 | addressT off; | |
83 | ||
84 | off = relax_align (size, frag->fr_offset); | |
85 | if (frag->fr_subtype != 0 && off > frag->fr_subtype) | |
86 | off = 0; | |
87 | size += off; | |
88 | } | |
89 | } | |
90 | frag = frag->fr_next; | |
91 | } | |
92 | if (size) | |
93 | { | |
94 | char *name = segment_info[idx].name; | |
28e4f854 | 95 | |
252b5132 | 96 | if (name == (char *) NULL) |
28e4f854 KH |
97 | name = ".data"; |
98 | ||
99 | segment_info[idx].user_stuff = | |
100 | (char *) (sec = bfd_make_section (abfd, name)); | |
101 | /* Make it output through itself. */ | |
252b5132 RH |
102 | sec->output_section = sec; |
103 | sec->flags |= SEC_HAS_CONTENTS; | |
104 | bfd_set_section_size (abfd, sec, size); | |
105 | } | |
106 | } | |
107 | ||
28e4f854 KH |
108 | /* Run through a frag chain and write out the data to go with it. */ |
109 | ||
252b5132 | 110 | static void |
1994a7c7 | 111 | fill_section (abfd, idx) |
28e4f854 | 112 | bfd *abfd; |
1994a7c7 | 113 | unsigned int idx; |
252b5132 RH |
114 | { |
115 | asection *sec = segment_info[idx].user_stuff; | |
28e4f854 | 116 | |
252b5132 RH |
117 | if (sec) |
118 | { | |
119 | fragS *frag = segment_info[idx].frag_root; | |
120 | unsigned int offset = 0; | |
121 | while (frag) | |
122 | { | |
123 | unsigned int fill_size; | |
124 | unsigned int count; | |
125 | switch (frag->fr_type) | |
126 | { | |
127 | case rs_fill: | |
128 | case rs_align: | |
129 | case rs_org: | |
130 | if (frag->fr_fix) | |
131 | { | |
132 | bfd_set_section_contents (abfd, | |
133 | sec, | |
134 | frag->fr_literal, | |
135 | frag->fr_address, | |
136 | frag->fr_fix); | |
137 | } | |
138 | offset += frag->fr_fix; | |
139 | fill_size = frag->fr_var; | |
140 | if (fill_size) | |
141 | { | |
142 | unsigned int off = frag->fr_fix; | |
143 | for (count = frag->fr_offset; count; count--) | |
144 | { | |
145 | bfd_set_section_contents (abfd, sec, | |
146 | frag->fr_literal + | |
147 | frag->fr_fix, | |
148 | frag->fr_address + off, | |
149 | fill_size); | |
150 | off += fill_size; | |
151 | } | |
152 | } | |
153 | break; | |
154 | default: | |
155 | abort (); | |
156 | } | |
157 | frag = frag->fr_next; | |
158 | } | |
159 | } | |
160 | } | |
161 | ||
28e4f854 | 162 | /* Count the relocations in a chain. */ |
252b5132 RH |
163 | |
164 | static unsigned int | |
1994a7c7 NC |
165 | count_entries_in_chain (idx) |
166 | unsigned int idx; | |
252b5132 RH |
167 | { |
168 | unsigned int nrelocs; | |
169 | fixS *fixup_ptr; | |
170 | ||
28e4f854 | 171 | /* Count the relocations. */ |
252b5132 RH |
172 | fixup_ptr = segment_info[idx].fix_root; |
173 | nrelocs = 0; | |
174 | while (fixup_ptr != (fixS *) NULL) | |
175 | { | |
176 | fixup_ptr = fixup_ptr->fx_next; | |
177 | nrelocs++; | |
178 | } | |
179 | return nrelocs; | |
180 | } | |
181 | ||
28e4f854 KH |
182 | /* Output all the relocations for a section. */ |
183 | ||
252b5132 | 184 | void |
1994a7c7 NC |
185 | do_relocs_for (idx) |
186 | unsigned int idx; | |
252b5132 RH |
187 | { |
188 | unsigned int nrelocs; | |
189 | arelent **reloc_ptr_vector; | |
190 | arelent *reloc_vector; | |
191 | asymbol **ptrs; | |
192 | asection *section = (asection *) (segment_info[idx].user_stuff); | |
193 | unsigned int i; | |
194 | fixS *from; | |
28e4f854 | 195 | |
252b5132 RH |
196 | if (section) |
197 | { | |
198 | nrelocs = count_entries_in_chain (idx); | |
199 | ||
28e4f854 KH |
200 | reloc_ptr_vector = |
201 | (arelent **) malloc ((nrelocs + 1) * sizeof (arelent *)); | |
252b5132 RH |
202 | reloc_vector = (arelent *) malloc (nrelocs * sizeof (arelent)); |
203 | ptrs = (asymbol **) malloc (nrelocs * sizeof (asymbol *)); | |
204 | from = segment_info[idx].fix_root; | |
205 | for (i = 0; i < nrelocs; i++) | |
206 | { | |
207 | arelent *to = reloc_vector + i; | |
208 | asymbol *s; | |
209 | reloc_ptr_vector[i] = to; | |
210 | to->howto = (reloc_howto_type *) (from->fx_r_type); | |
211 | ||
28e4f854 KH |
212 | #if 0 |
213 | /* We can't represent complicated things in a reloc yet. */ | |
214 | if (from->fx_addsy == 0 || from->fx_subsy != 0) | |
215 | abort (); | |
252b5132 RH |
216 | #endif |
217 | ||
218 | s = &(from->fx_addsy->sy_symbol.sy); | |
219 | to->address = ((char *) (from->fx_frag->fr_address + | |
220 | from->fx_where)) | |
221 | - ((char *) (&(from->fx_frag->fr_literal))); | |
222 | to->addend = from->fx_offset; | |
223 | /* If we know the symbol which we want to relocate to, turn | |
224 | this reloaction into a section relative. | |
225 | ||
226 | If this relocation is pcrelative, and we know the | |
227 | destination, we still want to keep the relocation - since | |
228 | the linker might relax some of the bytes, but it stops | |
28e4f854 | 229 | being pc relative and turns into an absolute relocation. */ |
252b5132 RH |
230 | if (s) |
231 | { | |
232 | if ((s->flags & BSF_UNDEFINED) == 0) | |
233 | { | |
234 | to->section = s->section; | |
235 | ||
236 | /* We can refer directly to the value field here, | |
237 | rather than using S_GET_VALUE, because this is | |
238 | only called after do_symbols, which sets up the | |
239 | value field. */ | |
240 | to->addend += s->value; | |
241 | ||
242 | to->sym_ptr_ptr = 0; | |
243 | if (to->howto->pcrel_offset) | |
28e4f854 KH |
244 | /* This is a pcrel relocation, the addend should |
245 | be adjusted. */ | |
246 | to->addend -= to->address + 1; | |
252b5132 RH |
247 | } |
248 | else | |
249 | { | |
250 | to->section = 0; | |
251 | *ptrs = &(from->fx_addsy->sy_symbol.sy); | |
252 | to->sym_ptr_ptr = ptrs; | |
253 | ||
254 | if (to->howto->pcrel_offset) | |
28e4f854 KH |
255 | /* This is a pcrel relocation, the addend should |
256 | be adjusted. */ | |
257 | to->addend -= to->address - 1; | |
252b5132 | 258 | } |
252b5132 RH |
259 | } |
260 | else | |
28e4f854 | 261 | to->section = 0; |
252b5132 RH |
262 | |
263 | ptrs++; | |
264 | from = from->fx_next; | |
265 | } | |
266 | ||
28e4f854 | 267 | /* Attatch to the section. */ |
252b5132 RH |
268 | section->orelocation = reloc_ptr_vector; |
269 | section->reloc_count = nrelocs; | |
270 | section->flags |= SEC_LOAD; | |
271 | } | |
272 | } | |
273 | ||
28e4f854 KH |
274 | /* Do the symbols. */ |
275 | ||
252b5132 | 276 | static void |
1994a7c7 | 277 | do_symbols (abfd) |
28e4f854 | 278 | bfd *abfd; |
252b5132 RH |
279 | { |
280 | extern symbolS *symbol_rootP; | |
281 | symbolS *ptr; | |
282 | asymbol **symbol_ptr_vec; | |
283 | asymbol *symbol_vec; | |
284 | unsigned int count = 0; | |
285 | unsigned int index; | |
286 | ||
252b5132 RH |
287 | for (ptr = symbol_rootP; |
288 | ptr != (symbolS *) NULL; | |
289 | ptr = ptr->sy_next) | |
290 | { | |
291 | if (SEG_NORMAL (ptr->sy_symbol.seg)) | |
292 | { | |
293 | ptr->sy_symbol.sy.section = | |
294 | (asection *) (segment_info[ptr->sy_symbol.seg].user_stuff); | |
ac62c346 | 295 | S_SET_VALUE (ptr, S_GET_VALUE (ptr)); |
252b5132 | 296 | if (ptr->sy_symbol.sy.flags == 0) |
28e4f854 | 297 | ptr->sy_symbol.sy.flags = BSF_LOCAL; |
252b5132 RH |
298 | } |
299 | else | |
300 | { | |
301 | switch (ptr->sy_symbol.seg) | |
302 | { | |
303 | case SEG_ABSOLUTE: | |
304 | ptr->sy_symbol.sy.flags |= BSF_ABSOLUTE; | |
305 | ptr->sy_symbol.sy.section = 0; | |
306 | break; | |
307 | case SEG_UNKNOWN: | |
308 | ptr->sy_symbol.sy.flags = BSF_UNDEFINED; | |
309 | ptr->sy_symbol.sy.section = 0; | |
310 | break; | |
311 | default: | |
312 | abort (); | |
313 | } | |
314 | } | |
315 | ptr->sy_symbol.sy.value = S_GET_VALUE (ptr); | |
316 | count++; | |
317 | } | |
318 | symbol_ptr_vec = (asymbol **) malloc ((count + 1) * sizeof (asymbol *)); | |
319 | ||
320 | index = 0; | |
321 | for (ptr = symbol_rootP; | |
322 | ptr != (symbolS *) NULL; | |
323 | ptr = ptr->sy_next) | |
324 | { | |
325 | symbol_ptr_vec[index] = &(ptr->sy_symbol.sy); | |
326 | index++; | |
327 | } | |
328 | symbol_ptr_vec[index] = 0; | |
329 | abfd->outsymbols = symbol_ptr_vec; | |
330 | abfd->symcount = count; | |
331 | } | |
332 | ||
333 | /* The generic as->bfd converter. Other backends may have special case | |
28e4f854 | 334 | code. */ |
252b5132 RH |
335 | |
336 | void | |
1994a7c7 | 337 | bfd_as_write_hook () |
252b5132 RH |
338 | { |
339 | int i; | |
340 | ||
341 | for (i = SEG_E0; i < SEG_UNKNOWN; i++) | |
28e4f854 | 342 | size_section (abfd, i); |
252b5132 RH |
343 | |
344 | for (i = SEG_E0; i < SEG_UNKNOWN; i++) | |
345 | fill_section (abfd, i); | |
346 | ||
347 | do_symbols (abfd); | |
348 | ||
349 | for (i = SEG_E0; i < SEG_UNKNOWN; i++) | |
350 | do_relocs_for (i); | |
252b5132 RH |
351 | } |
352 | ||
353 | S_SET_SEGMENT (x, y) | |
354 | symbolS *x; | |
355 | int y; | |
356 | { | |
357 | x->sy_symbol.seg = y; | |
358 | } | |
359 | ||
360 | S_IS_DEFINED (x) | |
361 | symbolS *x; | |
362 | { | |
363 | if (SEG_NORMAL (x->sy_symbol.seg)) | |
364 | { | |
365 | return 1; | |
366 | } | |
367 | switch (x->sy_symbol.seg) | |
368 | { | |
369 | case SEG_UNKNOWN: | |
370 | return 0; | |
371 | default: | |
372 | abort (); | |
373 | } | |
374 | } | |
375 | ||
376 | S_IS_EXTERNAL (x) | |
377 | { | |
378 | abort (); | |
379 | } | |
380 | ||
381 | S_GET_DESC (x) | |
382 | { | |
383 | abort (); | |
384 | } | |
385 | ||
386 | S_GET_SEGMENT (x) | |
387 | symbolS *x; | |
388 | { | |
389 | return x->sy_symbol.seg; | |
390 | } | |
391 | ||
392 | S_SET_EXTERNAL (x) | |
393 | symbolS *x; | |
394 | { | |
395 | x->sy_symbol.sy.flags |= BSF_GLOBAL | BSF_EXPORT; | |
396 | } | |
397 | ||
398 | S_SET_NAME (x, y) | |
399 | symbolS *x; | |
400 | char *y; | |
401 | { | |
402 | x->sy_symbol.sy.name = y; | |
403 | } | |
404 | ||
405 | S_GET_OTHER (x) | |
406 | { | |
407 | abort (); | |
408 | } | |
409 | ||
410 | S_IS_DEBUG (x) | |
411 | { | |
412 | abort (); | |
413 | } | |
414 | ||
415 | #ifndef segment_name | |
416 | char * | |
417 | segment_name () | |
418 | { | |
419 | abort (); | |
420 | } | |
421 | #endif | |
422 | ||
423 | void | |
424 | obj_read_begin_hook () | |
425 | { | |
426 | } | |
427 | ||
428 | static void | |
429 | obj_ieee_section (ignore) | |
430 | int ignore; | |
431 | { | |
432 | extern char *input_line_pointer; | |
433 | extern char is_end_of_line[]; | |
434 | char *p = input_line_pointer; | |
435 | char *s = p; | |
436 | int i; | |
28e4f854 KH |
437 | |
438 | /* Look up the name, if it doesn't exist, make it. */ | |
252b5132 RH |
439 | while (*p && *p != ' ' && *p != ',' && !is_end_of_line[*p]) |
440 | { | |
441 | p++; | |
442 | } | |
443 | for (i = SEG_E0; i < SEG_UNKNOWN; i++) | |
444 | { | |
445 | if (segment_info[i].hadone) | |
446 | { | |
447 | if (strncmp (segment_info[i].name, s, p - s) == 0) | |
28e4f854 | 448 | goto ok; |
252b5132 RH |
449 | } |
450 | else | |
451 | break; | |
452 | } | |
453 | if (i == SEG_UNKNOWN) | |
454 | { | |
455 | as_bad (_("too many sections")); | |
456 | return; | |
457 | } | |
458 | ||
459 | segment_info[i].hadone = 1; | |
460 | segment_info[i].name = malloc (p - s + 1); | |
461 | memcpy (segment_info[i].name, s, p - s); | |
462 | segment_info[i].name[p - s] = 0; | |
463 | ok: | |
464 | subseg_set (i, 0); | |
465 | while (!is_end_of_line[*p]) | |
466 | p++; | |
467 | input_line_pointer = p; | |
252b5132 RH |
468 | } |
469 | ||
252b5132 RH |
470 | void cons (); |
471 | void s_ignore (); | |
472 | ||
252b5132 RH |
473 | void s_globl (); |
474 | const pseudo_typeS obj_pseudo_table[] = | |
475 | { | |
476 | {"section", obj_ieee_section, 0}, | |
28e4f854 KH |
477 | {"data.b" , cons , 1}, |
478 | {"data.w" , cons , 2}, | |
479 | {"data.l" , cons , 4}, | |
480 | {"export" , s_globl , 0}, | |
481 | {"option" , s_ignore , 0}, | |
482 | {"end" , s_ignore , 0}, | |
483 | {"import" , s_ignore , 0}, | |
484 | {"sdata" , stringer , 0}, | |
252b5132 | 485 | 0, |
252b5132 RH |
486 | }; |
487 | ||
252b5132 RH |
488 | void |
489 | obj_symbol_new_hook (symbolP) | |
490 | symbolS *symbolP; | |
491 | { | |
492 | symbolP->sy_symbol.sy.the_bfd = abfd; | |
493 | } | |
494 | ||
252b5132 | 495 | #if 1 |
18e1d487 AM |
496 | |
497 | #ifndef SUB_SEGMENT_ALIGN | |
498 | #ifdef HANDLE_ALIGN | |
499 | /* The last subsegment gets an aligment corresponding to the alignment | |
500 | of the section. This allows proper nop-filling at the end of | |
501 | code-bearing sections. */ | |
502 | #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \ | |
503 | (!(FRCHAIN)->frch_next || (FRCHAIN)->frch_next->frch_seg != (SEG) \ | |
504 | ? get_recorded_alignment (SEG) : 0) | |
505 | #else | |
506 | #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 2 | |
507 | #endif | |
508 | #endif | |
509 | ||
252b5132 | 510 | extern void |
1994a7c7 | 511 | write_object_file () |
252b5132 RH |
512 | { |
513 | int i; | |
514 | struct frchain *frchain_ptr; | |
515 | struct frag *frag_ptr; | |
516 | ||
517 | abfd = bfd_openw (out_file_name, "ieee"); | |
518 | ||
519 | if (abfd == 0) | |
520 | { | |
521 | as_perror (_("FATAL: Can't create %s"), out_file_name); | |
522 | exit (EXIT_FAILURE); | |
523 | } | |
524 | bfd_set_format (abfd, bfd_object); | |
525 | bfd_set_arch_mach (abfd, bfd_arch_h8300, 0); | |
526 | subseg_set (1, 0); | |
527 | subseg_set (2, 0); | |
528 | subseg_set (3, 0); | |
18e1d487 AM |
529 | |
530 | /* Run through all the sub-segments and align them up. Also | |
531 | close any open frags. We tack a .fill onto the end of the | |
532 | frag chain so that any .align's size can be worked by looking | |
533 | at the next frag. */ | |
252b5132 RH |
534 | for (frchain_ptr = frchain_root; |
535 | frchain_ptr != (struct frchain *) NULL; | |
536 | frchain_ptr = frchain_ptr->frch_next) | |
537 | { | |
18e1d487 | 538 | int alignment; |
252b5132 RH |
539 | |
540 | subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg); | |
18e1d487 AM |
541 | |
542 | alignment = SUB_SEGMENT_ALIGN (now_seg, frchain_ptr) | |
543 | ||
544 | #ifdef md_do_align | |
545 | md_do_align (alignment, (char *) NULL, 0, 0, alignment_done); | |
546 | #endif | |
547 | if (subseg_text_p (now_seg)) | |
548 | frag_align_code (alignment, 0); | |
549 | else | |
550 | frag_align (alignment, 0, 0); | |
551 | ||
552 | #ifdef md_do_align | |
553 | alignment_done: | |
252b5132 | 554 | #endif |
18e1d487 | 555 | |
252b5132 RH |
556 | frag_wane (frag_now); |
557 | frag_now->fr_fix = 0; | |
558 | know (frag_now->fr_next == NULL); | |
559 | } | |
560 | ||
561 | /* Now build one big frag chain for each segment, linked through | |
28e4f854 | 562 | fr_next. */ |
252b5132 RH |
563 | for (i = SEG_E0; i < SEG_UNKNOWN; i++) |
564 | { | |
252b5132 RH |
565 | fragS **prev_frag_ptr_ptr; |
566 | struct frchain *next_frchain_ptr; | |
567 | ||
28e4f854 KH |
568 | #if 0 |
569 | struct frag **head_ptr = segment_info[i].frag_root; | |
570 | #endif | |
252b5132 RH |
571 | |
572 | segment_info[i].frag_root = segment_info[i].frchainP->frch_root; | |
573 | #if 0 | |
28e4f854 | 574 | /* I'm not sure what this is for. */ |
252b5132 RH |
575 | for (frchain_ptr = segment_info[i].frchainP->frch_root; |
576 | frchain_ptr != (struct frchain *) NULL; | |
577 | frchain_ptr = frchain_ptr->frch_next) | |
578 | { | |
579 | *head_ptr = frchain_ptr; | |
580 | head_ptr = &frchain_ptr->next; | |
581 | } | |
252b5132 RH |
582 | #endif |
583 | } | |
584 | ||
585 | for (i = SEG_E0; i < SEG_UNKNOWN; i++) | |
28e4f854 | 586 | relax_segment (segment_info[i].frag_root, i); |
252b5132 | 587 | |
1cd55018 AM |
588 | /* Relaxation has completed. Freeze all syms. */ |
589 | finalize_syms = 1; | |
590 | ||
28e4f854 | 591 | /* Now the addresses of the frags are correct within the segment. */ |
252b5132 RH |
592 | |
593 | bfd_as_write_hook (); | |
594 | bfd_close (abfd); | |
595 | } | |
596 | ||
597 | #endif | |
598 | ||
599 | H_SET_TEXT_SIZE (a, b) | |
600 | { | |
601 | abort (); | |
602 | } | |
603 | ||
604 | H_GET_TEXT_SIZE () | |
605 | { | |
606 | abort (); | |
607 | } | |
608 | ||
609 | H_SET_BSS_SIZE () | |
610 | { | |
611 | abort (); | |
612 | } | |
613 | ||
614 | H_SET_STRING_SIZE () | |
615 | { | |
616 | abort (); | |
617 | } | |
618 | ||
619 | H_SET_RELOCATION_SIZE () | |
620 | { | |
621 | abort (); | |
622 | } | |
623 | ||
624 | H_SET_MAGIC_NUMBER () | |
625 | { | |
626 | abort (); | |
627 | } | |
628 | ||
629 | H_GET_FILE_SIZE () | |
630 | { | |
631 | abort (); | |
632 | } | |
633 | ||
634 | H_GET_TEXT_RELOCATION_SIZE () | |
635 | { | |
636 | abort (); | |
637 | } |