X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fplugin-api.h;h=2076bdaae655e23c581bc170fe10630240fab476;hb=c0c3707ff46ccfb78ea175dd42d628d8c90dca8b;hp=9d58fef400d929531abfec2fb8c23b26868e08e0;hpb=5d3236eea075e471b90b4d89bc459645abe9f50c;p=deliverable%2Fbinutils-gdb.git diff --git a/include/plugin-api.h b/include/plugin-api.h index 9d58fef400..2076bdaae6 100644 --- a/include/plugin-api.h +++ b/include/plugin-api.h @@ -1,6 +1,6 @@ /* plugin-api.h -- External linker plugin API. */ -/* Copyright 2009 Free Software Foundation, Inc. +/* Copyright (C) 2009-2019 Free Software Foundation, Inc. Written by Cary Coutant . This file is part of binutils. @@ -34,7 +34,7 @@ #include #if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \ !defined(UINT64_MAX) && !defined(uint64_t) -#error can not find uint64_t type +#error cannot find uint64_t type #endif #ifdef __cplusplus @@ -66,7 +66,8 @@ enum ld_plugin_output_file_type { LDPO_REL, LDPO_EXEC, - LDPO_DYN + LDPO_DYN, + LDPO_PIE }; /* An input file managed by the plugin library. */ @@ -93,6 +94,14 @@ struct ld_plugin_symbol int resolution; }; +/* An object's section. */ + +struct ld_plugin_section +{ + const void* handle; + unsigned int shndx; +}; + /* Whether the symbol is a definition, reference, or common, weak or not. */ enum ld_plugin_symbol_kind @@ -147,7 +156,13 @@ enum ld_plugin_symbol_resolution LDPR_RESOLVED_EXEC, /* This symbol was resolved by a definition in a shared object. */ - LDPR_RESOLVED_DYN + LDPR_RESOLVED_DYN, + + /* This is the prevailing definition of the symbol, with no + references from regular objects. It is only referenced from IR + code, but the symbol is exported and may be referenced from + a dynamic object (not seen at link time). */ + LDPR_PREVAILING_DEF_IRONLY_EXP }; /* The plugin library's "claim file" handler. */ @@ -203,6 +218,10 @@ enum ld_plugin_status (*ld_plugin_get_input_file) (const void *handle, struct ld_plugin_input_file *file); +typedef +enum ld_plugin_status +(*ld_plugin_get_view) (const void *handle, const void **viewp); + /* The linker's interface for releasing the input file. */ typedef @@ -240,6 +259,134 @@ typedef enum ld_plugin_status (*ld_plugin_message) (int level, const char *format, ...); +/* The linker's interface for retrieving the number of sections in an object. + The handle is obtained in the claim_file handler. This interface should + only be invoked in the claim_file handler. This function sets *COUNT to + the number of sections in the object. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_count) (const void* handle, unsigned int *count); + +/* The linker's interface for retrieving the section type of a specific + section in an object. This interface should only be invoked in the + claim_file handler. This function sets *TYPE to an ELF SHT_xxx value. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_type) (const struct ld_plugin_section section, + unsigned int *type); + +/* The linker's interface for retrieving the name of a specific section in + an object. This interface should only be invoked in the claim_file handler. + This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated + by malloc. The plugin must free *SECTION_NAME_PTR. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_name) (const struct ld_plugin_section section, + char **section_name_ptr); + +/* The linker's interface for retrieving the contents of a specific section + in an object. This interface should only be invoked in the claim_file + handler. This function sets *SECTION_CONTENTS to point to a buffer that is + valid until clam_file handler returns. It sets *LEN to the size of the + buffer. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_contents) (const struct ld_plugin_section section, + const unsigned char **section_contents, + size_t* len); + +/* The linker's interface for specifying the desired order of sections. + The sections should be specifed using the array SECTION_LIST in the + order in which they should appear in the final layout. NUM_SECTIONS + specifies the number of entries in each array. This should be invoked + in the all_symbols_read handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_update_section_order) (const struct ld_plugin_section *section_list, + unsigned int num_sections); + +/* The linker's interface for specifying that reordering of sections is + desired so that the linker can prepare for it. This should be invoked + before update_section_order, preferably in the claim_file handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_allow_section_ordering) (void); + +/* The linker's interface for specifying that a subset of sections is + to be mapped to a unique segment. If the plugin wants to call + unique_segment_for_sections, it must call this function from a + claim_file_handler or when it is first loaded. */ + +typedef +enum ld_plugin_status +(*ld_plugin_allow_unique_segment_for_sections) (void); + +/* The linker's interface for specifying that a specific set of sections + must be mapped to a unique segment. ELF segments do not have names + and the NAME is used as the name of the newly created output section + that is then placed in the unique PT_LOAD segment. FLAGS is used to + specify if any additional segment flags need to be set. For instance, + a specific segment flag can be set to identify this segment. Unsetting + segment flags that would be set by default is not possible. The + parameter SEGMENT_ALIGNMENT when non-zero will override the default. */ + +typedef +enum ld_plugin_status +(*ld_plugin_unique_segment_for_sections) ( + const char* segment_name, + uint64_t segment_flags, + uint64_t segment_alignment, + const struct ld_plugin_section * section_list, + unsigned int num_sections); + +/* The linker's interface for retrieving the section alignment requirement + of a specific section in an object. This interface should only be invoked in the + claim_file handler. This function sets *ADDRALIGN to the ELF sh_addralign + value of the input section. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_alignment) (const struct ld_plugin_section section, + unsigned int *addralign); + +/* The linker's interface for retrieving the section size of a specific section + in an object. This interface should only be invoked in the claim_file handler. + This function sets *SECSIZE to the ELF sh_size + value of the input section. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_size) (const struct ld_plugin_section section, + uint64_t *secsize); + +typedef +enum ld_plugin_status +(*ld_plugin_new_input_handler) (const struct ld_plugin_input_file *file); + +/* The linker's interface for registering the "new_input" handler. This handler + will be notified when a new input file has been added after the + all_symbols_read event, allowing the plugin to, for example, set a unique + segment for sections in plugin-generated input files. */ + +typedef +enum ld_plugin_status +(*ld_plugin_register_new_input) (ld_plugin_new_input_handler handler); + +/* The linker's interface for getting the list of wrapped symbols using the + --wrap option. This sets *NUM_SYMBOLS to number of wrapped symbols and + *WRAP_SYMBOL_LIST to the list of wrapped symbols. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_wrap_symbols) (uint64_t *num_symbols, + const char ***wrap_symbol_list); + enum ld_plugin_level { LDPL_INFO, @@ -253,23 +400,38 @@ enum ld_plugin_level enum ld_plugin_tag { LDPT_NULL = 0, - LDPT_API_VERSION, - LDPT_GOLD_VERSION, - LDPT_LINKER_OUTPUT, - LDPT_OPTION, - LDPT_REGISTER_CLAIM_FILE_HOOK, - LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK, - LDPT_REGISTER_CLEANUP_HOOK, - LDPT_ADD_SYMBOLS, - LDPT_GET_SYMBOLS, - LDPT_ADD_INPUT_FILE, - LDPT_MESSAGE, - LDPT_GET_INPUT_FILE, - LDPT_RELEASE_INPUT_FILE, - LDPT_ADD_INPUT_LIBRARY, - LDPT_OUTPUT_NAME, - LDPT_SET_EXTRA_LIBRARY_PATH, - LDPT_GNU_LD_VERSION + LDPT_API_VERSION = 1, + LDPT_GOLD_VERSION = 2, + LDPT_LINKER_OUTPUT = 3, + LDPT_OPTION = 4, + LDPT_REGISTER_CLAIM_FILE_HOOK = 5, + LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK = 6, + LDPT_REGISTER_CLEANUP_HOOK = 7, + LDPT_ADD_SYMBOLS = 8, + LDPT_GET_SYMBOLS = 9, + LDPT_ADD_INPUT_FILE = 10, + LDPT_MESSAGE = 11, + LDPT_GET_INPUT_FILE = 12, + LDPT_RELEASE_INPUT_FILE = 13, + LDPT_ADD_INPUT_LIBRARY = 14, + LDPT_OUTPUT_NAME = 15, + LDPT_SET_EXTRA_LIBRARY_PATH = 16, + LDPT_GNU_LD_VERSION = 17, + LDPT_GET_VIEW = 18, + LDPT_GET_INPUT_SECTION_COUNT = 19, + LDPT_GET_INPUT_SECTION_TYPE = 20, + LDPT_GET_INPUT_SECTION_NAME = 21, + LDPT_GET_INPUT_SECTION_CONTENTS = 22, + LDPT_UPDATE_SECTION_ORDER = 23, + LDPT_ALLOW_SECTION_ORDERING = 24, + LDPT_GET_SYMBOLS_V2 = 25, + LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS = 26, + LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27, + LDPT_GET_SYMBOLS_V3 = 28, + LDPT_GET_INPUT_SECTION_ALIGNMENT = 29, + LDPT_GET_INPUT_SECTION_SIZE = 30, + LDPT_REGISTER_NEW_INPUT_HOOK = 31, + LDPT_GET_WRAP_SYMBOLS = 32 }; /* The plugin transfer vector. */ @@ -289,9 +451,22 @@ struct ld_plugin_tv ld_plugin_add_input_file tv_add_input_file; ld_plugin_message tv_message; ld_plugin_get_input_file tv_get_input_file; + ld_plugin_get_view tv_get_view; ld_plugin_release_input_file tv_release_input_file; ld_plugin_add_input_library tv_add_input_library; ld_plugin_set_extra_library_path tv_set_extra_library_path; + ld_plugin_get_input_section_count tv_get_input_section_count; + ld_plugin_get_input_section_type tv_get_input_section_type; + ld_plugin_get_input_section_name tv_get_input_section_name; + ld_plugin_get_input_section_contents tv_get_input_section_contents; + ld_plugin_update_section_order tv_update_section_order; + ld_plugin_allow_section_ordering tv_allow_section_ordering; + ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections; + ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections; + ld_plugin_get_input_section_alignment tv_get_input_section_alignment; + ld_plugin_get_input_section_size tv_get_input_section_size; + ld_plugin_register_new_input tv_register_new_input; + ld_plugin_get_wrap_symbols tv_get_wrap_symbols; } tv_u; };