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 (¬es, 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