aboutsummaryrefslogtreecommitdiff
path: root/gas/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/write.c')
-rw-r--r--gas/write.c54
1 files changed, 38 insertions, 16 deletions
diff --git a/gas/write.c b/gas/write.c
index abfe79f..736e150 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -295,7 +295,7 @@ fix_new_exp (frag, where, size, exp, pcrel, r_type)
case O_constant:
off = exp->X_add_number;
break;
-
+
default:
as_bad ("expression too complex for fixup");
}
@@ -319,7 +319,7 @@ append (charPP, fromP, length)
*charPP += length;
}
-#ifndef BFD_ASSEMBLER
+#ifndef BFD_ASSEMBLER
int section_alignment[SEG_MAXIMUM_ORDINAL];
#endif
@@ -329,7 +329,7 @@ int section_alignment[SEG_MAXIMUM_ORDINAL];
* boundary, all of the other alignments within it will work. At
* least one object format really uses this info.
*/
-void
+void
record_alignment (seg, align)
/* Segment to which alignment pertains */
segT seg;
@@ -427,7 +427,7 @@ chain_frchains_together (abfd, section, xxx)
#if !defined (BFD) && !defined (BFD_ASSEMBLER)
-void
+void
remove_subsegs (head, seg, root, last)
frchainS *head;
int seg;
@@ -727,7 +727,7 @@ adjust_reloc_syms (abfd, sec, xxx)
#endif
/* Is there some other (target cpu dependent) reason we can't adjust
- this one? (E.g. relocations involving function addresses on
+ this one? (E.g. relocations involving function addresses on
the PA. */
#ifdef tc_fix_adjustable
if (! tc_fix_adjustable (fixp))
@@ -760,9 +760,13 @@ adjust_reloc_syms (abfd, sec, xxx)
/* If the section symbol isn't going to be output, the relocs
at least should still work. If not, figure out what to do
- when we run into that case. */
+ when we run into that case.
+
+ We refetch the segment when calling section_symbol, rather
+ than using symsec, because S_GET_VALUE may wind up changing
+ the section when it calls resolve_symbol_value. */
fixp->fx_offset += S_GET_VALUE (sym);
- fixp->fx_addsy = section_symbol (symsec);
+ fixp->fx_addsy = section_symbol (S_GET_SEGMENT (sym));
fixp->fx_addsy->sy_used_in_reloc = 1;
done:
@@ -842,9 +846,13 @@ write_relocs (abfd, sec, xxx)
n--;
continue;
}
+
+#if 0
+ /* This test is triggered inappropriately for the SH. */
if (fixp->fx_where + fixp->fx_size
> fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
abort ();
+#endif
s = bfd_install_relocation (stdoutput, reloc,
fixp->fx_frag->fr_literal,
@@ -1228,7 +1236,7 @@ set_symtab ()
}
#endif
-void
+void
write_object_file ()
{
struct frchain *frchainP; /* Track along all frchains. */
@@ -1425,7 +1433,7 @@ write_object_file ()
#else
fix_new_exp (lie->frag,
lie->word_goes_here - lie->frag->fr_literal,
- 2, &exp, 0, BFD_RELOC_NONE);
+ 2, &exp, 0, BFD_RELOC_16);
#endif
#else
#if defined(TC_SPARC) || defined(TC_A29K) || defined(NEED_FX_R_TYPE)
@@ -1636,6 +1644,13 @@ write_object_file ()
PROGRESS (1);
+#ifdef tc_frob_file_before_adjust
+ tc_frob_file_before_adjust ();
+#endif
+#ifdef obj_frob_file_before_adjust
+ obj_frob_file_before_adjust ();
+#endif
+
bfd_map_over_sections (stdoutput, adjust_reloc_syms, (char *)0);
/* Set up symbol table, and write it out. */
@@ -1778,6 +1793,13 @@ write_object_file ()
bfd_map_over_sections (stdoutput, write_relocs, (char *) 0);
+#ifdef tc_frob_file_after_relocs
+ tc_frob_file_after_relocs ();
+#endif
+#ifdef obj_frob_file_after_relocs
+ obj_frob_file_after_relocs ();
+#endif
+
bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
#endif /* BFD_ASSEMBLER */
}
@@ -1800,7 +1822,7 @@ write_object_file ()
#ifdef TC_GENERIC_RELAX_TABLE
/* Subroutines of relax_segment. */
-static int
+static int
is_dnrange (f1, f2)
struct frag *f1;
struct frag *f2;
@@ -1835,7 +1857,7 @@ relax_align (address, alignment)
return (new_address - address);
}
-void
+void
relax_segment (segment_frag_root, segment)
struct frag *segment_frag_root;
segT segment;
@@ -2210,7 +2232,7 @@ fixup_segment (fixP, this_segment_type)
int pcrel, plt;
fragS *fragP;
segT add_symbol_segment = absolute_section;
-
+
/* If the linker is doing the relaxing, we must not do any fixups.
Well, strictly speaking that's not true -- we could do any that are
@@ -2258,7 +2280,7 @@ fixup_segment (fixP, this_segment_type)
if (add_symbolP)
add_symbol_segment = S_GET_SEGMENT (add_symbolP);
-
+
if (sub_symbolP)
{
resolve_symbol_value (sub_symbolP);
@@ -2395,7 +2417,7 @@ fixup_segment (fixP, this_segment_type)
add_number += S_GET_VALUE (add_symbolP);
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
pcrel = 0; /* Lie. Don't want further pcrel processing. */
-
+
/* Let the target machine make the final determination
as to whether or not a relocation will be needed to
handle this fixup. */
@@ -2418,7 +2440,7 @@ fixup_segment (fixP, this_segment_type)
/* Let the target machine make the final determination
as to whether or not a relocation will be needed to
handle this fixup. */
-
+
if (!TC_FORCE_RELOCATION (fixP))
{
fixP->fx_addsy = NULL;
@@ -2446,7 +2468,7 @@ fixup_segment (fixP, this_segment_type)
continue;
} /* COBR */
#endif /* TC_I960 */
-
+
#ifdef OBJ_COFF
#ifdef TE_I386AIX
if (S_IS_COMMON (add_symbolP))