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