aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1993-11-02 23:47:41 +0000
committerJeff Law <law@redhat.com>1993-11-02 23:47:41 +0000
commit97fbbaca20fe29a64e19d59454f88baa6d96e140 (patch)
tree422bf6ee632e9da889e4d777adcceadc4b288e21 /ld/ldlang.c
parent25270a1ca7e9d8c83873834e676b2610d5421ace (diff)
downloadgdb-97fbbaca20fe29a64e19d59454f88baa6d96e140.zip
gdb-97fbbaca20fe29a64e19d59454f88baa6d96e140.tar.gz
gdb-97fbbaca20fe29a64e19d59454f88baa6d96e140.tar.bz2
* ldlang.c (lang_process): Re-enable last call lang_size_sections.
Pass abs_output_section rather than NULL to avoid invalidating absolute symbols.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c66
1 files changed, 32 insertions, 34 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index a37f391..0fb4a18 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -82,6 +82,7 @@ boolean lang_has_input_file = false;
lang_output_section_statement_type *create_object_symbols = 0;
boolean had_output_filename = false;
boolean lang_float_flag = false;
+boolean delete_output_file_on_failure = false;
/* IMPORTS */
extern char *default_target;
@@ -325,12 +326,6 @@ lang_add_input_file (name, file_type, target)
/* Look it up or build a new one */
lang_has_input_file = true;
- if (name) {
- if ((*(name+strlen(name)-1) == '.') && (*(name+strlen(name)) == 'a')) {
- file_type=lang_input_file_is_l_enum;
- }
- }
-
#if 0
lang_input_statement_type *p;
@@ -782,6 +777,7 @@ wild (s, section, file, target, output)
/*
read in all the files
*/
+
static bfd *
open_output (name)
CONST char *CONST name;
@@ -811,6 +807,8 @@ open_output (name)
einfo ("%P%F: cannot open output file %s: %E\n", name);
}
+ delete_output_file_on_failure = 1;
+
/* output->flags |= D_PAGED;*/
if (! bfd_set_format (output, bfd_object))
@@ -1631,11 +1629,10 @@ DEFUN (lang_size_sections, (s, output_section_statement, prev, fill, dot, relax)
/* Ignore the size of the input sections, use the vma and size to */
/* align against */
-
after = ALIGN_N (os->bfd_section->vma +
- os->bfd_section->_raw_size,
- os->block_value);
-
+ os->bfd_section->_raw_size,
+ /* The coercion here is important, see ld.h. */
+ (bfd_vma) os->block_value);
os->bfd_section->_raw_size = after - os->bfd_section->vma;
dot = os->bfd_section->vma + os->bfd_section->_raw_size;
@@ -2143,7 +2140,9 @@ lang_common ()
/* Fix the size of the common section */
com->section->_raw_size =
- ALIGN_N (com->section->_raw_size, align);
+ ALIGN_N (com->section->_raw_size,
+ /* The coercion here is important, see ld.h. */
+ (bfd_vma) align);
/* Remember if this is the biggest alignment ever seen */
if (power_of_two > com->section->alignment_power)
@@ -2466,6 +2465,8 @@ lang_process ()
file */
lang_create_output_section_statements ();
+ ldemul_create_output_section_statements ();
+
/* Create a dummy bfd for the script */
lang_init_script_file ();
@@ -2514,50 +2515,41 @@ lang_process ()
/* Now run around and relax if we can */
if (command_line.relax)
{
- /* First time round is a trial run to get the 'worst case' addresses of the
- objects if there was no relaxing */
+ /* First time round is a trial run to get the 'worst case'
+ addresses of the objects if there was no relaxing. */
lang_size_sections (statement_list.head,
(lang_output_section_statement_type *) NULL,
&(statement_list.head), 0, (bfd_vma) 0, false);
+ /* Move the global symbols around so the second pass of relaxing
+ can see them. */
+ lang_relocate_globals ();
+ reset_memory_regions ();
- /* Move the global symbols around so the second pass of relaxing can
- see them */
- lang_relocate_globals ();
-
- reset_memory_regions ();
-
- /* Do all the assignments, now that we know the final restingplaces
- of all the symbols */
-
- lang_do_assignments (statement_list.head,
- abs_output_section,
- 0, (bfd_vma) 0);
+ /* Do all the assignments, now that we know the final resting
+ places of all the symbols. */
+ lang_do_assignments (statement_list.head,
+ abs_output_section,
+ 0, (bfd_vma) 0);
/* Perform another relax pass - this time we know where the
- globals are, so can make better guess */
+ globals are, so can make better guess. */
lang_size_sections (statement_list.head,
(lang_output_section_statement_type *) NULL,
&(statement_list.head), 0, (bfd_vma) 0, true);
-
-
-
}
-
else
{
- /* Size up the sections */
+ /* Size up the sections. */
lang_size_sections (statement_list.head,
abs_output_section,
&(statement_list.head), 0, (bfd_vma) 0, false);
-
}
-
/* See if anything special should be done now we know how big
- everything is */
+ everything is. */
ldemul_after_allocation ();
/* Do all the assignments, now that we know the final restingplaces
@@ -2576,6 +2568,12 @@ lang_process ()
lang_check ();
/* Final stuffs */
+
+ ldemul_finish ();
+ /* Size up the sections. */
+ lang_size_sections (statement_list.head,
+ abs_output_section,
+ &(statement_list.head), 0, (bfd_vma) 0, false);
lang_finish ();
}