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