Blame include/plugin-api.h

Packit bbfece
/* plugin-api.h -- External linker plugin API.  */
Packit bbfece
Packit bbfece
/* Copyright (C) 2009-2018 Free Software Foundation, Inc.
Packit bbfece
   Written by Cary Coutant <ccoutant@google.com>.
Packit bbfece
Packit bbfece
   This file is part of binutils.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit bbfece
   MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
/* This file defines the interface for writing a linker plugin, which is
Packit bbfece
   described at < http://gcc.gnu.org/wiki/whopr/driver >.  */
Packit bbfece
Packit bbfece
#ifndef PLUGIN_API_H
Packit bbfece
#define PLUGIN_API_H
Packit bbfece
Packit bbfece
#ifdef HAVE_STDINT_H
Packit bbfece
#include <stdint.h>
Packit bbfece
#elif defined(HAVE_INTTYPES_H)
Packit bbfece
#include <inttypes.h>
Packit bbfece
#endif
Packit bbfece
#include <sys/types.h>
Packit bbfece
#if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \
Packit bbfece
    !defined(UINT64_MAX) && !defined(uint64_t)
Packit bbfece
#error can not find uint64_t type
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C"
Packit bbfece
{
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* Status code returned by most API routines.  */
Packit bbfece
Packit bbfece
enum ld_plugin_status
Packit bbfece
{
Packit bbfece
  LDPS_OK = 0,
Packit bbfece
  LDPS_NO_SYMS,         /* Attempt to get symbols that haven't been added. */
Packit bbfece
  LDPS_BAD_HANDLE,      /* No claimed object associated with given handle. */
Packit bbfece
  LDPS_ERR
Packit bbfece
  /* Additional Error codes TBD.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The version of the API specification.  */
Packit bbfece
Packit bbfece
enum ld_plugin_api_version
Packit bbfece
{
Packit bbfece
  LD_PLUGIN_API_VERSION = 1
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The type of output file being generated by the linker.  */
Packit bbfece
Packit bbfece
enum ld_plugin_output_file_type
Packit bbfece
{
Packit bbfece
  LDPO_REL,
Packit bbfece
  LDPO_EXEC,
Packit bbfece
  LDPO_DYN,
Packit bbfece
  LDPO_PIE
Packit bbfece
};
Packit bbfece
Packit bbfece
/* An input file managed by the plugin library.  */
Packit bbfece
Packit bbfece
struct ld_plugin_input_file
Packit bbfece
{
Packit bbfece
  const char *name;
Packit bbfece
  int fd;
Packit bbfece
  off_t offset;
Packit bbfece
  off_t filesize;
Packit bbfece
  void *handle;
Packit bbfece
};
Packit bbfece
Packit bbfece
/* A symbol belonging to an input file managed by the plugin library.  */
Packit bbfece
Packit bbfece
struct ld_plugin_symbol
Packit bbfece
{
Packit bbfece
  char *name;
Packit bbfece
  char *version;
Packit bbfece
  int def;
Packit bbfece
  int visibility;
Packit bbfece
  uint64_t size;
Packit bbfece
  char *comdat_key;
Packit bbfece
  int resolution;
Packit bbfece
};
Packit bbfece
Packit bbfece
/* An object's section.  */
Packit bbfece
Packit bbfece
struct ld_plugin_section
Packit bbfece
{
Packit bbfece
  const void* handle;
Packit bbfece
  unsigned int shndx;
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Whether the symbol is a definition, reference, or common, weak or not.  */
Packit bbfece
Packit bbfece
enum ld_plugin_symbol_kind
Packit bbfece
{
Packit bbfece
  LDPK_DEF,
Packit bbfece
  LDPK_WEAKDEF,
Packit bbfece
  LDPK_UNDEF,
Packit bbfece
  LDPK_WEAKUNDEF,
Packit bbfece
  LDPK_COMMON
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The visibility of the symbol.  */
Packit bbfece
Packit bbfece
enum ld_plugin_symbol_visibility
Packit bbfece
{
Packit bbfece
  LDPV_DEFAULT,
Packit bbfece
  LDPV_PROTECTED,
Packit bbfece
  LDPV_INTERNAL,
Packit bbfece
  LDPV_HIDDEN
Packit bbfece
};
Packit bbfece
Packit bbfece
/* How a symbol is resolved.  */
Packit bbfece
Packit bbfece
enum ld_plugin_symbol_resolution
Packit bbfece
{
Packit bbfece
  LDPR_UNKNOWN = 0,
Packit bbfece
Packit bbfece
  /* Symbol is still undefined at this point.  */
Packit bbfece
  LDPR_UNDEF,
Packit bbfece
Packit bbfece
  /* This is the prevailing definition of the symbol, with references from
Packit bbfece
     regular object code.  */
Packit bbfece
  LDPR_PREVAILING_DEF,
Packit bbfece
Packit bbfece
  /* This is the prevailing definition of the symbol, with no
Packit bbfece
     references from regular objects.  It is only referenced from IR
Packit bbfece
     code.  */
Packit bbfece
  LDPR_PREVAILING_DEF_IRONLY,
Packit bbfece
Packit bbfece
  /* This definition was pre-empted by a definition in a regular
Packit bbfece
     object file.  */
Packit bbfece
  LDPR_PREEMPTED_REG,
Packit bbfece
Packit bbfece
  /* This definition was pre-empted by a definition in another IR file.  */
Packit bbfece
  LDPR_PREEMPTED_IR,
Packit bbfece
Packit bbfece
  /* This symbol was resolved by a definition in another IR file.  */
Packit bbfece
  LDPR_RESOLVED_IR,
Packit bbfece
Packit bbfece
  /* This symbol was resolved by a definition in a regular object
Packit bbfece
     linked into the main executable.  */
Packit bbfece
  LDPR_RESOLVED_EXEC,
Packit bbfece
Packit bbfece
  /* This symbol was resolved by a definition in a shared object.  */
Packit bbfece
  LDPR_RESOLVED_DYN,
Packit bbfece
Packit bbfece
  /* This is the prevailing definition of the symbol, with no
Packit bbfece
     references from regular objects.  It is only referenced from IR
Packit bbfece
     code, but the symbol is exported and may be referenced from
Packit bbfece
     a dynamic object (not seen at link time).  */
Packit bbfece
  LDPR_PREVAILING_DEF_IRONLY_EXP
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The plugin library's "claim file" handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_claim_file_handler) (
Packit bbfece
  const struct ld_plugin_input_file *file, int *claimed);
Packit bbfece
Packit bbfece
/* The plugin library's "all symbols read" handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_all_symbols_read_handler) (void);
Packit bbfece
Packit bbfece
/* The plugin library's cleanup handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_cleanup_handler) (void);
Packit bbfece
Packit bbfece
/* The linker's interface for registering the "claim file" handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_register_claim_file) (ld_plugin_claim_file_handler handler);
Packit bbfece
Packit bbfece
/* The linker's interface for registering the "all symbols read" handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_register_all_symbols_read) (
Packit bbfece
  ld_plugin_all_symbols_read_handler handler);
Packit bbfece
Packit bbfece
/* The linker's interface for registering the cleanup handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_register_cleanup) (ld_plugin_cleanup_handler handler);
Packit bbfece
Packit bbfece
/* The linker's interface for adding symbols from a claimed input file.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_add_symbols) (void *handle, int nsyms,
Packit bbfece
                          const struct ld_plugin_symbol *syms);
Packit bbfece
Packit bbfece
/* The linker's interface for getting the input file information with
Packit bbfece
   an open (possibly re-opened) file descriptor.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_file) (const void *handle,
Packit bbfece
                             struct ld_plugin_input_file *file);
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_view) (const void *handle, const void **viewp);
Packit bbfece
Packit bbfece
/* The linker's interface for releasing the input file.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_release_input_file) (const void *handle);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving symbol resolution information.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_symbols) (const void *handle, int nsyms,
Packit bbfece
                          struct ld_plugin_symbol *syms);
Packit bbfece
Packit bbfece
/* The linker's interface for adding a compiled input file.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_add_input_file) (const char *pathname);
Packit bbfece
Packit bbfece
/* The linker's interface for adding a library that should be searched.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_add_input_library) (const char *libname);
Packit bbfece
Packit bbfece
/* The linker's interface for adding a library path that should be searched.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_set_extra_library_path) (const char *path);
Packit bbfece
Packit bbfece
/* The linker's interface for issuing a warning or error message.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_message) (int level, const char *format, ...);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving the number of sections in an object.
Packit bbfece
   The handle is obtained in the claim_file handler.  This interface should
Packit bbfece
   only be invoked in the claim_file handler.   This function sets *COUNT to
Packit bbfece
   the number of sections in the object.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_section_count) (const void* handle, unsigned int *count);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving the section type of a specific
Packit bbfece
   section in an object.  This interface should only be invoked in the
Packit bbfece
   claim_file handler.  This function sets *TYPE to an ELF SHT_xxx value.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_section_type) (const struct ld_plugin_section section,
Packit bbfece
                                     unsigned int *type);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving the name of a specific section in
Packit bbfece
   an object. This interface should only be invoked in the claim_file handler.
Packit bbfece
   This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated
Packit bbfece
   by malloc.  The plugin must free *SECTION_NAME_PTR.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_section_name) (const struct ld_plugin_section section,
Packit bbfece
                                     char **section_name_ptr);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving the contents of a specific section
Packit bbfece
   in an object.  This interface should only be invoked in the claim_file
Packit bbfece
   handler.  This function sets *SECTION_CONTENTS to point to a buffer that is
Packit bbfece
   valid until clam_file handler returns.  It sets *LEN to the size of the
Packit bbfece
   buffer.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_section_contents) (const struct ld_plugin_section section,
Packit bbfece
                                         const unsigned char **section_contents,
Packit bbfece
                                         size_t* len);
Packit bbfece
Packit bbfece
/* The linker's interface for specifying the desired order of sections.
Packit bbfece
   The sections should be specifed using the array SECTION_LIST in the
Packit bbfece
   order in which they should appear in the final layout.  NUM_SECTIONS
Packit bbfece
   specifies the number of entries in each array.  This should be invoked
Packit bbfece
   in the all_symbols_read handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_update_section_order) (const struct ld_plugin_section *section_list,
Packit bbfece
				   unsigned int num_sections);
Packit bbfece
Packit bbfece
/* The linker's interface for specifying that reordering of sections is
Packit bbfece
   desired so that the linker can prepare for it.  This should be invoked
Packit bbfece
   before update_section_order, preferably in the claim_file handler.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_allow_section_ordering) (void);
Packit bbfece
Packit bbfece
/* The linker's interface for specifying that a subset of sections is
Packit bbfece
   to be mapped to a unique segment.  If the plugin wants to call
Packit bbfece
   unique_segment_for_sections, it must call this function from a
Packit bbfece
   claim_file_handler or when it is first loaded.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_allow_unique_segment_for_sections) (void);
Packit bbfece
Packit bbfece
/* The linker's interface for specifying that a specific set of sections
Packit bbfece
   must be mapped to a unique segment.  ELF segments do not have names
Packit bbfece
   and the NAME is used as the name of the newly created output section
Packit bbfece
   that is then placed in the unique PT_LOAD segment.  FLAGS is used to
Packit bbfece
   specify if any additional segment flags need to be set.  For instance,
Packit bbfece
   a specific segment flag can be set to identify this segment.  Unsetting
Packit bbfece
   segment flags that would be set by default is not possible.  The
Packit bbfece
   parameter SEGMENT_ALIGNMENT when non-zero will override the default.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_unique_segment_for_sections) (
Packit bbfece
    const char* segment_name,
Packit bbfece
    uint64_t segment_flags,
Packit bbfece
    uint64_t segment_alignment,
Packit bbfece
    const struct ld_plugin_section * section_list,
Packit bbfece
    unsigned int num_sections);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving the section alignment requirement
Packit bbfece
   of a specific section in an object.  This interface should only be invoked in the
Packit bbfece
   claim_file handler.  This function sets *ADDRALIGN to the ELF sh_addralign
Packit bbfece
   value of the input section.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_section_alignment) (const struct ld_plugin_section section,
Packit bbfece
                                          unsigned int *addralign);
Packit bbfece
Packit bbfece
/* The linker's interface for retrieving the section size of a specific section
Packit bbfece
   in an object.  This interface should only be invoked in the claim_file handler.
Packit bbfece
   This function sets *SECSIZE to the ELF sh_size
Packit bbfece
   value of the input section.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_get_input_section_size) (const struct ld_plugin_section section,
Packit bbfece
                                     uint64_t *secsize);
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_new_input_handler) (const struct ld_plugin_input_file *file);
Packit bbfece
Packit bbfece
/* The linker's interface for registering the "new_input" handler. This handler
Packit bbfece
   will be notified when a new input file has been added after the
Packit bbfece
   all_symbols_read event, allowing the plugin to, for example, set a unique
Packit bbfece
   segment for sections in plugin-generated input files. */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_register_new_input) (ld_plugin_new_input_handler handler);
Packit bbfece
Packit bbfece
Packit bbfece
enum ld_plugin_level
Packit bbfece
{
Packit bbfece
  LDPL_INFO,
Packit bbfece
  LDPL_WARNING,
Packit bbfece
  LDPL_ERROR,
Packit bbfece
  LDPL_FATAL
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Values for the tv_tag field of the transfer vector.  */
Packit bbfece
Packit bbfece
enum ld_plugin_tag
Packit bbfece
{
Packit bbfece
  LDPT_NULL = 0,
Packit bbfece
  LDPT_API_VERSION = 1,
Packit bbfece
  LDPT_GOLD_VERSION = 2,
Packit bbfece
  LDPT_LINKER_OUTPUT = 3,
Packit bbfece
  LDPT_OPTION = 4,
Packit bbfece
  LDPT_REGISTER_CLAIM_FILE_HOOK = 5,
Packit bbfece
  LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK = 6,
Packit bbfece
  LDPT_REGISTER_CLEANUP_HOOK = 7,
Packit bbfece
  LDPT_ADD_SYMBOLS = 8,
Packit bbfece
  LDPT_GET_SYMBOLS = 9,
Packit bbfece
  LDPT_ADD_INPUT_FILE = 10,
Packit bbfece
  LDPT_MESSAGE = 11,
Packit bbfece
  LDPT_GET_INPUT_FILE = 12,
Packit bbfece
  LDPT_RELEASE_INPUT_FILE = 13,
Packit bbfece
  LDPT_ADD_INPUT_LIBRARY = 14,
Packit bbfece
  LDPT_OUTPUT_NAME = 15,
Packit bbfece
  LDPT_SET_EXTRA_LIBRARY_PATH = 16,
Packit bbfece
  LDPT_GNU_LD_VERSION = 17,
Packit bbfece
  LDPT_GET_VIEW = 18,
Packit bbfece
  LDPT_GET_INPUT_SECTION_COUNT = 19,
Packit bbfece
  LDPT_GET_INPUT_SECTION_TYPE = 20,
Packit bbfece
  LDPT_GET_INPUT_SECTION_NAME = 21,
Packit bbfece
  LDPT_GET_INPUT_SECTION_CONTENTS = 22,
Packit bbfece
  LDPT_UPDATE_SECTION_ORDER = 23,
Packit bbfece
  LDPT_ALLOW_SECTION_ORDERING = 24,
Packit bbfece
  LDPT_GET_SYMBOLS_V2 = 25,
Packit bbfece
  LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS = 26,
Packit bbfece
  LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27,
Packit bbfece
  LDPT_GET_SYMBOLS_V3 = 28,
Packit bbfece
  LDPT_GET_INPUT_SECTION_ALIGNMENT = 29,
Packit bbfece
  LDPT_GET_INPUT_SECTION_SIZE = 30,
Packit bbfece
  LDPT_REGISTER_NEW_INPUT_HOOK = 31
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The plugin transfer vector.  */
Packit bbfece
Packit bbfece
struct ld_plugin_tv
Packit bbfece
{
Packit bbfece
  enum ld_plugin_tag tv_tag;
Packit bbfece
  union
Packit bbfece
  {
Packit bbfece
    int tv_val;
Packit bbfece
    const char *tv_string;
Packit bbfece
    ld_plugin_register_claim_file tv_register_claim_file;
Packit bbfece
    ld_plugin_register_all_symbols_read tv_register_all_symbols_read;
Packit bbfece
    ld_plugin_register_cleanup tv_register_cleanup;
Packit bbfece
    ld_plugin_add_symbols tv_add_symbols;
Packit bbfece
    ld_plugin_get_symbols tv_get_symbols;
Packit bbfece
    ld_plugin_add_input_file tv_add_input_file;
Packit bbfece
    ld_plugin_message tv_message;
Packit bbfece
    ld_plugin_get_input_file tv_get_input_file;
Packit bbfece
    ld_plugin_get_view tv_get_view;
Packit bbfece
    ld_plugin_release_input_file tv_release_input_file;
Packit bbfece
    ld_plugin_add_input_library tv_add_input_library;
Packit bbfece
    ld_plugin_set_extra_library_path tv_set_extra_library_path;
Packit bbfece
    ld_plugin_get_input_section_count tv_get_input_section_count;
Packit bbfece
    ld_plugin_get_input_section_type tv_get_input_section_type;
Packit bbfece
    ld_plugin_get_input_section_name tv_get_input_section_name;
Packit bbfece
    ld_plugin_get_input_section_contents tv_get_input_section_contents;
Packit bbfece
    ld_plugin_update_section_order tv_update_section_order;
Packit bbfece
    ld_plugin_allow_section_ordering tv_allow_section_ordering;
Packit bbfece
    ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections; 
Packit bbfece
    ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections;
Packit bbfece
    ld_plugin_get_input_section_alignment tv_get_input_section_alignment;
Packit bbfece
    ld_plugin_get_input_section_size tv_get_input_section_size;
Packit bbfece
    ld_plugin_register_new_input tv_register_new_input;
Packit bbfece
  } tv_u;
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The plugin library's "onload" entry point.  */
Packit bbfece
Packit bbfece
typedef
Packit bbfece
enum ld_plugin_status
Packit bbfece
(*ld_plugin_onload) (struct ld_plugin_tv *tv);
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#endif /* !defined(PLUGIN_API_H) */