diff options
author | Steve Chamberlain <sac@cygnus> | 1992-02-11 00:23:32 +0000 |
---|---|---|
committer | Steve Chamberlain <sac@cygnus> | 1992-02-11 00:23:32 +0000 |
commit | ffc500322549fb0747a8d66a0364c8964f02d3c7 (patch) | |
tree | d8d8d9d7fbde4321c3ccd26f2f592fc3c6d6348b /ld | |
parent | b745cf362d9701cb9d902bf3cce4281e5b188856 (diff) | |
download | gdb-ffc500322549fb0747a8d66a0364c8964f02d3c7.zip gdb-ffc500322549fb0747a8d66a0364c8964f02d3c7.tar.gz gdb-ffc500322549fb0747a8d66a0364c8964f02d3c7.tar.bz2 |
* ldexp.c, ldlang.c: added new idea "abs_output_section", removes
tests for NULL pointers all over the place.
* ldlang.c (lang_process): remember to relocate global symbols
*after* relaxing has done it stuff.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ldlang.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index ef4fdf7..a268cbc 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -64,9 +64,10 @@ static size_t longest_section_name = 8; static asection common_section; static section_userdata_type common_section_userdata; static lang_statement_list_type statement_list; + /* EXPORTS */ boolean relaxing; - +lang_output_section_statement_type *abs_output_section; lang_statement_list_type *stat_ptr = &statement_list; lang_input_statement_type *script_file = 0; boolean option_longmap = false; @@ -752,6 +753,12 @@ DEFUN(open_input_bfds,(statement), static void lang_reasonable_defaults() { + +abs_output_section = lang_output_section_statement_lookup(BFD_ABS_SECTION_NAME); + +abs_output_section->bfd_section = &bfd_abs_section; + + #if 0 lang_output_section_statement_lookup(".text"); lang_output_section_statement_lookup(".data"); @@ -1136,7 +1143,9 @@ DEFUN(print_padding_statement,(s), print_space(); print_fill(s->fill); print_nl(); + print_dot = s->output_offset + s->output_section->vma + s->size; + } static void @@ -1463,7 +1472,7 @@ DEFUN(lang_size_sections,(s, output_section_statement, prev, fill, dot, &newdot); - if (newdot != dot) + if (newdot != dot && ) /* We've been moved ! so insert a pad */ { lang_statement_union_type *new = @@ -1540,7 +1549,7 @@ DEFUN(lang_size_sections,(s, output_section_statement, prev, fill, else { etree_value_type r ; r = exp_fold_tree(os->addr_tree, - (lang_output_section_statement_type *)NULL, + abs_output_section, lang_allocating_phase_enum, dot, &dot); if (r.valid == false) { @@ -1575,6 +1584,19 @@ DEFUN(lang_size_sections,(s, output_section_statement, prev, fill, if (os->addr_tree == (etree_type *)NULL && os->region !=(lang_memory_region_type*)NULL ) { os->region->current = dot; + /* Make sure this isn't silly */ + if (os->region->current > + os->region->origin + + os->region->length) + { + einfo("%X%P: Region %s is full (%B section %s)\n", + os->region->name, + os->bfd_section->owner, + os->bfd_section->name); + /* Reset the region pointer */ + os->region->current = 0; + } + } } @@ -1656,7 +1678,7 @@ had_relax |= relax_section(prev); dot, &newdot); - if (newdot != dot) + if (newdot != dot && !relax) /* We've been moved ! so insert a pad */ { lang_statement_union_type *new = @@ -2300,17 +2322,17 @@ DEFUN_VOID(lang_process) /* Size up the sections */ lang_size_sections(statement_list.head, - (lang_output_section_statement_type *)NULL, + abs_output_section, &(statement_list.head), 0, (bfd_vma)0, false); - /* Move the global symbols around */ - lang_relocate_globals(); - /* Now run around and relax if we can */ if (command_line.relax) { reset_memory_regions(); + + /* Move the global symbols around */ + lang_relocate_globals(); had_relax = true; while (had_relax) @@ -2342,10 +2364,13 @@ DEFUN_VOID(lang_process) of all the symbols */ lang_do_assignments(statement_list.head, - (lang_output_section_statement_type *)NULL, + abs_output_section, 0, (bfd_vma)0); + /* Move the global symbols around */ + lang_relocate_globals(); + /* Make sure that we're not mixing architectures */ lang_check(); |