/* Main header file for the bfd library -- portable access to object files.
- Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+ Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
Contributed by Cygnus Support.
** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them;
/* typedef enum boolean {false, true} boolean; */
/* Yup, SVR4 has a "typedef enum boolean" in <sys/types.h> -fnf */
/* It gets worse if the host also defines a true/false enum... -sts */
+/* And even worse if your compiler has built-in boolean types... -law */
+#if defined (__GNUG__) && (__GNUC_MINOR__ > 5)
+#define TRUE_FALSE_ALREADY_DEFINED
+#endif
#ifndef TRUE_FALSE_ALREADY_DEFINED
typedef enum bfd_boolean {false, true} boolean;
#define BFD_TRUE_FALSE
#else
-typedef enum bfd_boolean {bfd_false, bfd_true} boolean;
+/* Use enum names that will appear nowhere else. */
+typedef enum bfd_boolean {bfd_fffalse, bfd_tttrue} boolean;
#endif
/* A pointer to a position in a file. */
#define printf_vma(x) fprintf_vma(stdout,x)
typedef unsigned int flagword; /* 32 bits of flags */
+typedef unsigned char bfd_byte;
\f
/** File formats */
/* A count of carsyms (canonical archive symbols). */
typedef unsigned long symindex;
+/* How to perform a relocation. */
+typedef const struct reloc_howto_struct reloc_howto_type;
+
#define BFD_NO_MORE_SYMBOLS ((symindex) ~0)
/* General purpose part of a symbol X;
file_ptr pos; /* bfd* or file position */
int namidx; /* index into string table */
};
-
\f
/* Linenumber stuff */
#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = true), true)
+#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = (boolean)true), true)
#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true)
#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true)
extern int bfd_flush PARAMS ((bfd *abfd));
extern int bfd_stat PARAMS ((bfd *abfd, struct stat *));
+/* PE STUFF */
+/* Also define some types which are used within bfdlink.h for the
+ bfd_link_info struct. These are not defined in bfdlink.h for a reason.
+ When the link_info data is passed to bfd from ld, it is copied into
+ extern variables defined in internal.h. The type class for these must
+ be available to any thing that includes internal.h. When internal.h is
+ included, it is always preceeded by an include on this file. If I leave the
+ type definitions in bfdlink.h, then I must include that file when ever
+ I include internal.h, and this is not always a good thing */
+
+/* These are the different types of subsystems to be used when linking for
+ Windows NT. This information is passed in as an input parameter (default
+ is console) and ultimately ends up in the optional header data */
+enum bfd_link_subsystem
+{
+ native, /* image doesn't require a subsystem */
+ windows, /* image runs in the Windows GUI subsystem */
+ console, /* image runs in the Windows CUI (character) subsystem */
+ os2, /* image runs in the OS/2 character subsystem */
+ posix /* image runs in the posix character subsystem */
+};
+/* The NT optional header file allows input of the stack and heap reserve
+ and commit size. This data may be input on the command line and will
+ end up in the optional header. Default sizes are provided. */
+struct _bfd_link_stack_heap
+{
+ boolean stack_defined;
+ boolean heap_defined;
+ bfd_vma stack_reserve;
+ bfd_vma stack_commit;
+ bfd_vma heap_reserve;
+ bfd_vma heap_commit;
+};
+typedef struct _bfd_link_stack_heap bfd_link_stack_heap;
+
+/* END OF PE STUFF */
+
/* Cast from const char * to char * so that caller can assign to
a char * without a warning. */
#define bfd_get_filename(abfd) ((char *) (abfd)->filename)
#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (bool)), true)
+#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (boolean)(bool)), true)
/* Byte swapping routines. */
PARAMS ((bfd *, struct bfd_link_info *));
/* And more from the source. */
+
+/* provide storage for subsystem, stack and heap data which may have been
+ passed in on the command line. Ld puts this data into a bfd_link_info
+ struct which ultimately gets passed in to the bfd. When it arrives, copy
+ it to the following struct so that the data will be available in coffcode.h
+ where it is needed. The typedef's used are defined in bfd.h */
+enum bfd_link_subsystem NT_subsystem;
+bfd_link_stack_heap NT_stack_heap;
void
bfd_init PARAMS ((void));
/* end-sanitize-rce */
/* start-sanitize-arc */
bfd_arch_arc, /* Argonaut RISC Core */
+#define bfd_mach_arc_base 0
+#define bfd_mach_arc_host 1
+#define bfd_mach_arc_graphics 2
+#define bfd_mach_arc_audio 3
/* end-sanitize-arc */
bfd_arch_last
};
bfd_vma addend;
/* Pointer to how to perform the required relocation */
- const struct reloc_howto_struct *howto;
+ reloc_howto_type *howto;
} arelent;
enum complain_overflow
complain_overflow_unsigned
};
-typedef unsigned char bfd_byte;
-typedef const struct reloc_howto_struct reloc_howto_type;
-
struct reloc_howto_struct
{
/* The type field has mainly a documetary use - the back end can
BFD_RELOC_12_PCREL,
BFD_RELOC_8_PCREL,
+/* For ELF. */
+ BFD_RELOC_32_GOT_PCREL,
+ BFD_RELOC_16_GOT_PCREL,
+ BFD_RELOC_8_GOT_PCREL,
+ BFD_RELOC_32_GOTOFF,
+ BFD_RELOC_16_GOTOFF,
+ BFD_RELOC_8_GOTOFF,
+ BFD_RELOC_32_PLT_PCREL,
+ BFD_RELOC_16_PLT_PCREL,
+ BFD_RELOC_8_PLT_PCREL,
+ BFD_RELOC_32_PLTOFF,
+ BFD_RELOC_16_PLTOFF,
+ BFD_RELOC_8_PLTOFF,
+
+/* Relocations used by 68K ELF. */
+ BFD_RELOC_68K_GLOB_DAT,
+ BFD_RELOC_68K_JMP_SLOT,
+ BFD_RELOC_68K_RELATIVE,
+
/* Linkage-table relative. */
BFD_RELOC_32_BASEREL,
BFD_RELOC_16_BASEREL,
BFD_RELOC_ARM_SWI,
BFD_RELOC_ARM_MULTI,
BFD_RELOC_ARM_CP_OFF_IMM,
+ BFD_RELOC_ARM_ADR_IMM,
+ BFD_RELOC_ARM_LDR_IMM,
+ BFD_RELOC_ARM_LITERAL,
+ BFD_RELOC_ARM_IN_POOL,
/* start-sanitize-arc */
/* Argonaut RISC Core (ARC) relocs.
ARC 22 bit pc-relative branch. The lowest two bits must be zero and are
-not stored in the instruction. High 20 bits installed in bits 7 through 26
-of instruction. */
+not stored in the instruction. The high 20 bits are installed in bits 26
+through 7 of the instruction. */
BFD_RELOC_ARC_B22_PCREL,
+
+/* ARC 26 bit absolute branch. The lowest two bits must be zero and are not
+stored in the instruction. The high 24 bits are installed in bits 23
+through 0. */
+ BFD_RELOC_ARC_B26,
/* end-sanitize-arc */
BFD_RELOC_UNUSED };
typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
-const struct reloc_howto_struct *
+reloc_howto_type *
bfd_reloc_type_lookup PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
void
bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret));
+boolean
+bfd_copy_private_symbol_data PARAMS ((bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym));
+
+#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \
+ BFD_SEND (ibfd, _bfd_copy_private_symbol_data, \
+ (ibfd, isymbol, obfd, osymbol))
struct _bfd
{
/* The filename the application opened the BFD with. */
struct lynx_core_struct *lynx_core_data;
struct osf_core_struct *osf_core_data;
struct cisco_core_struct *cisco_core_data;
+ struct versados_data_struct *versados_data;
PTR any;
} tdata;
bfd_error_no_debug_section,
bfd_error_bad_value,
bfd_error_file_truncated,
+ bfd_error_file_too_big,
bfd_error_invalid_error_code
} bfd_error_type;
void
bfd_perror PARAMS ((CONST char *message));
+typedef void (*bfd_error_handler_type) PARAMS ((const char *, ...));
+
+bfd_error_handler_type
+bfd_set_error_handler PARAMS ((bfd_error_handler_type));
+
+void
+bfd_set_error_program_name PARAMS ((const char *));
+
long
bfd_get_reloc_upper_bound PARAMS ((bfd *abfd, asection *sect));
#define bfd_copy_private_bfd_data(ibfd, obfd) \
BFD_SEND (ibfd, _bfd_copy_private_bfd_data, \
(ibfd, obfd))
+boolean
+bfd_merge_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd));
+
+#define bfd_merge_private_bfd_data(ibfd, obfd) \
+ BFD_SEND (ibfd, _bfd_merge_private_bfd_data, \
+ (ibfd, obfd))
+boolean
+bfd_set_private_flags PARAMS ((bfd *abfd, flagword flags));
+
+#define bfd_set_private_flags(abfd, flags) \
+ BFD_SEND (abfd, _bfd_set_private_flags, \
+ (abfd, flags))
#define bfd_sizeof_headers(abfd, reloc) \
BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc))
#define bfd_set_arch_mach(abfd, arch, mach)\
BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
-#define bfd_get_relocated_section_contents(abfd, link_info, link_order, data, relocateable, symbols) \
- BFD_SEND (abfd, _bfd_get_relocated_section_contents, \
- (abfd, link_info, link_order, data, relocateable, symbols))
-
#define bfd_relax_section(abfd, section, link_info, again) \
BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again))
#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \
BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms))
+extern bfd_byte *bfd_get_relocated_section_contents
+ PARAMS ((bfd *, struct bfd_link_info *,
+ struct bfd_link_order *, bfd_byte *,
+ boolean, asymbol **));
+
symindex
bfd_get_next_mapent PARAMS ((bfd *abfd, symindex previous, carsym **sym));
bfd_target_tekhex_flavour,
bfd_target_srec_flavour,
bfd_target_som_flavour,
- bfd_target_os9k_flavour};
+ bfd_target_os9k_flavour,
+ bfd_target_versados_flavour
+};
/* Forward declaration. */
typedef struct bfd_link_info _bfd_link_info;
/* Entry points to copy private data. */
#define BFD_JUMP_TABLE_COPY(NAME)\
CAT(NAME,_bfd_copy_private_bfd_data),\
-CAT(NAME,_bfd_copy_private_section_data)
+CAT(NAME,_bfd_merge_private_bfd_data),\
+CAT(NAME,_bfd_copy_private_section_data),\
+CAT(NAME,_bfd_copy_private_symbol_data),\
+CAT(NAME,_bfd_set_private_flags)
/* Called to copy BFD general private data from one object file
to another. */
boolean (*_bfd_copy_private_bfd_data) PARAMS ((bfd *, bfd *));
+ /* Called to merge BFD general private data from one object file
+ to a common output file when linking. */
+ boolean (*_bfd_merge_private_bfd_data) PARAMS ((bfd *, bfd *));
/* Called to copy BFD private section data from one object file
to another. */
boolean (*_bfd_copy_private_section_data) PARAMS ((bfd *, sec_ptr,
bfd *, sec_ptr));
+ /* Called to copy BFD private symbol data from one symbol
+ to another. */
+ boolean (*_bfd_copy_private_symbol_data) PARAMS ((bfd *, asymbol *,
+ bfd *, asymbol *));
+ /* Called to set private backend flags */
+ boolean (*_bfd_set_private_flags) PARAMS ((bfd *, flagword));
/* Core file entry points. */
#define BFD_JUMP_TABLE_CORE(NAME)\
long (*_bfd_canonicalize_reloc) PARAMS ((bfd *, sec_ptr, arelent **,
struct symbol_cache_entry **));
/* See documentation on reloc types. */
- CONST struct reloc_howto_struct *
+ reloc_howto_type *
(*reloc_type_lookup) PARAMS ((bfd *abfd,
bfd_reloc_code_real_type code));
CAT(NAME,_bfd_relax_section),\
CAT(NAME,_bfd_link_hash_table_create),\
CAT(NAME,_bfd_link_add_symbols),\
-CAT(NAME,_bfd_final_link)
+CAT(NAME,_bfd_final_link),\
+CAT(NAME,_bfd_link_split_section)
int (*_bfd_sizeof_headers) PARAMS ((bfd *, boolean));
bfd_byte * (*_bfd_get_relocated_section_contents) PARAMS ((bfd *,
struct bfd_link_info *, struct bfd_link_order *,
section of the BFD. */
boolean (*_bfd_final_link) PARAMS ((bfd *, struct bfd_link_info *));
+ /* Should this section be split up into smaller pieces during linking. */
+ boolean (*_bfd_link_split_section) PARAMS ((bfd *, struct sec *));
+
/* Routines to handle dynamic symbols and relocs. */
#define BFD_JUMP_TABLE_DYNAMIC(NAME)\
CAT(NAME,_get_dynamic_symtab_upper_bound),\