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