133965Sjdp/* ld-emul.h - Linker emulation header file
2218822Sdim   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
3218822Sdim   2002, 2003, 2004, 2005
477298Sobrien   Free Software Foundation, Inc.
533965Sjdp
633965Sjdp   This file is part of GLD, the Gnu Linker.
733965Sjdp
833965Sjdp   GLD is free software; you can redistribute it and/or modify
933965Sjdp   it under the terms of the GNU General Public License as published by
1033965Sjdp   the Free Software Foundation; either version 1, or (at your option)
1133965Sjdp   any later version.
1233965Sjdp
1333965Sjdp   GLD is distributed in the hope that it will be useful,
1433965Sjdp   but WITHOUT ANY WARRANTY; without even the implied warranty of
1533965Sjdp   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1633965Sjdp   GNU General Public License for more details.  */
1733965Sjdp
1833965Sjdp#ifndef LDEMUL_H
1933965Sjdp#define LDEMUL_H
2033965Sjdp
21217394Skib/* Forward declaration for ldemul_add_options() and others.  */
22217394Skibstruct option;
23217394Skib
24130561Sobrienextern void ldemul_hll
25130561Sobrien  (char *);
26130561Sobrienextern void ldemul_syslib
27130561Sobrien  (char *);
28130561Sobrienextern void ldemul_after_parse
29130561Sobrien  (void);
30130561Sobrienextern void ldemul_before_parse
31130561Sobrien  (void);
32130561Sobrienextern void ldemul_after_open
33130561Sobrien  (void);
34130561Sobrienextern void ldemul_after_allocation
35130561Sobrien  (void);
36130561Sobrienextern void ldemul_before_allocation
37130561Sobrien  (void);
38130561Sobrienextern void ldemul_set_output_arch
39130561Sobrien  (void);
40130561Sobrienextern char *ldemul_choose_target
41130561Sobrien  (int, char**);
42130561Sobrienextern void ldemul_choose_mode
43130561Sobrien  (char *);
44130561Sobrienextern void ldemul_list_emulations
45130561Sobrien  (FILE *);
46130561Sobrienextern void ldemul_list_emulation_options
47130561Sobrien  (FILE *);
48130561Sobrienextern char *ldemul_get_script
49130561Sobrien  (int *isfile);
50130561Sobrienextern void ldemul_finish
51130561Sobrien  (void);
52130561Sobrienextern void ldemul_set_symbols
53130561Sobrien  (void);
54130561Sobrienextern void ldemul_create_output_section_statements
55130561Sobrien  (void);
56130561Sobrienextern bfd_boolean ldemul_place_orphan
57218822Sdim  (asection *);
58130561Sobrienextern bfd_boolean ldemul_parse_args
59130561Sobrien  (int, char **);
60130561Sobrienextern void ldemul_add_options
61130561Sobrien  (int, char **, int, struct option **, int, struct option **);
62130561Sobrienextern bfd_boolean ldemul_handle_option
63130561Sobrien  (int);
64130561Sobrienextern bfd_boolean ldemul_unrecognized_file
65130561Sobrien  (struct lang_input_statement_struct *);
66130561Sobrienextern bfd_boolean ldemul_recognized_file
67130561Sobrien  (struct lang_input_statement_struct *);
68130561Sobrienextern bfd_boolean ldemul_open_dynamic_archive
69130561Sobrien  (const char *, struct search_dirs *, struct lang_input_statement_struct *);
70130561Sobrienextern char *ldemul_default_target
71130561Sobrien  (int, char**);
72130561Sobrienextern void after_parse_default
73130561Sobrien  (void);
74130561Sobrienextern void after_open_default
75130561Sobrien  (void);
76130561Sobrienextern void after_allocation_default
77130561Sobrien  (void);
78130561Sobrienextern void before_allocation_default
79130561Sobrien  (void);
80218822Sdimextern void finish_default
81218822Sdim  (void);
82218822Sdimextern void finish_default
83218822Sdim  (void);
84130561Sobrienextern void set_output_arch_default
85130561Sobrien  (void);
86130561Sobrienextern void syslib_default
87130561Sobrien  (char*);
88130561Sobrienextern void hll_default
89130561Sobrien  (char*);
9060484Sobrienextern int  ldemul_find_potential_libraries
91130561Sobrien  (char *, struct lang_input_statement_struct *);
92104834Sobrienextern struct bfd_elf_version_expr *ldemul_new_vers_pattern
93130561Sobrien  (struct bfd_elf_version_expr *);
9433965Sjdp
9577298Sobrientypedef struct ld_emulation_xfer_struct {
9633965Sjdp  /* Run before parsing the command line and script file.
9733965Sjdp     Set the architecture, maybe other things.  */
98130561Sobrien  void   (*before_parse) (void);
9933965Sjdp
10033965Sjdp  /* Handle the SYSLIB (low level library) script command.  */
101130561Sobrien  void   (*syslib) (char *);
10233965Sjdp
10333965Sjdp  /* Handle the HLL (high level library) script command.  */
104130561Sobrien  void   (*hll) (char *);
10533965Sjdp
10633965Sjdp  /* Run after parsing the command line and script file.  */
107130561Sobrien  void   (*after_parse) (void);
10833965Sjdp
10933965Sjdp  /* Run after opening all input files, and loading the symbols.  */
110130561Sobrien  void   (*after_open) (void);
11133965Sjdp
11233965Sjdp  /* Run after allocating output sections.  */
113130561Sobrien  void   (*after_allocation)  (void);
11433965Sjdp
11533965Sjdp  /* Set the output architecture and machine if possible.  */
116130561Sobrien  void   (*set_output_arch) (void);
11733965Sjdp
11833965Sjdp  /* Decide which target name to use.  */
119130561Sobrien  char * (*choose_target) (int, char**);
12033965Sjdp
12133965Sjdp  /* Run before allocating output sections.  */
122130561Sobrien  void   (*before_allocation) (void);
12333965Sjdp
12433965Sjdp  /* Return the appropriate linker script.  */
125130561Sobrien  char * (*get_script) (int *isfile);
12633965Sjdp
12733965Sjdp  /* The name of this emulation.  */
12833965Sjdp  char *emulation_name;
12933965Sjdp
13033965Sjdp  /* The output format.  */
13133965Sjdp  char *target_name;
13233965Sjdp
13333965Sjdp  /* Run after assigning values from the script.  */
134130561Sobrien  void	(*finish) (void);
13533965Sjdp
13633965Sjdp  /* Create any output sections needed by the target.  */
137130561Sobrien  void	(*create_output_section_statements) (void);
13833965Sjdp
13933965Sjdp  /* Try to open a dynamic library.  ARCH is an architecture name, and
14033965Sjdp     is normally the empty string.  ENTRY is the lang_input_statement
14133965Sjdp     that should be opened.  */
142130561Sobrien  bfd_boolean (*open_dynamic_archive)
143130561Sobrien    (const char *arch, struct search_dirs *,
144130561Sobrien     struct lang_input_statement_struct *entry);
14533965Sjdp
146130561Sobrien  /* Place an orphan section.  Return TRUE if it was placed, FALSE if
14733965Sjdp     the default action should be taken.  This field may be NULL, in
14833965Sjdp     which case the default action will always be taken.  */
149130561Sobrien  bfd_boolean (*place_orphan)
150218822Sdim    (asection *);
15133965Sjdp
15277298Sobrien  /* Run after assigning parsing with the args, but before
15377298Sobrien     reading the script.  Used to initialize symbols used in the script.  */
154130561Sobrien  void	(*set_symbols) (void);
15533965Sjdp
156130561Sobrien  /* Parse args which the base linker doesn't understand.
157130561Sobrien     Return TRUE if the arg needs no further processing.  */
158130561Sobrien  bfd_boolean (*parse_args) (int, char **);
15933965Sjdp
160130561Sobrien  /* Hook to add options to parameters passed by the base linker to
161130561Sobrien     getopt_long and getopt_long_only calls.  */
162130561Sobrien  void (*add_options)
163130561Sobrien    (int, char **, int, struct option **, int, struct option **);
164130561Sobrien
165130561Sobrien  /* Companion to the above to handle an option.  Returns TRUE if it is
166130561Sobrien     one of our options.  */
167130561Sobrien  bfd_boolean (*handle_option) (int);
168130561Sobrien
16933965Sjdp  /* Run to handle files which are not recognized as object files or
170130561Sobrien     archives.  Return TRUE if the file was handled.  */
171130561Sobrien  bfd_boolean (*unrecognized_file)
172130561Sobrien    (struct lang_input_statement_struct *);
17333965Sjdp
17460484Sobrien  /* Run to list the command line options which parse_args handles.  */
175130561Sobrien  void (* list_options) (FILE *);
17660484Sobrien
17760484Sobrien  /* Run to specially handle files which *are* recognized as object
178130561Sobrien     files or archives.  Return TRUE if the file was handled.  */
179130561Sobrien  bfd_boolean (*recognized_file)
180130561Sobrien    (struct lang_input_statement_struct *);
18160484Sobrien
18260484Sobrien  /* Called when looking for libraries in a directory specified
18360484Sobrien     via a linker command line option or linker script option.
18460484Sobrien     Files that match the pattern "lib*.a" have already been scanned.
18560484Sobrien     (For VMS files matching ":lib*.a" have also been scanned).  */
18660484Sobrien  int (* find_potential_libraries)
187130561Sobrien    (char *, struct lang_input_statement_struct *);
18877298Sobrien
189104834Sobrien  /* Called when adding a new version pattern.  PowerPC64-ELF uses
190104834Sobrien     this hook to add a pattern matching ".foo" for every "foo".  */
191104834Sobrien  struct bfd_elf_version_expr * (*new_vers_pattern)
192130561Sobrien    (struct bfd_elf_version_expr *);
193104834Sobrien
19433965Sjdp} ld_emulation_xfer_type;
19533965Sjdp
19677298Sobrientypedef enum {
19733965Sjdp  intel_ic960_ld_mode_enum,
19877298Sobrien  default_mode_enum,
19933965Sjdp  intel_gld960_ld_mode_enum
20033965Sjdp} lang_emulation_mode_enum_type;
20133965Sjdp
20233965Sjdpextern ld_emulation_xfer_type *ld_emulations[];
20333965Sjdp
20433965Sjdp#endif
205