/* Linker command language support.
- Copyright 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1991, 1992, 1993 Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
#include "ldindr.h"
#include "ldctor.h"
-#define BYTE_SIZE (1)
-#define SHORT_SIZE (2)
-#define LONG_SIZE (4)
-
/* FORWARDS */
static void print_statements PARAMS ((void));
static void print_statement PARAMS ((lang_statement_union_type *,
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;
{
/* Look it up or build a new one */
lang_has_input_file = true;
+
#if 0
lang_input_statement_type *p;
{
extern strip_symbols_type strip_symbols;
if (keepsyms_file != 0)
- info ("%X%P: error: duplicated keep-symbols-file value\n");
+ info_msg ("%X%P: error: duplicated keep-symbols-file value\n");
keepsyms_file = filename;
if (strip_symbols != STRIP_NONE)
- info ("%P: `-keep-only-symbols-file' overrides `-s' and `-S'\n");
+ info_msg ("%P: `-keep-only-symbols-file' overrides `-s' and `-S'\n");
strip_symbols = STRIP_SOME;
}
/*
read in all the files
*/
+
static bfd *
open_output (name)
CONST char *CONST 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))
fprintf (config.map_file, " ");
print_address (outside_symbol_address (q));
fprintf (config.map_file, " %s", q->name ? q->name : " ");
+ if (q->flags & BSF_WEAK)
+ fprintf (config.map_file, " *weak*");
print_nl ();
}
{
asymbol *q = *p;
- if (bfd_get_section (q) == i && q->flags & BSF_GLOBAL)
+ if (bfd_get_section (q) == i
+ && (q->flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
{
print_symbol (q);
}
/* 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;
else
{
- info ("%P: warning: %s architecture of input file `%B' is incompatible with %s output\n",
+ info_msg ("%P: warning: %s architecture of input file `%B' is incompatible with %s output\n",
bfd_printable_name (input_bfd), input_bfd,
bfd_printable_name (output_bfd));
/* 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)
if (default_common_section ==
(lang_output_section_statement_type *) NULL)
{
- info ("%P: no [COMMON] command, defaulting to .bss\n");
+ info_msg ("%P: no [COMMON] command, defaulting to .bss\n");
default_common_section =
lang_output_section_statement_lookup (".bss");
file */
lang_create_output_section_statements ();
+ ldemul_create_output_section_statements ();
+
/* Create a dummy bfd for the script */
lang_init_script_file ();
/* 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
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 ();
}