/* ldlang.h - linker command language support
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
- This file is part of GLD, the Gnu Linker.
+ This file is part of the GNU Binutils.
- GLD is free software; you can redistribute it and/or modify
+ This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
- GLD is distributed in the hope that it will be useful,
+ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with GLD; see the file COPYING. If not, write to the Free
- Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
- 02110-1301, USA. */
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
#ifndef LDLANG_H
#define LDLANG_H
typedef struct statement_list
{
- union lang_statement_union *head;
- union lang_statement_union **tail;
+ union lang_statement_union * head;
+ union lang_statement_union ** tail;
} lang_statement_list_type;
+typedef struct memory_region_name_struct
+{
+ const char * name;
+ struct memory_region_name_struct * next;
+} lang_memory_region_name;
+
typedef struct memory_region_struct
{
- char *name;
+ lang_memory_region_name name_list;
struct memory_region_struct *next;
bfd_vma origin;
bfd_size_type length;
bfd_vma current;
- bfd_size_type old_length;
+ union lang_statement_union *last_os;
flagword flags;
flagword not_flags;
bfd_boolean had_full_message;
lang_output_statement_enum,
lang_padding_statement_enum,
lang_group_statement_enum,
-
- lang_afile_asection_pair_statement_enum,
+ lang_insert_statement_enum,
lang_constructors_statement_enum
} type;
} lang_statement_header_type;
enum section_type
{
normal_section,
+ overlay_section,
noload_section,
noalloc_section
};
int constraint;
flagword flags;
enum section_type sectype;
- unsigned int processed : 1;
+ unsigned int processed_vma : 1;
+ unsigned int processed_lma : 1;
unsigned int all_input_readonly : 1;
+ /* If this section should be ignored. */
unsigned int ignored : 1;
+ /* If there is a symbol relative to this section. */
+ unsigned int section_relative_symbol : 1;
} lang_output_section_statement_type;
typedef struct
bfd *the_bfd;
- file_ptr passive_position;
-
- /* Symbol table of the file. */
- asymbol **asymbols;
- unsigned int symbol_count;
-
/* Point to the next file - whatever it is, wanders up and down
archives */
union lang_statement_union *next;
const char *target;
- unsigned int closed : 1;
unsigned int is_archive : 1;
/* 1 means search a set of directories for this file. */
asection *section;
} lang_input_section_type;
-typedef struct
-{
- lang_statement_header_type header;
- asection *section;
- union lang_statement_union *file;
-} lang_afile_asection_pair_statement_type;
-
typedef struct lang_wild_statement_struct lang_wild_statement_type;
typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
bfd *, const asection *);
+/* Binary search tree structure to efficiently sort sections by
+ name. */
+typedef struct lang_section_bst
+{
+ asection *section;
+ struct lang_section_bst *left;
+ struct lang_section_bst *right;
+} lang_section_bst_type;
+
struct lang_wild_statement_struct
{
lang_statement_header_type header;
walk_wild_section_handler_t walk_wild_section_handler;
struct wildcard_list *handler_data[4];
+ lang_section_bst_type *tree;
};
typedef struct lang_address_statement_struct
lang_statement_list_type children;
} lang_group_statement_type;
+typedef struct
+{
+ lang_statement_header_type header;
+ const char *where;
+ bfd_boolean is_before;
+} lang_insert_statement_type;
+
typedef union lang_statement_union
{
lang_statement_header_type header;
lang_reloc_statement_type reloc_statement;
lang_address_statement_type address_statement;
lang_output_section_statement_type output_section_statement;
- lang_afile_asection_pair_statement_type afile_asection_pair_statement;
lang_assignment_statement_type assignment_statement;
lang_input_statement_type input_statement;
lang_target_statement_type target_statement;
lang_fill_statement_type fill_statement;
lang_padding_statement_type padding_statement;
lang_group_statement_type group_statement;
+ lang_insert_statement_type insert_statement;
} lang_statement_union_type;
/* This structure holds information about a program header, from the
/* Used by place_orphan to keep track of orphan sections and statements. */
-struct orphan_save {
+struct orphan_save
+{
const char *name;
flagword flags;
lang_output_section_statement_type *os;
extern const char *entry_section;
extern bfd_boolean entry_from_cmdline;
extern lang_statement_list_type file_chain;
+extern lang_statement_list_type input_file_chain;
extern int lang_statement_iteration;
(void);
extern void lang_finish
(void);
-extern lang_memory_region_type *lang_memory_region_lookup
- (const char *const, bfd_boolean);
-extern lang_memory_region_type *lang_memory_region_default
- (asection *);
+extern lang_memory_region_type * lang_memory_region_lookup
+ (const char * const, bfd_boolean);
+extern void lang_memory_region_alias
+ (const char *, const char *);
extern void lang_map
(void);
extern void lang_set_flags
statement != (lang_input_statement_type *) NULL; \
statement = (lang_input_statement_type *) statement->next) \
+#define lang_output_section_find(NAME) \
+ lang_output_section_statement_lookup (NAME, 0, FALSE)
+
extern void lang_process
(void);
extern void ldlang_add_file
(lang_input_statement_type *);
-extern lang_output_section_statement_type *lang_output_section_find
- (const char * const);
extern lang_output_section_statement_type *lang_output_section_find_by_flags
(const asection *, lang_output_section_statement_type **,
lang_match_sec_type_func);
extern lang_output_section_statement_type *lang_insert_orphan
- (asection *, const char *, lang_output_section_statement_type *,
+ (asection *, const char *, int, lang_output_section_statement_type *,
struct orphan_save *, etree_type *, lang_statement_list_type *);
extern lang_input_statement_type *lang_add_input_file
(const char *, lang_input_file_enum_type, const char *);
extern void lang_add_keepsyms_file
(const char *);
-extern lang_output_section_statement_type *
- lang_output_section_statement_lookup
- (const char *const);
+extern lang_output_section_statement_type *lang_output_section_statement_lookup
+ (const char *const, int, bfd_boolean);
extern void ldlang_add_undef
(const char *const);
extern void lang_add_output_format
(const char *, const char *, const char *, int);
extern void lang_list_init
(lang_statement_list_type *);
+extern void push_stat_ptr
+ (lang_statement_list_type *);
+extern void pop_stat_ptr
+ (void);
extern void lang_add_data
(int type, union etree_union *);
extern void lang_add_reloc
(bfd_boolean *, bfd_boolean);
extern void one_lang_size_sections_pass
(bfd_boolean *, bfd_boolean);
+extern void lang_add_insert
+ (const char *, int);
extern void lang_enter_group
(void);
extern void lang_leave_group
(struct bfd_elf_version_deps *, const char *);
extern void lang_register_vers_node
(const char *, struct bfd_elf_version_tree *, struct bfd_elf_version_deps *);
-bfd_boolean unique_section_p
- (const asection *);
+extern void lang_append_dynamic_list (struct bfd_elf_version_expr *);
+extern void lang_append_dynamic_list_cpp_typeinfo (void);
+extern void lang_append_dynamic_list_cpp_new (void);
extern void lang_add_unique
(const char *);
extern const char *lang_get_output_target
(const char *, struct bfd_link_hash_entry *);
extern void add_excluded_libs (const char *);
+extern bfd_boolean load_symbols
+ (lang_input_statement_type *, lang_statement_list_type *);
+
+extern bfd_boolean
+ldlang_override_segment_assignment
+ (struct bfd_link_info *, bfd *, asection *, asection *, bfd_boolean);
#endif