* breakpoint.c, breakpoint.h (breakpoint_init_inferior): New function
[deliverable/binutils-gdb.git] / gas / write.c
1 /* write.c - emit .o file
2 Copyright (C) 1986, 1987, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 /* This thing should be set up to do byteordering correctly. But... */
21
22 #include "as.h"
23 #include "subsegs.h"
24 #include "obstack.h"
25 #include "output-file.h"
26
27 /* The NOP_OPCODE is for the alignment fill value. Fill it with a nop
28 instruction so that the disassembler does not choke on it. */
29 #ifndef NOP_OPCODE
30 #define NOP_OPCODE 0x00
31 #endif
32
33 #ifndef WORKING_DOT_WORD
34 extern CONST int md_short_jump_size;
35 extern CONST int md_long_jump_size;
36 #endif
37
38 #ifndef BFD_ASSEMBLER
39
40 #ifndef MANY_SEGMENTS
41 struct frag *text_frag_root;
42 struct frag *data_frag_root;
43 struct frag *bss_frag_root;
44
45 struct frag *text_last_frag; /* Last frag in segment. */
46 struct frag *data_last_frag; /* Last frag in segment. */
47 static struct frag *bss_last_frag; /* Last frag in segment. */
48 #endif
49
50 #if ! defined (BFD_ASSEMBLER) && ! defined (BFD)
51 static object_headers headers;
52 static char *the_object_file;
53 #endif
54
55 long string_byte_count;
56 char *next_object_file_charP; /* Tracks object file bytes. */
57
58 #ifndef OBJ_VMS
59 int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
60 #endif
61
62 #endif /* BFD_ASSEMBLER */
63
64 #ifdef BFD_ASSEMBLER
65 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
66 symbolS *add, symbolS *sub,
67 offsetT offset, int pcrel,
68 bfd_reloc_code_real_type r_type));
69 #else
70 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
71 symbolS *add, symbolS *sub,
72 offsetT offset, int pcrel,
73 int r_type));
74 #endif
75 #if defined (BFD_ASSEMBLER) || !defined (BFD)
76 static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
77 #endif
78 static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
79
80 /*
81 * fix_new()
82 *
83 * Create a fixS in obstack 'notes'.
84 */
85 static fixS *
86 fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
87 r_type)
88 fragS *frag; /* Which frag? */
89 int where; /* Where in that frag? */
90 int size; /* 1, 2, or 4 usually. */
91 symbolS *add_symbol; /* X_add_symbol. */
92 symbolS *sub_symbol; /* X_op_symbol. */
93 offsetT offset; /* X_add_number. */
94 int pcrel; /* TRUE if PC-relative relocation. */
95 #ifdef BFD_ASSEMBLER
96 bfd_reloc_code_real_type r_type; /* Relocation type */
97 #else
98 int r_type; /* Relocation type */
99 #endif
100 {
101 fixS *fixP;
102
103 fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
104
105 fixP->fx_frag = frag;
106 fixP->fx_where = where;
107 fixP->fx_size = size;
108 fixP->fx_addsy = add_symbol;
109 fixP->fx_subsy = sub_symbol;
110 fixP->fx_offset = offset;
111 fixP->fx_pcrel = pcrel;
112 #if defined(NEED_FX_R_TYPE) || defined (BFD_ASSEMBLER)
113 fixP->fx_r_type = r_type;
114 #endif
115 fixP->fx_im_disp = 0;
116 fixP->fx_pcrel_adjust = 0;
117 fixP->fx_bit_fixP = 0;
118 fixP->fx_addnumber = 0;
119
120 #ifdef TC_something
121 fixP->fx_bsr = 0;
122 #endif
123 #ifdef TC_I960
124 fixP->fx_callj = 0;
125 #endif
126
127 /* Usually, we want relocs sorted numerically, but while
128 comparing to older versions of gas that have relocs
129 reverse sorted, it is convenient to have this compile
130 time option. xoxorich. */
131
132 {
133
134 #ifdef BFD_ASSEMBLER
135 fixS **seg_fix_rootP = & (seg_info (now_seg)->fix_root);
136 fixS **seg_fix_tailP = & (seg_info (now_seg)->fix_tail);
137 #endif
138
139 #ifdef REVERSE_SORT_RELOCS
140
141 fixP->fx_next = *seg_fix_rootP;
142 *seg_fix_rootP = fixP;
143
144 #else /* REVERSE_SORT_RELOCS */
145
146 fixP->fx_next = NULL;
147
148 if (*seg_fix_tailP)
149 (*seg_fix_tailP)->fx_next = fixP;
150 else
151 *seg_fix_rootP = fixP;
152 *seg_fix_tailP = fixP;
153
154 #endif /* REVERSE_SORT_RELOCS */
155
156 }
157
158 return fixP;
159 }
160
161 /* Create a fixup relative to a symbol (plus a constant). */
162
163 fixS *
164 fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
165 fragS *frag; /* Which frag? */
166 int where; /* Where in that frag? */
167 short int size; /* 1, 2, or 4 usually. */
168 symbolS *add_symbol; /* X_add_symbol. */
169 offsetT offset; /* X_add_number. */
170 int pcrel; /* TRUE if PC-relative relocation. */
171 #ifdef BFD_ASSEMBLER
172 bfd_reloc_code_real_type r_type; /* Relocation type */
173 #else
174 int r_type; /* Relocation type */
175 #endif
176 {
177 return fix_new_internal (frag, where, size, add_symbol,
178 (symbolS *) NULL, offset, pcrel, r_type);
179 }
180
181 /* Create a fixup for an expression. Currently we only support fixups
182 for difference expressions. That is itself more than most object
183 file formats support anyhow. */
184
185 fixS *
186 fix_new_exp (frag, where, size, exp, pcrel, r_type)
187 fragS *frag; /* Which frag? */
188 int where; /* Where in that frag? */
189 short int size; /* 1, 2, or 4 usually. */
190 expressionS *exp; /* Expression. */
191 int pcrel; /* TRUE if PC-relative relocation. */
192 #ifdef BFD_ASSEMBLER
193 bfd_reloc_code_real_type r_type; /* Relocation type */
194 #else
195 int r_type; /* Relocation type */
196 #endif
197 {
198 symbolS *add = NULL;
199 symbolS *sub = NULL;
200 offsetT off = 0;
201
202 switch (exp->X_op)
203 {
204 case O_absent:
205 break;
206
207 case O_uminus:
208 sub = exp->X_add_symbol;
209 off = exp->X_add_number;
210 break;
211
212 case O_subtract:
213 sub = exp->X_op_symbol;
214 /* Fall through. */
215 case O_symbol:
216 add = exp->X_add_symbol;
217 /* Fall through. */
218 case O_constant:
219 off = exp->X_add_number;
220 break;
221
222 default:
223 as_bad ("expression too complex for fixup");
224 }
225
226 return fix_new_internal (frag, where, size, add, sub, off,
227 pcrel, r_type);
228 }
229
230 /* Append a string onto another string, bumping the pointer along. */
231 void
232 append (charPP, fromP, length)
233 char **charPP;
234 char *fromP;
235 unsigned long length;
236 {
237 /* Don't trust memcpy() of 0 chars. */
238 if (length == 0)
239 return;
240
241 memcpy (*charPP, fromP, length);
242 *charPP += length;
243 }
244
245 #ifndef BFD_ASSEMBLER
246 int section_alignment[SEG_MAXIMUM_ORDINAL];
247 #endif
248
249 /*
250 * This routine records the largest alignment seen for each segment.
251 * If the beginning of the segment is aligned on the worst-case
252 * boundary, all of the other alignments within it will work. At
253 * least one object format really uses this info.
254 */
255 void
256 record_alignment (seg, align)
257 /* Segment to which alignment pertains */
258 segT seg;
259 /* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte
260 boundary, etc.) */
261 int align;
262 {
263 #ifdef BFD_ASSEMBLER
264 if (align > bfd_get_section_alignment (stdoutput, seg))
265 bfd_set_section_alignment (stdoutput, seg, align);
266 #else
267 if (align > section_alignment[(int) seg])
268 section_alignment[(int) seg] = align;
269 #endif
270 }
271
272 #if defined (BFD_ASSEMBLER) || ! defined (BFD)
273
274 static fragS *
275 chain_frchains_together_1 (section, frchp)
276 segT section;
277 struct frchain *frchp;
278 {
279 fragS dummy, *prev_frag = &dummy;
280 for (; frchp && frchp->frch_seg == section; frchp = frchp->frch_next)
281 {
282 prev_frag->fr_next = frchp->frch_root;
283 prev_frag = frchp->frch_last;
284 }
285 prev_frag->fr_next = 0;
286 return prev_frag;
287 }
288
289 #endif
290
291 #ifdef BFD_ASSEMBLER
292
293 static void
294 chain_frchains_together (abfd, section, xxx)
295 bfd *abfd; /* unused */
296 segT section;
297 char *xxx; /* unused */
298 {
299 segment_info_type *info;
300
301 /* BFD may have introduced its own sections without using
302 subseg_new, so it is possible that seg_info is NULL. */
303 info = seg_info (section);
304 if (info != (segment_info_type *) NULL)
305 chain_frchains_together_1 (section, info->frchainP);
306 }
307
308 #endif
309
310 #if !defined (BFD) && !defined (BFD_ASSEMBLER)
311
312 void
313 remove_subsegs (head, seg, root, last)
314 frchainS *head;
315 int seg;
316 fragS **root;
317 fragS **last;
318 {
319 *root = head->frch_root;
320 *last = chain_frchains_together_1 (seg, head);
321 }
322
323 #endif /* BFD */
324
325 #if defined (BFD_ASSEMBLER) || !defined (BFD)
326
327 #ifdef BFD_ASSEMBLER
328 static void
329 cvt_frag_to_fill (sec, fragP)
330 segT sec;
331 fragS *fragP;
332 #else
333 static void
334 cvt_frag_to_fill (headers, fragP)
335 object_headers *headers;
336 fragS *fragP;
337 #endif
338 {
339 switch (fragP->fr_type)
340 {
341 case rs_align:
342 case rs_org:
343 #ifdef HANDLE_ALIGN
344 HANDLE_ALIGN (fragP);
345 #endif
346 fragP->fr_type = rs_fill;
347 know (fragP->fr_var == 1);
348 know (fragP->fr_next != NULL);
349
350 fragP->fr_offset = (fragP->fr_next->fr_address
351 - fragP->fr_address
352 - fragP->fr_fix);
353 break;
354
355 case rs_fill:
356 break;
357
358 case rs_machine_dependent:
359 #ifdef BFD_ASSEMBLER
360 md_convert_frag (stdoutput, sec, fragP);
361 #else
362 md_convert_frag (headers, fragP);
363 #endif
364
365 assert (fragP->fr_next == NULL || (fragP->fr_next->fr_address - fragP->fr_address == fragP->fr_fix));
366
367 /*
368 * After md_convert_frag, we make the frag into a ".space 0".
369 * Md_convert_frag() should set up any fixSs and constants
370 * required.
371 */
372 frag_wane (fragP);
373 break;
374
375 #ifndef WORKING_DOT_WORD
376 case rs_broken_word:
377 {
378 struct broken_word *lie;
379
380 if (fragP->fr_subtype)
381 {
382 fragP->fr_fix += md_short_jump_size;
383 for (lie = (struct broken_word *) (fragP->fr_symbol);
384 lie && lie->dispfrag == fragP;
385 lie = lie->next_broken_word)
386 if (lie->added == 1)
387 fragP->fr_fix += md_long_jump_size;
388 }
389 frag_wane (fragP);
390 }
391 break;
392 #endif
393
394 default:
395 BAD_CASE (fragP->fr_type);
396 break;
397 }
398 }
399
400 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
401
402 #ifdef BFD_ASSEMBLER
403 static void
404 relax_and_size_seg (abfd, sec, xxx)
405 bfd *abfd;
406 asection *sec;
407 char *xxx;
408 {
409 flagword flags;
410 fragS *fragp;
411 segment_info_type *seginfo;
412 int x;
413 valueT size, newsize;
414
415 flags = bfd_get_section_flags (abfd, sec);
416
417 seginfo = (segment_info_type *) bfd_get_section_userdata (abfd, sec);
418 if (seginfo && seginfo->frchainP)
419 {
420 relax_segment (seginfo->frchainP->frch_root, sec);
421 for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
422 cvt_frag_to_fill (sec, fragp);
423 for (fragp = seginfo->frchainP->frch_root;
424 fragp->fr_next;
425 fragp = fragp->fr_next)
426 /* walk to last elt */;
427 size = fragp->fr_address + fragp->fr_fix;
428 }
429 else
430 size = 0;
431 if (size > 0)
432 {
433 flags |= SEC_HAS_CONTENTS;
434 /* @@ This is just an approximation. */
435 if (seginfo->fix_root)
436 flags |= SEC_RELOC;
437 else
438 flags &= ~SEC_RELOC;
439 x = bfd_set_section_flags (abfd, sec, flags);
440 assert (x == true);
441 }
442 size = md_section_align (sec, size);
443 x = bfd_set_section_size (abfd, sec, size);
444 assert (x == true);
445
446 /* If the size had to be rounded up, add some padding in the last
447 non-empty frag. */
448 newsize = bfd_get_section_size_before_reloc (sec);
449 assert (newsize >= size);
450 if (size != newsize)
451 {
452 fragS *last = seginfo->frchainP->frch_last;
453 fragp = seginfo->frchainP->frch_root;
454 while (fragp->fr_next != last)
455 fragp = fragp->fr_next;
456 last->fr_address = size;
457 fragp->fr_offset += newsize - size;
458 }
459
460 #ifdef tc_frob_section
461 tc_frob_section (sec);
462 #endif
463 #ifdef obj_frob_section
464 obj_frob_section (sec);
465 #endif
466 }
467
468 #ifdef DEBUG2
469 static void
470 dump_section_relocs (abfd, sec, stream_)
471 bfd *abfd;
472 asection *sec;
473 char *stream_;
474 {
475 FILE *stream = (FILE *) stream_;
476 segment_info_type *seginfo = seg_info (sec);
477 fixS *fixp = seginfo->fix_root;
478
479 if (!fixp)
480 return;
481
482 fprintf (stream, "sec %s relocs:\n", sec->name);
483 while (fixp)
484 {
485 symbolS *s = fixp->fx_addsy;
486 if (s)
487 fprintf (stream, " %08x: %s(%s+%x)+%x\n", fixp,
488 S_GET_NAME (s), s->bsym->section->name,
489 S_GET_VALUE (s), fixp->fx_offset);
490 else
491 fprintf (stream, " %08x: type %d no sym\n", fixp, fixp->fx_r_type);
492 fixp = fixp->fx_next;
493 }
494 }
495 #else
496 #define dump_section_relocs(ABFD,SEC,STREAM) (void)(ABFD,SEC,STREAM)
497 #endif
498
499 static void
500 adjust_reloc_syms (abfd, sec, xxx)
501 bfd *abfd;
502 asection *sec;
503 char *xxx;
504 {
505 segment_info_type *seginfo = seg_info (sec);
506 fixS *fixp;
507
508 if (seginfo == NULL)
509 return;
510
511 dump_section_relocs (abfd, sec, stderr);
512
513 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
514 if (fixp->fx_addsy)
515 {
516 symbolS *sym = fixp->fx_addsy;
517 asection *symsec = sym->bsym->section;
518 segment_info_type *symseginfo = seg_info (symsec);
519
520 /* If it's one of these sections, assume the symbol is definitely
521 going to be output. */
522 if (symsec == &bfd_und_section
523 || symsec == &bfd_abs_section
524 || bfd_is_com_section (symsec))
525 {
526 fixp->fx_addsy->sy_used_in_reloc = 1;
527 continue;
528 }
529
530 /* Since we're reducing to section symbols, don't attempt to reduce
531 anything that's already using one. */
532 if (sym->bsym == symsec->symbol)
533 {
534 fixp->fx_addsy->sy_used_in_reloc = 1;
535 continue;
536 }
537
538 /* Is there some other reason we can't adjust this one? (E.g.,
539 call/bal links in i960-bout symbols.) */
540 #ifdef obj_fix_adjustable
541 if (! obj_fix_adjustable (fixp))
542 {
543 fixp->fx_addsy->sy_used_in_reloc = 1;
544 continue;
545 }
546 #endif
547 /* If the section symbol isn't going to be output, the relocs
548 at least should still work. If not, figure out what to do
549 when we run into that case. */
550 fixp->fx_offset += S_GET_VALUE (sym);
551 if (sym->sy_frag)
552 fixp->fx_offset += sym->sy_frag->fr_address;
553 if (symseginfo->sym)
554 fixp->fx_addsy = symseginfo->sym;
555 else
556 {
557 fixp->fx_addsy = symbol_find (symsec->name);
558 if (!fixp->fx_addsy)
559 {
560 fixp->fx_addsy = symbol_make (symsec->name);
561 fixp->fx_addsy->bsym = symsec->symbol;
562 }
563 symseginfo->sym = fixp->fx_addsy;
564 }
565 fixp->fx_addsy->sy_used_in_reloc = 1;
566 }
567
568 dump_section_relocs (abfd, sec, stderr);
569 }
570
571 static void
572 write_relocs (abfd, sec, xxx)
573 bfd *abfd;
574 asection *sec;
575 char *xxx;
576 {
577 segment_info_type *seginfo = seg_info (sec);
578 int i;
579 unsigned int n;
580 arelent **relocs;
581 fixS *fixp;
582
583 /* If seginfo is NULL, we did not create this section; don't do
584 anything with it. */
585 if (seginfo == NULL)
586 return;
587
588 fixup_segment (seginfo->fix_root, sec);
589
590 n = 0;
591 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
592 n++;
593
594 #ifndef RELOC_EXPANSION_POSSIBLE
595 /* Set up reloc information as well. */
596 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
597 n * sizeof (arelent *));
598 memset ((char*)relocs, 0, n * sizeof (arelent*));
599
600 i = 0;
601 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
602 {
603 arelent *reloc;
604 char *data;
605 bfd_reloc_status_type s;
606
607 if (fixp->fx_addsy == 0)
608 {
609 /* @@ Need some other flag to indicate which have already
610 been performed... */
611 n--;
612 continue;
613 }
614 reloc = tc_gen_reloc (sec, fixp);
615 if (!reloc)
616 {
617 n--;
618 continue;
619 }
620 data = fixp->fx_frag->fr_literal + fixp->fx_where;
621 /* @@ Assumes max size of reloc is 4. */
622 if (fixp->fx_where + 4
623 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
624 abort ();
625 /* Pass bogus address so that when bfd_perform_relocation adds
626 `address' back in, it'll come up with `data', which is where
627 we want it to operate. */
628 s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
629 sec, stdoutput);
630 switch (s)
631 {
632 case bfd_reloc_ok:
633 break;
634 default:
635 as_fatal ("bad return from bfd_perform_relocation");
636 }
637 relocs[i++] = reloc;
638 }
639 #else
640 n = n * MAX_RELOC_EXPANSION;
641 /* Set up reloc information as well. */
642 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
643 n * sizeof (arelent *));
644
645 i = 0;
646 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
647 {
648 arelent **reloc;
649 char *data;
650 bfd_reloc_status_type s;
651 int j;
652
653 if (fixp->fx_addsy == 0)
654 {
655 /* @@ Need some other flag to indicate which have already
656 been performed... */
657 n--;
658 continue;
659 }
660 reloc = tc_gen_reloc (sec, fixp);
661
662 for (j = 0; reloc[j]; j++)
663 {
664 relocs[i++] = reloc[j];
665 assert(i <= n);
666 }
667 data = fixp->fx_frag->fr_literal + fixp->fx_where;
668 if (fixp->fx_where + 4
669 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
670 abort ();
671 for (j = 0; reloc[j]; j++)
672 {
673 s = bfd_perform_relocation (stdoutput, reloc[j], data - reloc[j]->address,
674 sec, stdoutput);
675 switch (s)
676 {
677 case bfd_reloc_ok:
678 break;
679 default:
680 as_fatal ("bad return from bfd_perform_relocation");
681 }
682 }
683 }
684 n = i;
685 #endif
686
687 if (n)
688 bfd_set_reloc (stdoutput, sec, relocs, n);
689 else
690 bfd_set_section_flags (abfd, sec,
691 (bfd_get_section_flags (abfd, sec)
692 & (flagword) ~SEC_RELOC));
693 #ifdef DEBUG2
694 {
695 int i;
696 arelent *r;
697 asymbol *s;
698 fprintf (stderr, "relocs for sec %s\n", sec->name);
699 for (i = 0; i < n; i++)
700 {
701 r = relocs[i];
702 s = *r->sym_ptr_ptr;
703 fprintf (stderr, " reloc %2d @%08x off %4x : sym %-10s addend %x\n",
704 i, r, r->address, s->name, r->addend);
705 }
706 }
707 #endif
708 }
709
710 static void
711 write_contents (abfd, sec, xxx)
712 bfd *abfd;
713 asection *sec;
714 char *xxx;
715 {
716 segment_info_type *seginfo = seg_info (sec);
717 unsigned long offset = 0;
718 fragS *f;
719
720 /* Write out the frags. */
721 if (! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
722 return;
723
724 for (f = seginfo->frchainP->frch_root;
725 f;
726 f = f->fr_next)
727 {
728 int x;
729 unsigned long fill_size;
730 char *fill_literal;
731 long count;
732
733 assert (f->fr_type == rs_fill);
734 if (f->fr_fix)
735 {
736 x = bfd_set_section_contents (stdoutput, sec,
737 f->fr_literal, (file_ptr) offset,
738 (bfd_size_type) f->fr_fix);
739 assert (x == true);
740 offset += f->fr_fix;
741 }
742 fill_literal = f->fr_literal + f->fr_fix;
743 fill_size = f->fr_var;
744 count = f->fr_offset;
745 assert (count >= 0);
746 if (fill_size && count)
747 while (count--)
748 {
749 x = bfd_set_section_contents (stdoutput, sec,
750 fill_literal, (file_ptr) offset,
751 (bfd_size_type) fill_size);
752 assert (x == true);
753 offset += fill_size;
754 }
755 }
756 }
757 #endif
758
759 #if defined(BFD_ASSEMBLER) || (!defined (BFD) && !defined(OBJ_AOUT))
760 static void
761 merge_data_into_text ()
762 {
763 #if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
764 seg_info (text_section)->frchainP->frch_last->fr_next =
765 seg_info (data_section)->frchainP->frch_root;
766 seg_info (text_section)->frchainP->frch_last =
767 seg_info (data_section)->frchainP->frch_last;
768 seg_info (data_section)->frchainP = 0;
769 #else
770 fixS *tmp;
771
772 text_last_frag->fr_next = data_frag_root;
773 text_last_frag = data_last_frag;
774 data_last_frag = NULL;
775 data_frag_root = NULL;
776 if (text_fix_root)
777 {
778 for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
779 tmp->fx_next = data_fix_root;
780 text_fix_tail = data_fix_tail;
781 }
782 else
783 text_fix_root = data_fix_root;
784 data_fix_root = NULL;
785 #endif
786 }
787 #endif /* BFD_ASSEMBLER || (! BFD && ! OBJ_AOUT) */
788
789 #if !defined (BFD_ASSEMBLER) && !defined (BFD)
790 static void
791 relax_and_size_all_segments ()
792 {
793 fragS *fragP;
794
795 relax_segment (text_frag_root, SEG_TEXT);
796 relax_segment (data_frag_root, SEG_DATA);
797 relax_segment (bss_frag_root, SEG_BSS);
798 /*
799 * Now the addresses of frags are correct within the segment.
800 */
801
802 know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
803 H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
804 text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
805
806 /*
807 * Join the 2 segments into 1 huge segment.
808 * To do this, re-compute every rn_address in the SEG_DATA frags.
809 * Then join the data frags after the text frags.
810 *
811 * Determine a_data [length of data segment].
812 */
813 if (data_frag_root)
814 {
815 register relax_addressT slide;
816
817 know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
818
819 H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
820 data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
821 slide = H_GET_TEXT_SIZE (&headers); /* & in file of the data segment. */
822 #ifdef OBJ_BOUT
823 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
824 /* For b.out: If the data section has a strict alignment
825 requirement, its load address in the .o file will be
826 rounded up from the size of the text section. These
827 two values are *not* the same! Similarly for the bss
828 section.... */
829 slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
830 #endif
831
832 for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
833 {
834 fragP->fr_address += slide;
835 } /* for each data frag */
836
837 know (text_last_frag != 0);
838 text_last_frag->fr_next = data_frag_root;
839 }
840 else
841 {
842 H_SET_DATA_SIZE (&headers, 0);
843 }
844
845 #ifdef OBJ_BOUT
846 /* See above comments on b.out data section address. */
847 {
848 long bss_vma;
849 if (data_last_frag == 0)
850 bss_vma = H_GET_TEXT_SIZE (&headers);
851 else
852 bss_vma = data_last_frag->fr_address;
853 bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
854 bss_address_frag.fr_address = bss_vma;
855 }
856 #else /* ! OBJ_BOUT */
857 bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
858 H_GET_DATA_SIZE (&headers));
859
860
861 /* Slide all the frags */
862 if (bss_frag_root)
863 {
864 relax_addressT slide = bss_address_frag.fr_address;
865
866 for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
867 {
868 fragP->fr_address += slide;
869 } /* for each bss frag */
870 }
871
872 #endif /* ! OBJ_BOUT */
873
874 if (bss_last_frag)
875 H_SET_BSS_SIZE (&headers,
876 bss_last_frag->fr_address - bss_frag_root->fr_address);
877 else
878 H_SET_BSS_SIZE (&headers, 0);
879 }
880 #endif /* ! BFD_ASSEMBLER && ! BFD */
881
882 #if defined (BFD_ASSEMBLER) || !defined (BFD)
883
884 void
885 write_object_file ()
886 {
887 register struct frchain *frchainP; /* Track along all frchains. */
888 #if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
889 register fragS *fragP; /* Track along all frags. */
890 #endif
891 #if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
892 long object_file_size;
893 #endif
894
895 /* Do we really want to write it? */
896 {
897 int n_warns, n_errs;
898 n_warns = had_warnings ();
899 n_errs = had_errors ();
900 /* The -Z flag indicates that an object file should be generated,
901 regardless of warnings and errors. */
902 if (flagseen['Z'])
903 {
904 if (n_warns || n_errs)
905 as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
906 n_errs, n_errs == 1 ? "" : "s",
907 n_warns, n_warns == 1 ? "" : "s");
908 }
909 else
910 {
911 if (n_errs)
912 as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
913 n_errs, n_errs == 1 ? "" : "s",
914 n_warns, n_warns == 1 ? "" : "s");
915 }
916 }
917
918 #ifdef OBJ_VMS
919 /*
920 * Under VMS we try to be compatible with VAX-11 "C". Thus, we
921 * call a routine to check for the definition of the procedure
922 * "_main", and if so -- fix it up so that it can be program
923 * entry point.
924 */
925 VMS_Check_For_Main ();
926 #endif /* VMS */
927
928 /* After every sub-segment, we fake an ".align ...". This conforms to
929 BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
930 frag that requires least thought. ".align" frags like to have a
931 following frag since that makes calculating their intended length
932 trivial.
933
934 @@ Is this really necessary?? */
935 #ifndef SUB_SEGMENT_ALIGN
936 #ifdef BFD_ASSEMBLER
937 #define SUB_SEGMENT_ALIGN(SEG) (0)
938 #else
939 #define SUB_SEGMENT_ALIGN(SEG) (2)
940 #endif
941 #endif
942 for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
943 {
944 subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
945 frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
946 /* frag_align will have left a new frag.
947 Use this last frag for an empty ".fill".
948
949 For this segment ...
950 Create a last frag. Do not leave a "being filled in frag". */
951 frag_wane (frag_now);
952 frag_now->fr_fix = 0;
953 know (frag_now->fr_next == NULL);
954 }
955
956 /* From now on, we don't care about sub-segments. Build one frag chain
957 for each segment. Linked thru fr_next. */
958
959 #ifdef BFD_ASSEMBLER
960 /* Remove the sections created by gas for its own purposes. */
961 {
962 asection **seclist, *sec;
963 seclist = &stdoutput->sections;
964 while (seclist && *seclist)
965 {
966 sec = *seclist;
967 while (sec == reg_section || sec == expr_section)
968 {
969 sec = sec->next;
970 *seclist = sec;
971 stdoutput->section_count--;
972 if (!sec)
973 break;
974 }
975 if (*seclist)
976 seclist = &(*seclist)->next;
977 }
978 }
979
980 bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
981 #else
982 remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
983 remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
984 remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
985 #endif
986
987 /* We have two segments. If user gave -R flag, then we must put the
988 data frags into the text segment. Do this before relaxing so
989 we know to take advantage of -R and make shorter addresses. */
990 #if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
991 if (flagseen['R'])
992 {
993 merge_data_into_text ();
994 }
995 #endif
996
997 #ifdef BFD_ASSEMBLER
998 bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
999 #else
1000 relax_and_size_all_segments ();
1001 #endif /* BFD_ASSEMBLER */
1002
1003 #ifndef BFD_ASSEMBLER
1004 /*
1005 *
1006 * Crawl the symbol chain.
1007 *
1008 * For each symbol whose value depends on a frag, take the address of
1009 * that frag and subsume it into the value of the symbol.
1010 * After this, there is just one way to lookup a symbol value.
1011 * Values are left in their final state for object file emission.
1012 * We adjust the values of 'L' local symbols, even if we do
1013 * not intend to emit them to the object file, because their values
1014 * are needed for fix-ups.
1015 *
1016 * Unless we saw a -L flag, remove all symbols that begin with 'L'
1017 * from the symbol chain. (They are still pointed to by the fixes.)
1018 *
1019 * Count the remaining symbols.
1020 * Assign a symbol number to each symbol.
1021 * Count the number of string-table chars we will emit.
1022 * Put this info into the headers as appropriate.
1023 *
1024 */
1025 know (zero_address_frag.fr_address == 0);
1026 string_byte_count = sizeof (string_byte_count);
1027
1028 obj_crawl_symbol_chain (&headers);
1029
1030 if (string_byte_count == sizeof (string_byte_count))
1031 string_byte_count = 0;
1032
1033 H_SET_STRING_SIZE (&headers, string_byte_count);
1034
1035 /*
1036 * Addresses of frags now reflect addresses we use in the object file.
1037 * Symbol values are correct.
1038 * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1039 * Also converting any machine-dependent frags using md_convert_frag();
1040 */
1041 subseg_change (SEG_TEXT, 0);
1042
1043 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1044 {
1045 cvt_frag_to_fill (&headers, fragP);
1046
1047 /* Some assert macros don't work with # directives mixed in. */
1048 #ifndef NDEBUG
1049 if (!(fragP->fr_next == NULL
1050 #ifdef OBJ_BOUT
1051 || fragP->fr_next == data_frag_root
1052 #endif
1053 || ((fragP->fr_next->fr_address - fragP->fr_address)
1054 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1055 abort ();
1056 #endif
1057 }
1058 #endif /* ! BFD_ASSEMBLER */
1059
1060 #ifndef WORKING_DOT_WORD
1061 {
1062 struct broken_word *lie;
1063 struct broken_word **prevP;
1064
1065 prevP = &broken_words;
1066 for (lie = broken_words; lie; lie = lie->next_broken_word)
1067 if (!lie->added)
1068 {
1069 expressionS exp;
1070
1071 exp.X_op = O_subtract;
1072 exp.X_add_symbol = lie->add;
1073 exp.X_op_symbol = lie->sub;
1074 exp.X_add_number = lie->addnum;
1075 #ifdef BFD_ASSEMBLER
1076 fix_new_exp (lie->frag,
1077 lie->word_goes_here - lie->frag->fr_literal,
1078 2, &exp, 0, BFD_RELOC_NONE);
1079 #else
1080 #if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1081 fix_new_exp (lie->frag,
1082 lie->word_goes_here - lie->frag->fr_literal,
1083 2, &exp, 0, NO_RELOC);
1084 #else
1085 #ifdef TC_NS32K
1086 fix_new_ns32k_exp (lie->frag,
1087 lie->word_goes_here - lie->frag->fr_literal,
1088 2, &exp, 0, 0, 2, 0, 0);
1089 #else
1090 fix_new_exp (lie->frag,
1091 lie->word_goes_here - lie->frag->fr_literal,
1092 2, &exp, 0, 0);
1093 #endif /* TC_NS32K */
1094 #endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1095 #endif /* BFD_ASSEMBLER */
1096 *prevP = lie->next_broken_word;
1097 }
1098 else
1099 prevP = &(lie->next_broken_word);
1100
1101 for (lie = broken_words; lie;)
1102 {
1103 struct broken_word *untruth;
1104 char *table_ptr;
1105 addressT table_addr;
1106 addressT from_addr, to_addr;
1107 int n, m;
1108
1109 fragP = lie->dispfrag;
1110
1111 /* Find out how many broken_words go here. */
1112 n = 0;
1113 for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1114 if (untruth->added == 1)
1115 n++;
1116
1117 table_ptr = lie->dispfrag->fr_opcode;
1118 table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1119 /* Create the jump around the long jumps. This is a short
1120 jump from table_ptr+0 to table_ptr+n*long_jump_size. */
1121 from_addr = table_addr;
1122 to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1123 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1124 table_ptr += md_short_jump_size;
1125 table_addr += md_short_jump_size;
1126
1127 for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1128 {
1129 if (lie->added == 2)
1130 continue;
1131 /* Patch the jump table */
1132 /* This is the offset from ??? to table_ptr+0 */
1133 to_addr = table_addr - S_GET_VALUE (lie->sub);
1134 md_number_to_chars (lie->word_goes_here, to_addr, 2);
1135 for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1136 {
1137 if (untruth->use_jump == lie)
1138 md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1139 }
1140
1141 /* Install the long jump */
1142 /* this is a long jump from table_ptr+0 to the final target */
1143 from_addr = table_addr;
1144 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1145 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1146 table_ptr += md_long_jump_size;
1147 table_addr += md_long_jump_size;
1148 }
1149 }
1150 }
1151 #endif /* not WORKING_DOT_WORD */
1152
1153 #ifndef BFD_ASSEMBLER
1154 #ifndef OBJ_VMS
1155 { /* not vms */
1156 /*
1157 * Scan every FixS performing fixups. We had to wait until now to do
1158 * this because md_convert_frag() may have made some fixSs.
1159 */
1160 int trsize, drsize;
1161
1162 subseg_change (SEG_TEXT, 0);
1163 trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1164 subseg_change (SEG_DATA, 0);
1165 drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1166 H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1167
1168 /* FIXME move this stuff into the pre-write-hook */
1169 H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1170 H_SET_ENTRY_POINT (&headers, 0);
1171
1172 obj_pre_write_hook (&headers); /* extra coff stuff */
1173
1174 object_file_size = H_GET_FILE_SIZE (&headers);
1175 next_object_file_charP = the_object_file = xmalloc (object_file_size);
1176
1177 output_file_create (out_file_name);
1178
1179 obj_header_append (&next_object_file_charP, &headers);
1180
1181 know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1182
1183 /*
1184 * Emit code.
1185 */
1186 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1187 {
1188 register long count;
1189 register char *fill_literal;
1190 register long fill_size;
1191
1192 know (fragP->fr_type == rs_fill);
1193 append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1194 fill_literal = fragP->fr_literal + fragP->fr_fix;
1195 fill_size = fragP->fr_var;
1196 know (fragP->fr_offset >= 0);
1197
1198 for (count = fragP->fr_offset; count; count--)
1199 {
1200 append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1201 } /* for each */
1202
1203 } /* for each code frag. */
1204
1205 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1206
1207 /*
1208 * Emit relocations.
1209 */
1210 obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1211 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers)));
1212 #ifdef TC_I960
1213 /* Make addresses in data relocation directives relative to beginning of
1214 * first data fragment, not end of last text fragment: alignment of the
1215 * start of the data segment may place a gap between the segments.
1216 */
1217 obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1218 #else /* TC_I960 */
1219 obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1220 #endif /* TC_I960 */
1221
1222 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers)));
1223
1224 /*
1225 * Emit line number entries.
1226 */
1227 OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1228 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers)));
1229
1230 /*
1231 * Emit symbols.
1232 */
1233 obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1234 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers) + H_GET_TEXT_RELOCATION_SIZE (&headers) + H_GET_DATA_RELOCATION_SIZE (&headers) + H_GET_LINENO_SIZE (&headers) + H_GET_SYMBOL_TABLE_SIZE (&headers)));
1235
1236 /*
1237 * Emit strings.
1238 */
1239
1240 if (string_byte_count > 0)
1241 {
1242 obj_emit_strings (&next_object_file_charP);
1243 } /* only if we have a string table */
1244
1245 #ifdef BFD_HEADERS
1246 bfd_seek (stdoutput, 0, 0);
1247 bfd_write (the_object_file, 1, object_file_size, stdoutput);
1248 #else
1249
1250 /* Write the data to the file */
1251 output_file_append (the_object_file, object_file_size, out_file_name);
1252 #endif
1253
1254 output_file_close (out_file_name);
1255 } /* non vms output */
1256 #else /* VMS */
1257 /*
1258 * Now do the VMS-dependent part of writing the object file
1259 */
1260 VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1261 H_GET_DATA_SIZE (&headers),
1262 H_GET_BSS_SIZE (&headers),
1263 text_frag_root, data_frag_root);
1264 #endif /* VMS */
1265 #else /* BFD_ASSEMBLER */
1266
1267 #ifdef obj_check_file_symbols
1268 obj_check_file_symbols ();
1269 #endif
1270
1271 bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1272
1273 /* Set up symbol table, and write it out. */
1274 if (symbol_rootP)
1275 {
1276 unsigned int i = 0;
1277 unsigned int n;
1278 symbolS *symp;
1279
1280 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1281 {
1282 if (! symp->sy_resolved)
1283 {
1284 if (symp->sy_value.X_op == O_constant)
1285 {
1286 /* This is the normal case; skip the call. */
1287 S_SET_VALUE (symp,
1288 (S_GET_VALUE (symp)
1289 + symp->sy_frag->fr_address));
1290 symp->sy_resolved = 1;
1291 }
1292 else
1293 resolve_symbol_value (symp);
1294 }
1295
1296 /* So far, common symbols have been treated like undefined symbols.
1297 Put them in the common section now. */
1298 if (S_IS_DEFINED (symp) == 0
1299 && S_GET_VALUE (symp) != 0)
1300 S_SET_SEGMENT (symp, &bfd_com_section);
1301 #if 0
1302 printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1303 S_GET_NAME (symp), symp,
1304 S_GET_VALUE (symp),
1305 symp->bsym->flags,
1306 segment_name (symp->bsym->section));
1307 #endif
1308 if (! symp->sy_used_in_reloc)
1309 {
1310 #ifdef obj_frob_symbol
1311 {
1312 int punt = 0;
1313 obj_frob_symbol (symp, punt);
1314 if (punt)
1315 goto punt_it;
1316 }
1317 #endif
1318 #ifdef tc_frob_symbol
1319 {
1320 int punt = 0;
1321 tc_frob_symbol (symp, punt);
1322 if (punt)
1323 goto punt_it;
1324 }
1325 #endif
1326 }
1327
1328 /* If we don't want to keep this symbol, splice it out of the
1329 chain now. */
1330 if (! symp->sy_used_in_reloc
1331 && S_IS_LOCAL (symp))
1332 {
1333 symbolS *prev, *next;
1334 #if defined (obj_frob_symbol) || defined (tc_frob_symbol)
1335 punt_it:
1336 #endif
1337 prev = symbol_previous (symp);
1338 next = symbol_next (symp);
1339 #ifdef DEBUG_SYMS
1340 verify_symbol_chain_2 (symp);
1341 #endif
1342 if (prev)
1343 {
1344 symbol_next (prev) = next;
1345 symp = prev;
1346 }
1347 else if (symp == symbol_rootP)
1348 symbol_rootP = next;
1349 else
1350 abort ();
1351 if (next)
1352 symbol_previous (next) = prev;
1353 else
1354 symbol_lastP = prev;
1355 #ifdef DEBUG_SYMS
1356 if (prev)
1357 verify_symbol_chain_2 (prev);
1358 else if (next)
1359 verify_symbol_chain_2 (next);
1360 #endif
1361 continue;
1362 }
1363
1364 /* Make sure we really got a value for the symbol. */
1365 if (! symp->sy_resolved)
1366 {
1367 as_bad ("can't resolve value for symbol \"%s\"",
1368 S_GET_NAME (symp));
1369 symp->sy_resolved = 1;
1370 }
1371
1372 /* Set the value into the BFD symbol. Up til now the value
1373 has only been kept in the gas symbolS struct. */
1374 symp->bsym->value = S_GET_VALUE (symp);
1375
1376 i++;
1377 }
1378 n = i;
1379 if (n)
1380 {
1381 asymbol **asympp;
1382 boolean result;
1383 extern PTR bfd_alloc PARAMS ((bfd *, size_t));
1384
1385 asympp = (asymbol **) bfd_alloc (stdoutput,
1386 n * sizeof (asymbol *));
1387 symp = symbol_rootP;
1388 for (i = 0; i < n; i++, symp = symbol_next (symp))
1389 {
1390 asympp[i] = symp->bsym;
1391 symp->written = 1;
1392 }
1393 result = bfd_set_symtab (stdoutput, asympp, n);
1394 assert (result == true);
1395 }
1396 }
1397
1398
1399 #ifdef obj_frob_file
1400 /* If obj_frob_file changes the symbol value at this point, it is
1401 responsible for moving the changed value into symp->bsym->value
1402 as well. Hopefully all symbol value changing can be done in
1403 {obj,tc}_frob_symbol. */
1404 obj_frob_file ();
1405 #endif
1406
1407 /* Now that all the sizes are known, and contents correct, we can
1408 start writing the file. */
1409 bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1410
1411 bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1412
1413 output_file_close (out_file_name);
1414 #endif /* BFD_ASSEMBLER */
1415 }
1416 #endif /* ! BFD */
1417
1418 /*
1419 * relax_segment()
1420 *
1421 * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1422 * values.
1423 *
1424 * Relax the frags.
1425 *
1426 * After this, all frags in this segment have addresses that are correct
1427 * within the segment. Since segments live in different file addresses,
1428 * these frag addresses may not be the same as final object-file addresses.
1429 */
1430
1431 /* Subroutines of relax_segment. */
1432 static int
1433 is_dnrange (f1, f2)
1434 struct frag *f1;
1435 struct frag *f2;
1436 {
1437 for (; f1; f1 = f1->fr_next)
1438 if (f1->fr_next == f2)
1439 return 1;
1440 return 0;
1441 }
1442
1443 /* Relax_align. Advance location counter to next address that has 'alignment'
1444 lowest order bits all 0s, return size of adjustment made. */
1445 static relax_addressT
1446 relax_align (address, alignment)
1447 register relax_addressT address; /* Address now. */
1448 register int alignment; /* Alignment (binary). */
1449 {
1450 relax_addressT mask;
1451 relax_addressT new_address;
1452
1453 mask = ~((~0) << alignment);
1454 new_address = (address + mask) & (~mask);
1455 if (linkrelax)
1456 /* We must provide lots of padding, so the linker can discard it
1457 when needed. The linker will not add extra space, ever. */
1458 new_address += (1 << alignment);
1459 return (new_address - address);
1460 }
1461
1462 void
1463 relax_segment (segment_frag_root, segment)
1464 struct frag *segment_frag_root;
1465 segT segment;
1466 {
1467 register struct frag *fragP;
1468 register relax_addressT address;
1469 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1470 know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
1471 #endif
1472 /* In case md_estimate_size_before_relax() wants to make fixSs. */
1473 subseg_change (segment, 0);
1474
1475 /* For each frag in segment: count and store (a 1st guess of)
1476 fr_address. */
1477 address = 0;
1478 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1479 {
1480 fragP->fr_address = address;
1481 address += fragP->fr_fix;
1482
1483 switch (fragP->fr_type)
1484 {
1485 case rs_fill:
1486 address += fragP->fr_offset * fragP->fr_var;
1487 break;
1488
1489 case rs_align:
1490 address += relax_align (address, (int) fragP->fr_offset);
1491 break;
1492
1493 case rs_org:
1494 /* Assume .org is nugatory. It will grow with 1st relax. */
1495 break;
1496
1497 case rs_machine_dependent:
1498 address += md_estimate_size_before_relax (fragP, segment);
1499 break;
1500
1501 #ifndef WORKING_DOT_WORD
1502 /* Broken words don't concern us yet */
1503 case rs_broken_word:
1504 break;
1505 #endif
1506
1507 default:
1508 BAD_CASE (fragP->fr_type);
1509 break;
1510 } /* switch(fr_type) */
1511 } /* for each frag in the segment */
1512
1513 /* Do relax(). */
1514 {
1515 long stretch; /* May be any size, 0 or negative. */
1516 /* Cumulative number of addresses we have */
1517 /* relaxed this pass. */
1518 /* We may have relaxed more than one address. */
1519 long stretched; /* Have we stretched on this pass? */
1520 /* This is 'cuz stretch may be zero, when, in fact some piece of code
1521 grew, and another shrank. If a branch instruction doesn't fit anymore,
1522 we could be scrod. */
1523
1524 do
1525 {
1526 stretch = stretched = 0;
1527 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1528 {
1529 long growth = 0;
1530 unsigned long was_address;
1531 long offset;
1532 symbolS *symbolP;
1533 long target;
1534 long after;
1535
1536 was_address = fragP->fr_address;
1537 address = fragP->fr_address += stretch;
1538 symbolP = fragP->fr_symbol;
1539 offset = fragP->fr_offset;
1540
1541 switch (fragP->fr_type)
1542 {
1543 case rs_fill: /* .fill never relaxes. */
1544 growth = 0;
1545 break;
1546
1547 #ifndef WORKING_DOT_WORD
1548 /* JF: This is RMS's idea. I do *NOT* want to be blamed
1549 for it I do not want to write it. I do not want to have
1550 anything to do with it. This is not the proper way to
1551 implement this misfeature. */
1552 case rs_broken_word:
1553 {
1554 struct broken_word *lie;
1555 struct broken_word *untruth;
1556
1557 /* Yes this is ugly (storing the broken_word pointer
1558 in the symbol slot). Still, this whole chunk of
1559 code is ugly, and I don't feel like doing anything
1560 about it. Think of it as stubbornness in action. */
1561 growth = 0;
1562 for (lie = (struct broken_word *) (fragP->fr_symbol);
1563 lie && lie->dispfrag == fragP;
1564 lie = lie->next_broken_word)
1565 {
1566
1567 if (lie->added)
1568 continue;
1569
1570 offset = (lie->add->sy_frag->fr_address
1571 + S_GET_VALUE (lie->add)
1572 + lie->addnum
1573 - (lie->sub->sy_frag->fr_address
1574 + S_GET_VALUE (lie->sub)));
1575 if (offset <= -32768 || offset >= 32767)
1576 {
1577 if (flagseen['K'])
1578 {
1579 char buf[50];
1580 sprint_value (buf, (addressT) lie->addnum);
1581 as_warn (".word %s-%s+%s didn't fit",
1582 S_GET_NAME (lie->add),
1583 S_GET_NAME (lie->sub),
1584 buf);
1585 }
1586 lie->added = 1;
1587 if (fragP->fr_subtype == 0)
1588 {
1589 fragP->fr_subtype++;
1590 growth += md_short_jump_size;
1591 }
1592 for (untruth = lie->next_broken_word;
1593 untruth && untruth->dispfrag == lie->dispfrag;
1594 untruth = untruth->next_broken_word)
1595 if ((untruth->add->sy_frag == lie->add->sy_frag)
1596 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
1597 {
1598 untruth->added = 2;
1599 untruth->use_jump = lie;
1600 }
1601 growth += md_long_jump_size;
1602 }
1603 }
1604
1605 break;
1606 } /* case rs_broken_word */
1607 #endif
1608 case rs_align:
1609 growth = (relax_align ((relax_addressT) (address
1610 + fragP->fr_fix),
1611 (int) offset)
1612 - relax_align ((relax_addressT) (was_address
1613 + fragP->fr_fix),
1614 (int) offset));
1615 break;
1616
1617 case rs_org:
1618 target = offset;
1619
1620 if (symbolP)
1621 {
1622 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1623 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1624 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1625 || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
1626 || S_GET_SEGMENT (symbolP) == SEG_BSS);
1627 know (symbolP->sy_frag);
1628 know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1629 || (symbolP->sy_frag == &zero_address_frag));
1630 #endif
1631 target += S_GET_VALUE (symbolP)
1632 + symbolP->sy_frag->fr_address;
1633 } /* if we have a symbol */
1634
1635 know (fragP->fr_next);
1636 after = fragP->fr_next->fr_address;
1637 growth = ((target - after) > 0) ? (target - after) : 0;
1638 /* Growth may be negative, but variable part of frag
1639 cannot have fewer than 0 chars. That is, we can't
1640 .org backwards. */
1641
1642 growth -= stretch; /* This is an absolute growth factor */
1643 break;
1644
1645 case rs_machine_dependent:
1646 {
1647 const relax_typeS *this_type;
1648 const relax_typeS *start_type;
1649 relax_substateT next_state;
1650 relax_substateT this_state;
1651 long aim;
1652
1653 this_state = fragP->fr_subtype;
1654 start_type = this_type = md_relax_table + this_state;
1655 target = offset;
1656
1657 if (symbolP)
1658 {
1659 #ifndef DIFF_EXPR_OK
1660 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1661 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1662 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1663 || (S_GET_SEGMENT (symbolP) == SEG_BSS)
1664 || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
1665 #endif
1666 know (symbolP->sy_frag);
1667 #endif
1668 know (!(S_GET_SEGMENT (symbolP) == absolute_section)
1669 || symbolP->sy_frag == &zero_address_frag);
1670 target +=
1671 S_GET_VALUE (symbolP)
1672 + symbolP->sy_frag->fr_address;
1673
1674 /* If frag has yet to be reached on this pass,
1675 assume it will move by STRETCH just as we did.
1676 If this is not so, it will be because some frag
1677 between grows, and that will force another pass.
1678
1679 Beware zero-length frags.
1680
1681 There should be a faster way to do this. */
1682
1683 if (symbolP->sy_frag->fr_address >= was_address
1684 && is_dnrange (fragP, symbolP->sy_frag))
1685 {
1686 target += stretch;
1687 }
1688 }
1689
1690 aim = target - address - fragP->fr_fix;
1691 /* The displacement is affected by the instruction size
1692 for the 32k architecture. I think we ought to be able
1693 to add fragP->fr_pcrel_adjust in all cases (it should be
1694 zero if not used), but just in case it breaks something
1695 else we'll put this inside #ifdef NS32K ... #endif */
1696 #ifndef TC_NS32K
1697 if (fragP->fr_pcrel_adjust)
1698 abort ();
1699 #endif
1700 aim += fragP->fr_pcrel_adjust;
1701
1702 if (aim < 0)
1703 {
1704 /* Look backwards. */
1705 for (next_state = this_type->rlx_more; next_state;)
1706 if (aim >= this_type->rlx_backward)
1707 next_state = 0;
1708 else
1709 {
1710 /* Grow to next state. */
1711 this_state = next_state;
1712 this_type = md_relax_table + this_state;
1713 next_state = this_type->rlx_more;
1714 }
1715 }
1716 else
1717 {
1718 #ifdef M68K_AIM_KLUDGE
1719 M68K_AIM_KLUDGE (aim, this_state, this_type);
1720 #endif
1721 /* Look forwards. */
1722 for (next_state = this_type->rlx_more; next_state;)
1723 if (aim <= this_type->rlx_forward)
1724 next_state = 0;
1725 else
1726 {
1727 /* Grow to next state. */
1728 this_state = next_state;
1729 this_type = md_relax_table + this_state;
1730 next_state = this_type->rlx_more;
1731 }
1732 }
1733
1734 growth = this_type->rlx_length - start_type->rlx_length;
1735 if (growth != 0)
1736 fragP->fr_subtype = this_state;
1737 }
1738 break;
1739
1740 default:
1741 BAD_CASE (fragP->fr_type);
1742 break;
1743 }
1744 if (growth)
1745 {
1746 stretch += growth;
1747 stretched++;
1748 }
1749 } /* For each frag in the segment. */
1750 }
1751 while (stretched); /* Until nothing further to relax. */
1752 } /* do_relax */
1753
1754 /*
1755 * We now have valid fr_address'es for each frag.
1756 */
1757
1758 /*
1759 * All fr_address's are correct, relative to their own segment.
1760 * We have made all the fixS we will ever make.
1761 */
1762 } /* relax_segment() */
1763
1764 #if defined (BFD_ASSEMBLER) || !defined (BFD)
1765
1766 /* fixup_segment()
1767
1768 Go through all the fixS's in a segment and see which ones can be
1769 handled now. (These consist of fixS where we have since discovered
1770 the value of a symbol, or the address of the frag involved.)
1771 For each one, call md_apply_fix to put the fix into the frag data.
1772
1773 Result is a count of how many relocation structs will be needed to
1774 handle the remaining fixS's that we couldn't completely handle here.
1775 These will be output later by emit_relocations(). */
1776
1777 static long
1778 fixup_segment (fixP, this_segment_type)
1779 register fixS *fixP;
1780 segT this_segment_type; /* N_TYPE bits for segment. */
1781 {
1782 register long seg_reloc_count;
1783 register symbolS *add_symbolP;
1784 register symbolS *sub_symbolP;
1785 valueT add_number;
1786 register int size;
1787 register char *place;
1788 register long where;
1789 register char pcrel;
1790 register fragS *fragP;
1791 register segT add_symbol_segment = absolute_section;
1792
1793 seg_reloc_count = 0;
1794 /* If the linker is doing the relaxing, we must not do any fixups. */
1795 /* Well, strictly speaking that's not true -- we could do any that
1796 are PC-relative and don't cross regions that could change size.
1797 And for the i960 (the only machine for which we've got a relaxing
1798 linker right now), we might be able to turn callx/callj into bal
1799 in cases where we know the maximum displacement. */
1800 if (linkrelax)
1801 for (; fixP; fixP = fixP->fx_next)
1802 seg_reloc_count++;
1803 else
1804 for (; fixP; fixP = fixP->fx_next)
1805 {
1806 fragP = fixP->fx_frag;
1807 know (fragP);
1808 where = fixP->fx_where;
1809 place = fragP->fr_literal + where;
1810 size = fixP->fx_size;
1811 add_symbolP = fixP->fx_addsy;
1812 #ifdef TC_I960
1813 if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1814 {
1815 /* Relocation should be done via the associated 'bal'
1816 entry point symbol. */
1817
1818 if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1819 {
1820 as_bad ("No 'bal' entry point for leafproc %s",
1821 S_GET_NAME (add_symbolP));
1822 continue;
1823 }
1824 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
1825 }
1826 #endif
1827 sub_symbolP = fixP->fx_subsy;
1828 add_number = fixP->fx_offset;
1829 pcrel = fixP->fx_pcrel;
1830
1831 if (add_symbolP)
1832 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1833
1834 if (sub_symbolP)
1835 {
1836 if (!add_symbolP)
1837 {
1838 /* Its just -sym */
1839 /* @@ Should try converting to pcrel ref to fixed addr. */
1840 if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
1841 as_bad ("Negative of non-absolute symbol %s",
1842 S_GET_NAME (sub_symbolP));
1843
1844 add_number -= S_GET_VALUE (sub_symbolP);
1845 }
1846 else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1847 && (SEG_NORMAL (add_symbol_segment)
1848 || (add_symbol_segment == absolute_section)))
1849 {
1850 /* Difference of 2 symbols from same segment.
1851 Can't make difference of 2 undefineds: 'value' means
1852 something different for N_UNDF. */
1853 #ifdef TC_I960
1854 /* Makes no sense to use the difference of 2 arbitrary symbols
1855 as the target of a call instruction. */
1856 if (fixP->fx_callj)
1857 {
1858 as_bad ("callj to difference of 2 symbols");
1859 }
1860 #endif /* TC_I960 */
1861 add_number += S_GET_VALUE (add_symbolP) -
1862 S_GET_VALUE (sub_symbolP);
1863
1864 add_symbolP = NULL;
1865 fixP->fx_addsy = NULL;
1866 }
1867 else
1868 {
1869 /* Different segments in subtraction. */
1870 know (!(S_IS_EXTERNAL (sub_symbolP)
1871 && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
1872
1873 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
1874 {
1875 add_number -= S_GET_VALUE (sub_symbolP);
1876 }
1877 #ifdef DIFF_EXPR_OK
1878 else if (!pcrel
1879 && S_GET_SEGMENT (sub_symbolP) == this_segment_type)
1880 {
1881 /* Make it pc-relative. */
1882 add_number += (md_pcrel_from (fixP)
1883 - S_GET_VALUE (sub_symbolP));
1884 pcrel = 1;
1885 fixP->fx_pcrel = 1;
1886 sub_symbolP = 0;
1887 fixP->fx_subsy = 0;
1888 }
1889 #endif
1890 else
1891 {
1892 char buf[50];
1893 sprint_value (buf, fragP->fr_address + where);
1894 as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
1895 segment_name (S_GET_SEGMENT (sub_symbolP)),
1896 S_GET_NAME (sub_symbolP), buf);
1897 }
1898 }
1899 }
1900
1901 if (add_symbolP)
1902 {
1903 if (add_symbol_segment == this_segment_type && pcrel)
1904 {
1905 /*
1906 * This fixup was made when the symbol's segment was
1907 * SEG_UNKNOWN, but it is now in the local segment.
1908 * So we know how to do the address without relocation.
1909 */
1910 #ifdef TC_I960
1911 /* reloc_callj() may replace a 'call' with a 'calls' or a
1912 'bal', in which cases it modifies *fixP as appropriate.
1913 In the case of a 'calls', no further work is required,
1914 and *fixP has been set up to make the rest of the code
1915 below a no-op. */
1916 reloc_callj (fixP);
1917 #endif /* TC_I960 */
1918
1919 add_number += S_GET_VALUE (add_symbolP);
1920 add_number -= md_pcrel_from (fixP);
1921 pcrel = 0; /* Lie. Don't want further pcrel processing. */
1922 fixP->fx_addsy = NULL; /* No relocations please. */
1923 }
1924 else
1925 {
1926 if (add_symbol_segment == absolute_section)
1927 {
1928 #ifdef TC_I960
1929 /* See comment about reloc_callj() above. */
1930 reloc_callj (fixP);
1931 #endif /* TC_I960 */
1932 add_number += S_GET_VALUE (add_symbolP);
1933 fixP->fx_addsy = NULL;
1934 add_symbolP = NULL;
1935 }
1936 else if (add_symbol_segment == undefined_section
1937 #ifdef BFD_ASSEMBLER
1938 || bfd_is_com_section (add_symbol_segment)
1939 #endif
1940 )
1941 {
1942 #ifdef TC_I960
1943 if ((int) fixP->fx_bit_fixP == 13)
1944 {
1945 /* This is a COBR instruction. They have only a
1946 * 13-bit displacement and are only to be used
1947 * for local branches: flag as error, don't generate
1948 * relocation.
1949 */
1950 as_bad ("can't use COBR format with external label");
1951 fixP->fx_addsy = NULL; /* No relocations please. */
1952 continue;
1953 } /* COBR */
1954 #endif /* TC_I960 */
1955
1956 #ifdef OBJ_COFF
1957 #ifdef TE_I386AIX
1958 if (S_IS_COMMON (add_symbolP))
1959 add_number += S_GET_VALUE (add_symbolP);
1960 #endif /* TE_I386AIX */
1961 #endif /* OBJ_COFF */
1962 ++seg_reloc_count;
1963 }
1964 else
1965 {
1966 seg_reloc_count++;
1967 add_number += S_GET_VALUE (add_symbolP);
1968 }
1969 } /* if not in local seg */
1970 } /* if there was a + symbol */
1971
1972 if (pcrel)
1973 {
1974 add_number -= md_pcrel_from (fixP);
1975 if (add_symbolP == 0)
1976 {
1977 fixP->fx_addsy = &abs_symbol;
1978 ++seg_reloc_count;
1979 } /* if there's an add_symbol */
1980 } /* if pcrel */
1981
1982 if (!fixP->fx_bit_fixP)
1983 {
1984 valueT mask = 0;
1985 /* set all bits to one */
1986 mask--;
1987 /* Technically speaking, combining these produces an
1988 undefined result if size is sizeof (valueT), though I
1989 think these two half-way operations should both be
1990 defined. */
1991 mask <<= size * 4;
1992 mask <<= size * 4;
1993 if ((add_number & mask) != 0
1994 && (add_number & mask) != mask)
1995 {
1996 char buf[50];
1997 sprint_value (buf, fragP->fr_address + where);
1998 as_bad ("Value of %ld too large for field of %d bytes at %s",
1999 (long) add_number, size, buf);
2000 } /* generic error checking */
2001 #ifdef WARN_SIGNED_OVERFLOW_WORD
2002 /* Warn if a .word value is too large when treated as a signed
2003 number. We already know it is not too negative. This is to
2004 catch over-large switches generated by gcc on the 68k. */
2005 if (!flagseen['J']
2006 && size == 2
2007 && add_number > 0x7fff)
2008 as_bad ("Signed .word overflow; switch may be too large; %ld at 0x%lx",
2009 (long) add_number,
2010 (unsigned long) (fragP->fr_address + where));
2011 #endif
2012 } /* not a bit fix */
2013
2014 #ifdef BFD_ASSEMBLER
2015 md_apply_fix (fixP, &add_number);
2016 #else
2017 md_apply_fix (fixP, add_number);
2018 #endif
2019 } /* For each fixS in this segment. */
2020
2021 #if defined (OBJ_COFF) && defined (TC_I960)
2022 {
2023 fixS *topP = fixP;
2024
2025 /* two relocs per callj under coff. */
2026 for (fixP = topP; fixP; fixP = fixP->fx_next)
2027 if (fixP->fx_callj && fixP->fx_addsy != 0)
2028 ++seg_reloc_count;
2029 }
2030 #endif /* OBJ_COFF && TC_I960 */
2031
2032 return (seg_reloc_count);
2033 }
2034
2035 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
2036
2037 /* end of write.c */
This page took 0.070174 seconds and 4 git commands to generate.