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