1 /* plugin-api.h -- External linker plugin API. */
3 /* Copyright (C) 2009-2024 Free Software Foundation, Inc.
4 Written by Cary Coutant <ccoutant@google.com>.
6 This file is part of binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 /* This file defines the interface for writing a linker plugin, which is
24 described at < http://gcc.gnu.org/wiki/whopr/driver >. */
31 #elif defined(HAVE_INTTYPES_H)
34 #include <sys/types.h>
35 #if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \
36 !defined(UINT64_MAX) && !defined(uint64_t)
37 #error cannot find uint64_t type
40 /* Detect endianess based on gcc's (>=4.6.0) __BYTE_ORDER__ macro. */
41 #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
42 defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_PDP_ENDIAN__)
43 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
44 #define PLUGIN_LITTLE_ENDIAN 1
45 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
46 #define PLUGIN_BIG_ENDIAN 1
47 #elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
48 #define PLUGIN_PDP_ENDIAN 1
52 /* Include header files to define endian macros. */
53 #if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID__)
56 #elif defined(__SVR4) && defined(__sun)
57 #include <sys/byteorder.h>
59 #elif defined(__FreeBSD__) || defined(__NetBSD__) || \
60 defined(__DragonFly__) || defined(__minix)
61 #include <sys/endian.h>
63 #elif defined(__OpenBSD__)
64 #include <machine/endian.h>
67 /* Detect endianess based on __BYTE_ORDER. */
69 #if __BYTE_ORDER == __LITTLE_ENDIAN
70 #define PLUGIN_LITTLE_ENDIAN 1
71 #elif __BYTE_ORDER == __BIG_ENDIAN
72 #define PLUGIN_BIG_ENDIAN 1
75 /* Detect endianess based on _BYTE_ORDER. */
76 #elif defined _BYTE_ORDER
77 #if _BYTE_ORDER == _LITTLE_ENDIAN
78 #define PLUGIN_LITTLE_ENDIAN 1
79 #elif _BYTE_ORDER == _BIG_ENDIAN
80 #define PLUGIN_BIG_ENDIAN 1
83 /* Detect based on _WIN32. */
85 #define PLUGIN_LITTLE_ENDIAN 1
87 /* Detect based on __BIG_ENDIAN__ and __LITTLE_ENDIAN__ */
88 #elif defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
89 #define PLUGIN_LITTLE_ENDIAN 1
90 #elif defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
91 #define PLUGIN_BIG_ENDIAN 1
100 /* Status code returned by most API routines. */
102 enum ld_plugin_status
105 LDPS_NO_SYMS
, /* Attempt to get symbols that haven't been added. */
106 LDPS_BAD_HANDLE
, /* No claimed object associated with given handle. */
108 /* Additional Error codes TBD. */
111 /* The version of the API specification. */
113 enum ld_plugin_api_version
115 LD_PLUGIN_API_VERSION
= 1
118 /* The type of output file being generated by the linker. */
120 enum ld_plugin_output_file_type
128 /* An input file managed by the plugin library. */
130 struct ld_plugin_input_file
139 /* A symbol belonging to an input file managed by the plugin library. */
141 struct ld_plugin_symbol
145 /* This is for compatibility with older ABIs. The older ABI defined
147 #if PLUGIN_BIG_ENDIAN == 1
152 #elif PLUGIN_LITTLE_ENDIAN == 1
157 #elif PLUGIN_PDP_ENDIAN == 1
163 #error "Could not detect architecture endianess"
171 /* An object's section. */
173 struct ld_plugin_section
179 /* Whether the symbol is a definition, reference, or common, weak or not. */
181 enum ld_plugin_symbol_kind
190 /* The visibility of the symbol. */
192 enum ld_plugin_symbol_visibility
200 /* The type of the symbol. */
202 enum ld_plugin_symbol_type
209 enum ld_plugin_symbol_section_kind
215 /* How a symbol is resolved. */
217 enum ld_plugin_symbol_resolution
221 /* Symbol is still undefined at this point. */
224 /* This is the prevailing definition of the symbol, with references from
225 regular object code. */
228 /* This is the prevailing definition of the symbol, with no
229 references from regular objects. It is only referenced from IR
231 LDPR_PREVAILING_DEF_IRONLY
,
233 /* This definition was pre-empted by a definition in a regular
237 /* This definition was pre-empted by a definition in another IR file. */
240 /* This symbol was resolved by a definition in another IR file. */
243 /* This symbol was resolved by a definition in a regular object
244 linked into the main executable. */
247 /* This symbol was resolved by a definition in a shared object. */
250 /* This is the prevailing definition of the symbol, with no
251 references from regular objects. It is only referenced from IR
252 code, but the symbol is exported and may be referenced from
253 a dynamic object (not seen at link time). */
254 LDPR_PREVAILING_DEF_IRONLY_EXP
257 /* The plugin library's "claim file" handler. */
260 enum ld_plugin_status
261 (*ld_plugin_claim_file_handler
) (
262 const struct ld_plugin_input_file
*file
, int *claimed
);
264 /* The plugin library's "claim file" handler, version 2. */
267 enum ld_plugin_status
268 (*ld_plugin_claim_file_handler_v2
) (
269 const struct ld_plugin_input_file
*file
, int *claimed
, int known_used
);
271 /* The plugin library's "all symbols read" handler. */
274 enum ld_plugin_status
275 (*ld_plugin_all_symbols_read_handler
) (void);
277 /* The plugin library's cleanup handler. */
280 enum ld_plugin_status
281 (*ld_plugin_cleanup_handler
) (void);
283 /* The linker's interface for registering the "claim file" handler. */
286 enum ld_plugin_status
287 (*ld_plugin_register_claim_file
) (ld_plugin_claim_file_handler handler
);
289 /* The linker's interface for registering the "claim file" handler,
293 enum ld_plugin_status
294 (*ld_plugin_register_claim_file_v2
) (ld_plugin_claim_file_handler_v2 handler
);
296 /* The linker's interface for registering the "all symbols read" handler. */
299 enum ld_plugin_status
300 (*ld_plugin_register_all_symbols_read
) (
301 ld_plugin_all_symbols_read_handler handler
);
303 /* The linker's interface for registering the cleanup handler. */
306 enum ld_plugin_status
307 (*ld_plugin_register_cleanup
) (ld_plugin_cleanup_handler handler
);
309 /* The linker's interface for adding symbols from a claimed input file. */
312 enum ld_plugin_status
313 (*ld_plugin_add_symbols
) (void *handle
, int nsyms
,
314 const struct ld_plugin_symbol
*syms
);
316 /* The linker's interface for getting the input file information with
317 an open (possibly re-opened) file descriptor. */
320 enum ld_plugin_status
321 (*ld_plugin_get_input_file
) (const void *handle
,
322 struct ld_plugin_input_file
*file
);
325 enum ld_plugin_status
326 (*ld_plugin_get_view
) (const void *handle
, const void **viewp
);
328 /* The linker's interface for releasing the input file. */
331 enum ld_plugin_status
332 (*ld_plugin_release_input_file
) (const void *handle
);
334 /* The linker's interface for retrieving symbol resolution information. */
337 enum ld_plugin_status
338 (*ld_plugin_get_symbols
) (const void *handle
, int nsyms
,
339 struct ld_plugin_symbol
*syms
);
341 /* The linker's interface for adding a compiled input file. */
344 enum ld_plugin_status
345 (*ld_plugin_add_input_file
) (const char *pathname
);
347 /* The linker's interface for adding a library that should be searched. */
350 enum ld_plugin_status
351 (*ld_plugin_add_input_library
) (const char *libname
);
353 /* The linker's interface for adding a library path that should be searched. */
356 enum ld_plugin_status
357 (*ld_plugin_set_extra_library_path
) (const char *path
);
359 /* The linker's interface for issuing a warning or error message. */
362 enum ld_plugin_status
363 (*ld_plugin_message
) (int level
, const char *format
, ...);
365 /* The linker's interface for retrieving the number of sections in an object.
366 The handle is obtained in the claim_file handler. This interface should
367 only be invoked in the claim_file handler. This function sets *COUNT to
368 the number of sections in the object. */
371 enum ld_plugin_status
372 (*ld_plugin_get_input_section_count
) (const void* handle
, unsigned int *count
);
374 /* The linker's interface for retrieving the section type of a specific
375 section in an object. This interface should only be invoked in the
376 claim_file handler. This function sets *TYPE to an ELF SHT_xxx value. */
379 enum ld_plugin_status
380 (*ld_plugin_get_input_section_type
) (const struct ld_plugin_section section
,
383 /* The linker's interface for retrieving the name of a specific section in
384 an object. This interface should only be invoked in the claim_file handler.
385 This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated
386 by malloc. The plugin must free *SECTION_NAME_PTR. */
389 enum ld_plugin_status
390 (*ld_plugin_get_input_section_name
) (const struct ld_plugin_section section
,
391 char **section_name_ptr
);
393 /* The linker's interface for retrieving the contents of a specific section
394 in an object. This interface should only be invoked in the claim_file
395 handler. This function sets *SECTION_CONTENTS to point to a buffer that is
396 valid until clam_file handler returns. It sets *LEN to the size of the
400 enum ld_plugin_status
401 (*ld_plugin_get_input_section_contents
) (const struct ld_plugin_section section
,
402 const unsigned char **section_contents
,
405 /* The linker's interface for specifying the desired order of sections.
406 The sections should be specifed using the array SECTION_LIST in the
407 order in which they should appear in the final layout. NUM_SECTIONS
408 specifies the number of entries in each array. This should be invoked
409 in the all_symbols_read handler. */
412 enum ld_plugin_status
413 (*ld_plugin_update_section_order
) (const struct ld_plugin_section
*section_list
,
414 unsigned int num_sections
);
416 /* The linker's interface for specifying that reordering of sections is
417 desired so that the linker can prepare for it. This should be invoked
418 before update_section_order, preferably in the claim_file handler. */
421 enum ld_plugin_status
422 (*ld_plugin_allow_section_ordering
) (void);
424 /* The linker's interface for specifying that a subset of sections is
425 to be mapped to a unique segment. If the plugin wants to call
426 unique_segment_for_sections, it must call this function from a
427 claim_file_handler or when it is first loaded. */
430 enum ld_plugin_status
431 (*ld_plugin_allow_unique_segment_for_sections
) (void);
433 /* The linker's interface for specifying that a specific set of sections
434 must be mapped to a unique segment. ELF segments do not have names
435 and the NAME is used as the name of the newly created output section
436 that is then placed in the unique PT_LOAD segment. FLAGS is used to
437 specify if any additional segment flags need to be set. For instance,
438 a specific segment flag can be set to identify this segment. Unsetting
439 segment flags that would be set by default is not possible. The
440 parameter SEGMENT_ALIGNMENT when non-zero will override the default. */
443 enum ld_plugin_status
444 (*ld_plugin_unique_segment_for_sections
) (
445 const char* segment_name
,
446 uint64_t segment_flags
,
447 uint64_t segment_alignment
,
448 const struct ld_plugin_section
* section_list
,
449 unsigned int num_sections
);
451 /* The linker's interface for retrieving the section alignment requirement
452 of a specific section in an object. This interface should only be invoked in the
453 claim_file handler. This function sets *ADDRALIGN to the ELF sh_addralign
454 value of the input section. */
457 enum ld_plugin_status
458 (*ld_plugin_get_input_section_alignment
) (const struct ld_plugin_section section
,
459 unsigned int *addralign
);
461 /* The linker's interface for retrieving the section size of a specific section
462 in an object. This interface should only be invoked in the claim_file handler.
463 This function sets *SECSIZE to the ELF sh_size
464 value of the input section. */
467 enum ld_plugin_status
468 (*ld_plugin_get_input_section_size
) (const struct ld_plugin_section section
,
472 enum ld_plugin_status
473 (*ld_plugin_new_input_handler
) (const struct ld_plugin_input_file
*file
);
475 /* The linker's interface for registering the "new_input" handler. This handler
476 will be notified when a new input file has been added after the
477 all_symbols_read event, allowing the plugin to, for example, set a unique
478 segment for sections in plugin-generated input files. */
481 enum ld_plugin_status
482 (*ld_plugin_register_new_input
) (ld_plugin_new_input_handler handler
);
484 /* The linker's interface for getting the list of wrapped symbols using the
485 --wrap option. This sets *NUM_SYMBOLS to number of wrapped symbols and
486 *WRAP_SYMBOL_LIST to the list of wrapped symbols. */
489 enum ld_plugin_status
490 (*ld_plugin_get_wrap_symbols
) (uint64_t *num_symbols
,
491 const char ***wrap_symbol_list
);
501 /* Contract between a plug-in and a linker. */
503 enum linker_api_version
505 /* The linker/plugin do not implement any of the API levels below, the API
506 is determined solely via the transfer vector. */
509 /* API level v1. The linker provides get_symbols_v3, add_symbols_v2,
510 the plugin will use that and not any lower versions.
511 claim_file is thread-safe on the plugin side and
512 add_symbols on the linker side. */
516 /* The linker's interface for API version negotiation. A plug-in calls
517 the function (with its IDENTIFIER and VERSION), plus minimal and maximal
518 version of linker_api_version is provided. Linker then returns selected
519 API version and provides its IDENTIFIER and VERSION. The returned value
520 by linker must be in range [MINIMAL_API_SUPPORTED, MAXIMAL_API_SUPPORTED].
521 Identifier pointers remain valid as long as the plugin is loaded. */
525 (*ld_plugin_get_api_version
) (const char *plugin_identifier
,
526 const char *plugin_version
,
527 int minimal_api_supported
,
528 int maximal_api_supported
,
529 const char **linker_identifier
,
530 const char **linker_version
);
532 /* Values for the tv_tag field of the transfer vector. */
541 LDPT_REGISTER_CLAIM_FILE_HOOK
,
542 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
,
543 LDPT_REGISTER_CLEANUP_HOOK
,
549 LDPT_RELEASE_INPUT_FILE
,
550 LDPT_ADD_INPUT_LIBRARY
,
552 LDPT_SET_EXTRA_LIBRARY_PATH
,
555 LDPT_GET_INPUT_SECTION_COUNT
,
556 LDPT_GET_INPUT_SECTION_TYPE
,
557 LDPT_GET_INPUT_SECTION_NAME
,
558 LDPT_GET_INPUT_SECTION_CONTENTS
,
559 LDPT_UPDATE_SECTION_ORDER
,
560 LDPT_ALLOW_SECTION_ORDERING
,
562 LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS
,
563 LDPT_UNIQUE_SEGMENT_FOR_SECTIONS
,
565 LDPT_GET_INPUT_SECTION_ALIGNMENT
,
566 LDPT_GET_INPUT_SECTION_SIZE
,
567 LDPT_REGISTER_NEW_INPUT_HOOK
,
568 LDPT_GET_WRAP_SYMBOLS
,
570 LDPT_GET_API_VERSION
,
571 LDPT_REGISTER_CLAIM_FILE_HOOK_V2
574 /* The plugin transfer vector. */
578 enum ld_plugin_tag tv_tag
;
582 const char *tv_string
;
583 ld_plugin_register_claim_file tv_register_claim_file
;
584 ld_plugin_register_claim_file_v2 tv_register_claim_file_v2
;
585 ld_plugin_register_all_symbols_read tv_register_all_symbols_read
;
586 ld_plugin_register_cleanup tv_register_cleanup
;
587 ld_plugin_add_symbols tv_add_symbols
;
588 ld_plugin_get_symbols tv_get_symbols
;
589 ld_plugin_add_input_file tv_add_input_file
;
590 ld_plugin_message tv_message
;
591 ld_plugin_get_input_file tv_get_input_file
;
592 ld_plugin_get_view tv_get_view
;
593 ld_plugin_release_input_file tv_release_input_file
;
594 ld_plugin_add_input_library tv_add_input_library
;
595 ld_plugin_set_extra_library_path tv_set_extra_library_path
;
596 ld_plugin_get_input_section_count tv_get_input_section_count
;
597 ld_plugin_get_input_section_type tv_get_input_section_type
;
598 ld_plugin_get_input_section_name tv_get_input_section_name
;
599 ld_plugin_get_input_section_contents tv_get_input_section_contents
;
600 ld_plugin_update_section_order tv_update_section_order
;
601 ld_plugin_allow_section_ordering tv_allow_section_ordering
;
602 ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections
;
603 ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections
;
604 ld_plugin_get_input_section_alignment tv_get_input_section_alignment
;
605 ld_plugin_get_input_section_size tv_get_input_section_size
;
606 ld_plugin_register_new_input tv_register_new_input
;
607 ld_plugin_get_wrap_symbols tv_get_wrap_symbols
;
608 ld_plugin_get_api_version tv_get_api_version
;
612 /* The plugin library's "onload" entry point. */
615 enum ld_plugin_status
616 (*ld_plugin_onload
) (struct ld_plugin_tv
*tv
);
622 #endif /* !defined(PLUGIN_API_H) */