1 /* plugin-api.h -- External linker plugin API. */
3 /* Copyright 2009, 2010 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 can not find uint64_t type
45 /* Status code returned by most API routines. */
50 LDPS_NO_SYMS
, /* Attempt to get symbols that haven't been added. */
51 LDPS_BAD_HANDLE
, /* No claimed object associated with given handle. */
53 /* Additional Error codes TBD. */
56 /* The version of the API specification. */
58 enum ld_plugin_api_version
60 LD_PLUGIN_API_VERSION
= 1
63 /* The type of output file being generated by the linker. */
65 enum ld_plugin_output_file_type
72 /* An input file managed by the plugin library. */
74 struct ld_plugin_input_file
83 /* A symbol belonging to an input file managed by the plugin library. */
85 struct ld_plugin_symbol
96 /* An object's section. */
98 struct ld_plugin_section
104 /* Whether the symbol is a definition, reference, or common, weak or not. */
106 enum ld_plugin_symbol_kind
115 /* The visibility of the symbol. */
117 enum ld_plugin_symbol_visibility
125 /* How a symbol is resolved. */
127 enum ld_plugin_symbol_resolution
131 /* Symbol is still undefined at this point. */
134 /* This is the prevailing definition of the symbol, with references from
135 regular object code. */
138 /* This is the prevailing definition of the symbol, with no
139 references from regular objects. It is only referenced from IR
141 LDPR_PREVAILING_DEF_IRONLY
,
143 /* This definition was pre-empted by a definition in a regular
147 /* This definition was pre-empted by a definition in another IR file. */
150 /* This symbol was resolved by a definition in another IR file. */
153 /* This symbol was resolved by a definition in a regular object
154 linked into the main executable. */
157 /* This symbol was resolved by a definition in a shared object. */
161 /* The plugin library's "claim file" handler. */
164 enum ld_plugin_status
165 (*ld_plugin_claim_file_handler
) (
166 const struct ld_plugin_input_file
*file
, int *claimed
);
168 /* The plugin library's "all symbols read" handler. */
171 enum ld_plugin_status
172 (*ld_plugin_all_symbols_read_handler
) (void);
174 /* The plugin library's cleanup handler. */
177 enum ld_plugin_status
178 (*ld_plugin_cleanup_handler
) (void);
180 /* The linker's interface for registering the "claim file" handler. */
183 enum ld_plugin_status
184 (*ld_plugin_register_claim_file
) (ld_plugin_claim_file_handler handler
);
186 /* The linker's interface for registering the "all symbols read" handler. */
189 enum ld_plugin_status
190 (*ld_plugin_register_all_symbols_read
) (
191 ld_plugin_all_symbols_read_handler handler
);
193 /* The linker's interface for registering the cleanup handler. */
196 enum ld_plugin_status
197 (*ld_plugin_register_cleanup
) (ld_plugin_cleanup_handler handler
);
199 /* The linker's interface for adding symbols from a claimed input file. */
202 enum ld_plugin_status
203 (*ld_plugin_add_symbols
) (void *handle
, int nsyms
,
204 const struct ld_plugin_symbol
*syms
);
206 /* The linker's interface for getting the input file information with
207 an open (possibly re-opened) file descriptor. */
210 enum ld_plugin_status
211 (*ld_plugin_get_input_file
) (const void *handle
,
212 struct ld_plugin_input_file
*file
);
215 enum ld_plugin_status
216 (*ld_plugin_get_view
) (const void *handle
, const void **viewp
);
218 /* The linker's interface for releasing the input file. */
221 enum ld_plugin_status
222 (*ld_plugin_release_input_file
) (const void *handle
);
224 /* The linker's interface for retrieving symbol resolution information. */
227 enum ld_plugin_status
228 (*ld_plugin_get_symbols
) (const void *handle
, int nsyms
,
229 struct ld_plugin_symbol
*syms
);
231 /* The linker's interface for adding a compiled input file. */
234 enum ld_plugin_status
235 (*ld_plugin_add_input_file
) (const char *pathname
);
237 /* The linker's interface for adding a library that should be searched. */
240 enum ld_plugin_status
241 (*ld_plugin_add_input_library
) (const char *libname
);
243 /* The linker's interface for adding a library path that should be searched. */
246 enum ld_plugin_status
247 (*ld_plugin_set_extra_library_path
) (const char *path
);
249 /* The linker's interface for issuing a warning or error message. */
252 enum ld_plugin_status
253 (*ld_plugin_message
) (int level
, const char *format
, ...);
255 /* The linker's interface for retrieving the number of sections in an object.
256 The handle is obtained in the claim_file handler. This interface should
257 only be invoked in the claim_file handler. This function sets *COUNT to
258 the number of sections in the object. */
261 enum ld_plugin_status
262 (*ld_plugin_get_input_section_count
) (const void* handle
, unsigned int *count
);
264 /* The linker's interface for retrieving the section type of a specific
265 section in an object. This interface should only be invoked in the
266 claim_file handler. This function sets *TYPE to an ELF SHT_xxx value. */
269 enum ld_plugin_status
270 (*ld_plugin_get_input_section_type
) (const struct ld_plugin_section section
,
273 /* The linker's interface for retrieving the name of a specific section in
274 an object. This interface should only be invoked in the claim_file handler.
275 This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated
276 by malloc. The plugin must free *SECTION_NAME_PTR. */
279 enum ld_plugin_status
280 (*ld_plugin_get_input_section_name
) (const struct ld_plugin_section section
,
281 char **section_name_ptr
);
283 /* The linker's interface for retrieving the contents of a specific section
284 in an object. This interface should only be invoked in the claim_file
285 handler. This function sets *SECTION_CONTENTS to point to a buffer that is
286 valid until clam_file handler returns. It sets *LEN to the size of the
290 enum ld_plugin_status
291 (*ld_plugin_get_input_section_contents
) (const struct ld_plugin_section section
,
292 const unsigned char **section_contents
,
295 /* The linker's interface for specifying the desired order of sections.
296 The sections should be specifed using the array SECTION_LIST in the
297 order in which they should appear in the final layout. NUM_SECTIONS
298 specifies the number of entries in each array. This should be invoked
299 in the all_symbols_read handler. */
302 enum ld_plugin_status
303 (*ld_plugin_update_section_order
) (const struct ld_plugin_section
*section_list
,
304 unsigned int num_sections
);
306 /* The linker's interface for specifying that reordering of sections is
307 desired so that the linker can prepare for it. This should be invoked
308 before update_section_order, preferably in the claim_file handler. */
311 enum ld_plugin_status
312 (*ld_plugin_allow_section_ordering
) (void);
322 /* Values for the tv_tag field of the transfer vector. */
331 LDPT_REGISTER_CLAIM_FILE_HOOK
,
332 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
,
333 LDPT_REGISTER_CLEANUP_HOOK
,
339 LDPT_RELEASE_INPUT_FILE
,
340 LDPT_ADD_INPUT_LIBRARY
,
342 LDPT_SET_EXTRA_LIBRARY_PATH
,
345 LDPT_GET_INPUT_SECTION_COUNT
,
346 LDPT_GET_INPUT_SECTION_TYPE
,
347 LDPT_GET_INPUT_SECTION_NAME
,
348 LDPT_GET_INPUT_SECTION_CONTENTS
,
349 LDPT_UPDATE_SECTION_ORDER
,
350 LDPT_ALLOW_SECTION_ORDERING
353 /* The plugin transfer vector. */
357 enum ld_plugin_tag tv_tag
;
361 const char *tv_string
;
362 ld_plugin_register_claim_file tv_register_claim_file
;
363 ld_plugin_register_all_symbols_read tv_register_all_symbols_read
;
364 ld_plugin_register_cleanup tv_register_cleanup
;
365 ld_plugin_add_symbols tv_add_symbols
;
366 ld_plugin_get_symbols tv_get_symbols
;
367 ld_plugin_add_input_file tv_add_input_file
;
368 ld_plugin_message tv_message
;
369 ld_plugin_get_input_file tv_get_input_file
;
370 ld_plugin_get_view tv_get_view
;
371 ld_plugin_release_input_file tv_release_input_file
;
372 ld_plugin_add_input_library tv_add_input_library
;
373 ld_plugin_set_extra_library_path tv_set_extra_library_path
;
374 ld_plugin_get_input_section_count tv_get_input_section_count
;
375 ld_plugin_get_input_section_type tv_get_input_section_type
;
376 ld_plugin_get_input_section_name tv_get_input_section_name
;
377 ld_plugin_get_input_section_contents tv_get_input_section_contents
;
378 ld_plugin_update_section_order tv_update_section_order
;
379 ld_plugin_allow_section_ordering tv_allow_section_ordering
;
383 /* The plugin library's "onload" entry point. */
386 enum ld_plugin_status
387 (*ld_plugin_onload
) (struct ld_plugin_tv
*tv
);
393 #endif /* !defined(PLUGIN_API_H) */