Wolfgang Thallergcc16 merge934c3885 months agoHistory
1124 lines · 40.2 KB · C
RawDownload
/* bfdlink.h -- header file for BFD link routines   Copyright (C) 1993-2026 Free Software Foundation, Inc.   Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support.    This file is part of BFD, the Binary File Descriptor library.    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 3 of the License, or   (at your option) any later version.    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 this program; if not, write to the Free Software   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,   MA 02110-1301, USA.  */ #ifndef BFDLINK_H#define BFDLINK_H /* Which symbols to strip during a link.  */enum bfd_link_strip{  strip_none,		/* Don't strip any symbols.  */  strip_debugger,	/* Strip debugging symbols.  */  strip_some,		/* keep_hash is the list of symbols to keep.  */  strip_all		/* Strip all symbols.  */}; /* Which local symbols to discard during a link.  This is irrelevant   if strip_all is used.  */enum bfd_link_discard{  discard_sec_merge,	/* Discard local temporary symbols in SEC_MERGE			   sections.  */  discard_none,		/* Don't discard any locals.  */  discard_l,		/* Discard local temporary symbols.  */  discard_all		/* Discard all locals.  */}; enum notice_asneeded_action {  notice_as_needed,  notice_not_needed,  notice_needed}; /* Whether to generate ELF common symbols with the STT_COMMON type   during a relocatable link.  */enum bfd_link_elf_stt_common{  unchanged,  elf_stt_common,  no_elf_stt_common}; /* Describes the type of hash table entry structure being used.   Different hash table structure have different fields and so   support different linking features.  */enum bfd_link_hash_table_type  {    bfd_link_generic_hash_table,    bfd_link_elf_hash_table  };/* These are the possible types of an entry in the BFD link hash   table.  */ enum bfd_link_hash_type{  bfd_link_hash_new,		/* Symbol is new.  */  bfd_link_hash_undefined,	/* Symbol seen before, but undefined.  */  bfd_link_hash_undefweak,	/* Symbol is weak and undefined.  */  bfd_link_hash_defined,	/* Symbol is defined.  */  bfd_link_hash_defweak,	/* Symbol is weak and defined.  */  bfd_link_hash_common,		/* Symbol is common.  */  bfd_link_hash_indirect,	/* Symbol is an indirect link.  */  bfd_link_hash_warning		/* Like indirect, but warn if referenced.  */}; enum bfd_link_common_skip_ar_symbols{  bfd_link_common_skip_none,  bfd_link_common_skip_text,  bfd_link_common_skip_data,  bfd_link_common_skip_all}; struct bfd_link_hash_common_entry  {    unsigned int alignment_power;	/* Alignment.  */    asection *section;		/* Symbol section.  */  }; /* The linking routines use a hash table which uses this structure for   its elements.  */ struct bfd_link_hash_entry{  /* Base hash table entry structure.  */  struct bfd_hash_entry root;   /* Type of this entry.  */  ENUM_BITFIELD (bfd_link_hash_type) type : 8;   /* Symbol is referenced in a normal regular object file,     as distinct from a LTO IR object file.  */  unsigned int non_ir_ref_regular : 1;   /* Symbol is referenced in a normal dynamic object file,     as distinct from a LTO IR object file.  */  unsigned int non_ir_ref_dynamic : 1;   /* The symbol, SYM, is referenced by __real_SYM in an object file.  */  unsigned int ref_real : 1;   /* The symbol is a wrapper symbol, __wrap_SYM.  */  unsigned int wrapper_symbol : 1;   /* Symbol is a built-in define.  These will be overridden by PROVIDE     in a linker script.  */  unsigned int linker_def : 1;   /* Symbol defined in a linker script.  */  unsigned int ldscript_def : 1;   /* Symbol will be converted from absolute to section-relative.  Set for     symbols defined by a script from "dot" (also SEGMENT_START or ORIGIN)     outside of an output section statement.  */  unsigned int rel_from_abs : 1;   /* A union of information depending upon the type.  */  union    {      /* Nothing is kept for bfd_hash_new.  */      /* bfd_link_hash_undefined, bfd_link_hash_undefweak.  */      struct	{	  /* Undefined and common symbols are kept in a linked list through	     this field.  This field is present in all of the union element	     so that we don't need to remove entries from the list when we	     change their type.  Removing entries would either require the	     list to be doubly linked, which would waste more memory, or	     require a traversal.  When an undefined or common symbol is	     created, it should be added to this list, the head of which is in	     the link hash table itself.  As symbols are defined, they need	     not be removed from the list; anything which reads the list must	     doublecheck the symbol type. 	     Weak symbols are not kept on this list. 	     Defined and defweak symbols use this field as a reference marker.	     If the field is not NULL, or this structure is the tail of the	     undefined symbol list, the symbol has been referenced.  If the	     symbol is undefined and becomes defined, this field will	     automatically be non-NULL since the symbol will have been on the	     undefined symbol list.  */	  struct bfd_link_hash_entry *next;	  /* BFD symbol was found in.  */	  bfd *abfd;	} undef;      /* bfd_link_hash_defined, bfd_link_hash_defweak.  */      struct	{	  struct bfd_link_hash_entry *next;	  /* Symbol section.  */	  asection *section;	  /* Symbol value.  */	  bfd_vma value;	} def;      /* bfd_link_hash_indirect, bfd_link_hash_warning.  */      struct	{	  struct bfd_link_hash_entry *next;	  /* Real symbol.  */	  struct bfd_link_hash_entry *link;	  /* Warning message (bfd_link_hash_warning only).  */	  const char *warning;	} i;      /* bfd_link_hash_common.  */      struct	{	  struct bfd_link_hash_entry *next;	  /* The linker needs to know three things about common	     symbols: the size, the alignment, and the section in	     which the symbol should be placed.  We store the size	     here, and we allocate a small structure to hold the	     section and the alignment.  The alignment is stored as a	     power of two.  We don't store all the information	     directly because we don't want to increase the size of	     the union; this structure is a major space user in the	     linker.  */	  struct bfd_link_hash_common_entry *p;	  /* Common symbol size.  */	  bfd_size_type size;	} c;    } u;}; /* This is the link hash table.  It is a derived class of   bfd_hash_table.  */ struct bfd_link_hash_table{  /* The hash table itself.  */  struct bfd_hash_table table;  /* A linked list of undefined and common symbols, linked through the     next field in the bfd_link_hash_entry structure.  */  struct bfd_link_hash_entry *undefs;  /* Entries are added to the tail of the undefs list.  */  struct bfd_link_hash_entry *undefs_tail;  /* Function to free the hash table on closing BFD.  */  void (*hash_table_free) (bfd *);   /* A pointer to information used to merge SEC_MERGE sections.  */  void *merge_info;   /* The type of the link hash table.  */  enum bfd_link_hash_table_type type;}; /* Look up an entry in a link hash table.  If FOLLOW is TRUE, this   follows bfd_link_hash_indirect and bfd_link_hash_warning links to   the real symbol.  */extern struct bfd_link_hash_entry *bfd_link_hash_lookup  (struct bfd_link_hash_table *, const char *, bool create,   bool copy, bool follow); /* Look up an entry in the main linker hash table if the symbol might   be wrapped.  This should only be used for references to an   undefined symbol, not for definitions of a symbol.  */ extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup  (bfd *, struct bfd_link_info *, const char *, bool, bool, bool); /* If H is a wrapped symbol, ie. the symbol name starts with "__wrap_"   and the remainder is found in wrap_hash, return the real symbol.  */ extern struct bfd_link_hash_entry *unwrap_hash_lookup  (struct bfd_link_info *, bfd *, struct bfd_link_hash_entry *); /* Traverse a link hash table.  */extern void bfd_link_hash_traverse  (struct bfd_link_hash_table *,    bool (*) (struct bfd_link_hash_entry *, void *),    void *); /* Add an entry to the undefs list.  */extern void bfd_link_add_undef  (struct bfd_link_hash_table *, struct bfd_link_hash_entry *); /* Remove symbols from the undefs list that don't belong there.  */extern void bfd_link_repair_undef_list  (struct bfd_link_hash_table *table); /* Read symbols and cache symbol pointer array in outsymbols.  */extern bool bfd_generic_link_read_symbols (bfd *); /* Check the relocs in the BFD.  Called after all the input   files have been loaded, and garbage collection has tagged   any unneeded sections.  */extern bool bfd_link_check_relocs (bfd *,struct bfd_link_info *); struct bfd_sym_chain{  struct bfd_sym_chain *next;  const char *name;};/* How to handle unresolved symbols.   There are four possibilities which are enumerated below:  */enum report_method{  /* This is the initial value when then link_info structure is created.     It allows the various stages of the linker to determine whether they     allowed to set the value.  */  RM_NOT_YET_SET = 0,  RM_IGNORE,  RM_DIAGNOSE,}; /* How to handle DT_TEXTREL.  */ enum textrel_check_method{  textrel_check_none,  textrel_check_warning,  textrel_check_error}; #define bfd_link_textrel_check(info) \  (info->textrel_check != textrel_check_none) typedef enum {with_flags, without_flags} flag_type; /* A section flag list.  */struct flag_info_list{  flag_type with;  const char *name;  bool valid;  struct flag_info_list *next;}; /* Section flag info.  */struct flag_info{  flagword only_with_flags;  flagword not_with_flags;  struct flag_info_list *flag_list;  bool flags_initialized;}; struct bfd_elf_dynamic_list;struct bfd_elf_version_tree; /* Types of output.  */ enum output_type{  type_pde,  type_pie,  type_relocatable,  type_dll,}; #define bfd_link_pde(info)	   ((info)->type == type_pde)#define bfd_link_dll(info)	   ((info)->type == type_dll)#define bfd_link_relocatable(info) ((info)->type == type_relocatable)#define bfd_link_pie(info)	   ((info)->type == type_pie)#define bfd_link_executable(info)  (bfd_link_pde (info) || bfd_link_pie (info))#define bfd_link_pic(info)	   (bfd_link_dll (info) || bfd_link_pie (info)) /* This structure holds all the information needed to communicate   between BFD and the linker when doing a link.  */ struct bfd_link_info{  /* Output type.  */  ENUM_BITFIELD (output_type) type : 2;   /* TRUE if BFD should pre-bind symbols in a shared object.  */  unsigned int symbolic: 1;   /* TRUE if BFD should export all symbols in the dynamic symbol table     of an executable, rather than only those used.  */  unsigned int export_dynamic: 1;   /* TRUE if a default symbol version should be created and used for     exported symbols.  */  unsigned int create_default_symver: 1;   /* TRUE if unreferenced sections should be removed.  */  unsigned int gc_sections: 1;   /* TRUE if exported symbols should be kept during section gc.  */  unsigned int gc_keep_exported: 1;   /* TRUE if every symbol should be reported back via the notice     callback.  */  unsigned int notice_all: 1;   /* TRUE if the LTO plugin is active.  */  unsigned int lto_plugin_active: 1;   /* TRUE if all LTO IR symbols have been read.  */  unsigned int lto_all_symbols_read : 1;   /* TRUE if global symbols in discarded sections should be stripped.  */  unsigned int strip_discarded: 1;   /* TRUE if all data symbols should be dynamic.  */  unsigned int dynamic_data: 1;   /* TRUE if section groups should be resolved.  */  unsigned int resolve_section_groups: 1;   /* Set if output file is big-endian, or if that is unknown, from     the command line or first input file endianness.  */  unsigned int big_endian : 1;   /* Which symbols to strip.  */  ENUM_BITFIELD (bfd_link_strip) strip : 2;   /* Which local symbols to discard.  */  ENUM_BITFIELD (bfd_link_discard) discard : 2;   /* Whether to generate ELF common symbols with the STT_COMMON type.  */  ENUM_BITFIELD (bfd_link_elf_stt_common) elf_stt_common : 2;   /* Criteria for skipping symbols when determining     whether to include an object from an archive.  */  ENUM_BITFIELD (bfd_link_common_skip_ar_symbols) common_skip_ar_symbols : 2;   /* What to do with unresolved symbols in an object file.     When producing executables the default is GENERATE_ERROR.     When producing shared libraries the default is IGNORE.  The     assumption with shared libraries is that the reference will be     resolved at load/execution time.  */  ENUM_BITFIELD (report_method) unresolved_syms_in_objects : 2;   /* What to do with unresolved symbols in a shared library.     The same defaults apply.  */  ENUM_BITFIELD (report_method) unresolved_syms_in_shared_libs : 2;   /* TRUE if unresolved symbols are to be warned, rather than errored.  */  unsigned int warn_unresolved_syms: 1;   /* TRUE if shared objects should be linked directly, not shared.  */  unsigned int static_link: 1;   /* TRUE if symbols should be retained in memory, FALSE if they     should be freed and reread.  */  unsigned int keep_memory: 1;   /* TRUE if BFD should generate relocation information in the final     executable.  */  unsigned int emitrelocations: 1;   /* TRUE if PT_GNU_RELRO segment should be created.  */  unsigned int relro: 1;   /* TRUE if DT_RELR should be enabled for compact relative     relocations.  */  unsigned int enable_dt_relr: 1;   /* TRUE if separate code segment should be created.  */  unsigned int separate_code: 1;   /* TRUE if only one read-only, non-code segment should be created.  */  unsigned int one_rosegment: 1;   /* TRUE if GNU_PROPERTY_MEMORY_SEAL should be generated.  */  unsigned int memory_seal: 1;   /* Nonzero if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment     should be created.  1 for DWARF2 tables, 2 for compact tables.  */  unsigned int eh_frame_hdr_type: 2;   /* What to do with DT_TEXTREL in output.  */  ENUM_BITFIELD (textrel_check_method) textrel_check: 2;   /* TRUE if .hash section should be created.  */  unsigned int emit_hash: 1;   /* TRUE if .gnu.hash section should be created.  */  unsigned int emit_gnu_hash: 1;   /* If TRUE reduce memory overheads, at the expense of speed. This will     cause map file generation to use an O(N^2) algorithm and disable     caching ELF symbol buffer.  */  unsigned int reduce_memory_overheads: 1;   /* TRUE if the output file should be in a traditional format.  This     is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag     on the output file, but may be checked when reading the input     files.  */  unsigned int traditional_format: 1;   /* TRUE if non-PLT relocs should be merged into one reloc section     and sorted so that relocs against the same symbol come together.  */  unsigned int combreloc: 1;   /* TRUE if a default symbol version should be created and used for     imported symbols.  */  unsigned int default_imported_symver: 1;   /* TRUE if the new ELF dynamic tags are enabled. */  unsigned int new_dtags: 1;   /* FALSE if .eh_frame unwind info should be generated for PLT and other     linker created sections, TRUE if it should be omitted.  */  unsigned int no_ld_generated_unwind_info: 1;   /* TRUE if no .sframe stack trace info should be generated for the output.     This includes linker generated SFrame info as well.  */  unsigned int discard_sframe: 1;   /* TRUE if BFD should generate a "task linked" object file,     similar to relocatable but also with globals converted to     statics.  */  unsigned int task_link: 1;   /* TRUE if ok to have multiple definitions, without warning.  */  unsigned int allow_multiple_definition: 1;   /* TRUE if multiple definition of absolute symbols (eg. from -R) should     be reported.  */  unsigned int prohibit_multiple_definition_absolute: 1;   /* TRUE if multiple definitions should only warn.  */  unsigned int warn_multiple_definition: 1;   /* TRUE if ok to have version with no definition.  */  unsigned int allow_undefined_version: 1;   /* TRUE if some symbols have to be dynamic, controlled by

Lines 1–500 of 1124.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t