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