* write.c (adjust_reloc_syms): Don't reduce a reloc against a
[external/binutils.git] / gas / write.c
1 /* write.c - emit .o file
2    Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 1996
3    Free Software Foundation, Inc.
4
5    This file is part of GAS, the GNU Assembler.
6
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to
19    the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /* This thing should be set up to do byteordering correctly.  But... */
22
23 #include "as.h"
24 #include "subsegs.h"
25 #include "obstack.h"
26 #include "output-file.h"
27
28 /* This looks like a good idea.  Let's try turning it on always, for now.  */
29 #undef  BFD_FAST_SECTION_FILL
30 #define BFD_FAST_SECTION_FILL
31
32 /* The NOP_OPCODE is for the alignment fill value.  Fill it with a nop
33    instruction so that the disassembler does not choke on it.  */
34 #ifndef NOP_OPCODE
35 #define NOP_OPCODE 0x00
36 #endif
37
38 #ifndef TC_ADJUST_RELOC_COUNT
39 #define TC_ADJUST_RELOC_COUNT(FIXP,COUNT)
40 #endif
41
42 #ifndef TC_FORCE_RELOCATION
43 #define TC_FORCE_RELOCATION(FIXP) 0
44 #endif
45
46 #ifndef TC_FORCE_RELOCATION_SECTION
47 #define TC_FORCE_RELOCATION_SECTION(FIXP,SEG) TC_FORCE_RELOCATION(FIXP)
48 #endif
49
50 #ifndef MD_PCREL_FROM_SECTION
51 #define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from(FIXP)
52 #endif
53
54 #ifndef WORKING_DOT_WORD
55 extern CONST int md_short_jump_size;
56 extern CONST int md_long_jump_size;
57 #endif
58
59 int symbol_table_frozen;
60 void print_fixup PARAMS ((fixS *));
61
62 #ifdef BFD_ASSEMBLER
63 static void renumber_sections PARAMS ((bfd *, asection *, PTR));
64
65 /* We generally attach relocs to frag chains.  However, after we have
66    chained these all together into a segment, any relocs we add after
67    that must be attached to a segment.  This will include relocs added
68    in md_estimate_size_for_relax, for example.  */
69 static int frags_chained = 0;
70 #endif
71
72 #ifndef BFD_ASSEMBLER
73
74 #ifndef MANY_SEGMENTS
75 struct frag *text_frag_root;
76 struct frag *data_frag_root;
77 struct frag *bss_frag_root;
78
79 struct frag *text_last_frag;    /* Last frag in segment. */
80 struct frag *data_last_frag;    /* Last frag in segment. */
81 static struct frag *bss_last_frag;      /* Last frag in segment. */
82 #endif
83
84 #ifndef BFD
85 static object_headers headers;
86 #endif
87
88 long string_byte_count;
89 char *next_object_file_charP;   /* Tracks object file bytes. */
90
91 #ifndef OBJ_VMS
92 int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
93 #endif
94
95 #endif /* BFD_ASSEMBLER */
96
97 static int n_fixups;
98
99 #ifdef BFD_ASSEMBLER
100 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
101                                        symbolS *add, symbolS *sub,
102                                        offsetT offset, int pcrel,
103                                        bfd_reloc_code_real_type r_type));
104 #else
105 static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
106                                        symbolS *add, symbolS *sub,
107                                        offsetT offset, int pcrel,
108                                        int r_type));
109 #endif
110 #if defined (BFD_ASSEMBLER) || (!defined (BFD) && !defined (OBJ_VMS))
111 static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
112 #endif
113 static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
114
115 /*
116  *                      fix_new()
117  *
118  * Create a fixS in obstack 'notes'.
119  */
120 static fixS *
121 fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
122                   r_type)
123      fragS *frag;               /* Which frag? */
124      int where;                 /* Where in that frag? */
125      int size;                  /* 1, 2, or 4 usually. */
126      symbolS *add_symbol;       /* X_add_symbol. */
127      symbolS *sub_symbol;       /* X_op_symbol. */
128      offsetT offset;            /* X_add_number. */
129      int pcrel;                 /* TRUE if PC-relative relocation. */
130 #ifdef BFD_ASSEMBLER
131      bfd_reloc_code_real_type r_type; /* Relocation type */
132 #else
133      int r_type;                /* Relocation type */
134 #endif
135 {
136   fixS *fixP;
137
138   n_fixups++;
139
140   fixP = (fixS *) obstack_alloc (&notes, sizeof (fixS));
141
142   fixP->fx_frag = frag;
143   fixP->fx_where = where;
144   fixP->fx_size = size;
145   /* We've made fx_size a narrow field; check that it's wide enough.  */
146   if (fixP->fx_size != size)
147     {
148       as_bad ("field fx_size too small to hold %d", size);
149       abort ();
150     }
151   fixP->fx_addsy = add_symbol;
152   fixP->fx_subsy = sub_symbol;
153   fixP->fx_offset = offset;
154   fixP->fx_pcrel = pcrel;
155   fixP->fx_plt = 0;
156 #if defined(NEED_FX_R_TYPE) || defined (BFD_ASSEMBLER)
157   fixP->fx_r_type = r_type;
158 #endif
159   fixP->fx_im_disp = 0;
160   fixP->fx_pcrel_adjust = 0;
161   fixP->fx_bit_fixP = 0;
162   fixP->fx_addnumber = 0;
163   fixP->fx_tcbit = 0;
164   fixP->fx_done = 0;
165
166 #ifdef TC_FIX_TYPE
167   TC_INIT_FIX_DATA(fixP);
168 #endif
169
170   as_where (&fixP->fx_file, &fixP->fx_line);
171
172   /* Usually, we want relocs sorted numerically, but while
173      comparing to older versions of gas that have relocs
174      reverse sorted, it is convenient to have this compile
175      time option.  xoxorich. */
176
177   {
178
179 #ifdef BFD_ASSEMBLER
180     fixS **seg_fix_rootP = (frags_chained
181                             ? &seg_info (now_seg)->fix_root
182                             : &frchain_now->fix_root);
183     fixS **seg_fix_tailP = (frags_chained
184                             ? &seg_info (now_seg)->fix_tail
185                             : &frchain_now->fix_tail);
186 #endif
187
188 #ifdef REVERSE_SORT_RELOCS
189
190     fixP->fx_next = *seg_fix_rootP;
191     *seg_fix_rootP = fixP;
192
193 #else /* REVERSE_SORT_RELOCS */
194
195     fixP->fx_next = NULL;
196
197     if (*seg_fix_tailP)
198       (*seg_fix_tailP)->fx_next = fixP;
199     else
200       *seg_fix_rootP = fixP;
201     *seg_fix_tailP = fixP;
202
203 #endif /* REVERSE_SORT_RELOCS */
204
205   }
206
207   return fixP;
208 }
209
210 /* Create a fixup relative to a symbol (plus a constant).  */
211
212 fixS *
213 fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
214      fragS *frag;               /* Which frag? */
215      int where;                 /* Where in that frag? */
216      int size;                  /* 1, 2, or 4 usually. */
217      symbolS *add_symbol;       /* X_add_symbol. */
218      offsetT offset;            /* X_add_number. */
219      int pcrel;                 /* TRUE if PC-relative relocation. */
220 #ifdef BFD_ASSEMBLER
221      bfd_reloc_code_real_type r_type; /* Relocation type */
222 #else
223      int r_type;                /* Relocation type */
224 #endif
225 {
226   return fix_new_internal (frag, where, size, add_symbol,
227                            (symbolS *) NULL, offset, pcrel, r_type);
228 }
229
230 /* Create a fixup for an expression.  Currently we only support fixups
231    for difference expressions.  That is itself more than most object
232    file formats support anyhow.  */
233
234 fixS *
235 fix_new_exp (frag, where, size, exp, pcrel, r_type)
236      fragS *frag;               /* Which frag? */
237      int where;                 /* Where in that frag? */
238      int size;                  /* 1, 2, or 4 usually. */
239      expressionS *exp;          /* Expression.  */
240      int pcrel;                 /* TRUE if PC-relative relocation. */
241 #ifdef BFD_ASSEMBLER
242      bfd_reloc_code_real_type r_type; /* Relocation type */
243 #else
244      int r_type;                /* Relocation type */
245 #endif
246 {
247   symbolS *add = NULL;
248   symbolS *sub = NULL;
249   offsetT off = 0;
250
251   switch (exp->X_op)
252     {
253     case O_absent:
254       break;
255
256     case O_add:
257       /* This comes up when _GLOBAL_OFFSET_TABLE_+(.-L0) is read, if
258          the difference expression cannot immediately be reduced.  */
259       {
260         extern symbolS *make_expr_symbol ();
261         symbolS *stmp = make_expr_symbol (exp);
262         exp->X_op = O_symbol;
263         exp->X_op_symbol = 0;
264         exp->X_add_symbol = stmp;
265         exp->X_add_number = 0;
266         return fix_new_exp (frag, where, size, exp, pcrel, r_type);
267       }
268
269     case O_symbol_rva:
270       add = exp->X_add_symbol;
271       off = exp->X_add_number;
272
273 #if defined(BFD_ASSEMBLER)
274       r_type = BFD_RELOC_RVA;
275 #else
276 #if defined(TC_RVA_RELOC)
277       r_type = TC_RVA_RELOC;
278 #else
279       as_fatal("rva not supported");
280 #endif
281 #endif
282       break;
283
284     case O_uminus:
285       sub = exp->X_add_symbol;
286       off = exp->X_add_number;
287       break;
288
289     case O_subtract:
290       sub = exp->X_op_symbol;
291       /* Fall through.  */
292     case O_symbol:
293       add = exp->X_add_symbol;
294       /* Fall through.   */
295     case O_constant:
296       off = exp->X_add_number;
297       break;
298
299     default:
300       add = make_expr_symbol (exp);
301       break;
302     }
303
304   return fix_new_internal (frag, where, size, add, sub, off,
305                            pcrel, r_type);
306 }
307
308 /* Append a string onto another string, bumping the pointer along.  */
309 void
310 append (charPP, fromP, length)
311      char **charPP;
312      char *fromP;
313      unsigned long length;
314 {
315   /* Don't trust memcpy() of 0 chars. */
316   if (length == 0)
317     return;
318
319   memcpy (*charPP, fromP, length);
320   *charPP += length;
321 }
322
323 #ifndef BFD_ASSEMBLER
324 int section_alignment[SEG_MAXIMUM_ORDINAL];
325 #endif
326
327 /*
328  * This routine records the largest alignment seen for each segment.
329  * If the beginning of the segment is aligned on the worst-case
330  * boundary, all of the other alignments within it will work.  At
331  * least one object format really uses this info.
332  */
333 void
334 record_alignment (seg, align)
335      /* Segment to which alignment pertains */
336      segT seg;
337      /* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte
338         boundary, etc.)  */
339      int align;
340 {
341   if (seg == absolute_section)
342     return;
343 #ifdef BFD_ASSEMBLER
344   if (align > bfd_get_section_alignment (stdoutput, seg))
345     bfd_set_section_alignment (stdoutput, seg, align);
346 #else
347   if (align > section_alignment[(int) seg])
348     section_alignment[(int) seg] = align;
349 #endif
350 }
351
352 #ifdef BFD_ASSEMBLER
353
354 /* Reset the section indices after removing the gas created sections.  */
355
356 static void
357 renumber_sections (abfd, sec, countparg)
358      bfd *abfd;
359      asection *sec;
360      PTR countparg;
361 {
362   int *countp = (int *) countparg;
363
364   sec->index = *countp;
365   ++*countp;
366 }
367
368 #endif /* defined (BFD_ASSEMBLER) */
369
370 #if defined (BFD_ASSEMBLER) || ! defined (BFD)
371
372 static fragS *
373 chain_frchains_together_1 (section, frchp)
374      segT section;
375      struct frchain *frchp;
376 {
377   fragS dummy, *prev_frag = &dummy;
378 #ifdef BFD_ASSEMBLER
379   fixS fix_dummy, *prev_fix = &fix_dummy;
380 #endif
381
382   for (; frchp && frchp->frch_seg == section; frchp = frchp->frch_next)
383     {
384       prev_frag->fr_next = frchp->frch_root;
385       prev_frag = frchp->frch_last;
386       assert (prev_frag->fr_type != 0);
387 #ifdef BFD_ASSEMBLER
388       if (frchp->fix_root != (fixS *) NULL)
389         {
390           if (seg_info (section)->fix_root == (fixS *) NULL)
391             seg_info (section)->fix_root = frchp->fix_root;
392           prev_fix->fx_next = frchp->fix_root;
393           seg_info (section)->fix_tail = frchp->fix_tail;
394           prev_fix = frchp->fix_tail;
395         }
396 #endif
397     }
398   assert (prev_frag->fr_type != 0);
399   prev_frag->fr_next = 0;
400   return prev_frag;
401 }
402
403 #endif
404
405 #ifdef BFD_ASSEMBLER
406
407 static void
408 chain_frchains_together (abfd, section, xxx)
409      bfd *abfd;                 /* unused */
410      segT section;
411      PTR xxx;                   /* unused */
412 {
413   segment_info_type *info;
414
415   /* BFD may have introduced its own sections without using
416      subseg_new, so it is possible that seg_info is NULL.  */
417   info = seg_info (section);
418   if (info != (segment_info_type *) NULL)
419    info->frchainP->frch_last
420      = chain_frchains_together_1 (section, info->frchainP);
421
422   /* Now that we've chained the frags together, we must add new fixups
423      to the segment, not to the frag chain.  */
424   frags_chained = 1;
425 }
426
427 #endif
428
429 #if !defined (BFD) && !defined (BFD_ASSEMBLER)
430
431 void
432 remove_subsegs (head, seg, root, last)
433      frchainS *head;
434      int seg;
435      fragS **root;
436      fragS **last;
437 {
438   *root = head->frch_root;
439   *last = chain_frchains_together_1 (seg, head);
440 }
441
442 #endif /* BFD */
443
444 #if defined (BFD_ASSEMBLER) || !defined (BFD)
445
446 #ifdef BFD_ASSEMBLER
447 static void
448 cvt_frag_to_fill (sec, fragP)
449      segT sec;
450      fragS *fragP;
451 #else
452 static void
453 cvt_frag_to_fill (headersP, sec, fragP)
454      object_headers *headersP;
455      segT sec;
456      fragS *fragP;
457 #endif
458 {
459   switch (fragP->fr_type)
460     {
461     case rs_align:
462     case rs_align_code:
463     case rs_org:
464     case rs_space:
465 #ifdef HANDLE_ALIGN
466       HANDLE_ALIGN (fragP);
467 #endif
468       know (fragP->fr_next != NULL);
469       fragP->fr_offset = (fragP->fr_next->fr_address
470                           - fragP->fr_address
471                           - fragP->fr_fix) / fragP->fr_var;
472       if (fragP->fr_offset < 0)
473         {
474           as_bad ("attempt to .org/.space backwards? (%ld)",
475                   (long) fragP->fr_offset);
476         }
477       fragP->fr_type = rs_fill;
478       break;
479
480     case rs_fill:
481       break;
482
483     case rs_machine_dependent:
484 #ifdef BFD_ASSEMBLER
485       md_convert_frag (stdoutput, sec, fragP);
486 #else
487       md_convert_frag (headersP, sec, fragP);
488 #endif
489
490       assert (fragP->fr_next == NULL || (fragP->fr_next->fr_address - fragP->fr_address == fragP->fr_fix));
491
492       /*
493        * After md_convert_frag, we make the frag into a ".space 0".
494        * Md_convert_frag() should set up any fixSs and constants
495        * required.
496        */
497       frag_wane (fragP);
498       break;
499
500 #ifndef WORKING_DOT_WORD
501     case rs_broken_word:
502       {
503         struct broken_word *lie;
504
505         if (fragP->fr_subtype)
506           {
507             fragP->fr_fix += md_short_jump_size;
508             for (lie = (struct broken_word *) (fragP->fr_symbol);
509                  lie && lie->dispfrag == fragP;
510                  lie = lie->next_broken_word)
511               if (lie->added == 1)
512                 fragP->fr_fix += md_long_jump_size;
513           }
514         frag_wane (fragP);
515       }
516       break;
517 #endif
518
519     default:
520       BAD_CASE (fragP->fr_type);
521       break;
522     }
523 }
524
525 #endif /* defined (BFD_ASSEMBLER) || !defined (BFD) */
526
527 #ifdef BFD_ASSEMBLER
528 static void
529 relax_and_size_seg (abfd, sec, xxx)
530      bfd *abfd;
531      asection *sec;
532      PTR xxx;
533 {
534   flagword flags;
535   fragS *fragp;
536   segment_info_type *seginfo;
537   int x;
538   valueT size, newsize;
539
540   subseg_change (sec, 0);
541
542   flags = bfd_get_section_flags (abfd, sec);
543
544   seginfo = seg_info (sec);
545   if (seginfo && seginfo->frchainP)
546     {
547       relax_segment (seginfo->frchainP->frch_root, sec);
548       for (fragp = seginfo->frchainP->frch_root; fragp; fragp = fragp->fr_next)
549         cvt_frag_to_fill (sec, fragp);
550       for (fragp = seginfo->frchainP->frch_root;
551            fragp->fr_next;
552            fragp = fragp->fr_next)
553         /* walk to last elt */;
554       size = fragp->fr_address + fragp->fr_fix;
555     }
556   else
557     size = 0;
558
559   if (size > 0 && ! seginfo->bss)
560     flags |= SEC_HAS_CONTENTS;
561
562   /* @@ This is just an approximation.  */
563   if (seginfo && seginfo->fix_root)
564     flags |= SEC_RELOC;
565   else
566     flags &= ~SEC_RELOC;
567   x = bfd_set_section_flags (abfd, sec, flags);
568   assert (x == true);
569
570   newsize = md_section_align (sec, size);
571   x = bfd_set_section_size (abfd, sec, newsize);
572   assert (x == true);
573
574   /* If the size had to be rounded up, add some padding in the last
575      non-empty frag.  */
576   assert (newsize >= size);
577   if (size != newsize)
578     {
579       fragS *last = seginfo->frchainP->frch_last;
580       fragp = seginfo->frchainP->frch_root;
581       while (fragp->fr_next != last)
582         fragp = fragp->fr_next;
583       last->fr_address = size;
584       fragp->fr_offset += newsize - size;
585     }
586
587 #ifdef tc_frob_section
588   tc_frob_section (sec);
589 #endif
590 #ifdef obj_frob_section
591   obj_frob_section (sec);
592 #endif
593 }
594
595 #ifdef DEBUG2
596 static void
597 dump_section_relocs (abfd, sec, stream_)
598      bfd *abfd;
599      asection *sec;
600      char *stream_;
601 {
602   FILE *stream = (FILE *) stream_;
603   segment_info_type *seginfo = seg_info (sec);
604   fixS *fixp = seginfo->fix_root;
605
606   if (!fixp)
607     return;
608
609   fprintf (stream, "sec %s relocs:\n", sec->name);
610   while (fixp)
611     {
612       symbolS *s = fixp->fx_addsy;
613       if (s)
614         {
615           fprintf (stream, "  %08x: %s(%s", fixp, S_GET_NAME (s),
616                    s->bsym->section->name);
617           if (s->bsym->flags & BSF_SECTION_SYM)
618             {
619               fprintf (stream, " section sym");
620               if (S_GET_VALUE (s))
621                 fprintf (stream, "+%x", S_GET_VALUE (s));
622             }
623           else
624             fprintf (stream, "+%x", S_GET_VALUE (s));
625           fprintf (stream, ")+%x\n", fixp->fx_offset);
626         }
627       else
628         fprintf (stream, "  %08x: type %d no sym\n", fixp, fixp->fx_r_type);
629       fixp = fixp->fx_next;
630     }
631 }
632 #else
633 #define dump_section_relocs(ABFD,SEC,STREAM)    ((void) 0)
634 #endif
635
636 #ifndef EMIT_SECTION_SYMBOLS
637 #define EMIT_SECTION_SYMBOLS 1
638 #endif
639
640 static void
641 adjust_reloc_syms (abfd, sec, xxx)
642      bfd *abfd;
643      asection *sec;
644      PTR xxx;
645 {
646   segment_info_type *seginfo = seg_info (sec);
647   fixS *fixp;
648
649   if (seginfo == NULL)
650     return;
651
652   dump_section_relocs (abfd, sec, stderr);
653
654   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
655     if (fixp->fx_done)
656       /* ignore it */;
657     else if (fixp->fx_addsy)
658       {
659         symbolS *sym;
660         asection *symsec;
661
662       reduce_fixup:
663
664 #ifdef DEBUG5
665         fprintf (stderr, "\n\nadjusting fixup:\n");
666         print_fixup (fixp);
667 #endif
668
669         sym = fixp->fx_addsy;
670         symsec = sym->bsym->section;
671
672         /* All symbols should have already been resolved at this
673            point.  It is possible to see unresolved expression
674            symbols, though, since they are not in the regular symbol
675            table.  */
676         if (sym != NULL && ! sym->sy_resolved)
677           resolve_symbol_value (sym);
678         if (fixp->fx_subsy != NULL && ! fixp->fx_subsy->sy_resolved)
679           resolve_symbol_value (fixp->fx_subsy);
680
681         if (sym != NULL && sym->sy_mri_common)
682           {
683             /* These symbols are handled specially in fixup_segment.  */
684             goto done;
685           }
686
687         if (bfd_is_abs_section (symsec))
688           {
689             /* The fixup_segment routine will not use this symbol in a
690                relocation unless TC_FORCE_RELOCATION returns 1.  */
691             if (TC_FORCE_RELOCATION (fixp))
692               {
693                 fixp->fx_addsy->sy_used_in_reloc = 1;
694 #ifdef UNDEFINED_DIFFERENCE_OK
695                 if (fixp->fx_subsy != NULL)
696                   fixp->fx_subsy->sy_used_in_reloc = 1;
697 #endif
698               }
699             goto done;
700           }
701
702         /* If it's one of these sections, assume the symbol is
703            definitely going to be output.  The code in
704            md_estimate_size_before_relax in tc-mips.c uses this test
705            as well, so if you change this code you should look at that
706            code.  */
707         if (bfd_is_und_section (symsec)
708             || bfd_is_com_section (symsec))
709           {
710             fixp->fx_addsy->sy_used_in_reloc = 1;
711 #ifdef UNDEFINED_DIFFERENCE_OK
712             /* We have the difference of an undefined symbol and some
713                other symbol.  Make sure to mark the other symbol as used
714                in a relocation so that it will always be output.  */
715             if (fixp->fx_subsy)
716               fixp->fx_subsy->sy_used_in_reloc = 1;
717 #endif
718             goto done;
719           }
720
721 #ifdef BFD_ASSEMBLER
722         /* Don't try to reduce relocs which refer to .linkonce
723            sections.  It can lead to confusion when a debugging
724            section refers to a .linkonce section.  I hope this will
725            always be correct.  */
726         if (symsec != sec
727             && ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
728                 != 0))
729           {
730             fixp->fx_addsy->sy_used_in_reloc = 1;
731 #ifdef UNDEFINED_DIFFERENCE_OK
732             if (fixp->fx_subsy != NULL)
733               fixp->fx_subsy->sy_used_in_reloc = 1;
734 #endif
735             goto done;
736           }
737 #endif
738
739         /* Since we're reducing to section symbols, don't attempt to reduce
740            anything that's already using one.  */
741         if (sym->bsym->flags & BSF_SECTION_SYM)
742           {
743             fixp->fx_addsy->sy_used_in_reloc = 1;
744             goto done;
745           }
746
747         /* Is there some other reason we can't adjust this one?  (E.g.,
748            call/bal links in i960-bout symbols.)  */
749 #ifdef obj_fix_adjustable
750         if (! obj_fix_adjustable (fixp))
751           {
752             fixp->fx_addsy->sy_used_in_reloc = 1;
753             goto done;
754           }
755 #endif
756
757         /* Is there some other (target cpu dependent) reason we can't adjust
758            this one?  (E.g. relocations involving function addresses on
759            the PA.  */
760 #ifdef tc_fix_adjustable
761         if (! tc_fix_adjustable (fixp))
762           {
763             fixp->fx_addsy->sy_used_in_reloc = 1;
764             goto done;
765           }
766 #endif
767
768         /* For PIC support: We may get expressions like
769            "_GLOBAL_OFFSET_TABLE_+(.-L5)" where "." and "L5" may not
770            necessarily have had a fixed difference initially.  But now
771            it should be a known constant, so we can reduce it.  Since
772            we can't easily handle a symbol value that looks like
773            someUndefinedSymbol+const, though, we convert the fixup to
774            access the undefined symbol directly, and discard the
775            intermediate symbol.  */
776         if (S_GET_SEGMENT (sym) == expr_section
777             && sym->sy_value.X_op == O_add
778             && (resolve_symbol_value (sym->sy_value.X_add_symbol),
779                 S_GET_SEGMENT (sym->sy_value.X_add_symbol) == undefined_section)
780             && (resolve_symbol_value (sym->sy_value.X_op_symbol),
781                 S_GET_SEGMENT (sym->sy_value.X_op_symbol) == absolute_section))
782           {
783             fixp->fx_offset += S_GET_VALUE (sym->sy_value.X_op_symbol);
784             fixp->fx_offset += sym->sy_value.X_add_number;
785             fixp->fx_addsy = sym->sy_value.X_add_symbol;
786             goto reduce_fixup;
787           }
788
789         /* If the section symbol isn't going to be output, the relocs
790            at least should still work.  If not, figure out what to do
791            when we run into that case.
792
793            We refetch the segment when calling section_symbol, rather
794            than using symsec, because S_GET_VALUE may wind up changing
795            the section when it calls resolve_symbol_value. */
796         fixp->fx_offset += S_GET_VALUE (sym);
797         fixp->fx_addsy = section_symbol (S_GET_SEGMENT (sym));
798         fixp->fx_addsy->sy_used_in_reloc = 1;
799
800       done:
801         ;
802       }
803 #if 1/*def RELOC_REQUIRES_SYMBOL*/
804     else
805       {
806         /* There was no symbol required by this relocation.  However,
807            BFD doesn't really handle relocations without symbols well.
808            (At least, the COFF support doesn't.)  So for now we fake up
809            a local symbol in the absolute section.  */
810
811         fixp->fx_addsy = section_symbol (absolute_section);
812 /*      fixp->fx_addsy->sy_used_in_reloc = 1; */
813       }
814 #endif
815
816   dump_section_relocs (abfd, sec, stderr);
817 }
818
819 static void
820 write_relocs (abfd, sec, xxx)
821      bfd *abfd;
822      asection *sec;
823      PTR xxx;
824 {
825   segment_info_type *seginfo = seg_info (sec);
826   int i;
827   unsigned int n;
828   arelent **relocs;
829   fixS *fixp;
830   char *err;
831
832   /* If seginfo is NULL, we did not create this section; don't do
833      anything with it.  */
834   if (seginfo == NULL)
835     return;
836
837   fixup_segment (seginfo->fix_root, sec);
838
839   n = 0;
840   for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
841     n++;
842
843 #ifndef RELOC_EXPANSION_POSSIBLE
844   /* Set up reloc information as well.  */
845   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
846                                              n * sizeof (arelent *));
847   memset ((char*)relocs, 0, n * sizeof (arelent*));
848
849   i = 0;
850   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
851     {
852       arelent *reloc;
853       bfd_reloc_status_type s;
854       symbolS *sym;
855
856       if (fixp->fx_done)
857         {
858           n--;
859           continue;
860         }
861
862       /* If this is an undefined symbol which was equated to another
863          symbol, then use generate the reloc against the latter symbol
864          rather than the former.  */
865       sym = fixp->fx_addsy;
866       while (sym->sy_value.X_op == O_symbol
867              && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
868         sym = sym->sy_value.X_add_symbol;
869       fixp->fx_addsy = sym;
870
871       reloc = tc_gen_reloc (sec, fixp);
872       if (!reloc)
873         {
874           n--;
875           continue;
876         }
877
878 #if 0
879       /* This test is triggered inappropriately for the SH.  */
880       if (fixp->fx_where + fixp->fx_size
881           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
882         abort ();
883 #endif
884
885       s = bfd_install_relocation (stdoutput, reloc,
886                                   fixp->fx_frag->fr_literal,
887                                   fixp->fx_frag->fr_address,
888                                   sec, &err);
889       switch (s)
890         {
891         case bfd_reloc_ok:
892           break;
893         case bfd_reloc_overflow:
894           as_bad_where (fixp->fx_file, fixp->fx_line, "relocation overflow");
895           break;
896         default:
897           as_fatal ("%s:%u: bad return from bfd_perform_relocation",
898                     fixp->fx_file, fixp->fx_line);
899         }
900       relocs[i++] = reloc;
901     }
902 #else
903   n = n * MAX_RELOC_EXPANSION;
904   /* Set up reloc information as well.  */
905   relocs = (arelent **) bfd_alloc_by_size_t (stdoutput,
906                                              n * sizeof (arelent *));
907
908   i = 0;
909   for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
910     {
911       arelent **reloc;
912       char *data;
913       bfd_reloc_status_type s;
914       symbolS *sym;
915       int j;
916
917       if (fixp->fx_done)
918         {
919           n--;
920           continue;
921         }
922
923       /* If this is an undefined symbol which was equated to another
924          symbol, then use generate the reloc against the latter symbol
925          rather than the former.  */
926       sym = fixp->fx_addsy;
927       while (sym->sy_value.X_op == O_symbol
928              && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
929         sym = sym->sy_value.X_add_symbol;
930       fixp->fx_addsy = sym;
931
932       reloc = tc_gen_reloc (sec, fixp);
933
934       for (j = 0; reloc[j]; j++)
935         {
936           relocs[i++] = reloc[j];
937           assert(i <= n);
938         }
939       data = fixp->fx_frag->fr_literal + fixp->fx_where;
940       if (fixp->fx_where + fixp->fx_size
941           > fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
942         as_bad_where (fixp->fx_file, fixp->fx_line,
943                       "internal error: fixup not contained within frag");
944       for (j = 0; reloc[j]; j++)
945         {
946           s = bfd_install_relocation (stdoutput, reloc[j],
947                                       fixp->fx_frag->fr_literal,
948                                       fixp->fx_frag->fr_address,
949                                       sec, &err);
950           switch (s)
951             {
952             case bfd_reloc_ok:
953               break;
954             case bfd_reloc_overflow:
955               as_bad_where (fixp->fx_file, fixp->fx_line,
956                             "relocation overflow");
957               break;
958             default:
959               as_fatal ("%s:%u: bad return from bfd_perform_relocation",
960                         fixp->fx_file, fixp->fx_line);
961             }
962         }
963     }
964   n = i;
965 #endif
966
967 #ifdef DEBUG4
968   {
969     int i, j, nsyms;
970     asymbol **sympp;
971     sympp = bfd_get_outsymbols (stdoutput);
972     nsyms = bfd_get_symcount (stdoutput);
973     for (i = 0; i < n; i++)
974       if (((*relocs[i]->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
975         {
976           for (j = 0; j < nsyms; j++)
977             if (sympp[j] == *relocs[i]->sym_ptr_ptr)
978               break;
979           if (j == nsyms)
980             abort ();
981         }
982   }
983 #endif
984
985   if (n)
986     bfd_set_reloc (stdoutput, sec, relocs, n);
987   else
988     bfd_set_section_flags (abfd, sec,
989                            (bfd_get_section_flags (abfd, sec)
990                             & (flagword) ~SEC_RELOC));
991
992 #ifdef DEBUG3
993   {
994     int i;
995     arelent *r;
996     asymbol *s;
997     fprintf (stderr, "relocs for sec %s\n", sec->name);
998     for (i = 0; i < n; i++)
999       {
1000         r = relocs[i];
1001         s = *r->sym_ptr_ptr;
1002         fprintf (stderr, "  reloc %2d @%08x off %4x : sym %-10s addend %x\n",
1003                  i, r, r->address, s->name, r->addend);
1004       }
1005   }
1006 #endif
1007 }
1008
1009 static void
1010 write_contents (abfd, sec, xxx)
1011      bfd *abfd;
1012      asection *sec;
1013      PTR xxx;
1014 {
1015   segment_info_type *seginfo = seg_info (sec);
1016   unsigned long offset = 0;
1017   fragS *f;
1018
1019   /* Write out the frags.  */
1020   if (seginfo == NULL
1021       || ! (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS))
1022     return;
1023
1024   for (f = seginfo->frchainP->frch_root;
1025        f;
1026        f = f->fr_next)
1027     {
1028       int x;
1029       unsigned long fill_size;
1030       char *fill_literal;
1031       long count;
1032
1033       assert (f->fr_type == rs_fill);
1034       if (f->fr_fix)
1035         {
1036           x = bfd_set_section_contents (stdoutput, sec,
1037                                         f->fr_literal, (file_ptr) offset,
1038                                         (bfd_size_type) f->fr_fix);
1039           if (x == false)
1040             {
1041               bfd_perror (stdoutput->filename);
1042               as_perror ("FATAL: Can't write %s", stdoutput->filename);
1043               exit (EXIT_FAILURE);
1044             }
1045           offset += f->fr_fix;
1046         }
1047       fill_literal = f->fr_literal + f->fr_fix;
1048       fill_size = f->fr_var;
1049       count = f->fr_offset;
1050       assert (count >= 0);
1051       if (fill_size && count)
1052         {
1053           char buf[256];
1054           if (fill_size > sizeof(buf))
1055             {
1056               /* Do it the old way. Can this ever happen? */
1057               while (count--)
1058                 {
1059                   x = bfd_set_section_contents (stdoutput, sec,
1060                                                 fill_literal,
1061                                                 (file_ptr) offset,
1062                                                 (bfd_size_type) fill_size);
1063                   if (x == false)
1064                     {
1065                       bfd_perror (stdoutput->filename);
1066                       as_perror ("FATAL: Can't write %s", stdoutput->filename);
1067                       exit (EXIT_FAILURE);
1068                     }
1069                   offset += fill_size;
1070                 }
1071             }
1072           else
1073             {
1074               /* Build a buffer full of fill objects and output it as
1075                  often as necessary. This saves on the overhead of
1076                  potentially lots of bfd_set_section_contents calls.  */
1077               int n_per_buf, i;
1078               if (fill_size == 1)
1079                 {
1080                   n_per_buf = sizeof (buf);
1081                   memset (buf, *fill_literal, n_per_buf);
1082                 }
1083               else
1084                 {
1085                   char *bufp;
1086                   n_per_buf = sizeof(buf)/fill_size;
1087                   for (i = n_per_buf, bufp = buf; i; i--, bufp += fill_size)
1088                     memcpy(bufp, fill_literal, fill_size);
1089                 }
1090               for (; count > 0; count -= n_per_buf)
1091                 {
1092                   n_per_buf = n_per_buf > count ? count : n_per_buf;
1093                   x = bfd_set_section_contents (stdoutput, sec,
1094                                                 buf, (file_ptr) offset,
1095                                                 (bfd_size_type) n_per_buf * fill_size);
1096                   if (x != true)
1097                     as_fatal ("Cannot write to output file.");
1098                   offset += n_per_buf * fill_size;
1099                 }
1100             }
1101         }
1102     }
1103 }
1104 #endif
1105
1106 #if defined(BFD_ASSEMBLER) || (!defined (BFD) && !defined(OBJ_AOUT))
1107 static void
1108 merge_data_into_text ()
1109 {
1110 #if defined(BFD_ASSEMBLER) || defined(MANY_SEGMENTS)
1111   seg_info (text_section)->frchainP->frch_last->fr_next =
1112     seg_info (data_section)->frchainP->frch_root;
1113   seg_info (text_section)->frchainP->frch_last =
1114     seg_info (data_section)->frchainP->frch_last;
1115   seg_info (data_section)->frchainP = 0;
1116 #else
1117   fixS *tmp;
1118
1119   text_last_frag->fr_next = data_frag_root;
1120   text_last_frag = data_last_frag;
1121   data_last_frag = NULL;
1122   data_frag_root = NULL;
1123   if (text_fix_root)
1124     {
1125       for (tmp = text_fix_root; tmp->fx_next; tmp = tmp->fx_next);;
1126       tmp->fx_next = data_fix_root;
1127       text_fix_tail = data_fix_tail;
1128     }
1129   else
1130     text_fix_root = data_fix_root;
1131   data_fix_root = NULL;
1132 #endif
1133 }
1134 #endif /* BFD_ASSEMBLER || (! BFD && ! OBJ_AOUT) */
1135
1136 #if !defined (BFD_ASSEMBLER) && !defined (BFD)
1137 static void
1138 relax_and_size_all_segments ()
1139 {
1140   fragS *fragP;
1141
1142   relax_segment (text_frag_root, SEG_TEXT);
1143   relax_segment (data_frag_root, SEG_DATA);
1144   relax_segment (bss_frag_root, SEG_BSS);
1145   /*
1146    * Now the addresses of frags are correct within the segment.
1147    */
1148
1149   know (text_last_frag->fr_type == rs_fill && text_last_frag->fr_offset == 0);
1150   H_SET_TEXT_SIZE (&headers, text_last_frag->fr_address);
1151   text_last_frag->fr_address = H_GET_TEXT_SIZE (&headers);
1152
1153   /*
1154    * Join the 2 segments into 1 huge segment.
1155    * To do this, re-compute every rn_address in the SEG_DATA frags.
1156    * Then join the data frags after the text frags.
1157    *
1158    * Determine a_data [length of data segment].
1159    */
1160   if (data_frag_root)
1161     {
1162       register relax_addressT slide;
1163
1164       know ((text_last_frag->fr_type == rs_fill) && (text_last_frag->fr_offset == 0));
1165
1166       H_SET_DATA_SIZE (&headers, data_last_frag->fr_address);
1167       data_last_frag->fr_address = H_GET_DATA_SIZE (&headers);
1168       slide = H_GET_TEXT_SIZE (&headers);       /* & in file of the data segment. */
1169 #ifdef OBJ_BOUT
1170 #define RoundUp(N,S) (((N)+(S)-1)&-(S))
1171       /* For b.out: If the data section has a strict alignment
1172          requirement, its load address in the .o file will be
1173          rounded up from the size of the text section.  These
1174          two values are *not* the same!  Similarly for the bss
1175          section....  */
1176       slide = RoundUp (slide, 1 << section_alignment[SEG_DATA]);
1177 #endif
1178
1179       for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
1180         {
1181           fragP->fr_address += slide;
1182         }                       /* for each data frag */
1183
1184       know (text_last_frag != 0);
1185       text_last_frag->fr_next = data_frag_root;
1186     }
1187   else
1188     {
1189       H_SET_DATA_SIZE (&headers, 0);
1190     }
1191
1192 #ifdef OBJ_BOUT
1193   /* See above comments on b.out data section address.  */
1194   {
1195     long bss_vma;
1196     if (data_last_frag == 0)
1197       bss_vma = H_GET_TEXT_SIZE (&headers);
1198     else
1199       bss_vma = data_last_frag->fr_address;
1200     bss_vma = RoundUp (bss_vma, 1 << section_alignment[SEG_BSS]);
1201     bss_address_frag.fr_address = bss_vma;
1202   }
1203 #else /* ! OBJ_BOUT */
1204   bss_address_frag.fr_address = (H_GET_TEXT_SIZE (&headers) +
1205                                  H_GET_DATA_SIZE (&headers));
1206
1207 #endif /* ! OBJ_BOUT */
1208
1209   /* Slide all the frags */
1210   if (bss_frag_root)
1211     {
1212       relax_addressT slide = bss_address_frag.fr_address;
1213
1214       for (fragP = bss_frag_root; fragP; fragP = fragP->fr_next)
1215         {
1216           fragP->fr_address += slide;
1217         }                       /* for each bss frag */
1218     }
1219
1220   if (bss_last_frag)
1221     H_SET_BSS_SIZE (&headers,
1222                     bss_last_frag->fr_address - bss_frag_root->fr_address);
1223   else
1224     H_SET_BSS_SIZE (&headers, 0);
1225 }
1226 #endif /* ! BFD_ASSEMBLER && ! BFD */
1227
1228 #if defined (BFD_ASSEMBLER) || !defined (BFD)
1229
1230 #ifdef BFD_ASSEMBLER
1231 static void
1232 set_symtab ()
1233 {
1234   int nsyms;
1235   asymbol **asympp;
1236   symbolS *symp;
1237   boolean result;
1238   extern PTR bfd_alloc PARAMS ((bfd *, size_t));
1239
1240   /* Count symbols.  We can't rely on a count made by the loop in
1241      write_object_file, because *_frob_file may add a new symbol or
1242      two.  */
1243   nsyms = 0;
1244   for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1245     nsyms++;
1246
1247   if (nsyms)
1248     {
1249       int i;
1250
1251       asympp = (asymbol **) bfd_alloc (stdoutput,
1252                                        nsyms * sizeof (asymbol *));
1253       symp = symbol_rootP;
1254       for (i = 0; i < nsyms; i++, symp = symbol_next (symp))
1255         {
1256           asympp[i] = symp->bsym;
1257           symp->written = 1;
1258         }
1259     }
1260   else
1261     asympp = 0;
1262   result = bfd_set_symtab (stdoutput, asympp, nsyms);
1263   assert (result == true);
1264   symbol_table_frozen = 1;
1265 }
1266 #endif
1267
1268 void
1269 write_object_file ()
1270 {
1271   struct frchain *frchainP;     /* Track along all frchains. */
1272 #if ! defined (BFD_ASSEMBLER) || ! defined (WORKING_DOT_WORD)
1273   fragS *fragP;                 /* Track along all frags. */
1274 #endif
1275
1276   /* Do we really want to write it?  */
1277   {
1278     int n_warns, n_errs;
1279     n_warns = had_warnings ();
1280     n_errs = had_errors ();
1281     /* The -Z flag indicates that an object file should be generated,
1282        regardless of warnings and errors.  */
1283     if (flag_always_generate_output)
1284       {
1285         if (n_warns || n_errs)
1286           as_warn ("%d error%s, %d warning%s, generating bad object file.\n",
1287                    n_errs, n_errs == 1 ? "" : "s",
1288                    n_warns, n_warns == 1 ? "" : "s");
1289       }
1290     else
1291       {
1292         if (n_errs)
1293           as_fatal ("%d error%s, %d warning%s, no object file generated.\n",
1294                     n_errs, n_errs == 1 ? "" : "s",
1295                     n_warns, n_warns == 1 ? "" : "s");
1296       }
1297   }
1298
1299 #ifdef  OBJ_VMS
1300   /* Under VMS we try to be compatible with VAX-11 "C".  Thus, we call
1301      a routine to check for the definition of the procedure "_main",
1302      and if so -- fix it up so that it can be program entry point. */
1303   vms_check_for_main ();
1304 #endif /* OBJ_VMS */
1305
1306   /* After every sub-segment, we fake an ".align ...". This conforms to
1307      BSD4.2 brane-damage. We then fake ".fill 0" because that is the kind of
1308      frag that requires least thought. ".align" frags like to have a
1309      following frag since that makes calculating their intended length
1310      trivial.
1311
1312      @@ Is this really necessary??  */
1313 #ifndef SUB_SEGMENT_ALIGN
1314 #ifdef BFD_ASSEMBLER
1315 #define SUB_SEGMENT_ALIGN(SEG) (0)
1316 #else
1317 #define SUB_SEGMENT_ALIGN(SEG) (2)
1318 #endif
1319 #endif
1320   for (frchainP = frchain_root; frchainP; frchainP = frchainP->frch_next)
1321     {
1322       subseg_set (frchainP->frch_seg, frchainP->frch_subseg);
1323       frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE);
1324       /* frag_align will have left a new frag.
1325          Use this last frag for an empty ".fill".
1326
1327          For this segment ...
1328          Create a last frag. Do not leave a "being filled in frag".  */
1329       frag_wane (frag_now);
1330       frag_now->fr_fix = 0;
1331       know (frag_now->fr_next == NULL);
1332     }
1333
1334   /* From now on, we don't care about sub-segments.  Build one frag chain
1335      for each segment. Linked thru fr_next.  */
1336
1337 #ifdef BFD_ASSEMBLER
1338   /* Remove the sections created by gas for its own purposes.  */
1339   {
1340     asection **seclist, *sec;
1341     int i;
1342
1343     seclist = &stdoutput->sections;
1344     while (seclist && *seclist)
1345       {
1346         sec = *seclist;
1347         while (sec == reg_section || sec == expr_section)
1348           {
1349             sec = sec->next;
1350             *seclist = sec;
1351             stdoutput->section_count--;
1352             if (!sec)
1353               break;
1354           }
1355         if (*seclist)
1356           seclist = &(*seclist)->next;
1357       }
1358     i = 0;
1359     bfd_map_over_sections (stdoutput, renumber_sections, &i);
1360   }
1361
1362   bfd_map_over_sections (stdoutput, chain_frchains_together, (char *) 0);
1363 #else
1364   remove_subsegs (frchain_root, SEG_TEXT, &text_frag_root, &text_last_frag);
1365   remove_subsegs (data0_frchainP, SEG_DATA, &data_frag_root, &data_last_frag);
1366   remove_subsegs (bss0_frchainP, SEG_BSS, &bss_frag_root, &bss_last_frag);
1367 #endif
1368
1369   /* We have two segments. If user gave -R flag, then we must put the
1370      data frags into the text segment. Do this before relaxing so
1371      we know to take advantage of -R and make shorter addresses.  */
1372 #if !defined (OBJ_AOUT) || defined (BFD_ASSEMBLER)
1373   if (flag_readonly_data_in_text)
1374     {
1375       merge_data_into_text ();
1376     }
1377 #endif
1378
1379 #ifdef BFD_ASSEMBLER
1380   bfd_map_over_sections (stdoutput, relax_and_size_seg, (char *) 0);
1381 #else
1382   relax_and_size_all_segments ();
1383 #endif /* BFD_ASSEMBLER */
1384
1385 #ifndef BFD_ASSEMBLER
1386   /*
1387    *
1388    * Crawl the symbol chain.
1389    *
1390    * For each symbol whose value depends on a frag, take the address of
1391    * that frag and subsume it into the value of the symbol.
1392    * After this, there is just one way to lookup a symbol value.
1393    * Values are left in their final state for object file emission.
1394    * We adjust the values of 'L' local symbols, even if we do
1395    * not intend to emit them to the object file, because their values
1396    * are needed for fix-ups.
1397    *
1398    * Unless we saw a -L flag, remove all symbols that begin with 'L'
1399    * from the symbol chain.  (They are still pointed to by the fixes.)
1400    *
1401    * Count the remaining symbols.
1402    * Assign a symbol number to each symbol.
1403    * Count the number of string-table chars we will emit.
1404    * Put this info into the headers as appropriate.
1405    *
1406    */
1407   know (zero_address_frag.fr_address == 0);
1408   string_byte_count = sizeof (string_byte_count);
1409
1410   obj_crawl_symbol_chain (&headers);
1411
1412   if (string_byte_count == sizeof (string_byte_count))
1413     string_byte_count = 0;
1414
1415   H_SET_STRING_SIZE (&headers, string_byte_count);
1416
1417   /*
1418    * Addresses of frags now reflect addresses we use in the object file.
1419    * Symbol values are correct.
1420    * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
1421    * Also converting any machine-dependent frags using md_convert_frag();
1422    */
1423   subseg_change (SEG_TEXT, 0);
1424
1425   for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1426     {
1427       cvt_frag_to_fill (&headers, SEG_TEXT, fragP);
1428
1429       /* Some assert macros don't work with # directives mixed in.  */
1430 #ifndef NDEBUG
1431       if (!(fragP->fr_next == NULL
1432 #ifdef OBJ_BOUT
1433             || fragP->fr_next == data_frag_root
1434 #endif
1435             || ((fragP->fr_next->fr_address - fragP->fr_address)
1436                 == (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
1437         abort ();
1438 #endif
1439     }
1440 #endif /* ! BFD_ASSEMBLER */
1441
1442 #ifndef WORKING_DOT_WORD
1443   {
1444     struct broken_word *lie;
1445     struct broken_word **prevP;
1446
1447     prevP = &broken_words;
1448     for (lie = broken_words; lie; lie = lie->next_broken_word)
1449       if (!lie->added)
1450         {
1451           expressionS exp;
1452
1453           exp.X_op = O_subtract;
1454           exp.X_add_symbol = lie->add;
1455           exp.X_op_symbol = lie->sub;
1456           exp.X_add_number = lie->addnum;
1457 #ifdef BFD_ASSEMBLER
1458 #ifdef TC_CONS_FIX_NEW
1459           TC_CONS_FIX_NEW (lie->frag,
1460                        lie->word_goes_here - lie->frag->fr_literal,
1461                        2, &exp);
1462 #else
1463           fix_new_exp (lie->frag,
1464                        lie->word_goes_here - lie->frag->fr_literal,
1465                        2, &exp, 0, BFD_RELOC_16);
1466 #endif
1467 #else
1468 #if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
1469           fix_new_exp (lie->frag,
1470                        lie->word_goes_here - lie->frag->fr_literal,
1471                        2, &exp, 0, NO_RELOC);
1472 #else
1473 #ifdef TC_NS32K
1474           fix_new_ns32k_exp (lie->frag,
1475                              lie->word_goes_here - lie->frag->fr_literal,
1476                              2, &exp, 0, 0, 2, 0, 0);
1477 #else
1478           fix_new_exp (lie->frag,
1479                        lie->word_goes_here - lie->frag->fr_literal,
1480                        2, &exp, 0, 0);
1481 #endif /* TC_NS32K */
1482 #endif /* TC_SPARC|TC_A29K|NEED_FX_R_TYPE */
1483 #endif /* BFD_ASSEMBLER */
1484           *prevP = lie->next_broken_word;
1485         }
1486       else
1487         prevP = &(lie->next_broken_word);
1488
1489     for (lie = broken_words; lie;)
1490       {
1491         struct broken_word *untruth;
1492         char *table_ptr;
1493         addressT table_addr;
1494         addressT from_addr, to_addr;
1495         int n, m;
1496
1497         fragP = lie->dispfrag;
1498
1499         /* Find out how many broken_words go here.  */
1500         n = 0;
1501         for (untruth = lie; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1502           if (untruth->added == 1)
1503             n++;
1504
1505         table_ptr = lie->dispfrag->fr_opcode;
1506         table_addr = lie->dispfrag->fr_address + (table_ptr - lie->dispfrag->fr_literal);
1507         /* Create the jump around the long jumps.  This is a short
1508            jump from table_ptr+0 to table_ptr+n*long_jump_size.  */
1509         from_addr = table_addr;
1510         to_addr = table_addr + md_short_jump_size + n * md_long_jump_size;
1511         md_create_short_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1512         table_ptr += md_short_jump_size;
1513         table_addr += md_short_jump_size;
1514
1515         for (m = 0; lie && lie->dispfrag == fragP; m++, lie = lie->next_broken_word)
1516           {
1517             if (lie->added == 2)
1518               continue;
1519             /* Patch the jump table */
1520             /* This is the offset from ??? to table_ptr+0 */
1521             to_addr = table_addr - S_GET_VALUE (lie->sub);
1522 #ifdef BFD_ASSEMBLER
1523             to_addr -= lie->sub->sy_frag->fr_address;
1524 #endif
1525             md_number_to_chars (lie->word_goes_here, to_addr, 2);
1526             for (untruth = lie->next_broken_word; untruth && untruth->dispfrag == fragP; untruth = untruth->next_broken_word)
1527               {
1528                 if (untruth->use_jump == lie)
1529                   md_number_to_chars (untruth->word_goes_here, to_addr, 2);
1530               }
1531
1532             /* Install the long jump */
1533             /* this is a long jump from table_ptr+0 to the final target */
1534             from_addr = table_addr;
1535             to_addr = S_GET_VALUE (lie->add) + lie->addnum;
1536 #ifdef BFD_ASSEMBLER
1537             to_addr += lie->add->sy_frag->fr_address;
1538 #endif
1539             md_create_long_jump (table_ptr, from_addr, to_addr, lie->dispfrag, lie->add);
1540             table_ptr += md_long_jump_size;
1541             table_addr += md_long_jump_size;
1542           }
1543       }
1544   }
1545 #endif /* not WORKING_DOT_WORD */
1546
1547 #ifndef BFD_ASSEMBLER
1548 #ifndef OBJ_VMS
1549   {                             /* not vms */
1550     char *the_object_file;
1551     long object_file_size;
1552     /*
1553      * Scan every FixS performing fixups. We had to wait until now to do
1554      * this because md_convert_frag() may have made some fixSs.
1555      */
1556     int trsize, drsize;
1557
1558     subseg_change (SEG_TEXT, 0);
1559     trsize = md_reloc_size * fixup_segment (text_fix_root, SEG_TEXT);
1560     subseg_change (SEG_DATA, 0);
1561     drsize = md_reloc_size * fixup_segment (data_fix_root, SEG_DATA);
1562     H_SET_RELOCATION_SIZE (&headers, trsize, drsize);
1563
1564     /* FIXME move this stuff into the pre-write-hook */
1565     H_SET_MAGIC_NUMBER (&headers, magic_number_for_object_file);
1566     H_SET_ENTRY_POINT (&headers, 0);
1567
1568     obj_pre_write_hook (&headers);      /* extra coff stuff */
1569
1570     object_file_size = H_GET_FILE_SIZE (&headers);
1571     next_object_file_charP = the_object_file = xmalloc (object_file_size);
1572
1573     output_file_create (out_file_name);
1574
1575     obj_header_append (&next_object_file_charP, &headers);
1576
1577     know ((next_object_file_charP - the_object_file) == H_GET_HEADER_SIZE (&headers));
1578
1579     /*
1580      * Emit code.
1581      */
1582     for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
1583       {
1584         register long count;
1585         register char *fill_literal;
1586         register long fill_size;
1587
1588         PROGRESS (1);
1589         know (fragP->fr_type == rs_fill);
1590         append (&next_object_file_charP, fragP->fr_literal, (unsigned long) fragP->fr_fix);
1591         fill_literal = fragP->fr_literal + fragP->fr_fix;
1592         fill_size = fragP->fr_var;
1593         know (fragP->fr_offset >= 0);
1594
1595         for (count = fragP->fr_offset; count; count--)
1596           {
1597             append (&next_object_file_charP, fill_literal, (unsigned long) fill_size);
1598           }                     /* for each  */
1599
1600       }                         /* for each code frag. */
1601
1602     know ((next_object_file_charP - the_object_file) == (H_GET_HEADER_SIZE (&headers) + H_GET_TEXT_SIZE (&headers) + H_GET_DATA_SIZE (&headers)));
1603
1604     /*
1605      * Emit relocations.
1606      */
1607     obj_emit_relocations (&next_object_file_charP, text_fix_root, (relax_addressT) 0);
1608     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)));
1609 #ifdef TC_I960
1610     /* Make addresses in data relocation directives relative to beginning of
1611      * first data fragment, not end of last text fragment:  alignment of the
1612      * start of the data segment may place a gap between the segments.
1613      */
1614     obj_emit_relocations (&next_object_file_charP, data_fix_root, data0_frchainP->frch_root->fr_address);
1615 #else /* TC_I960 */
1616     obj_emit_relocations (&next_object_file_charP, data_fix_root, text_last_frag->fr_address);
1617 #endif /* TC_I960 */
1618
1619     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)));
1620
1621     /*
1622      * Emit line number entries.
1623      */
1624     OBJ_EMIT_LINENO (&next_object_file_charP, lineno_rootP, the_object_file);
1625     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)));
1626
1627     /*
1628      * Emit symbols.
1629      */
1630     obj_emit_symbols (&next_object_file_charP, symbol_rootP);
1631     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)));
1632
1633     /*
1634      * Emit strings.
1635      */
1636
1637     if (string_byte_count > 0)
1638       {
1639         obj_emit_strings (&next_object_file_charP);
1640       }                         /* only if we have a string table */
1641
1642 #ifdef BFD_HEADERS
1643     bfd_seek (stdoutput, 0, 0);
1644     bfd_write (the_object_file, 1, object_file_size, stdoutput);
1645 #else
1646
1647     /* Write the data to the file */
1648     output_file_append (the_object_file, object_file_size, out_file_name);
1649     free (the_object_file);
1650 #endif
1651   }                             /* non vms output */
1652 #else /* OBJ_VMS */
1653   /*
1654    *    Now do the VMS-dependent part of writing the object file
1655    */
1656   vms_write_object_file (H_GET_TEXT_SIZE (&headers),
1657                          H_GET_DATA_SIZE (&headers),
1658                          H_GET_BSS_SIZE (&headers),
1659                          text_frag_root, data_frag_root);
1660 #endif /* OBJ_VMS */
1661 #else /* BFD_ASSEMBLER */
1662
1663   /* Resolve symbol values.  This needs to be done before processing
1664      the relocations.  */
1665   if (symbol_rootP)
1666     {
1667       symbolS *symp;
1668
1669       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1670         if (!symp->sy_resolved)
1671           resolve_symbol_value (symp);
1672     }
1673
1674   PROGRESS (1);
1675
1676 #ifdef tc_frob_file_before_adjust
1677   tc_frob_file_before_adjust ();
1678 #endif
1679 #ifdef obj_frob_file_before_adjust
1680   obj_frob_file_before_adjust ();
1681 #endif
1682
1683   bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
1684
1685   /* Set up symbol table, and write it out.  */
1686   if (symbol_rootP)
1687     {
1688       symbolS *symp;
1689
1690       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1691         {
1692           int punt = 0;
1693           const char *name;
1694
1695           if (symp->sy_mri_common)
1696             {
1697               if (S_IS_EXTERNAL (symp))
1698                 as_bad ("%s: global symbols not supported in common sections",
1699                         S_GET_NAME (symp));
1700               symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1701               continue;
1702             }
1703
1704           name = S_GET_NAME (symp);
1705           if (name)
1706             {
1707               const char *name2 = decode_local_label_name ((char *)S_GET_NAME (symp));
1708               /* They only differ if `name' is a fb or dollar local
1709                  label name.  */
1710               if (name2 != name && ! S_IS_DEFINED (symp))
1711                 as_bad ("local label %s is not defined", name2);
1712             }
1713
1714           /* Do it again, because adjust_reloc_syms might introduce
1715              more symbols.  They'll probably only be section symbols,
1716              but they'll still need to have the values computed.  */
1717           if (! symp->sy_resolved)
1718             {
1719               if (symp->sy_value.X_op == O_constant)
1720                 {
1721                   /* This is the normal case; skip the call.  */
1722                   S_SET_VALUE (symp,
1723                                (S_GET_VALUE (symp)
1724                                 + symp->sy_frag->fr_address));
1725                   symp->sy_resolved = 1;
1726                 }
1727               else
1728                 resolve_symbol_value (symp);
1729             }
1730
1731           /* Skip symbols which were equated to undefined or common
1732              symbols.  */
1733           if (symp->sy_value.X_op == O_symbol
1734               && (! S_IS_DEFINED (symp) || S_IS_COMMON (symp)))
1735             {
1736               symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1737               continue;
1738             }
1739
1740           /* So far, common symbols have been treated like undefined symbols.
1741              Put them in the common section now.  */
1742           if (S_IS_DEFINED (symp) == 0
1743               && S_GET_VALUE (symp) != 0)
1744             S_SET_SEGMENT (symp, bfd_com_section_ptr);
1745 #if 0
1746           printf ("symbol `%s'\n\t@%x: value=%d flags=%x seg=%s\n",
1747                   S_GET_NAME (symp), symp,
1748                   S_GET_VALUE (symp),
1749                   symp->bsym->flags,
1750                   segment_name (symp->bsym->section));
1751 #endif
1752
1753 #ifdef obj_frob_symbol
1754           obj_frob_symbol (symp, punt);
1755 #endif
1756 #ifdef tc_frob_symbol
1757           if (! punt || symp->sy_used_in_reloc)
1758             tc_frob_symbol (symp, punt);
1759 #endif
1760
1761           /* If we don't want to keep this symbol, splice it out of
1762              the chain now.  If EMIT_SECTION_SYMBOLS is 0, we never
1763              want section symbols.  Otherwise, we skip local symbols
1764              and symbols that the frob_symbol macros told us to punt,
1765              but we keep such symbols if they are used in relocs.  */
1766           if ((! EMIT_SECTION_SYMBOLS
1767                && (symp->bsym->flags & BSF_SECTION_SYM) != 0)
1768               /* Note that S_IS_EXTERN and S_IS_LOCAL are not always
1769                  opposites.  Sometimes the former checks flags and the
1770                  latter examines the name...  */
1771               || (!S_IS_EXTERN (symp)
1772                   && (S_IS_LOCAL (symp) || punt)
1773                   && ! symp->sy_used_in_reloc))
1774             {
1775               symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1776               /* After symbol_remove, symbol_next(symp) still returns
1777                  the one that came after it in the chain.  So we don't
1778                  need to do any extra cleanup work here.  */
1779
1780               continue;
1781             }
1782
1783           /* Make sure we really got a value for the symbol.  */
1784           if (! symp->sy_resolved)
1785             {
1786               as_bad ("can't resolve value for symbol \"%s\"",
1787                       S_GET_NAME (symp));
1788               symp->sy_resolved = 1;
1789             }
1790
1791           /* Set the value into the BFD symbol.  Up til now the value
1792              has only been kept in the gas symbolS struct.  */
1793           symp->bsym->value = S_GET_VALUE (symp);
1794         }
1795     }
1796
1797   PROGRESS (1);
1798
1799   /* Now do any format-specific adjustments to the symbol table, such
1800      as adding file symbols.  */
1801 #ifdef tc_adjust_symtab
1802   tc_adjust_symtab ();
1803 #endif
1804 #ifdef obj_adjust_symtab
1805   obj_adjust_symtab ();
1806 #endif
1807
1808   /* Now that all the sizes are known, and contents correct, we can
1809      start writing to the file.  */
1810   set_symtab ();
1811
1812   /* If *_frob_file changes the symbol value at this point, it is
1813      responsible for moving the changed value into symp->bsym->value
1814      as well.  Hopefully all symbol value changing can be done in
1815      *_frob_symbol.  */
1816 #ifdef tc_frob_file
1817   tc_frob_file ();
1818 #endif
1819 #ifdef obj_frob_file
1820   obj_frob_file ();
1821 #endif
1822
1823   bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
1824
1825 #ifdef tc_frob_file_after_relocs
1826   tc_frob_file_after_relocs ();
1827 #endif
1828 #ifdef obj_frob_file_after_relocs
1829   obj_frob_file_after_relocs ();
1830 #endif
1831
1832   bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
1833 #endif /* BFD_ASSEMBLER */
1834 }
1835 #endif /* ! BFD */
1836
1837 /*
1838  *                      relax_segment()
1839  *
1840  * Now we have a segment, not a crowd of sub-segments, we can make fr_address
1841  * values.
1842  *
1843  * Relax the frags.
1844  *
1845  * After this, all frags in this segment have addresses that are correct
1846  * within the segment. Since segments live in different file addresses,
1847  * these frag addresses may not be the same as final object-file addresses.
1848  */
1849
1850 #ifndef md_relax_frag
1851 #ifdef TC_GENERIC_RELAX_TABLE
1852
1853 /* Subroutines of relax_segment.  */
1854 static int
1855 is_dnrange (f1, f2)
1856      struct frag *f1;
1857      struct frag *f2;
1858 {
1859   for (; f1; f1 = f1->fr_next)
1860     if (f1->fr_next == f2)
1861       return 1;
1862   return 0;
1863 }
1864
1865 #endif /* defined (TC_GENERIC_RELAX_TABLE) */
1866 #endif /* ! defined (md_relax_frag) */
1867
1868 /* Relax_align. Advance location counter to next address that has 'alignment'
1869    lowest order bits all 0s, return size of adjustment made.  */
1870 static relax_addressT
1871 relax_align (address, alignment)
1872      register relax_addressT address;   /* Address now. */
1873      register int alignment;    /* Alignment (binary). */
1874 {
1875   relax_addressT mask;
1876   relax_addressT new_address;
1877
1878   mask = ~((~0) << alignment);
1879   new_address = (address + mask) & (~mask);
1880 #ifdef LINKER_RELAXING_SHRINKS_ONLY
1881   if (linkrelax)
1882     /* We must provide lots of padding, so the linker can discard it
1883        when needed.  The linker will not add extra space, ever.  */
1884     new_address += (1 << alignment);
1885 #endif
1886   return (new_address - address);
1887 }
1888
1889 void
1890 relax_segment (segment_frag_root, segment)
1891      struct frag *segment_frag_root;
1892      segT segment;
1893 {
1894   register struct frag *fragP;
1895   register relax_addressT address;
1896 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
1897   know (segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS);
1898 #endif
1899   /* In case md_estimate_size_before_relax() wants to make fixSs. */
1900   subseg_change (segment, 0);
1901
1902   /* For each frag in segment: count and store  (a 1st guess of)
1903      fr_address.  */
1904   address = 0;
1905   for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1906     {
1907       fragP->fr_address = address;
1908       address += fragP->fr_fix;
1909
1910       switch (fragP->fr_type)
1911         {
1912         case rs_fill:
1913           address += fragP->fr_offset * fragP->fr_var;
1914           break;
1915
1916         case rs_align:
1917         case rs_align_code:
1918           {
1919             int offset = relax_align (address, (int) fragP->fr_offset);
1920             if (offset % fragP->fr_var != 0)
1921               {
1922                 as_bad ("alignment padding (%d bytes) not a multiple of %ld",
1923                         offset, (long) fragP->fr_var);
1924                 offset -= (offset % fragP->fr_var);
1925               }
1926             address += offset;
1927           }
1928           break;
1929
1930         case rs_org:
1931         case rs_space:
1932           /* Assume .org is nugatory. It will grow with 1st relax.  */
1933           break;
1934
1935         case rs_machine_dependent:
1936           address += md_estimate_size_before_relax (fragP, segment);
1937           break;
1938
1939 #ifndef WORKING_DOT_WORD
1940           /* Broken words don't concern us yet */
1941         case rs_broken_word:
1942           break;
1943 #endif
1944
1945         default:
1946           BAD_CASE (fragP->fr_type);
1947           break;
1948         }                       /* switch(fr_type) */
1949     }                           /* for each frag in the segment */
1950
1951   /* Do relax().  */
1952   {
1953     long stretch;       /* May be any size, 0 or negative. */
1954     /* Cumulative number of addresses we have */
1955     /* relaxed this pass. */
1956     /* We may have relaxed more than one address. */
1957     long stretched;     /* Have we stretched on this pass? */
1958     /* This is 'cuz stretch may be zero, when, in fact some piece of code
1959        grew, and another shrank.  If a branch instruction doesn't fit anymore,
1960        we could be scrod.  */
1961
1962     do
1963       {
1964         stretch = stretched = 0;
1965         for (fragP = segment_frag_root; fragP; fragP = fragP->fr_next)
1966           {
1967             long growth = 0;
1968             unsigned long was_address;
1969             long offset;
1970             symbolS *symbolP;
1971             long target;
1972             long after;
1973
1974             was_address = fragP->fr_address;
1975             address = fragP->fr_address += stretch;
1976             symbolP = fragP->fr_symbol;
1977             offset = fragP->fr_offset;
1978
1979             switch (fragP->fr_type)
1980               {
1981               case rs_fill:     /* .fill never relaxes. */
1982                 growth = 0;
1983                 break;
1984
1985 #ifndef WORKING_DOT_WORD
1986                 /* JF:  This is RMS's idea.  I do *NOT* want to be blamed
1987                    for it I do not want to write it.  I do not want to have
1988                    anything to do with it.  This is not the proper way to
1989                    implement this misfeature.  */
1990               case rs_broken_word:
1991                 {
1992                   struct broken_word *lie;
1993                   struct broken_word *untruth;
1994
1995                   /* Yes this is ugly (storing the broken_word pointer
1996                      in the symbol slot).  Still, this whole chunk of
1997                      code is ugly, and I don't feel like doing anything
1998                      about it.  Think of it as stubbornness in action.  */
1999                   growth = 0;
2000                   for (lie = (struct broken_word *) (fragP->fr_symbol);
2001                        lie && lie->dispfrag == fragP;
2002                        lie = lie->next_broken_word)
2003                     {
2004
2005                       if (lie->added)
2006                         continue;
2007
2008                       offset = (lie->add->sy_frag->fr_address
2009                                 + S_GET_VALUE (lie->add)
2010                                 + lie->addnum
2011                                 - (lie->sub->sy_frag->fr_address
2012                                    + S_GET_VALUE (lie->sub)));
2013                       if (offset <= -32768 || offset >= 32767)
2014                         {
2015                           if (flag_warn_displacement)
2016                             {
2017                               char buf[50];
2018                               sprint_value (buf, (addressT) lie->addnum);
2019                               as_warn (".word %s-%s+%s didn't fit",
2020                                        S_GET_NAME (lie->add),
2021                                        S_GET_NAME (lie->sub),
2022                                        buf);
2023                             }
2024                           lie->added = 1;
2025                           if (fragP->fr_subtype == 0)
2026                             {
2027                               fragP->fr_subtype++;
2028                               growth += md_short_jump_size;
2029                             }
2030                           for (untruth = lie->next_broken_word;
2031                                untruth && untruth->dispfrag == lie->dispfrag;
2032                                untruth = untruth->next_broken_word)
2033                             if ((untruth->add->sy_frag == lie->add->sy_frag)
2034                                 && S_GET_VALUE (untruth->add) == S_GET_VALUE (lie->add))
2035                               {
2036                                 untruth->added = 2;
2037                                 untruth->use_jump = lie;
2038                               }
2039                           growth += md_long_jump_size;
2040                         }
2041                     }
2042
2043                   break;
2044                 }               /* case rs_broken_word */
2045 #endif
2046               case rs_align:
2047               case rs_align_code:
2048                 growth = (relax_align ((relax_addressT) (address
2049                                                          + fragP->fr_fix),
2050                                        (int) offset)
2051                           - relax_align ((relax_addressT) (was_address
2052                                                            + fragP->fr_fix),
2053                                          (int) offset));
2054                 break;
2055
2056               case rs_org:
2057                 target = offset;
2058
2059                 if (symbolP)
2060                   {
2061 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
2062                     know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
2063                           || (S_GET_SEGMENT (symbolP) == SEG_DATA)
2064                           || (S_GET_SEGMENT (symbolP) == SEG_TEXT)
2065                           || S_GET_SEGMENT (symbolP) == SEG_BSS);
2066                     know (symbolP->sy_frag);
2067                     know (!(S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
2068                           || (symbolP->sy_frag == &zero_address_frag));
2069 #endif
2070                     target += S_GET_VALUE (symbolP)
2071                       + symbolP->sy_frag->fr_address;
2072                   }             /* if we have a symbol */
2073
2074                 know (fragP->fr_next);
2075                 after = fragP->fr_next->fr_address;
2076                 growth = target - after;
2077                 if (growth < 0)
2078                   {
2079                     /* Growth may be negative, but variable part of frag
2080                        cannot have fewer than 0 chars.  That is, we can't
2081                        .org backwards. */
2082                     as_bad ("attempt to .org backwards ignored");
2083                     growth = 0;
2084                   }
2085
2086                 growth -= stretch;      /* This is an absolute growth factor */
2087                 break;
2088
2089               case rs_space:
2090                 if (symbolP)
2091                   {
2092                     growth = S_GET_VALUE (symbolP);
2093                     if (symbolP->sy_frag != &zero_address_frag)
2094                       as_bad (".space specifies non-absolute value");
2095                     fragP->fr_symbol = 0;
2096                     if (growth < 0)
2097                       {
2098                         as_warn (".space or .fill with negative value, ignored");
2099                         growth = 0;
2100                       }
2101                   }
2102                 else
2103                   growth = 0;
2104                 break;
2105
2106               case rs_machine_dependent:
2107 #ifdef md_relax_frag
2108                 growth = md_relax_frag (fragP, stretch);
2109 #else
2110 #ifdef TC_GENERIC_RELAX_TABLE
2111                 /* The default way to relax a frag is to look through
2112                    md_relax_table.  */
2113                 {
2114                   const relax_typeS *this_type;
2115                   const relax_typeS *start_type;
2116                   relax_substateT next_state;
2117                   relax_substateT this_state;
2118                   long aim;
2119                   const relax_typeS *table = TC_GENERIC_RELAX_TABLE;
2120
2121                   this_state = fragP->fr_subtype;
2122                   start_type = this_type = table + this_state;
2123                   target = offset;
2124
2125                   if (symbolP)
2126                     {
2127 #ifndef DIFF_EXPR_OK
2128 #if !defined (MANY_SEGMENTS) && !defined (BFD_ASSEMBLER)
2129                       know ((S_GET_SEGMENT (symbolP) == SEG_ABSOLUTE)
2130                             || (S_GET_SEGMENT (symbolP) == SEG_DATA)
2131                             || (S_GET_SEGMENT (symbolP) == SEG_BSS)
2132                             || (S_GET_SEGMENT (symbolP) == SEG_TEXT));
2133 #endif
2134                       know (symbolP->sy_frag);
2135 #endif
2136                       know (!(S_GET_SEGMENT (symbolP) == absolute_section)
2137                             || symbolP->sy_frag == &zero_address_frag);
2138                       target +=
2139                         S_GET_VALUE (symbolP)
2140                         + symbolP->sy_frag->fr_address;
2141
2142                       /* If frag has yet to be reached on this pass,
2143                          assume it will move by STRETCH just as we did.
2144                          If this is not so, it will be because some frag
2145                          between grows, and that will force another pass.
2146
2147                          Beware zero-length frags.
2148
2149                          There should be a faster way to do this.  */
2150
2151                       if (symbolP->sy_frag->fr_address >= was_address
2152                           && is_dnrange (fragP, symbolP->sy_frag))
2153                         {
2154                           target += stretch;
2155                         }
2156                     }
2157
2158                   aim = target - address - fragP->fr_fix;
2159 #ifdef TC_PCREL_ADJUST
2160                   /* Currently only the ns32k family needs this */
2161                   aim += TC_PCREL_ADJUST(fragP);
2162 #else
2163                   /* This machine doesn't want to use pcrel_adjust.
2164                      In that case, pcrel_adjust should be zero.  */
2165                   assert (fragP->fr_pcrel_adjust == 0);
2166 #endif
2167
2168                   if (aim < 0)
2169                     {
2170                       /* Look backwards. */
2171                       for (next_state = this_type->rlx_more; next_state;)
2172                         if (aim >= this_type->rlx_backward)
2173                           next_state = 0;
2174                         else
2175                           {
2176                             /* Grow to next state. */
2177                             this_state = next_state;
2178                             this_type = table + this_state;
2179                             next_state = this_type->rlx_more;
2180                           }
2181                     }
2182                   else
2183                     {
2184 #ifdef M68K_AIM_KLUDGE
2185                       M68K_AIM_KLUDGE (aim, this_state, this_type);
2186 #endif
2187                       /* Look forwards. */
2188                       for (next_state = this_type->rlx_more; next_state;)
2189                         if (aim <= this_type->rlx_forward)
2190                           next_state = 0;
2191                         else
2192                           {
2193                             /* Grow to next state. */
2194                             this_state = next_state;
2195                             this_type = table + this_state;
2196                             next_state = this_type->rlx_more;
2197                           }
2198                     }
2199
2200                   growth = this_type->rlx_length - start_type->rlx_length;
2201                   if (growth != 0)
2202                     fragP->fr_subtype = this_state;
2203                 }
2204 #endif /* TC_GENERIC_RELAX_TABLE */
2205 #endif
2206                 break;
2207
2208               default:
2209                 BAD_CASE (fragP->fr_type);
2210                 break;
2211               }
2212             if (growth)
2213               {
2214                 stretch += growth;
2215                 stretched++;
2216               }
2217           }                     /* For each frag in the segment. */
2218       }
2219     while (stretched);          /* Until nothing further to relax. */
2220   }                             /* do_relax */
2221
2222   /*
2223    * We now have valid fr_address'es for each frag.
2224    */
2225
2226   /*
2227    * All fr_address's are correct, relative to their own segment.
2228    * We have made all the fixS we will ever make.
2229    */
2230 }                               /* relax_segment() */
2231
2232 #if defined (BFD_ASSEMBLER) || (!defined (BFD) && !defined (OBJ_VMS))
2233
2234 #ifndef TC_RELOC_RTSYM_LOC_FIXUP
2235 #define TC_RELOC_RTSYM_LOC_FIXUP(X) (1)
2236 #endif
2237
2238 /* fixup_segment()
2239
2240    Go through all the fixS's in a segment and see which ones can be
2241    handled now.  (These consist of fixS where we have since discovered
2242    the value of a symbol, or the address of the frag involved.)
2243    For each one, call md_apply_fix to put the fix into the frag data.
2244
2245    Result is a count of how many relocation structs will be needed to
2246    handle the remaining fixS's that we couldn't completely handle here.
2247    These will be output later by emit_relocations().  */
2248
2249 static long
2250 fixup_segment (fixP, this_segment_type)
2251      register fixS *fixP;
2252      segT this_segment_type;    /* N_TYPE bits for segment. */
2253 {
2254   long seg_reloc_count = 0;
2255   symbolS *add_symbolP;
2256   symbolS *sub_symbolP;
2257   valueT add_number;
2258   int size;
2259   char *place;
2260   long where;
2261   int pcrel, plt;
2262   fragS *fragP;
2263   segT add_symbol_segment = absolute_section;
2264
2265   /* If the linker is doing the relaxing, we must not do any fixups.
2266
2267      Well, strictly speaking that's not true -- we could do any that are
2268      PC-relative and don't cross regions that could change size.  And for the
2269      i960 (the only machine for which we've got a relaxing linker right now),
2270      we might be able to turn callx/callj into bal anyways in cases where we
2271      know the maximum displacement.  */
2272   if (linkrelax)
2273     {
2274       for (; fixP; fixP = fixP->fx_next)
2275         seg_reloc_count++;
2276       TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count);
2277       return seg_reloc_count;
2278     }
2279
2280   for (; fixP; fixP = fixP->fx_next)
2281     {
2282 #ifdef DEBUG5
2283       fprintf (stderr, "\nprocessing fixup:\n");
2284       print_fixup (fixP);
2285 #endif
2286
2287       fragP = fixP->fx_frag;
2288       know (fragP);
2289       where = fixP->fx_where;
2290       place = fragP->fr_literal + where;
2291       size = fixP->fx_size;
2292       add_symbolP = fixP->fx_addsy;
2293 #ifdef TC_VALIDATE_FIX
2294       TC_VALIDATE_FIX (fixP, this_segment_type, skip);
2295 #endif
2296       sub_symbolP = fixP->fx_subsy;
2297       add_number = fixP->fx_offset;
2298       pcrel = fixP->fx_pcrel;
2299       plt = fixP->fx_plt;
2300
2301       if (add_symbolP != NULL
2302           && add_symbolP->sy_mri_common)
2303         {
2304           know (add_symbolP->sy_value.X_op == O_symbol);
2305           add_number += S_GET_VALUE (add_symbolP);
2306           fixP->fx_offset = add_number;
2307           add_symbolP = fixP->fx_addsy = add_symbolP->sy_value.X_add_symbol;
2308         }
2309
2310       if (add_symbolP)
2311         add_symbol_segment = S_GET_SEGMENT (add_symbolP);
2312
2313       if (sub_symbolP)
2314         {
2315           resolve_symbol_value (sub_symbolP);
2316           if (add_symbolP == NULL || add_symbol_segment == absolute_section)
2317             {
2318               if (add_symbolP != NULL)
2319                 {
2320                   add_number += S_GET_VALUE (add_symbolP);
2321                   add_symbolP = NULL;
2322                   fixP->fx_addsy = NULL;
2323                 }
2324
2325               /* It's just -sym */
2326               if (S_GET_SEGMENT (sub_symbolP) == absolute_section)
2327                 {
2328                   add_number -= S_GET_VALUE (sub_symbolP);
2329                   fixP->fx_subsy = NULL;
2330                 }
2331               else if (pcrel
2332                        && S_GET_SEGMENT (sub_symbolP) == this_segment_type)
2333                 {
2334                   /* Should try converting to a constant.  */
2335                   goto bad_sub_reloc;
2336                 }
2337               else
2338               bad_sub_reloc:
2339                 as_bad_where (fixP->fx_file, fixP->fx_line,
2340                               "Negative of non-absolute symbol %s",
2341                               S_GET_NAME (sub_symbolP));
2342             }
2343           else if (S_GET_SEGMENT (sub_symbolP) == add_symbol_segment
2344                    && SEG_NORMAL (add_symbol_segment))
2345             {
2346               /* Difference of 2 symbols from same segment.
2347                  Can't make difference of 2 undefineds: 'value' means
2348                  something different for N_UNDF. */
2349 #ifdef TC_I960
2350               /* Makes no sense to use the difference of 2 arbitrary symbols
2351                  as the target of a call instruction.  */
2352               if (fixP->fx_tcbit)
2353                 as_bad_where (fixP->fx_file, fixP->fx_line,
2354                               "callj to difference of 2 symbols");
2355 #endif /* TC_I960 */
2356               add_number += S_GET_VALUE (add_symbolP) -
2357                 S_GET_VALUE (sub_symbolP);
2358
2359               add_symbolP = NULL;
2360               pcrel = 0;        /* No further pcrel processing. */
2361
2362               /* Let the target machine make the final determination
2363                  as to whether or not a relocation will be needed to
2364                  handle this fixup.  */
2365               if (!TC_FORCE_RELOCATION_SECTION (fixP, this_segment_type))
2366                 {
2367                   fixP->fx_pcrel = 0;
2368                   fixP->fx_addsy = NULL;
2369                   fixP->fx_subsy = NULL;
2370                 }
2371             }
2372           else
2373             {
2374               /* Different segments in subtraction. */
2375               know (!(S_IS_EXTERNAL (sub_symbolP)
2376                       && (S_GET_SEGMENT (sub_symbolP) == absolute_section)));
2377
2378               if ((S_GET_SEGMENT (sub_symbolP) == absolute_section))
2379                 add_number -= S_GET_VALUE (sub_symbolP);
2380
2381 #ifdef DIFF_EXPR_OK
2382               else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type
2383 #if 0 /* Do this even if it's already described as pc-relative.  For example,
2384          on the m68k, an operand of "pc@(foo-.-2)" should address "foo" in a
2385          pc-relative mode.  */
2386                        && pcrel
2387 #endif
2388                        )
2389                 {
2390                   /* Make it pc-relative.  */
2391                   add_number += (MD_PCREL_FROM_SECTION (fixP, this_segment_type)
2392                                  - S_GET_VALUE (sub_symbolP));
2393                   pcrel = 1;
2394                   fixP->fx_pcrel = 1;
2395                   sub_symbolP = 0;
2396                   fixP->fx_subsy = 0;
2397                 }
2398 #endif
2399 #ifdef UNDEFINED_DIFFERENCE_OK
2400               /* The PA needs this for PIC code generation.  We basically
2401                  don't want to do anything if we have the difference of two
2402                  symbols at this point.  */
2403               else if (1)
2404                 {
2405                   /* Leave it alone.  */
2406                 }
2407 #endif
2408 #ifdef BFD_ASSEMBLER
2409               else if (fixP->fx_r_type == BFD_RELOC_GPREL32
2410                        || fixP->fx_r_type == BFD_RELOC_GPREL16)
2411                 {
2412                   /* Leave it alone.  */
2413                 }
2414 #endif
2415               else
2416                 {
2417                   char buf[50];
2418                   sprint_value (buf, fragP->fr_address + where);
2419                   as_bad_where (fixP->fx_file, fixP->fx_line,
2420                                 "Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %s.",
2421                                 segment_name (S_GET_SEGMENT (sub_symbolP)),
2422                                 S_GET_NAME (sub_symbolP), buf);
2423                 }
2424             }
2425         }
2426
2427       if (add_symbolP)
2428         {
2429           if (add_symbol_segment == this_segment_type && pcrel && !plt
2430               && TC_RELOC_RTSYM_LOC_FIXUP (fixP))
2431             {
2432               /*
2433                * This fixup was made when the symbol's segment was
2434                * SEG_UNKNOWN, but it is now in the local segment.
2435                * So we know how to do the address without relocation.
2436                */
2437 #ifdef TC_I960
2438               /* reloc_callj() may replace a 'call' with a 'calls' or a
2439                  'bal', in which cases it modifies *fixP as appropriate.
2440                  In the case of a 'calls', no further work is required,
2441                  and *fixP has been set up to make the rest of the code
2442                  below a no-op. */
2443               reloc_callj (fixP);
2444 #endif /* TC_I960 */
2445
2446               add_number += S_GET_VALUE (add_symbolP);
2447               add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
2448               pcrel = 0;        /* Lie. Don't want further pcrel processing. */
2449
2450               /* Let the target machine make the final determination
2451                  as to whether or not a relocation will be needed to
2452                  handle this fixup.  */
2453               if (!TC_FORCE_RELOCATION (fixP))
2454                 {
2455                   fixP->fx_pcrel = 0;
2456                   fixP->fx_addsy = NULL;
2457                 }
2458             }
2459           else
2460             {
2461               if (add_symbol_segment == absolute_section
2462                   && ! pcrel)
2463                 {
2464 #ifdef TC_I960
2465                   /* See comment about reloc_callj() above.  */
2466                   reloc_callj (fixP);
2467 #endif /* TC_I960 */
2468                   add_number += S_GET_VALUE (add_symbolP);
2469
2470                   /* Let the target machine make the final determination
2471                      as to whether or not a relocation will be needed to
2472                      handle this fixup.  */
2473
2474                   if (!TC_FORCE_RELOCATION (fixP))
2475                     {
2476                       fixP->fx_addsy = NULL;
2477                       add_symbolP = NULL;
2478                     }
2479                 }
2480               else if (add_symbol_segment == undefined_section
2481 #ifdef BFD_ASSEMBLER
2482                        || bfd_is_com_section (add_symbol_segment)
2483 #endif
2484                        )
2485                 {
2486 #ifdef TC_I960
2487                   if ((int) fixP->fx_bit_fixP == 13)
2488                     {
2489                       /* This is a COBR instruction.  They have only a
2490                        * 13-bit displacement and are only to be used
2491                        * for local branches: flag as error, don't generate
2492                        * relocation.
2493                        */
2494                       as_bad_where (fixP->fx_file, fixP->fx_line,
2495                                     "can't use COBR format with external label");
2496                       fixP->fx_addsy = NULL;
2497                       fixP->fx_done = 1;
2498                       continue;
2499                     }           /* COBR */
2500 #endif /* TC_I960 */
2501
2502 #ifdef OBJ_COFF
2503 #ifdef TE_I386AIX
2504                   if (S_IS_COMMON (add_symbolP))
2505                     add_number += S_GET_VALUE (add_symbolP);
2506 #endif /* TE_I386AIX */
2507 #endif /* OBJ_COFF */
2508                   ++seg_reloc_count;
2509                 }
2510               else
2511                 {
2512                   seg_reloc_count++;
2513 /* start-sanitize-v850 */
2514 #if !(defined (TC_V850) && defined (OBJ_ELF))
2515 /* end-sanitize-v850 */
2516 #if !(defined (TC_M68K) && defined (OBJ_ELF))
2517 #if !defined (TC_I386) || !(defined (OBJ_ELF) || defined (OBJ_COFF))
2518                   add_number += S_GET_VALUE (add_symbolP);
2519 /* start-sanitize-v850 */
2520 #endif
2521 /* end-sanitize-v850 */
2522 #endif
2523 #endif
2524                 }
2525             }
2526         }
2527
2528       if (pcrel)
2529         {
2530           add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
2531           if (add_symbolP == 0)
2532             {
2533 #ifndef BFD_ASSEMBLER
2534               fixP->fx_addsy = &abs_symbol;
2535 #else
2536               fixP->fx_addsy = section_symbol (absolute_section);
2537 #endif
2538               fixP->fx_addsy->sy_used_in_reloc = 1;
2539               ++seg_reloc_count;
2540             }
2541         }
2542
2543       if (!fixP->fx_bit_fixP && !fixP->fx_no_overflow && size > 0)
2544         {
2545           valueT mask = 0;
2546           if (size < sizeof (mask))
2547             {
2548               /* set all bits to one */
2549               mask--;
2550               /* Technically, combining these produces an undefined result
2551                  if size is sizeof (valueT), though I think these two
2552                  half-way operations should both be defined.  And the
2553                  compiler should be able to combine them if it's valid on
2554                  the host architecture.  */
2555               mask <<= size * 4;
2556               mask <<= size * 4;
2557               if ((add_number & mask) != 0
2558                   && (add_number & mask) != mask)
2559                 {
2560                   char buf[50], buf2[50];
2561                   sprint_value (buf, fragP->fr_address + where);
2562                   if (add_number > 1000)
2563                     sprint_value (buf2, add_number);
2564                   else
2565                     sprintf (buf2, "%ld", (long) add_number);
2566                   as_bad_where (fixP->fx_file, fixP->fx_line,
2567                                 "Value of %s too large for field of %d bytes at %s",
2568                                 buf2, size, buf);
2569                 } /* generic error checking */
2570             }
2571 #ifdef WARN_SIGNED_OVERFLOW_WORD
2572           /* Warn if a .word value is too large when treated as a signed
2573              number.  We already know it is not too negative.  This is to
2574              catch over-large switches generated by gcc on the 68k.  */
2575           if (!flag_signed_overflow_ok
2576               && size == 2
2577               && add_number > 0x7fff)
2578             as_bad_where (fixP->fx_file, fixP->fx_line,
2579                           "Signed .word overflow; switch may be too large; %ld at 0x%lx",
2580                           (long) add_number,
2581                           (unsigned long) (fragP->fr_address + where));
2582 #endif
2583         }                       /* not a bit fix */
2584
2585       if (!fixP->fx_done)
2586         {
2587 #ifdef MD_APPLY_FIX3
2588           md_apply_fix3 (fixP, &add_number, this_segment_type);
2589 #else
2590 #ifdef BFD_ASSEMBLER
2591           md_apply_fix (fixP, &add_number);
2592 #else
2593           md_apply_fix (fixP, add_number);
2594 #endif
2595 #endif
2596
2597 #ifndef TC_HANDLES_FX_DONE
2598           /* If the tc-* files haven't been converted, assume it's handling
2599              it the old way, where a null fx_addsy means that the fix has
2600              been applied completely, and no further work is needed.  */
2601           if (fixP->fx_addsy == 0 && fixP->fx_pcrel == 0)
2602             fixP->fx_done = 1;
2603 #endif
2604         }
2605 #ifdef TC_VALIDATE_FIX
2606     skip: ;
2607 #endif
2608 #ifdef DEBUG5
2609       fprintf (stderr, "result:\n");
2610       print_fixup (fixP);
2611 #endif
2612     }                           /* For each fixS in this segment. */
2613
2614   TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count);
2615   return seg_reloc_count;
2616 }
2617
2618 #endif /* defined (BFD_ASSEMBLER) || (!defined (BFD) && !defined (OBJ_VMS)) */
2619
2620 void
2621 number_to_chars_bigendian (buf, val, n)
2622      char *buf;
2623      valueT val;
2624      int n;
2625 {
2626   if (n > sizeof (val)|| n <= 0)
2627     abort ();
2628   while (n--)
2629     {
2630       buf[n] = val & 0xff;
2631       val >>= 8;
2632     }
2633 }
2634
2635 void
2636 number_to_chars_littleendian (buf, val, n)
2637      char *buf;
2638      valueT val;
2639      int n;
2640 {
2641   if (n > sizeof (val) || n <= 0)
2642     abort ();
2643   while (n--)
2644     {
2645       *buf++ = val & 0xff;
2646       val >>= 8;
2647     }
2648 }
2649
2650 void
2651 write_print_statistics (file)
2652      FILE *file;
2653 {
2654   fprintf (stderr, "fixups: %d\n", n_fixups);
2655 }
2656
2657 /* for debugging */
2658 extern int indent_level;
2659 extern void print_symbol_value_1 ();
2660
2661 void
2662 print_fixup (fixp)
2663      fixS *fixp;
2664 {
2665   indent_level = 1;
2666   fprintf (stderr, "fix %lx %s:%d", (long) fixp, fixp->fx_file, fixp->fx_line);
2667   if (fixp->fx_pcrel)
2668     fprintf (stderr, " pcrel");
2669   if (fixp->fx_pcrel_adjust)
2670     fprintf (stderr, " pcrel_adjust=%d", fixp->fx_pcrel_adjust);
2671   if (fixp->fx_im_disp)
2672     {
2673 #ifdef TC_NS32K
2674       fprintf (stderr, " im_disp=%d", fixp->fx_im_disp);
2675 #else
2676       fprintf (stderr, " im_disp");
2677 #endif
2678     }
2679   if (fixp->fx_tcbit)
2680     fprintf (stderr, " tcbit");
2681   if (fixp->fx_done)
2682     fprintf (stderr, " done");
2683   fprintf (stderr, "\n    size=%d frag=%lx where=%ld offset=%lx addnumber=%lx",
2684            fixp->fx_size, (long) fixp->fx_frag, (long) fixp->fx_where,
2685            (long) fixp->fx_offset, (long) fixp->fx_addnumber);
2686 #ifdef BFD_ASSEMBLER
2687   fprintf (stderr, "\n    %s (%d)", bfd_get_reloc_code_name (fixp->fx_r_type),
2688            fixp->fx_r_type);
2689 #else
2690 #ifdef NEED_FX_R_TYPE
2691   fprintf (stderr, " r_type=%d", fixp->fx_r_type);
2692 #endif
2693 #endif
2694   if (fixp->fx_addsy)
2695     {
2696       fprintf (stderr, "\n   +<");
2697       print_symbol_value_1 (stderr, fixp->fx_addsy);
2698       fprintf (stderr, ">");
2699     }
2700   if (fixp->fx_subsy)
2701     {
2702       fprintf (stderr, "\n   -<");
2703       print_symbol_value_1 (stderr, fixp->fx_subsy);
2704       fprintf (stderr, ">");
2705     }
2706   fprintf (stderr, "\n");
2707 }
2708
2709 /* end of write.c */