* ld.h (check_nocrossrefs): Declare.

* ldlang.h (struct lang_nocrossref): Define.
	(struct lang_nocrossrefs): Define.
	(nocrossref_list): Declare.
	(lang_add_nocrossref): Declare.
	* ldlex.l: Recognize NOCROSSREFS keyword.
	* ldgram.y (%union): Add nocrossref field.
	(NOCROSSREFS): New terminal.
	(ifile_p1): Recognize NOCROSSREFS.
	(nocrossref_list): New nonterminal.
	* ldlang.c (nocrossref_list): Define.
	(lang_add_nocrossref): New function.
	* ldmain.c (main): If nocrossref_list is not NULL, call
	check_nocrossrefs.
	(warning_callback): Free symbols if there is no place to store
	them.
	(notice): Call add_cref if nocrossref_list is not NULL.
	* ldcref.c: Include "ldexp.h" and "ldlang.h".
	(check_nocrossrefs): New function.
	(check_nocrossref): New static function.
	(struct check_refs_info): Define.
	(check_refs, check_reloc_refs): New static functions.
	* Makefile.in: Rebuild dependencies.
	* ld.texinfo (Option Commands): Document NOCROSSREFS.
This commit is contained in:
Ian Lance Taylor
1996-08-01 17:35:49 +00:00
parent 8efb80797c
commit 582dd77f65
9 changed files with 359 additions and 10 deletions

View File

@@ -1,5 +1,5 @@
/* ldlang.h - linker command language support
Copyright 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
Copyright 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@@ -96,6 +96,17 @@ typedef struct lang_output_statement_struct
const char *name;
} lang_output_statement_type;
/* Section types specified in a linker script. */
enum section_type
{
normal_section,
dsect_section,
copy_section,
noload_section,
info_section,
overlay_section
};
/* This structure holds a list of program headers describing segments
in which this section should be placed. */
@@ -120,7 +131,7 @@ typedef struct lang_output_section_statement_struct
asection *bfd_section;
int flags; /* Or together of all input sections */
int loadable; /* set from NOLOAD flag in script */
enum section_type sectype;
struct memory_region_struct *region;
size_t block_value;
fill_type fill;
@@ -243,9 +254,6 @@ typedef struct lang_input_statement_struct
/* unsigned int globals_in_this_file;*/
const char *target;
boolean real;
asection *common_section;
asection *common_output_section;
boolean complained;
} lang_input_statement_type;
typedef struct
@@ -335,6 +343,25 @@ struct lang_phdr
etree_type *flags;
};
/* This structure is used to hold a list of sections which may not
cross reference each other. */
struct lang_nocrossref
{
struct lang_nocrossref *next;
const char *name;
};
/* The list of nocrossref lists. */
struct lang_nocrossrefs
{
struct lang_nocrossrefs *next;
struct lang_nocrossref *list;
};
extern struct lang_nocrossrefs *nocrossref_list;
extern lang_output_section_statement_type *abs_output_section;
extern boolean lang_has_input_file;
extern etree_type *base;
@@ -353,7 +380,7 @@ extern void lang_add_output PARAMS ((const char *, int from_script));
extern void lang_enter_output_section_statement
PARAMS ((const char *output_section_statement_name,
etree_type * address_exp,
int flags,
enum section_type sectype,
bfd_vma block_value,
etree_type *align,
etree_type *subalign,
@@ -431,5 +458,6 @@ extern void lang_new_phdr
PARAMS ((const char *, etree_type *, boolean, boolean, etree_type *,
etree_type *));
extern void lang_section_in_phdr PARAMS ((const char *));
extern void lang_add_nocrossref PARAMS ((struct lang_nocrossref *));
#endif