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