From 4fdbafb247bd7a1af8c22d6da0acc560aa16d05a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 22 Mar 1994 00:24:13 +0000 Subject: [PATCH] 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. --- ld/ChangeLog | 53 +++++++++++++++++++++++++++ ld/ldlang.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++-- ld/ldwrite.c | 60 ++++++++++++++++++++++++++++-- 3 files changed, 208 insertions(+), 6 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index fc232471087..6693c07a034 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,56 @@ +Mon Mar 21 18:28:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + 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. + + * Makefile.in (cdtest.out, cdtest-ur.o): New targets. + (cdtest-ur, cdtest-ur.out): New targets. + (check-cdtest): Now also check that -Ur works correctly. + + * scripttemp/alpha.sc: Align all sections to 16 byte boundaries. + +Thu Mar 17 12:45:41 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ldlang.c (lang_process): Move lang_common call before + map_input_to_output_sections, to ensure that any alignment + constraints set by common symbols are copied over to the output + sections. + +Fri Mar 11 22:17:34 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * emulparams/elf32ppc.sh (TEMPLATE_NAME): Don't define. + (OTHER_READWRITE_SECTIONS): Rename .toc to .got. + * Makefile.in (em_elf32ppc.c): Depend upon generic.em, not ppc.em. + * emultempl/ppc.em: Remove ugly stub code; turns out not to be + needed for ELF. + Tue Mar 8 04:22:27 1994 David J. Mackenzie (djm@rtl.cygnus.com) * config/i386bsd.mh: New file. diff --git a/ld/ldlang.c b/ld/ldlang.c index 08ab408fa40..712eb80e1db 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; diff --git a/ld/ldwrite.c b/ld/ldwrite.c index 376e65036d0..1dacb3de2a7 100644 --- a/ld/ldwrite.c +++ b/ld/ldwrite.c @@ -48,13 +48,17 @@ build_link_order (statement) it just does the output directly. */ { bfd_vma value = statement->data_statement.value; - bfd_byte play_area[LONG_SIZE]; + bfd_byte play_area[QUAD_SIZE]; unsigned int size = 0; asection *output_section = statement->data_statement.output_section; ASSERT (output_section->owner == output_bfd); switch (statement->data_statement.type) { + case QUAD: + bfd_put_64 (output_bfd, value, play_area); + size = QUAD_SIZE; + break; case LONG: bfd_put_32 (output_bfd, value, play_area); size = LONG_SIZE; @@ -79,6 +83,52 @@ build_link_order (statement) } break; + case lang_reloc_statement_enum: + { + lang_reloc_statement_type *rs; + asection *output_section; + struct bfd_link_order *link_order; + + rs = &statement->reloc_statement; + + output_section = rs->output_section; + ASSERT (output_section->owner == output_bfd); + + link_order = bfd_new_link_order (output_bfd, output_section); + if (link_order == NULL) + einfo ("%P%F: bfd_new_link_order failed"); + + link_order->offset = rs->output_vma; + link_order->size = bfd_get_reloc_size (rs->howto); + + link_order->u.reloc.p = + ((struct bfd_link_order_reloc *) + xmalloc (sizeof (struct bfd_link_order_reloc))); + + link_order->u.reloc.p->reloc = rs->reloc; + link_order->u.reloc.p->addend = rs->addend_value; + + if (rs->section != (asection *) NULL) + { + ASSERT (rs->name == (const char *) NULL); + link_order->type = bfd_section_reloc_link_order; + if (rs->section->owner == output_bfd) + link_order->u.reloc.p->u.section = rs->section; + else + { + link_order->u.reloc.p->u.section = rs->section->output_section; + link_order->u.reloc.p->addend += rs->section->output_offset; + } + } + else + { + ASSERT (rs->name != (const char *) NULL); + link_order->type = bfd_symbol_reloc_link_order; + link_order->u.reloc.p->u.name = rs->name; + } + } + break; + case lang_input_section_enum: /* Create a new link_order in the output section with this attached */ @@ -109,7 +159,10 @@ build_link_order (statement) link_order->u.indirect.section = i; ASSERT (i->output_section == output_section); } - link_order->size = bfd_section_size (i->owner, i); + if (i->_cooked_size) + link_order->size = i->_cooked_size; + else + link_order->size = bfd_get_section_size_before_reloc (i); link_order->offset = i->output_offset; } } @@ -149,7 +202,7 @@ ldwrite () lang_for_each_statement (build_link_order); if (! bfd_final_link (output_bfd, &link_info)) - einfo ("%F%P: %B: %E\n", output_bfd); + einfo ("%F%P: final link failed: %E\n", output_bfd); if (config.map_file) { @@ -226,6 +279,7 @@ print_file_stuff (f) /* Print a symbol. */ +/*ARGSUSED*/ static boolean print_symbol (p, ignore) struct bfd_link_hash_entry *p; -- 2.30.2