* config/tc-sparc.h: Removed remaining non-BFD_ASSEMBLER code.
[deliverable/binutils-gdb.git] / gas / write.c
... / ...
CommitLineData
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
34extern CONST int md_short_jump_size;
35extern CONST int md_long_jump_size;
36#endif
37
38#ifndef BFD_ASSEMBLER
39
40#ifndef MANY_SEGMENTS
41struct frag *text_frag_root;
42struct frag *data_frag_root;
43struct frag *bss_frag_root;
44
45struct frag *text_last_frag; /* Last frag in segment. */
46struct frag *data_last_frag; /* Last frag in segment. */
47static struct frag *bss_last_frag; /* Last frag in segment. */
48#endif
49
50#if ! defined (BFD_ASSEMBLER) && ! defined (BFD)
51static object_headers headers;
52static char *the_object_file;
53#endif
54
55long string_byte_count;
56char *next_object_file_charP; /* Tracks object file bytes. */
57
58#ifndef OBJ_VMS
59int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
60#endif
61
62#endif /* BFD_ASSEMBLER */
63
64#ifdef BFD_ASSEMBLER
65static 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
70static 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)
76static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
77#endif
78static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
79
80/*
81 * fix_new()
82 *
83 * Create a fixS in obstack 'notes'.
84 */
85static fixS *
86fix_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
163fixS *
164fix_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
185fixS *
186fix_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. */
231void
232append (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
246int 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 */
255void
256record_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
274static fragS *
275chain_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
293static void
294chain_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
312void
313remove_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
328static void
329cvt_frag_to_fill (sec, fragP)
330 segT sec;
331 fragS *fragP;
332#else
333static void
334cvt_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
403static void
404relax_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
469static void
470dump_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
499static void
500adjust_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
548 /* Is there some other (target cpu dependent) reason we can't adjust
549 this one? (E.g. relocations involving function addresses on
550 the PA. */
551#ifdef tc_fix_adjustable
552 if (! tc_fix_adjustable (fixp))
553 continue;
554#endif
555
556 /* If the section symbol isn't going to be output, the relocs
557 at least should still work. If not, figure out what to do
558 when we run into that case. */
559 fixp->fx_offset += S_GET_VALUE (sym);
560 if (sym->sy_frag)
561 fixp->fx_offset += sym->sy_frag->fr_address;
562 if (symseginfo->sym)
563 fixp->fx_addsy = symseginfo->sym;
564 else
565 {
566 fixp->fx_addsy = symbol_find (symsec->name);
567 if (!fixp->fx_addsy)
568 {
569 fixp->fx_addsy = symbol_make (symsec->name);
570 fixp->fx_addsy->bsym = symsec->symbol;
571 }
572 symseginfo->sym = fixp->fx_addsy;
573 }
574 fixp->fx_addsy->sy_used_in_reloc = 1;
575 }
576
577 dump_section_relocs (abfd, sec, stderr);
578}
579
580static void
581write_relocs (abfd, sec, xxx)
582 bfd *abfd;
583 asection *sec;
584 char *xxx;
585{
586 segment_info_type *seginfo = seg_info (sec);
587 int i;
588 unsigned int n;
589 arelent **relocs;
590 fixS *fixp;
591
592 /* If seginfo is NULL, we did not create this section; don't do
593 anything with it. */
594 if (seginfo == NULL)
595 return;
596
597 fixup_segment (seginfo->fix_root, sec);
598
599 n = 0;
600 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
601 n++;
602
603#ifndef RELOC_EXPANSION_POSSIBLE
604 /* Set up reloc information as well. */
605 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
606 n * sizeof (arelent *));
607 memset ((char*)relocs, 0, n * sizeof (arelent*));
608
609 i = 0;
610 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
611 {
612 arelent *reloc;
613 char *data;
614 bfd_reloc_status_type s;
615
616 if (fixp->fx_addsy == 0)
617 {
618 /* @@ Need some other flag to indicate which have already
619 been performed... */
620 n--;
621 continue;
622 }
623 reloc = tc_gen_reloc (sec, fixp);
624 if (!reloc)
625 {
626 n--;
627 continue;
628 }
629 data = fixp->fx_frag->fr_literal + fixp->fx_where;
630 /* @@ Assumes max size of reloc is 4. */
631 if (fixp->fx_where + 4
632 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
633 abort ();
634 /* Pass bogus address so that when bfd_perform_relocation adds
635 `address' back in, it'll come up with `data', which is where
636 we want it to operate. */
637 s = bfd_perform_relocation (stdoutput, reloc, data - reloc->address,
638 sec, stdoutput);
639 switch (s)
640 {
641 case bfd_reloc_ok:
642 break;
643 default:
644 as_fatal ("bad return from bfd_perform_relocation");
645 }
646 relocs[i++] = reloc;
647 }
648#else
649 n = n * MAX_RELOC_EXPANSION;
650 /* Set up reloc information as well. */
651 relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
652 n * sizeof (arelent *));
653
654 i = 0;
655 for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
656 {
657 arelent **reloc;
658 char *data;
659 bfd_reloc_status_type s;
660 int j;
661
662 if (fixp->fx_addsy == 0)
663 {
664 /* @@ Need some other flag to indicate which have already
665 been performed... */
666 n--;
667 continue;
668 }
669 reloc = tc_gen_reloc (sec, fixp);
670
671 for (j = 0; reloc[j]; j++)
672 {
673 relocs[i++] = reloc[j];
674 assert(i <= n);
675 }
676 data = fixp->fx_frag->fr_literal + fixp->fx_where;
677 if (fixp->fx_where + 4
678 > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
679 abort ();
680 for (j = 0; reloc[j]; j++)
681 {
682 s = bfd_perform_relocation (stdoutput, reloc[j], data - reloc[j]->address,
683 sec, stdoutput);
684 switch (s)
685 {
686 case bfd_reloc_ok:
687 break;
688 default:
689 as_fatal ("bad return from bfd_perform_relocation");
690 }
691 }
692 }
693 n = i;
694#endif
695
696 if (n)
697 bfd_set_reloc (stdoutput, sec, relocs, n);
698 else
699 bfd_set_section_flags (abfd, sec,
700 (bfd_get_section_flags (abfd, sec)
701 & (flagword) ~SEC_RELOC));
702#ifdef DEBUG2
703 {
704 int i;
705 arelent *r;
706 asymbol *s;
707 fprintf (stderr, "relocs for sec %s\n", sec->name);
708 for (i = 0; i < n; i++)
709 {
710 r = relocs[i];
711 s = *r->sym_ptr_ptr;
712 fprintf (stderr, " reloc %2d @%08x off %4x : sym %-10s addend %x\n",
713 i, r, r->address, s->name, r->addend);
714 }
715 }
716#endif
717}
718
719static void
720write_contents (abfd, sec, xxx)
721 bfd *abfd;
722 asection *sec;
723 char *xxx;
724{
725 segment_info_type *seginfo = seg_info (sec);
726 unsigned long offset = 0;
727 fragS *f;
728
729 /* Write out the frags. */
730 if (seginfo == NULL
731 || ! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
732 return;
733
734 for (f = seginfo->frchainP->frch_root;
735 f;
736 f = f->fr_next)
737 {
738 int x;
739 unsigned long fill_size;
740 char *fill_literal;
741 long count;
742
743 assert (f->fr_type == rs_fill);
744 if (f->fr_fix)
745 {
746 x = bfd_set_section_contents (stdoutput, sec,
747 f->fr_literal, (file_ptr) offset,
748 (bfd_size_type) f->fr_fix);
749 assert (x == true);
750 offset += f->fr_fix;
751 }
752 fill_literal = f->fr_literal + f->fr_fix;
753 fill_size = f->fr_var;
754 count = f->fr_offset;
755 assert (count >= 0);
756 if (fill_size && count)
757 while (count--)
758 {
759 x = bfd_set_section_contents (stdoutput, sec,
760 fill_literal, (file_ptr) offset,
761 (bfd_size_type) fill_size);
762 assert (x == true);
763 offset += fill_size;
764 }
765 }
766}
767#endif
768
769#if defined(BFD_ASSEMBLER) || (!defined (BFD) && !defined(OBJ_AOUT))
770static void
771merge_data_into_text ()
772{
773#if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
774 seg_info (text_section)->frchainP->frch_last->fr_next =
775 seg_info (data_section)->frchainP->frch_root;
776 seg_info (text_section)->frchainP->frch_last =
777 seg_info (data_section)->frchainP->frch_last;
778 seg_info (data_section)->frchainP = 0;
779#else
780 fixS *tmp;
781
782 text_last_frag->fr_next = data_frag_root;
783 text_last_frag = data_last_frag;
784 data_last_frag = NULL;
785 data_frag_root = NULL;
786 if (text_fix_root)
787 {
788 for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
789 tmp->fx_next = data_fix_root;
790 text_fix_tail = data_fix_tail;
791 }
792 else
793 text_fix_root = data_fix_root;
794 data_fix_root = NULL;
795#endif
796}
797#endif /* BFD_ASSEMBLER || (! BFD && ! OBJ_AOUT) */
798
799#if !defined (BFD_ASSEMBLER) && !defined (BFD)
800static void
801relax_and_size_all_segments ()
802{
803 fragS *fragP;
804
805 relax_segment (text_frag_root, SEG_TEXT);
806 relax_segment (data_frag_root, SEG_DATA);
807 relax_segment (bss_frag_root, SEG_BSS);
808 /*
809 * Now the addresses of frags are correct within the segment.
810 */
811
812 know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
813 H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
814 text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
815
816 /*
817 * Join the 2 segments into 1 huge segment.
818 * To do this, re-compute every rn_address in the SEG_DATA frags.
819 * Then join the data frags after the text frags.
820 *
821 * Determine a_data [length of data segment].
822 */
823 if (data_frag_root)
824 {
825 register relax_addressT slide;
826
827 know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
828
829 H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
830 data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
831 slide = H_GET_TEXT_SIZE (&headers); /* & in file of the data segment. */
832#ifdef OBJ_BOUT
833#define RoundUp(N,S) (((N)+(S)-1)&-(S))
834 /* For b.out: If the data section has a strict alignment
835 requirement, its load address in the .o file will be
836 rounded up from the size of the text section. These
837 two values are *not* the same! Similarly for the bss
838 section.... */
839 slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
840#endif
841
842 for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
843 {
844 fragP->fr_address += slide;
845 } /* for each data frag */
846
847 know (text_last_frag != 0);
848 text_last_frag->fr_next = data_frag_root;
849 }
850 else
851 {
852 H_SET_DATA_SIZE (&headers, 0);
853 }
854
855#ifdef OBJ_BOUT
856 /* See above comments on b.out data section address. */
857 {
858 long bss_vma;
859 if (data_last_frag == 0)
860 bss_vma = H_GET_TEXT_SIZE (&headers);
861 else
862 bss_vma = data_last_frag->fr_address;
863 bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
864 bss_address_frag.fr_address = bss_vma;
865 }
866#else /* ! OBJ_BOUT */
867 bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
868 H_GET_DATA_SIZE (&headers));
869
870#endif /* ! OBJ_BOUT */
871
872 /* Slide all the frags */
873 if (bss_frag_root)
874 {
875 relax_addressT slide = bss_address_frag.fr_address;
876
877 for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
878 {
879 fragP->fr_address += slide;
880 } /* for each bss frag */
881 }
882
883 if (bss_last_frag)
884 H_SET_BSS_SIZE (&headers,
885 bss_last_frag->fr_address - bss_frag_root->fr_address);
886 else
887 H_SET_BSS_SIZE (&headers, 0);
888}
889#endif /* ! BFD_ASSEMBLER && ! BFD */
890
891#if defined (BFD_ASSEMBLER) || !defined (BFD)
892
893void
894write_object_file ()
895{
896 register struct frchain *frchainP; /* Track along all frchains. */
897#if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
898 register fragS *fragP; /* Track along all frags. */
899#endif
900#if !defined (BFD_ASSEMBLER) && !defined (OBJ_VMS)
901 long object_file_size;
902#endif
903
904 /* Do we really want to write it? */
905 {
906 int n_warns, n_errs;
907 n_warns = had_warnings ();
908 n_errs = had_errors ();
909 /* The -Z flag indicates that an object file should be generated,
910 regardless of warnings and errors. */
911 if (flagseen['Z'])
912 {
913 if (n_warns || n_errs)
914 as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
915 n_errs, n_errs == 1 ? "" : "s",
916 n_warns, n_warns == 1 ? "" : "s");
917 }
918 else
919 {
920 if (n_errs)
921 as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
922 n_errs, n_errs == 1 ? "" : "s",
923 n_warns, n_warns == 1 ? "" : "s");
924 }
925 }
926
927#ifdef OBJ_VMS
928 /*
929 * Under VMS we try to be compatible with VAX-11 "C". Thus, we
930 * call a routine to check for the definition of the procedure
931 * "_main", and if so -- fix it up so that it can be program
932 * entry point.
933 */
934 VMS_Check_For_Main ();
935#endif /* VMS */
936
937 /* After every sub-segment, we fake an ".align ...". This conforms to
938 BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
939 frag that requires least thought. ".align" frags like to have a
940 following frag since that makes calculating their intended length
941 trivial.
942
943 @@ Is this really necessary?? */
944#ifndef SUB_SEGMENT_ALIGN
945#ifdef BFD_ASSEMBLER
946#define SUB_SEGMENT_ALIGN(SEG) (0)
947#else
948#define SUB_SEGMENT_ALIGN(SEG) (2)
949#endif
950#endif
951 for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
952 {
953 subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
954 frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
955 /* frag_align will have left a new frag.
956 Use this last frag for an empty ".fill".
957
958 For this segment ...
959 Create a last frag. Do not leave a "being filled in frag". */
960 frag_wane (frag_now);
961 frag_now->fr_fix = 0;
962 know (frag_now->fr_next == NULL);
963 }
964
965 /* From now on, we don't care about sub-segments. Build one frag chain
966 for each segment. Linked thru fr_next. */
967
968#ifdef BFD_ASSEMBLER
969 /* Remove the sections created by gas for its own purposes. */
970 {
971 asection **seclist, *sec;
972 seclist = &stdoutput->sections;
973 while (seclist && *seclist)
974 {
975 sec = *seclist;
976 while (sec == reg_section || sec == expr_section)
977 {
978 sec = sec->next;
979 *seclist = sec;
980 stdoutput->section_count--;
981 if (!sec)
982 break;
983 }
984 if (*seclist)
985 seclist = &(*seclist)->next;
986 }
987 }
988
989 bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
990#else
991 remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
992 remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
993 remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
994#endif
995
996 /* We have two segments. If user gave -R flag, then we must put the
997 data frags into the text segment. Do this before relaxing so
998 we know to take advantage of -R and make shorter addresses. */
999#if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
1000 if (flagseen['R'])
1001 {
1002 merge_data_into_text ();
1003 }
1004#endif
1005
1006#ifdef BFD_ASSEMBLER
1007 bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
1008#else
1009 relax_and_size_all_segments ();
1010#endif /* BFD_ASSEMBLER */
1011
1012#ifndef BFD_ASSEMBLER
1013 /*
1014 *
1015 * Crawl the symbol chain.
1016 *
1017 * For each symbol whose value depends on a frag, take the address of
1018 * that frag and subsume it into the value of the symbol.
1019 * After this, there is just one way to lookup a symbol value.
1020 * Values are left in their final state for object file emission.
1021 * We adjust the values of 'L' local symbols, even if we do
1022 * not intend to emit them to the object file, because their values
1023 * are needed for fix-ups.
1024 *
1025 * Unless we saw a -L flag, remove all symbols that begin with 'L'
1026 * from the symbol chain. (They are still pointed to by the fixes.)
1027 *
1028 * Count the remaining symbols.
1029 * Assign a symbol number to each symbol.
1030 * Count the number of string-table chars we will emit.
1031 * Put this info into the headers as appropriate.
1032 *
1033 */
1034 know (zero_address_frag.fr_address == 0);
1035 string_byte_count = sizeof (string_byte_count);
1036
1037 obj_crawl_symbol_chain (&headers);
1038
1039 if (string_byte_count == sizeof (string_byte_count))
1040 string_byte_count = 0;
1041
1042 H_SET_STRING_SIZE (&headers, string_byte_count);
1043
1044 /*
1045 * Addresses of frags now reflect addresses we use in the object file.
1046 * Symbol values are correct.
1047 * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1048 * Also converting any machine-dependent frags using md_convert_frag();
1049 */
1050 subseg_change (SEG_TEXT, 0);
1051
1052 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1053 {
1054 cvt_frag_to_fill (&headers, fragP);
1055
1056 /* Some assert macros don't work with # directives mixed in. */
1057#ifndef NDEBUG
1058 if (!(fragP->fr_next == NULL
1059#ifdef OBJ_BOUT
1060 || fragP->fr_next == data_frag_root
1061#endif
1062 || ((fragP->fr_next->fr_address - fragP->fr_address)
1063 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1064 abort ();
1065#endif
1066 }
1067#endif /* ! BFD_ASSEMBLER */
1068
1069#ifndef WORKING_DOT_WORD
1070 {
1071 struct broken_word *lie;
1072 struct broken_word **prevP;
1073
1074 prevP = &broken_words;
1075 for (lie = broken_words; lie; lie = lie->next_broken_word)
1076 if (!lie->added)
1077 {
1078 expressionS exp;
1079
1080 exp.X_op = O_subtract;
1081 exp.X_add_symbol = lie->add;
1082 exp.X_op_symbol = lie->sub;
1083 exp.X_add_number = lie->addnum;
1084#ifdef BFD_ASSEMBLER
1085 fix_new_exp (lie->frag,
1086 lie->word_goes_here - lie->frag->fr_literal,
1087 2, &exp, 0, BFD_RELOC_NONE);
1088#else
1089#if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1090 fix_new_exp (lie->frag,
1091 lie->word_goes_here - lie->frag->fr_literal,
1092 2, &exp, 0, NO_RELOC);
1093#else
1094#ifdef TC_NS32K
1095 fix_new_ns32k_exp (lie->frag,
1096 lie->word_goes_here - lie->frag->fr_literal,
1097 2, &exp, 0, 0, 2, 0, 0);
1098#else
1099 fix_new_exp (lie->frag,
1100 lie->word_goes_here - lie->frag->fr_literal,
1101 2, &exp, 0, 0);
1102#endif /* TC_NS32K */
1103#endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1104#endif /* BFD_ASSEMBLER */
1105 *prevP = lie->next_broken_word;
1106 }
1107 else
1108 prevP = &(lie->next_broken_word);
1109
1110 for (lie = broken_words; lie;)
1111 {
1112 struct broken_word *untruth;
1113 char *table_ptr;
1114 addressT table_addr;
1115 addressT from_addr, to_addr;
1116 int n, m;
1117
1118 fragP = lie->dispfrag;
1119
1120 /* Find out how many broken_words go here. */
1121 n = 0;
1122 for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1123 if (untruth->added == 1)
1124 n++;
1125
1126 table_ptr = lie->dispfrag->fr_opcode;
1127 table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1128 /* Create the jump around the long jumps. This is a short
1129 jump from table_ptr+0 to table_ptr+n*long_jump_size. */
1130 from_addr = table_addr;
1131 to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1132 md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1133 table_ptr += md_short_jump_size;
1134 table_addr += md_short_jump_size;
1135
1136 for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1137 {
1138 if (lie->added == 2)
1139 continue;
1140 /* Patch the jump table */
1141 /* This is the offset from ??? to table_ptr+0 */
1142 to_addr = table_addr - S_GET_VALUE (lie->sub);
1143 md_number_to_chars (lie->word_goes_here, to_addr, 2);
1144 for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1145 {
1146 if (untruth->use_jump == lie)
1147 md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1148 }
1149
1150 /* Install the long jump */
1151 /* this is a long jump from table_ptr+0 to the final target */
1152 from_addr = table_addr;
1153 to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1154 md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1155 table_ptr += md_long_jump_size;
1156 table_addr += md_long_jump_size;
1157 }
1158 }
1159 }
1160#endif /* not WORKING_DOT_WORD */
1161
1162#ifndef BFD_ASSEMBLER
1163#ifndef OBJ_VMS
1164 { /* not vms */
1165 /*
1166 * Scan every FixS performing fixups. We had to wait until now to do
1167 * this because md_convert_frag() may have made some fixSs.
1168 */
1169 int trsize, drsize;
1170
1171 subseg_change (SEG_TEXT, 0);
1172 trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1173 subseg_change (SEG_DATA, 0);
1174 drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1175 H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1176
1177 /* FIXME move this stuff into the pre-write-hook */
1178 H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1179 H_SET_ENTRY_POINT (&headers, 0);
1180
1181 obj_pre_write_hook (&headers); /* extra coff stuff */
1182
1183 object_file_size = H_GET_FILE_SIZE (&headers);
1184 next_object_file_charP = the_object_file = xmalloc (object_file_size);
1185
1186 output_file_create (out_file_name);
1187
1188 obj_header_append (&next_object_file_charP, &headers);
1189
1190 know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1191
1192 /*
1193 * Emit code.
1194 */
1195 for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1196 {
1197 register long count;
1198 register char *fill_literal;
1199 register long fill_size;
1200
1201 know (fragP->fr_type == rs_fill);
1202 append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1203 fill_literal = fragP->fr_literal + fragP->fr_fix;
1204 fill_size = fragP->fr_var;
1205 know (fragP->fr_offset >= 0);
1206
1207 for (count = fragP->fr_offset; count; count--)
1208 {
1209 append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1210 } /* for each */
1211
1212 } /* for each code frag. */
1213
1214 know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1215
1216 /*
1217 * Emit relocations.
1218 */
1219 obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1220 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)));
1221#ifdef TC_I960
1222 /* Make addresses in data relocation directives relative to beginning of
1223 * first data fragment, not end of last text fragment: alignment of the
1224 * start of the data segment may place a gap between the segments.
1225 */
1226 obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1227#else /* TC_I960 */
1228 obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1229#endif /* TC_I960 */
1230
1231 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)));
1232
1233 /*
1234 * Emit line number entries.
1235 */
1236 OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1237 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)));
1238
1239 /*
1240 * Emit symbols.
1241 */
1242 obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1243 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)));
1244
1245 /*
1246 * Emit strings.
1247 */
1248
1249 if (string_byte_count > 0)
1250 {
1251 obj_emit_strings (&next_object_file_charP);
1252 } /* only if we have a string table */
1253
1254#ifdef BFD_HEADERS
1255 bfd_seek (stdoutput, 0, 0);
1256 bfd_write (the_object_file, 1, object_file_size, stdoutput);
1257#else
1258
1259 /* Write the data to the file */
1260 output_file_append (the_object_file, object_file_size, out_file_name);
1261#endif
1262
1263 output_file_close (out_file_name);
1264 } /* non vms output */
1265#else /* VMS */
1266 /*
1267 * Now do the VMS-dependent part of writing the object file
1268 */
1269 VMS_write_object_file (H_GET_TEXT_SIZE (&headers),
1270 H_GET_DATA_SIZE (&headers),
1271 H_GET_BSS_SIZE (&headers),
1272 text_frag_root, data_frag_root);
1273#endif /* VMS */
1274#else /* BFD_ASSEMBLER */
1275
1276#ifdef obj_check_file_symbols
1277 obj_check_file_symbols ();
1278#endif
1279
1280 bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1281
1282 /* Set up symbol table, and write it out. */
1283 if (symbol_rootP)
1284 {
1285 unsigned int i = 0;
1286 unsigned int n;
1287 symbolS *symp;
1288
1289 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1290 {
1291 if (! symp->sy_resolved)
1292 {
1293 if (symp->sy_value.X_op == O_constant)
1294 {
1295 /* This is the normal case; skip the call. */
1296 S_SET_VALUE (symp,
1297 (S_GET_VALUE (symp)
1298 + symp->sy_frag->fr_address));
1299 symp->sy_resolved = 1;
1300 }
1301 else
1302 resolve_symbol_value (symp);
1303 }
1304
1305 /* So far, common symbols have been treated like undefined symbols.
1306 Put them in the common section now. */
1307 if (S_IS_DEFINED (symp) == 0
1308 && S_GET_VALUE (symp) != 0)
1309 S_SET_SEGMENT (symp, &bfd_com_section);
1310#if 0
1311 printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1312 S_GET_NAME (symp), symp,
1313 S_GET_VALUE (symp),
1314 symp->bsym->flags,
1315 segment_name (symp->bsym->section));
1316#endif
1317 if (! symp->sy_used_in_reloc)
1318 {
1319#ifdef obj_frob_symbol
1320 {
1321 int punt = 0;
1322 obj_frob_symbol (symp, punt);
1323 if (punt)
1324 goto punt_it;
1325 }
1326#endif
1327#ifdef tc_frob_symbol
1328 {
1329 int punt = 0;
1330 tc_frob_symbol (symp, punt);
1331 if (punt)
1332 goto punt_it;
1333 }
1334#endif
1335 }
1336
1337 /* If we don't want to keep this symbol, splice it out of the
1338 chain now. */
1339 if (! symp->sy_used_in_reloc
1340 && S_IS_LOCAL (symp))
1341 {
1342 symbolS *prev, *next;
1343#if defined (obj_frob_symbol) || defined (tc_frob_symbol)
1344 punt_it:
1345#endif
1346 prev = symbol_previous (symp);
1347 next = symbol_next (symp);
1348#ifdef DEBUG_SYMS
1349 verify_symbol_chain_2 (symp);
1350#endif
1351 if (prev)
1352 {
1353 symbol_next (prev) = next;
1354 symp = prev;
1355 }
1356 else if (symp == symbol_rootP)
1357 symbol_rootP = next;
1358 else
1359 abort ();
1360 if (next)
1361 symbol_previous (next) = prev;
1362 else
1363 symbol_lastP = prev;
1364#ifdef DEBUG_SYMS
1365 if (prev)
1366 verify_symbol_chain_2 (prev);
1367 else if (next)
1368 verify_symbol_chain_2 (next);
1369#endif
1370 continue;
1371 }
1372
1373 /* Make sure we really got a value for the symbol. */
1374 if (! symp->sy_resolved)
1375 {
1376 as_bad ("can't resolve value for symbol \"%s\"",
1377 S_GET_NAME (symp));
1378 symp->sy_resolved = 1;
1379 }
1380
1381 /* Set the value into the BFD symbol. Up til now the value
1382 has only been kept in the gas symbolS struct. */
1383 symp->bsym->value = S_GET_VALUE (symp);
1384
1385 i++;
1386 }
1387 n = i;
1388 if (n)
1389 {
1390 asymbol **asympp;
1391 boolean result;
1392 extern PTR bfd_alloc PARAMS ((bfd *, size_t));
1393
1394 asympp = (asymbol **) bfd_alloc (stdoutput,
1395 n * sizeof (asymbol *));
1396 symp = symbol_rootP;
1397 for (i = 0; i < n; i++, symp = symbol_next (symp))
1398 {
1399 asympp[i] = symp->bsym;
1400 symp->written = 1;
1401 }
1402 result = bfd_set_symtab (stdoutput, asympp, n);
1403 assert (result == true);
1404 }
1405 }
1406
1407
1408#ifdef obj_frob_file
1409 /* If obj_frob_file changes the symbol value at this point, it is
1410 responsible for moving the changed value into symp->bsym->value
1411 as well. Hopefully all symbol value changing can be done in
1412 {obj,tc}_frob_symbol. */
1413 obj_frob_file ();
1414#endif
1415
1416 /* Now that all the sizes are known, and contents correct, we can
1417 start writing the file. */
1418 bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1419
1420 bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1421
1422 output_file_close (out_file_name);
1423#endif /* BFD_ASSEMBLER */
1424}
1425#endif /* ! BFD */
1426
1427/*
1428 * relax_segment()
1429 *
1430 * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1431 * values.
1432 *
1433 * Relax the frags.
1434 *
1435 * After this, all frags in this segment have addresses that are correct
1436 * within the segment. Since segments live in different file addresses,
1437 * these frag addresses may not be the same as final object-file addresses.
1438 */
1439
1440/* Subroutines of relax_segment. */
1441static int
1442is_dnrange (f1, f2)
1443 struct frag *f1;
1444 struct frag *f2;
1445{
1446 for (; f1; f1 = f1->fr_next)
1447 if (f1->fr_next == f2)
1448 return 1;
1449 return 0;
1450}
1451
1452/* Relax_align. Advance location counter to next address that has 'alignment'
1453 lowest order bits all 0s, return size of adjustment made. */
1454static relax_addressT
1455relax_align (address, alignment)
1456 register relax_addressT address; /* Address now. */
1457 register int alignment; /* Alignment (binary). */
1458{
1459 relax_addressT mask;
1460 relax_addressT new_address;
1461
1462 mask = ~((~0) << alignment);
1463 new_address = (address + mask) & (~mask);
1464 if (linkrelax)
1465 /* We must provide lots of padding, so the linker can discard it
1466 when needed. The linker will not add extra space, ever. */
1467 new_address += (1 << alignment);
1468 return (new_address - address);
1469}
1470
1471void
1472relax_segment (segment_frag_root, segment)
1473 struct frag *segment_frag_root;
1474 segT segment;
1475{
1476 register struct frag *fragP;
1477 register relax_addressT address;
1478#if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1479 know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
1480#endif
1481 /* In case md_estimate_size_before_relax() wants to make fixSs. */
1482 subseg_change (segment, 0);
1483
1484 /* For each frag in segment: count and store (a 1st guess of)
1485 fr_address. */
1486 address = 0;
1487 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1488 {
1489 fragP->fr_address = address;
1490 address += fragP->fr_fix;
1491
1492 switch (fragP->fr_type)
1493 {
1494 case rs_fill:
1495 address += fragP->fr_offset * fragP->fr_var;
1496 break;
1497
1498 case rs_align:
1499 address += relax_align (address, (int) fragP->fr_offset);
1500 break;
1501
1502 case rs_org:
1503 /* Assume .org is nugatory. It will grow with 1st relax. */
1504 break;
1505
1506 case rs_machine_dependent:
1507 address += md_estimate_size_before_relax (fragP, segment);
1508 break;
1509
1510#ifndef WORKING_DOT_WORD
1511 /* Broken words don't concern us yet */
1512 case rs_broken_word:
1513 break;
1514#endif
1515
1516 default:
1517 BAD_CASE (fragP->fr_type);
1518 break;
1519 } /* switch(fr_type) */
1520 } /* for each frag in the segment */
1521
1522 /* Do relax(). */
1523 {
1524 long stretch; /* May be any size, 0 or negative. */
1525 /* Cumulative number of addresses we have */
1526 /* relaxed this pass. */
1527 /* We may have relaxed more than one address. */
1528 long stretched; /* Have we stretched on this pass? */
1529 /* This is 'cuz stretch may be zero, when, in fact some piece of code
1530 grew, and another shrank. If a branch instruction doesn't fit anymore,
1531 we could be scrod. */
1532
1533 do
1534 {
1535 stretch = stretched = 0;
1536 for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1537 {
1538 long growth = 0;
1539 unsigned long was_address;
1540 long offset;
1541 symbolS *symbolP;
1542 long target;
1543 long after;
1544
1545 was_address = fragP->fr_address;
1546 address = fragP->fr_address += stretch;
1547 symbolP = fragP->fr_symbol;
1548 offset = fragP->fr_offset;
1549
1550 switch (fragP->fr_type)
1551 {
1552 case rs_fill: /* .fill never relaxes. */
1553 growth = 0;
1554 break;
1555
1556#ifndef WORKING_DOT_WORD
1557 /* JF: This is RMS's idea. I do *NOT* want to be blamed
1558 for it I do not want to write it. I do not want to have
1559 anything to do with it. This is not the proper way to
1560 implement this misfeature. */
1561 case rs_broken_word:
1562 {
1563 struct broken_word *lie;
1564 struct broken_word *untruth;
1565
1566 /* Yes this is ugly (storing the broken_word pointer
1567 in the symbol slot). Still, this whole chunk of
1568 code is ugly, and I don't feel like doing anything
1569 about it. Think of it as stubbornness in action. */
1570 growth = 0;
1571 for (lie = (struct broken_word *) (fragP->fr_symbol);
1572 lie && lie->dispfrag == fragP;
1573 lie = lie->next_broken_word)
1574 {
1575
1576 if (lie->added)
1577 continue;
1578
1579 offset = (lie->add->sy_frag->fr_address
1580 + S_GET_VALUE (lie->add)
1581 + lie->addnum
1582 - (lie->sub->sy_frag->fr_address
1583 + S_GET_VALUE (lie->sub)));
1584 if (offset <= -32768 || offset >= 32767)
1585 {
1586 if (flagseen['K'])
1587 {
1588 char buf[50];
1589 sprint_value (buf, (addressT) lie->addnum);
1590 as_warn (".word %s-%s+%s didn't fit",
1591 S_GET_NAME (lie->add),
1592 S_GET_NAME (lie->sub),
1593 buf);
1594 }
1595 lie->added = 1;
1596 if (fragP->fr_subtype == 0)
1597 {
1598 fragP->fr_subtype++;
1599 growth += md_short_jump_size;
1600 }
1601 for (untruth = lie->next_broken_word;
1602 untruth && untruth->dispfrag == lie->dispfrag;
1603 untruth = untruth->next_broken_word)
1604 if ((untruth->add->sy_frag == lie->add->sy_frag)
1605 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
1606 {
1607 untruth->added = 2;
1608 untruth->use_jump = lie;
1609 }
1610 growth += md_long_jump_size;
1611 }
1612 }
1613
1614 break;
1615 } /* case rs_broken_word */
1616#endif
1617 case rs_align:
1618 growth = (relax_align ((relax_addressT) (address
1619 + fragP->fr_fix),
1620 (int) offset)
1621 - relax_align ((relax_addressT) (was_address
1622 + fragP->fr_fix),
1623 (int) offset));
1624 break;
1625
1626 case rs_org:
1627 target = offset;
1628
1629 if (symbolP)
1630 {
1631#if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1632 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1633 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1634 || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
1635 || S_GET_SEGMENT (symbolP) == SEG_BSS);
1636 know (symbolP->sy_frag);
1637 know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1638 || (symbolP->sy_frag == &zero_address_frag));
1639#endif
1640 target += S_GET_VALUE (symbolP)
1641 + symbolP->sy_frag->fr_address;
1642 } /* if we have a symbol */
1643
1644 know (fragP->fr_next);
1645 after = fragP->fr_next->fr_address;
1646 growth = ((target - after) > 0) ? (target - after) : 0;
1647 /* Growth may be negative, but variable part of frag
1648 cannot have fewer than 0 chars. That is, we can't
1649 .org backwards. */
1650
1651 growth -= stretch; /* This is an absolute growth factor */
1652 break;
1653
1654 case rs_machine_dependent:
1655 {
1656 const relax_typeS *this_type;
1657 const relax_typeS *start_type;
1658 relax_substateT next_state;
1659 relax_substateT this_state;
1660 long aim;
1661
1662 this_state = fragP->fr_subtype;
1663 start_type = this_type = md_relax_table + this_state;
1664 target = offset;
1665
1666 if (symbolP)
1667 {
1668#ifndef DIFF_EXPR_OK
1669#if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1670 know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
1671 || (S_GET_SEGMENT (symbolP) == SEG_DATA)
1672 || (S_GET_SEGMENT (symbolP) == SEG_BSS)
1673 || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
1674#endif
1675 know (symbolP->sy_frag);
1676#endif
1677 know (!(S_GET_SEGMENT (symbolP) == absolute_section)
1678 || symbolP->sy_frag == &zero_address_frag);
1679 target +=
1680 S_GET_VALUE (symbolP)
1681 + symbolP->sy_frag->fr_address;
1682
1683 /* If frag has yet to be reached on this pass,
1684 assume it will move by STRETCH just as we did.
1685 If this is not so, it will be because some frag
1686 between grows, and that will force another pass.
1687
1688 Beware zero-length frags.
1689
1690 There should be a faster way to do this. */
1691
1692 if (symbolP->sy_frag->fr_address >= was_address
1693 && is_dnrange (fragP, symbolP->sy_frag))
1694 {
1695 target += stretch;
1696 }
1697 }
1698
1699 aim = target - address - fragP->fr_fix;
1700 /* The displacement is affected by the instruction size
1701 for the 32k architecture. I think we ought to be able
1702 to add fragP->fr_pcrel_adjust in all cases (it should be
1703 zero if not used), but just in case it breaks something
1704 else we'll put this inside #ifdef NS32K ... #endif */
1705#ifndef TC_NS32K
1706 if (fragP->fr_pcrel_adjust)
1707 abort ();
1708#endif
1709 aim += fragP->fr_pcrel_adjust;
1710
1711 if (aim < 0)
1712 {
1713 /* Look backwards. */
1714 for (next_state = this_type->rlx_more; next_state;)
1715 if (aim >= this_type->rlx_backward)
1716 next_state = 0;
1717 else
1718 {
1719 /* Grow to next state. */
1720 this_state = next_state;
1721 this_type = md_relax_table + this_state;
1722 next_state = this_type->rlx_more;
1723 }
1724 }
1725 else
1726 {
1727#ifdef M68K_AIM_KLUDGE
1728 M68K_AIM_KLUDGE (aim, this_state, this_type);
1729#endif
1730 /* Look forwards. */
1731 for (next_state = this_type->rlx_more; next_state;)
1732 if (aim <= this_type->rlx_forward)
1733 next_state = 0;
1734 else
1735 {
1736 /* Grow to next state. */
1737 this_state = next_state;
1738 this_type = md_relax_table + this_state;
1739 next_state = this_type->rlx_more;
1740 }
1741 }
1742
1743 growth = this_type->rlx_length - start_type->rlx_length;
1744 if (growth != 0)
1745 fragP->fr_subtype = this_state;
1746 }
1747 break;
1748
1749 default:
1750 BAD_CASE (fragP->fr_type);
1751 break;
1752 }
1753 if (growth)
1754 {
1755 stretch += growth;
1756 stretched++;
1757 }
1758 } /* For each frag in the segment. */
1759 }
1760 while (stretched); /* Until nothing further to relax. */
1761 } /* do_relax */
1762
1763 /*
1764 * We now have valid fr_address'es for each frag.
1765 */
1766
1767 /*
1768 * All fr_address's are correct, relative to their own segment.
1769 * We have made all the fixS we will ever make.
1770 */
1771} /* relax_segment() */
1772
1773#if defined (BFD_ASSEMBLER) || !defined (BFD)
1774
1775/* fixup_segment()
1776
1777 Go through all the fixS's in a segment and see which ones can be
1778 handled now. (These consist of fixS where we have since discovered
1779 the value of a symbol, or the address of the frag involved.)
1780 For each one, call md_apply_fix to put the fix into the frag data.
1781
1782 Result is a count of how many relocation structs will be needed to
1783 handle the remaining fixS's that we couldn't completely handle here.
1784 These will be output later by emit_relocations(). */
1785
1786static long
1787fixup_segment (fixP, this_segment_type)
1788 register fixS *fixP;
1789 segT this_segment_type; /* N_TYPE bits for segment. */
1790{
1791 register long seg_reloc_count;
1792 register symbolS *add_symbolP;
1793 register symbolS *sub_symbolP;
1794 valueT add_number;
1795 register int size;
1796 register char *place;
1797 register long where;
1798 register char pcrel;
1799 register fragS *fragP;
1800 register segT add_symbol_segment = absolute_section;
1801
1802 seg_reloc_count = 0;
1803 /* If the linker is doing the relaxing, we must not do any fixups. */
1804 /* Well, strictly speaking that's not true -- we could do any that
1805 are PC-relative and don't cross regions that could change size.
1806 And for the i960 (the only machine for which we've got a relaxing
1807 linker right now), we might be able to turn callx/callj into bal
1808 in cases where we know the maximum displacement. */
1809 if (linkrelax)
1810 for (; fixP; fixP = fixP->fx_next)
1811 seg_reloc_count++;
1812 else
1813 for (; fixP; fixP = fixP->fx_next)
1814 {
1815 fragP = fixP->fx_frag;
1816 know (fragP);
1817 where = fixP->fx_where;
1818 place = fragP->fr_literal + where;
1819 size = fixP->fx_size;
1820 add_symbolP = fixP->fx_addsy;
1821#ifdef TC_I960
1822 if (fixP->fx_callj && TC_S_IS_CALLNAME (add_symbolP))
1823 {
1824 /* Relocation should be done via the associated 'bal'
1825 entry point symbol. */
1826
1827 if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
1828 {
1829 as_bad ("No 'bal' entry point for leafproc %s",
1830 S_GET_NAME (add_symbolP));
1831 continue;
1832 }
1833 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
1834 }
1835#endif
1836 sub_symbolP = fixP->fx_subsy;
1837 add_number = fixP->fx_offset;
1838 pcrel = fixP->fx_pcrel;
1839
1840 if (add_symbolP)
1841 add_symbol_segment = S_GET_SEGMENT (add_symbolP);
1842
1843 if (sub_symbolP)
1844 {
1845 if (!add_symbolP)
1846 {
1847 /* Its just -sym */
1848 /* @@ Should try converting to pcrel ref to fixed addr. */
1849 if (S_GET_SEGMENT (sub_symbolP) != absolute_section)
1850 as_bad ("Negative of non-absolute symbol %s",
1851 S_GET_NAME (sub_symbolP));
1852
1853 add_number -= S_GET_VALUE (sub_symbolP);
1854 }
1855 else if ((S_GET_SEGMENT (sub_symbolP) == add_symbol_segment)
1856 && (SEG_NORMAL (add_symbol_segment)
1857 || (add_symbol_segment == absolute_section)))
1858 {
1859 /* Difference of 2 symbols from same segment.
1860 Can't make difference of 2 undefineds: 'value' means
1861 something different for N_UNDF. */
1862#ifdef TC_I960
1863 /* Makes no sense to use the difference of 2 arbitrary symbols
1864 as the target of a call instruction. */
1865 if (fixP->fx_callj)
1866 {
1867 as_bad ("callj to difference of 2 symbols");
1868 }
1869#endif /* TC_I960 */
1870 add_number += S_GET_VALUE (add_symbolP) -
1871 S_GET_VALUE (sub_symbolP);
1872
1873 add_symbolP = NULL;
1874 fixP->fx_addsy = NULL;
1875 }
1876#if !defined(SEG_DIFF_ALLOWED) && !defined (GLOBAL_DIFF_ALLOWED)
1877 else
1878 {
1879 /* Different segments in subtraction. */
1880 know (!(S_IS_EXTERNAL (sub_symbolP)
1881 && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
1882
1883 if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
1884 {
1885 add_number -= S_GET_VALUE (sub_symbolP);
1886 }
1887#ifdef DIFF_EXPR_OK
1888 else if (!pcrel
1889 && S_GET_SEGMENT (sub_symbolP) == this_segment_type)
1890 {
1891 /* Make it pc-relative. */
1892 add_number += (md_pcrel_from (fixP)
1893 - S_GET_VALUE (sub_symbolP));
1894 pcrel = 1;
1895 fixP->fx_pcrel = 1;
1896 sub_symbolP = 0;
1897 fixP->fx_subsy = 0;
1898 }
1899#endif
1900 else
1901 {
1902 char buf[50];
1903 sprint_value (buf, fragP->fr_address + where);
1904 as_bad ("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
1905 segment_name (S_GET_SEGMENT (sub_symbolP)),
1906 S_GET_NAME (sub_symbolP), buf);
1907 }
1908#else
1909 else
1910 {
1911 seg_reloc_count++;
1912 fixP->fx_addnumber = add_number; /* Remember value for emit_reloc */
1913 continue;
1914 } /* if absolute */
1915#endif
1916 }
1917 }
1918
1919 if (add_symbolP)
1920 {
1921 if (add_symbol_segment == this_segment_type && pcrel)
1922 {
1923 /*
1924 * This fixup was made when the symbol's segment was
1925 * SEG_UNKNOWN, but it is now in the local segment.
1926 * So we know how to do the address without relocation.
1927 */
1928#ifdef TC_I960
1929 /* reloc_callj() may replace a 'call' with a 'calls' or a
1930 'bal', in which cases it modifies *fixP as appropriate.
1931 In the case of a 'calls', no further work is required,
1932 and *fixP has been set up to make the rest of the code
1933 below a no-op. */
1934 reloc_callj (fixP);
1935#endif /* TC_I960 */
1936
1937 add_number += S_GET_VALUE (add_symbolP);
1938 add_number -= md_pcrel_from (fixP);
1939 pcrel = 0; /* Lie. Don't want further pcrel processing. */
1940#ifndef TC_HPPA
1941 fixP->fx_addsy = NULL; /* No relocations please. */
1942#endif
1943 }
1944 else
1945 {
1946 if (add_symbol_segment == absolute_section)
1947 {
1948#ifdef TC_I960
1949 /* See comment about reloc_callj() above. */
1950 reloc_callj (fixP);
1951#endif /* TC_I960 */
1952 add_number += S_GET_VALUE (add_symbolP);
1953 fixP->fx_addsy = NULL;
1954 add_symbolP = NULL;
1955 }
1956 else if (add_symbol_segment == undefined_section
1957#ifdef BFD_ASSEMBLER
1958 || bfd_is_com_section (add_symbol_segment)
1959#endif
1960 )
1961 {
1962#ifdef TC_I960
1963 if ((int) fixP->fx_bit_fixP == 13)
1964 {
1965 /* This is a COBR instruction. They have only a
1966 * 13-bit displacement and are only to be used
1967 * for local branches: flag as error, don't generate
1968 * relocation.
1969 */
1970 as_bad ("can't use COBR format with external label");
1971 fixP->fx_addsy = NULL; /* No relocations please. */
1972 continue;
1973 } /* COBR */
1974#endif /* TC_I960 */
1975
1976#ifdef OBJ_COFF
1977#ifdef TE_I386AIX
1978 if (S_IS_COMMON (add_symbolP))
1979 add_number += S_GET_VALUE (add_symbolP);
1980#endif /* TE_I386AIX */
1981#endif /* OBJ_COFF */
1982 ++seg_reloc_count;
1983 }
1984 else
1985 {
1986 seg_reloc_count++;
1987 add_number += S_GET_VALUE (add_symbolP);
1988 }
1989 } /* if not in local seg */
1990 } /* if there was a + symbol */
1991
1992 if (pcrel)
1993 {
1994 add_number -= md_pcrel_from (fixP);
1995 if (add_symbolP == 0)
1996 {
1997 fixP->fx_addsy = &abs_symbol;
1998 ++seg_reloc_count;
1999 } /* if there's an add_symbol */
2000 } /* if pcrel */
2001
2002 if (!fixP->fx_bit_fixP)
2003 {
2004 valueT mask = 0;
2005 /* set all bits to one */
2006 mask--;
2007 /* Technically speaking, combining these produces an
2008 undefined result if size is sizeof (valueT), though I
2009 think these two half-way operations should both be
2010 defined. */
2011 mask <<= size * 4;
2012 mask <<= size * 4;
2013 if ((add_number & mask) != 0
2014 && (add_number & mask) != mask)
2015 {
2016 char buf[50], buf2[50];
2017 sprint_value (buf, fragP->fr_address + where);
2018 if (add_number > 1000)
2019 sprint_value (buf2, add_number);
2020 else
2021 sprintf (buf2, "%d", (long) add_number);
2022 as_bad ("Value of %s too large for field of %d bytes at %s",
2023 buf2, size, buf);
2024 } /* generic error checking */
2025#ifdef WARN_SIGNED_OVERFLOW_WORD
2026 /* Warn if a .word value is too large when treated as a signed
2027 number. We already know it is not too negative. This is to
2028 catch over-large switches generated by gcc on the 68k. */
2029 if (!flagseen['J']
2030 && size == 2
2031 && add_number > 0x7fff)
2032 as_bad ("Signed .word overflow; switch may be too large; %ld at 0x%lx",
2033 (long) add_number,
2034 (unsigned long) (fragP->fr_address + where));
2035#endif
2036 } /* not a bit fix */
2037
2038#ifdef BFD_ASSEMBLER
2039 md_apply_fix (fixP, &add_number);
2040#else
2041 md_apply_fix (fixP, add_number);
2042#endif
2043 } /* For each fixS in this segment. */
2044
2045#if defined (OBJ_COFF) && defined (TC_I960)
2046 {
2047 fixS *topP = fixP;
2048
2049 /* two relocs per callj under coff. */
2050 for (fixP = topP; fixP; fixP = fixP->fx_next)
2051 if (fixP->fx_callj && fixP->fx_addsy != 0)
2052 ++seg_reloc_count;
2053 }
2054#endif /* OBJ_COFF && TC_I960 */
2055
2056 return (seg_reloc_count);
2057}
2058
2059#endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
2060
2061/* end of write.c */
This page took 0.029094 seconds and 4 git commands to generate.