aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1994-03-22 00:24:13 +0000
committerIan Lance Taylor <ian@airs.com>1994-03-22 00:24:13 +0000
commit4fdbafb247bd7a1af8c22d6da0acc560aa16d05a (patch)
tree0247b62538ab19861805f548402561a786ded0a7 /ld/ldlang.c
parent651d2da7f6f480720b9a5fa09d295ecad20f8a59 (diff)
downloadgdb-4fdbafb247bd7a1af8c22d6da0acc560aa16d05a.zip
gdb-4fdbafb247bd7a1af8c22d6da0acc560aa16d05a.tar.gz
gdb-4fdbafb247bd7a1af8c22d6da0acc560aa16d05a.tar.bz2
Changes to make -Ur work again.
* ldmain.c (add_to_set): Now takes reloc argument rather than bitsize. Check config.build_constructors here. If an new hash table entry is created, mark it as undefined. (constructor_callback): No longer takes bitsize argument. Pass BFD_RELOC_CTOR to ldctor_add_set_entry, but first make sure the BFD backend supports it. (reloc_overflow): Handle a NULL abfd argument. (reloc_dangerous, unattached_reloc): Likewise. * ldctor.c: Include ldmain.h. (struct set_info): Change bitsize field to reloc. (ldctor_add_set_entry): Now takes reloc argument rather than bitsize. Don't bother to check config.build_constructors here. (ldctor_build_sets): Get the size from the reloc howto. If generating relocateable output, call lang_add_reloc rather than lang_add_data. * ldctor.h (ldctor_add_set_entry): Change declaration to use reloc instead of bitsize. * ldlang.h (statement_enum): Add lang_reloc_statement_enum. (lang_reloc_statement_type): New structure. (lang_statement_union_type): Add reloc_statement field. (lang_add_reloc): Declare new function. * ldlang.c (lang_for_each_statement_worker): Handle lang_reloc_statement_enum. (map_input_to_output_sections, print_statement): Likewise. (lang_size_sections, lang_do_assignments): Likewise. (print_reloc_statement): New function. (lang_add_reloc): New function. * ldwrite.c (build_link_order): Handle lang_reloc_statement_enum.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c101
1 files changed, 98 insertions, 3 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 08ab408..712eb80 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -112,6 +112,7 @@ static void print_input_statement PARAMS ((lang_input_statement_type *statm));
static void print_input_section PARAMS ((lang_input_section_type *in));
static void print_fill_statement PARAMS ((lang_fill_statement_type *fill));
static void print_data_statement PARAMS ((lang_data_statement_type *data));
+static void print_reloc_statement PARAMS ((lang_reloc_statement_type *reloc));
static void print_padding_statement PARAMS ((lang_padding_statement_type *s));
static void print_wild_statement
PARAMS ((lang_wild_statement_type *w,
@@ -231,6 +232,7 @@ lang_for_each_statement_worker (func, s)
s->wild_statement.children.head);
break;
case lang_data_statement_enum:
+ case lang_reloc_statement_enum:
case lang_object_symbols_statement_enum:
case lang_output_statement_enum:
case lang_target_statement_enum:
@@ -778,6 +780,12 @@ lookup_name (name, force_load)
|| ! search->real
|| search->filename == (const char *) NULL)
return search;
+/* start-sanitize-mpw */
+#ifdef MPW
+ /* I hate adding code that works, but for reasons I don't know. */
+ search->the_bfd = NULL;
+#endif
+/* end-sanitize-mpw */
ldfile_open_file (search);
@@ -1084,6 +1092,7 @@ map_input_to_output_sections (s, target, output_section_statement)
case lang_input_section_enum:
case lang_object_symbols_statement_enum:
case lang_data_statement_enum:
+ case lang_reloc_statement_enum:
case lang_assignment_statement_enum:
case lang_padding_statement_enum:
break;
@@ -1365,6 +1374,32 @@ print_data_statement (data)
fprintf (config.map_file, "\n");
}
+/* Print a reloc statement. */
+
+static void
+print_reloc_statement (reloc)
+ lang_reloc_statement_type *reloc;
+{
+ print_section ("");
+ print_space ();
+ print_section ("");
+ print_space ();
+
+/* ASSERT(print_dot == data->output_vma);*/
+
+ print_address (reloc->output_vma + reloc->output_section->vma);
+ print_space ();
+ print_address (reloc->addend_value);
+ print_space ();
+
+ fprintf (config.map_file, "RELOC %s ", reloc->howto->name);
+
+ print_dot += bfd_get_reloc_size (reloc->howto);
+
+ exp_print_tree (reloc->addend_exp);
+
+ fprintf (config.map_file, "\n");
+}
static void
print_padding_statement (s)
@@ -1443,6 +1478,9 @@ print_statement (s, os)
case lang_data_statement_enum:
print_data_statement (&s->data_statement);
break;
+ case lang_reloc_statement_enum:
+ print_reloc_statement (&s->reloc_statement);
+ break;
case lang_input_section_enum:
print_input_section (&s->input_section);
break;
@@ -1730,6 +1768,20 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
}
break;
+ case lang_reloc_statement_enum:
+ {
+ int size;
+
+ s->reloc_statement.output_vma =
+ dot - output_section_statement->bfd_section->vma;
+ s->reloc_statement.output_section =
+ output_section_statement->bfd_section;
+ size = bfd_get_reloc_size (s->reloc_statement.howto);
+ dot += size;
+ output_section_statement->bfd_section->_raw_size += size;
+ }
+ break;
+
case lang_wild_statement_enum:
dot = lang_size_sections (s->wild_statement.children.head,
@@ -1918,6 +1970,21 @@ lang_do_assignments (s, output_section_statement, fill, dot)
break;
}
break;
+
+ case lang_reloc_statement_enum:
+ {
+ etree_value_type value;
+
+ value = exp_fold_tree (s->reloc_statement.addend_exp,
+ abs_output_section,
+ lang_final_phase_enum, dot, &dot);
+ s->reloc_statement.addend_value = value.value;
+ if (value.valid == false)
+ einfo ("%F%P: invalid reloc statement\n");
+ }
+ dot += bfd_get_reloc_size (s->reloc_statement.howto);
+ break;
+
case lang_input_section_enum:
{
asection *in = s->input_section.section;
@@ -2447,6 +2514,9 @@ lang_process ()
files. */
ldctor_build_sets ();
+ /* Size up the common data */
+ lang_common ();
+
/* Run through the contours of the script and attatch input sections
to the correct output sections
*/
@@ -2457,9 +2527,6 @@ lang_process ()
/* Find any sections not attatched explicitly and handle them */
lang_place_orphans ();
- /* Size up the common data */
- lang_common ();
-
ldemul_before_allocation ();
@@ -2627,6 +2694,34 @@ lang_add_data (type, exp)
}
+/* Create a new reloc statement. RELOC is the BFD relocation type to
+ generate. HOWTO is the corresponding howto structure (we could
+ look this up, but the caller has already done so). SECTION is the
+ section to generate a reloc against, or NAME is the name of the
+ symbol to generate a reloc against. Exactly one of SECTION and
+ NAME must be NULL. ADDEND is an expression for the addend. */
+
+void
+lang_add_reloc (reloc, howto, section, name, addend)
+ bfd_reloc_code_real_type reloc;
+ const reloc_howto_type *howto;
+ asection *section;
+ const char *name;
+ union etree_union *addend;
+{
+ lang_reloc_statement_type *p = new_stat (lang_reloc_statement, stat_ptr);
+
+ p->reloc = reloc;
+ p->howto = howto;
+ p->section = section;
+ p->name = name;
+ p->addend_exp = addend;
+
+ p->addend_value = 0;
+ p->output_section = NULL;
+ p->output_vma = 0;
+}
+
void
lang_add_assignment (exp)
etree_type * exp;