1 /* LTO plugin for linkers like gold, GNU ld or mold.
2 Copyright (C) 2009-2025 Free Software Foundation, Inc.
3 Contributed by Rafael Avila de Espindola (espindola@google.com).
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; see the file COPYING3. If not see
17 <http://www.gnu.org/licenses/>. */
19 /* The plugin has only one external function: onload. A linker passes it an array of
20 function that the plugin uses to communicate back to the linker.
22 With the functions provided by the linker, the plugin can be notified when
23 the linker first analyzes a file and pass a symbol table back to the linker. The plugin
24 is also notified when all symbols have been read and it is time to generate
25 machine code for the necessary symbols.
27 More information at http://gcc.gnu.org/wiki/whopr/driver.
29 This plugin should be passed the lto-wrapper options and will forward them.
30 It also has options at his own:
31 -debug: Print the command line used to run lto-wrapper.
32 -nop: Instead of running lto-wrapper, pass the original to the plugin. This
33 only works if the input files are hybrid.
34 -linker-output-known: Do not determine linker output
35 -linker-output-auto-nolto-rel: Switch from rel to nolto-rel mode without
36 warning. This is used on systems like VxWorks (kernel) where the link is
37 always partial and repeated incremental linking is generally not used.
38 -sym-style={none,win32,underscore|uscore}
57 #include <sys/types.h>
58 #if HAVE_PTHREAD_LOCKING
61 #ifdef HAVE_SYS_WAIT_H
65 #define WIFEXITED(S) (((S) & 0xff) == 0)
68 #define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
70 #include <libiberty.h>
72 #include "../gcc/lto/common.h"
73 #include "simple-object.h"
74 #include "plugin-api.h"
76 /* We need to use I64 instead of ll width-specifier on native Windows.
77 The reason for this is that older MS-runtimes don't support the ll. */
84 /* Handle opening elf files on hosts, such as Windows, that may use
85 text file handling that will break binary access. */
90 /* Segment name for LTO sections. This is only used for Mach-O.
91 FIXME: This needs to be kept in sync with darwin.c. */
93 #define LTO_SEGMENT_NAME "__GNU_LTO"
95 /* Return true if STR string starts with PREFIX. */
98 startswith (const char *str
, const char *prefix
)
100 return strncmp (str
, prefix
, strlen (prefix
)) == 0;
103 /* The part of the symbol table the plugin has to keep track of. Note that we
104 must keep SYMS until all_symbols_read is called to give the linker time to
105 copy the symbol information.
106 The id must be 64bit to minimze collisions. */
111 unsigned long long id
;
112 unsigned next_conflict
;
120 struct ld_plugin_symbol
*syms
;
121 unsigned long long id
;
124 /* Encapsulates object file data during symbol scan. */
125 struct plugin_objfile
129 simple_object_read
*objfile
;
130 struct plugin_symtab
*out
;
131 const struct ld_plugin_input_file
*file
;
134 /* All that we have to remember about a file. */
136 struct plugin_file_info
140 struct plugin_symtab symtab
;
141 struct plugin_symtab conflicts
;
145 /* List item with name of the file with offloading. */
147 struct plugin_offload_file
150 struct plugin_offload_file
*next
;
153 /* Until ASM_OUTPUT_LABELREF can be hookized and decoupled from
154 stdio file streams, we do simple label translation here. */
158 ss_none
, /* No underscore prefix. */
159 ss_win32
, /* Underscore prefix any symbol not beginning with '@'. */
160 ss_uscore
, /* Underscore prefix all symbols. */
163 #if HAVE_PTHREAD_LOCKING
165 static pthread_mutex_t plugin_lock
;
167 #define LOCK_SECTION pthread_mutex_lock (&plugin_lock)
168 #define UNLOCK_SECTION pthread_mutex_unlock (&plugin_lock)
171 #define UNLOCK_SECTION
174 static char *arguments_file_name
;
175 static ld_plugin_register_claim_file register_claim_file
;
176 static ld_plugin_register_claim_file_v2 register_claim_file_v2
;
177 static ld_plugin_register_all_symbols_read register_all_symbols_read
;
178 static ld_plugin_get_symbols get_symbols
, get_symbols_v2
, get_symbols_v3
;
179 static ld_plugin_register_cleanup register_cleanup
;
180 static ld_plugin_add_input_file add_input_file
;
181 static ld_plugin_add_input_library add_input_library
;
182 static ld_plugin_message message
;
183 static ld_plugin_add_symbols add_symbols
, add_symbols_v2
;
184 static ld_plugin_get_api_version get_api_version
;
186 /* By default, use version LAPI_V0 if there is not negotiation. */
187 static enum linker_api_version api_version
= LAPI_V0
;
189 static struct plugin_file_info
*claimed_files
= NULL
;
190 static unsigned int num_claimed_files
= 0;
191 static unsigned int non_claimed_files
= 0;
193 /* List of files with offloading. */
194 static struct plugin_offload_file
*offload_files
;
195 /* Last file in the list. */
196 static struct plugin_offload_file
*offload_files_last
;
197 /* Last non-archive file in the list. */
198 static struct plugin_offload_file
*offload_files_last_obj
;
199 /* Last LTO file in the list. */
200 static struct plugin_offload_file
*offload_files_last_lto
;
201 /* Total number of files with offloading. */
202 static unsigned num_offload_files
;
204 static char **output_files
= NULL
;
205 static unsigned int num_output_files
= 0;
207 static char **lto_wrapper_argv
;
208 static int lto_wrapper_num_args
;
210 static char **pass_through_items
= NULL
;
211 static unsigned int num_pass_through_items
;
213 static char *ltrans_objects
= NULL
;
216 static bool save_temps
;
217 static bool flto_incremental
;
220 static char *resolution_file
= NULL
;
221 static enum ld_plugin_output_file_type linker_output
;
222 static bool linker_output_set
;
223 static bool linker_output_known
;
224 static bool linker_output_auto_nolto_rel
;
225 static const char *link_output_name
= NULL
;
227 /* This indicates link_output_name already contains the dot of the
228 suffix, so we can skip it in extensions. */
229 static bool skip_in_suffix
= false;
231 /* The version of gold being used, or -1 if not gold. The number is
232 MAJOR * 100 + MINOR. */
233 static int gold_version
= -1;
235 /* Not used by default, but can be overridden at runtime
236 by using -plugin-opt=-sym-style={none,win32,underscore|uscore}
237 (in fact, only first letter of style arg is checked.) */
238 static enum symbol_style sym_style
= ss_none
;
241 check_1 (int gate
, enum ld_plugin_level level
, const char *text
)
247 message (level
, text
);
250 /* If there is no nicer way to inform the user, fallback to stderr. */
251 fprintf (stderr
, "%s\n", text
);
252 if (level
== LDPL_FATAL
)
257 /* This little wrapper allows check to be called with a non-integer
258 first argument, such as a pointer that must be non-NULL. We can't
259 use c99 bool type to coerce it into range, so we explicitly test. */
260 #define check(GATE, LEVEL, TEXT) check_1 (((GATE) != 0), (LEVEL), (TEXT))
262 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
263 by P and the result is written in ENTRY. The slot number is stored in SLOT.
264 Returns the address of the next entry. */
267 parse_table_entry (char *p
, struct ld_plugin_symbol
*entry
,
271 enum ld_plugin_symbol_kind translate_kind
[] =
280 enum ld_plugin_symbol_visibility translate_visibility
[] =
293 /* cf. Duff's device. */
295 entry
->name
= xstrdup (p
);
300 entry
->name
= concat ("_", p
, NULL
);
303 check (0, LDPL_FATAL
, "invalid symbol style requested");
310 entry
->version
= NULL
;
312 entry
->comdat_key
= p
;
317 if (strlen (entry
->comdat_key
) == 0)
318 entry
->comdat_key
= NULL
;
320 entry
->comdat_key
= xstrdup (entry
->comdat_key
);
322 entry
->unused
= entry
->section_kind
= entry
->symbol_type
= 0;
325 check (t
<= 4, LDPL_FATAL
, "invalid symbol kind found");
326 entry
->def
= translate_kind
[t
];
330 check (t
<= 3, LDPL_FATAL
, "invalid symbol visibility found");
331 entry
->visibility
= translate_visibility
[t
];
334 memcpy (&entry
->size
, p
, sizeof (uint64_t));
337 memcpy (&aux
->slot
, p
, sizeof (uint32_t));
340 entry
->resolution
= LDPR_UNKNOWN
;
342 aux
->next_conflict
= -1;
347 /* Parse an entry of the IL symbol table. The data to be parsed is pointed
348 by P and the result is written in ENTRY. The slot number is stored in SLOT.
349 Returns the address of the next entry. */
352 parse_table_entry_extension (char *p
, struct ld_plugin_symbol
*entry
)
355 enum ld_plugin_symbol_type symbol_types
[] =
363 check (t
<= 2, LDPL_FATAL
, "invalid symbol type found");
364 entry
->symbol_type
= symbol_types
[t
];
366 entry
->section_kind
= *p
;
373 /* Translate the IL symbol table located between DATA and END. Append the
374 slots and symbols to OUT. */
377 translate (char *data
, char *end
, struct plugin_symtab
*out
)
380 struct ld_plugin_symbol
*syms
= NULL
;
383 /* This overestimates the output buffer sizes, but at least
384 the algorithm is O(1) now. */
386 len
= (end
- data
)/8 + out
->nsyms
+ 1;
387 syms
= xrealloc (out
->syms
, len
* sizeof (struct ld_plugin_symbol
));
388 aux
= xrealloc (out
->aux
, len
* sizeof (struct sym_aux
));
390 for (n
= out
->nsyms
; data
< end
; n
++)
393 data
= parse_table_entry (data
, &syms
[n
], &aux
[n
]);
404 parse_symtab_extension (char *data
, char *end
, struct plugin_symtab
*out
)
407 unsigned char version
;
410 /* FIXME: Issue an error ? */
419 /* Version 1 contains the following data per entry:
424 unsigned long nsyms
= (end
- data
) / 2;
426 for (i
= 0; i
< nsyms
; i
++)
427 data
= parse_table_entry_extension (data
, out
->syms
+ i
+ out
->last_sym
);
429 out
->last_sym
+= nsyms
;
432 /* Free all memory that is no longer needed after writing the symbol
436 free_1 (struct plugin_file_info
*files
, unsigned num_files
)
439 for (i
= 0; i
< num_files
; i
++)
441 struct plugin_file_info
*info
= &files
[i
];
442 struct plugin_symtab
*symtab
= &info
->symtab
;
444 for (j
= 0; j
< symtab
->nsyms
; j
++)
446 struct ld_plugin_symbol
*s
= &symtab
->syms
[j
];
448 free (s
->comdat_key
);
455 /* Free all remaining memory. */
461 for (i
= 0; i
< num_claimed_files
; i
++)
463 struct plugin_file_info
*info
= &claimed_files
[i
];
464 struct plugin_symtab
*symtab
= &info
->symtab
;
469 for (i
= 0; i
< num_output_files
; i
++)
470 free (output_files
[i
]);
473 free (claimed_files
);
474 claimed_files
= NULL
;
475 num_claimed_files
= 0;
477 while (offload_files
)
479 struct plugin_offload_file
*ofld
= offload_files
;
480 offload_files
= offload_files
->next
;
483 num_offload_files
= 0;
485 free (arguments_file_name
);
486 arguments_file_name
= NULL
;
489 /* Dump SYMTAB to resolution file F. */
492 dump_symtab (FILE *f
, struct plugin_symtab
*symtab
)
496 for (j
= 0; j
< symtab
->nsyms
; j
++)
498 uint32_t slot
= symtab
->aux
[j
].slot
;
499 unsigned int resolution
= symtab
->syms
[j
].resolution
;
501 assert (resolution
!= LDPR_UNKNOWN
);
503 fprintf (f
, "%u %" PRI_LL
"x %s %s\n",
504 (unsigned int) slot
, symtab
->aux
[j
].id
,
505 lto_resolution_str
[resolution
],
506 symtab
->syms
[j
].name
);
510 /* Finish the conflicts' resolution information after the linker resolved
511 the original symbols */
514 finish_conflict_resolution (struct plugin_symtab
*symtab
,
515 struct plugin_symtab
*conflicts
)
519 if (conflicts
->nsyms
== 0)
522 for (i
= 0; i
< symtab
->nsyms
; i
++)
524 char resolution
= LDPR_UNKNOWN
;
526 if (symtab
->aux
[i
].next_conflict
== -1)
529 switch (symtab
->syms
[i
].def
)
532 case LDPK_COMMON
: /* ??? */
533 resolution
= LDPR_RESOLVED_IR
;
536 resolution
= LDPR_PREEMPTED_IR
;
540 resolution
= symtab
->syms
[i
].resolution
;
546 assert (resolution
!= LDPR_UNKNOWN
);
548 for (j
= symtab
->aux
[i
].next_conflict
;
550 j
= conflicts
->aux
[j
].next_conflict
)
551 conflicts
->syms
[j
].resolution
= resolution
;
555 /* Free symbol table SYMTAB. */
558 free_symtab (struct plugin_symtab
*symtab
)
566 /* Writes the relocations to disk. */
569 write_resolution (void)
571 unsigned int i
, included_files
= 0;
574 check (resolution_file
, LDPL_FATAL
, "resolution file not specified");
575 f
= fopen (resolution_file
, "w");
576 check (f
, LDPL_FATAL
, "could not open file");
578 for (i
= 0; i
< num_claimed_files
; i
++)
580 struct plugin_file_info
*info
= &claimed_files
[i
];
581 struct plugin_symtab
*symtab
= &info
->symtab
;
582 struct ld_plugin_symbol
*syms
= symtab
->syms
;
584 /* Version 2 of API supports IRONLY_EXP resolution that is
585 accepted by GCC-4.7 and newer.
586 Version 3 can return LDPS_NO_SYMS that means the object
587 will not be used at all. */
590 enum ld_plugin_status status
591 = get_symbols_v3 (info
->handle
, symtab
->nsyms
, syms
);
592 if (status
== LDPS_NO_SYMS
)
594 info
->skip_file
= true;
598 else if (get_symbols_v2
)
599 get_symbols_v2 (info
->handle
, symtab
->nsyms
, syms
);
601 get_symbols (info
->handle
, symtab
->nsyms
, syms
);
605 finish_conflict_resolution (symtab
, &info
->conflicts
);
608 fprintf (f
, "%d\n", included_files
);
610 for (i
= 0; i
< num_claimed_files
; i
++)
612 struct plugin_file_info
*info
= &claimed_files
[i
];
613 struct plugin_symtab
*symtab
= &info
->symtab
;
618 fprintf (f
, "%s %d\n", info
->name
, symtab
->nsyms
+ info
->conflicts
.nsyms
);
619 dump_symtab (f
, symtab
);
620 if (info
->conflicts
.nsyms
)
622 dump_symtab (f
, &info
->conflicts
);
623 free_symtab (&info
->conflicts
);
629 /* Pass files generated by the lto-wrapper to the linker. FD is lto-wrapper's
633 add_output_files (FILE *f
)
637 const unsigned piece
= 32;
638 char *buf
, *s
= xmalloc (piece
);
643 if (!fgets (buf
, piece
, f
))
649 if (s
[len
- 1] != '\n')
651 s
= xrealloc (s
, len
+ piece
);
659 = xrealloc (output_files
, num_output_files
* sizeof (char *));
660 output_files
[num_output_files
- 1] = s
;
661 add_input_file (output_files
[num_output_files
- 1]);
665 /* Execute the lto-wrapper. ARGV[0] is the binary. The rest of ARGV is the
669 exec_lto_wrapper (char *argv
[])
675 FILE *wrapper_output
;
680 /* Write argv to a file to avoid a command line that is too long
681 Save the file locally on save-temps. */
682 const char *suffix
= ".lto_wrapper_args";
685 if (save_temps
&& link_output_name
)
686 arguments_file_name
= concat (link_output_name
, suffix
, NULL
);
688 arguments_file_name
= make_temp_file (".lto_wrapper_args");
689 check (arguments_file_name
, LDPL_FATAL
,
690 "Failed to generate a temorary file name");
692 args
= fopen (arguments_file_name
, "w");
693 check (args
, LDPL_FATAL
, "could not open arguments file");
695 t
= writeargv (&argv
[1], args
);
696 check (t
== 0, LDPL_FATAL
, "could not write arguments");
698 check (t
== 0, LDPL_FATAL
, "could not close arguments file");
700 at_args
= concat ("@", arguments_file_name
, NULL
);
701 check (at_args
, LDPL_FATAL
, "could not allocate");
703 for (i
= 1; argv
[i
]; i
++)
706 /* Check the input argument list for a verbose marker too. */
707 if (a
[0] == '-' && a
[1] == 'v' && a
[2] == '\0')
716 for (i
= 0; argv
[i
]; i
++)
717 fprintf (stderr
, "%s ", argv
[i
]);
718 fprintf (stderr
, "\n");
721 new_argv
[0] = argv
[0];
722 new_argv
[1] = at_args
;
727 for (i
= 0; new_argv
[i
]; i
++)
728 fprintf (stderr
, "%s ", new_argv
[i
]);
729 fprintf (stderr
, "\n");
732 pex
= pex_init (PEX_USE_PIPES
, "lto-wrapper", NULL
);
733 check (pex
!= NULL
, LDPL_FATAL
, "could not pex_init lto-wrapper");
735 errmsg
= pex_run (pex
, 0, new_argv
[0], new_argv
, NULL
, NULL
, &t
);
736 check (errmsg
== NULL
, LDPL_FATAL
, "could not run lto-wrapper");
737 check (t
== 0, LDPL_FATAL
, "could not run lto-wrapper");
739 wrapper_output
= pex_read_output (pex
, 0);
740 check (wrapper_output
, LDPL_FATAL
, "could not read lto-wrapper output");
742 add_output_files (wrapper_output
);
744 t
= pex_get_status (pex
, 1, &status
);
745 check (t
== 1, LDPL_FATAL
, "could not get lto-wrapper exit status");
746 check (WIFEXITED (status
) && WEXITSTATUS (status
) == 0, LDPL_FATAL
,
747 "lto-wrapper failed");
754 /* Pass the original files back to the linker. */
757 use_original_files (void)
760 for (i
= 0; i
< num_claimed_files
; i
++)
762 struct plugin_file_info
*info
= &claimed_files
[i
];
763 add_input_file (info
->name
);
768 /* Called by the linker once all symbols have been read. */
770 static enum ld_plugin_status
771 all_symbols_read_handler (void)
773 const unsigned num_lto_args
774 = num_claimed_files
+ lto_wrapper_num_args
+ 2
775 + !linker_output_known
+ !linker_output_auto_nolto_rel
;
778 const char *linker_output_str
= NULL
;
779 const char **lto_arg_ptr
;
780 if (num_claimed_files
+ num_offload_files
== 0)
785 use_original_files ();
791 FILE *objs
= fopen (ltrans_objects
, "r");
792 add_output_files (objs
);
797 lto_argv
= (char **) xcalloc (sizeof (char *), num_lto_args
);
798 lto_arg_ptr
= (const char **) lto_argv
;
799 assert (lto_wrapper_argv
);
803 free_1 (claimed_files
, num_claimed_files
);
805 for (i
= 0; i
< lto_wrapper_num_args
; i
++)
806 *lto_arg_ptr
++ = lto_wrapper_argv
[i
];
808 if (!linker_output_known
)
810 assert (linker_output_set
);
811 switch (linker_output
)
814 if (non_claimed_files
)
816 if (!linker_output_auto_nolto_rel
)
817 message (LDPL_WARNING
, "incremental linking of LTO and non-LTO"
818 " objects; using -flinker-output=nolto-rel which will"
819 " bypass whole program optimization");
820 linker_output_str
= "-flinker-output=nolto-rel";
823 linker_output_str
= "-flinker-output=rel";
826 linker_output_str
= "-flinker-output=dyn";
829 linker_output_str
= "-flinker-output=pie";
832 linker_output_str
= "-flinker-output=exec";
835 message (LDPL_FATAL
, "unsupported linker output %i", linker_output
);
838 *lto_arg_ptr
++ = xstrdup (linker_output_str
);
841 if (num_offload_files
> 0)
845 char *offload_objects_file_name
;
846 struct plugin_offload_file
*ofld
;
847 const char *suffix
= ".ofldlist";
849 if (save_temps
&& link_output_name
)
851 suffix
+= skip_in_suffix
;
852 offload_objects_file_name
= concat (link_output_name
, suffix
, NULL
);
855 offload_objects_file_name
= make_temp_file (suffix
);
856 check (offload_objects_file_name
, LDPL_FATAL
,
857 "Failed to generate a temporary file name");
858 f
= fopen (offload_objects_file_name
, "w");
859 check (f
, LDPL_FATAL
, "could not open file with offload objects");
860 fprintf (f
, "%u\n", num_offload_files
);
862 /* Skip the dummy item at the start of the list. */
863 ofld
= offload_files
->next
;
866 fprintf (f
, "%s\n", ofld
->name
);
871 arg
= concat ("-foffload-objects=", offload_objects_file_name
, NULL
);
872 check (arg
, LDPL_FATAL
, "could not allocate");
873 *lto_arg_ptr
++ = arg
;
876 for (i
= 0; i
< num_claimed_files
; i
++)
878 struct plugin_file_info
*info
= &claimed_files
[i
];
880 if (!info
->skip_file
)
881 *lto_arg_ptr
++ = info
->name
;
884 *lto_arg_ptr
++ = NULL
;
885 exec_lto_wrapper (lto_argv
);
889 /* --pass-through is not needed when using gold 1.11 or later. */
890 if (pass_through_items
&& gold_version
< 111)
893 for (i
= 0; i
< num_pass_through_items
; i
++)
895 if (startswith (pass_through_items
[i
], "-l"))
896 add_input_library (pass_through_items
[i
] + 2);
898 add_input_file (pass_through_items
[i
]);
899 free (pass_through_items
[i
]);
900 pass_through_items
[i
] = NULL
;
902 free (pass_through_items
);
903 pass_through_items
= NULL
;
909 /* Helper, as used in collect2. */
911 file_exists (const char *name
)
913 return access (name
, R_OK
) == 0;
916 /* Unlink FILE unless we have save-temps set.
917 Note that we're saving files if verbose output is set. */
920 maybe_unlink (const char *file
)
922 if (save_temps
&& file_exists (file
))
925 fprintf (stderr
, "[Leaving %s]\n", file
);
929 unlink_if_ordinary (file
);
932 /* Remove temporary files at the end of the link. */
934 static enum ld_plugin_status
935 cleanup_handler (void)
942 if (arguments_file_name
)
943 maybe_unlink (arguments_file_name
);
945 if (!flto_incremental
)
946 for (i
= 0; i
< num_output_files
; i
++)
947 maybe_unlink (output_files
[i
]);
950 /* Keep files in ltrans cache. */
951 const char* suffix
= ".ltrans.o";
952 for (i
= 0; i
< num_output_files
; i
++)
954 int offset
= strlen (output_files
[i
]) - strlen (suffix
);
955 if (offset
< 0 || strcmp (output_files
[i
] + offset
, suffix
))
956 maybe_unlink (output_files
[i
]);
964 #define SWAP(type, a, b) \
965 do { type tmp_; tmp_ = (a); (a) = (b); (b) = tmp_; } while(0)
967 /* Compare two hash table entries */
969 static int eq_sym (const void *a
, const void *b
)
971 const struct ld_plugin_symbol
*as
= (const struct ld_plugin_symbol
*)a
;
972 const struct ld_plugin_symbol
*bs
= (const struct ld_plugin_symbol
*)b
;
974 return !strcmp (as
->name
, bs
->name
);
979 static hashval_t
hash_sym (const void *a
)
981 const struct ld_plugin_symbol
*as
= (const struct ld_plugin_symbol
*)a
;
983 return htab_hash_string (as
->name
);
986 /* Determine how strong a symbol is */
988 static int symbol_strength (struct ld_plugin_symbol
*s
)
1002 /* In the ld -r case we can get dups in the LTO symbol tables, where
1003 the same symbol can have different resolutions (e.g. undefined and defined).
1005 We have to keep that in the LTO symbol tables, but the dups confuse
1006 gold and then finally gcc by supplying incorrect resolutions.
1008 Problem is that the main gold symbol table doesn't know about subids
1009 and does not distingush the same symbols in different states.
1011 So we drop duplicates from the linker visible symbol table
1012 and keep them in a private table. Then later do own symbol
1013 resolution for the duplicated based on the results for the
1016 Then when writing out the resolution file readd the dropped symbols.
1018 XXX how to handle common? */
1021 resolve_conflicts (struct plugin_symtab
*t
, struct plugin_symtab
*conflicts
)
1023 htab_t symtab
= htab_create (t
->nsyms
, hash_sym
, eq_sym
, NULL
);
1029 conflicts
->syms
= xmalloc (sizeof (struct ld_plugin_symbol
) * outlen
);
1030 conflicts
->aux
= xmalloc (sizeof (struct sym_aux
) * outlen
);
1032 /* Move all duplicate symbols into the auxiliary conflicts table. */
1034 for (i
= 0; i
< t
->nsyms
; i
++)
1036 struct ld_plugin_symbol
*s
= &t
->syms
[i
];
1037 struct sym_aux
*aux
= &t
->aux
[i
];
1040 slot
= htab_find_slot (symtab
, s
, INSERT
);
1044 struct ld_plugin_symbol
*orig
= (struct ld_plugin_symbol
*)*slot
;
1045 struct sym_aux
*orig_aux
= &t
->aux
[orig
- t
->syms
];
1047 /* Always let the linker resolve the strongest symbol */
1048 if (symbol_strength (orig
) < symbol_strength (s
))
1050 SWAP (struct ld_plugin_symbol
, *orig
, *s
);
1051 SWAP (uint32_t, orig_aux
->slot
, aux
->slot
);
1052 SWAP (unsigned long long, orig_aux
->id
, aux
->id
);
1053 /* Don't swap conflict chain pointer */
1056 /* Move current symbol into the conflicts table */
1057 cnf
= conflicts
->nsyms
++;
1058 conflicts
->syms
[cnf
] = *s
;
1059 conflicts
->aux
[cnf
] = *aux
;
1060 aux
= &conflicts
->aux
[cnf
];
1062 /* Update conflicts chain of the original symbol */
1063 aux
->next_conflict
= orig_aux
->next_conflict
;
1064 orig_aux
->next_conflict
= cnf
;
1069 /* Remove previous duplicates in the main table */
1076 /* Put original into the hash table */
1077 *slot
= &t
->syms
[out
];
1081 assert (conflicts
->nsyms
<= outlen
);
1082 assert (conflicts
->nsyms
+ out
== t
->nsyms
);
1085 htab_delete (symtab
);
1088 /* Process one section of an object file. */
1091 process_symtab (void *data
, const char *name
, off_t offset
, off_t length
)
1093 struct plugin_objfile
*obj
= (struct plugin_objfile
*)data
;
1095 char *secdatastart
, *secdata
;
1097 if (!startswith (name
, ".gnu.lto_.symtab"))
1100 s
= strrchr (name
, '.');
1102 sscanf (s
, ".%" PRI_LL
"x", &obj
->out
->id
);
1103 secdata
= secdatastart
= xmalloc (length
);
1104 offset
+= obj
->file
->offset
;
1105 if (offset
!= lseek (obj
->file
->fd
, offset
, SEEK_SET
))
1110 ssize_t got
= read (obj
->file
->fd
, secdata
, length
);
1118 else if (errno
!= EINTR
)
1125 translate (secdatastart
, secdata
, obj
->out
);
1127 free (secdatastart
);
1132 message (LDPL_FATAL
, "%s: corrupt object file", obj
->file
->name
);
1133 /* Force claim_file_handler to abandon this file. */
1135 free (secdatastart
);
1139 /* Process one section of an object file. */
1142 process_symtab_extension (void *data
, const char *name
, off_t offset
,
1145 struct plugin_objfile
*obj
= (struct plugin_objfile
*)data
;
1147 char *secdatastart
, *secdata
;
1149 if (!startswith (name
, ".gnu.lto_.ext_symtab"))
1152 s
= strrchr (name
, '.');
1154 sscanf (s
, ".%" PRI_LL
"x", &obj
->out
->id
);
1155 secdata
= secdatastart
= xmalloc (length
);
1156 offset
+= obj
->file
->offset
;
1157 if (offset
!= lseek (obj
->file
->fd
, offset
, SEEK_SET
))
1162 ssize_t got
= read (obj
->file
->fd
, secdata
, length
);
1170 else if (errno
!= EINTR
)
1177 parse_symtab_extension (secdatastart
, secdata
, obj
->out
);
1179 free (secdatastart
);
1184 message (LDPL_FATAL
, "%s: corrupt object file", obj
->file
->name
);
1185 /* Force claim_file_handler to abandon this file. */
1187 free (secdatastart
);
1192 /* Find an offload section of an object file. */
1195 process_offload_section (void *data
, const char *name
, off_t offset
, off_t len
)
1197 if (startswith (name
, ".gnu.offload_lto_.opts"))
1199 struct plugin_objfile
*obj
= (struct plugin_objfile
*) data
;
1200 obj
->offload
= true;
1207 /* Callback used by a linker to check if the plugin can claim FILE.
1208 Writes the result in CAN_BE_CLAIMED. If KNOWN_USED != 0, the object
1209 is known by the linker to be included in link output, or an older API
1210 version is in use that does not provide that information. Otherwise,
1211 the linker is only determining whether this is a plugin object and
1212 only the symbol table is needed by the linker. In this case, the
1213 object should not be included in link output and this function will
1214 be called by the linker again with KNOWN_USED != 0 after the linker
1215 decides the object should be included in link output. */
1217 static enum ld_plugin_status
1218 claim_file_handler_v2 (const struct ld_plugin_input_file
*file
,
1219 int *can_be_claimed
, int known_used
)
1221 enum ld_plugin_status status
;
1222 struct plugin_objfile obj
;
1223 struct plugin_file_info lto_file
;
1227 memset (<o_file
, 0, sizeof (struct plugin_file_info
));
1229 if (file
->offset
!= 0)
1231 /* We pass the offset of the actual file, not the archive header.
1232 Can't use PRIx64, because that's C99, so we have to print the
1233 64-bit hex int as two 32-bit ones. Use xasprintf instead of
1234 asprintf because asprintf doesn't work as expected on some older
1237 lo
= file
->offset
& 0xffffffff;
1238 hi
= ((int64_t)file
->offset
>> 32) & 0xffffffff;
1239 lto_file
.name
= hi
? xasprintf ("%s@0x%x%08x", file
->name
, hi
, lo
)
1240 : xasprintf ("%s@0x%x", file
->name
, lo
);
1244 lto_file
.name
= xstrdup (file
->name
);
1246 lto_file
.handle
= file
->handle
;
1248 *can_be_claimed
= 0;
1251 obj
.offload
= false;
1252 obj
.out
= <o_file
.symtab
;
1254 obj
.objfile
= simple_object_start_read (file
->fd
, file
->offset
, LTO_SEGMENT_NAME
,
1256 /* No file, but also no error code means unrecognized format; just skip it. */
1257 if (!obj
.objfile
&& !err
)
1262 errmsg
= simple_object_find_sections (obj
.objfile
, process_symtab
, &obj
,
1264 /* Parsing symtab extension should be done only for add_symbols_v2 and
1266 if (!errmsg
&& add_symbols_v2
!= NULL
)
1268 obj
.out
->last_sym
= 0;
1269 errmsg
= simple_object_find_sections (obj
.objfile
,
1270 process_symtab_extension
,
1275 if (!obj
.objfile
|| errmsg
)
1278 message (LDPL_FATAL
, "%s: %s: %s", file
->name
, errmsg
,
1281 message (LDPL_FATAL
, "%s: %s", file
->name
, errmsg
);
1286 simple_object_find_sections (obj
.objfile
, process_offload_section
,
1289 if (obj
.found
== 0 && !obj
.offload
)
1293 resolve_conflicts (<o_file
.symtab
, <o_file
.conflicts
);
1298 status
= add_symbols_v2 (file
->handle
, lto_file
.symtab
.nsyms
,
1299 lto_file
.symtab
.syms
);
1301 status
= add_symbols (file
->handle
, lto_file
.symtab
.nsyms
,
1302 lto_file
.symtab
.syms
);
1303 check (status
== LDPS_OK
, LDPL_FATAL
, "could not add symbols");
1305 /* Include it only if it is known to be used for link output. */
1309 num_claimed_files
++;
1311 xrealloc (claimed_files
,
1312 num_claimed_files
* sizeof (struct plugin_file_info
));
1313 claimed_files
[num_claimed_files
- 1] = lto_file
;
1317 *can_be_claimed
= 1;
1321 if (offload_files
== NULL
)
1323 /* Add dummy item to the start of the list. */
1324 offload_files
= xmalloc (sizeof (struct plugin_offload_file
));
1325 offload_files
->name
= NULL
;
1326 offload_files
->next
= NULL
;
1327 offload_files_last
= offload_files
;
1330 /* If this is an LTO file without offload, and it is the first LTO file, save
1331 the pointer to the last offload file in the list. Further offload LTO
1332 files will be inserted after it, if any. */
1333 if (*can_be_claimed
&& !obj
.offload
&& offload_files_last_lto
== NULL
)
1334 offload_files_last_lto
= offload_files_last
;
1336 if (obj
.offload
&& known_used
)
1338 /* Add file to the list. The order must be exactly the same as the final
1339 order after recompilation and linking, otherwise host and target tables
1340 with addresses wouldn't match. If a static library contains both LTO
1341 and non-LTO objects, ld and gold link them in a different order. */
1342 struct plugin_offload_file
*ofld
1343 = xmalloc (sizeof (struct plugin_offload_file
));
1344 ofld
->name
= lto_file
.name
;
1348 && offload_files_last_lto
== NULL
1349 && file
->offset
!= 0
1350 && gold_version
== -1)
1352 /* ld only: insert first LTO file from the archive after the last real
1353 object file immediately preceding the archive, or at the begin of
1354 the list if there was no real objects before archives. */
1355 if (offload_files_last_obj
!= NULL
)
1357 ofld
->next
= offload_files_last_obj
->next
;
1358 offload_files_last_obj
->next
= ofld
;
1362 ofld
->next
= offload_files
->next
;
1363 offload_files
->next
= ofld
;
1366 else if (*can_be_claimed
&& offload_files_last_lto
!= NULL
)
1368 /* Insert LTO file after the last LTO file in the list. */
1369 ofld
->next
= offload_files_last_lto
->next
;
1370 offload_files_last_lto
->next
= ofld
;
1373 /* Add non-LTO file or first non-archive LTO file to the end of the
1375 offload_files_last
->next
= ofld
;
1377 if (ofld
->next
== NULL
)
1378 offload_files_last
= ofld
;
1379 if (file
->offset
== 0)
1380 offload_files_last_obj
= ofld
;
1381 if (*can_be_claimed
)
1382 offload_files_last_lto
= ofld
;
1383 num_offload_files
++;
1392 non_claimed_files
++;
1394 free (lto_file
.name
);
1398 simple_object_release_read (obj
.objfile
);
1403 /* Callback used by a linker to check if the plugin will claim FILE. Writes
1404 the result in CLAIMED. */
1406 static enum ld_plugin_status
1407 claim_file_handler (const struct ld_plugin_input_file
*file
, int *claimed
)
1409 return claim_file_handler_v2 (file
, claimed
, true);
1412 /* Parse the plugin options. */
1415 process_option (const char *option
)
1417 if (strcmp (option
, "-linker-output-known") == 0)
1418 linker_output_known
= true;
1419 /* Also accept "notlo" for backwards compatibility. */
1420 else if ((strcmp (option
, "-linker-output-auto-nolto-rel") == 0)
1421 || (strcmp (option
, "-linker-output-auto-notlo-rel") == 0))
1422 linker_output_auto_nolto_rel
= true;
1423 else if (strcmp (option
, "-debug") == 0)
1425 else if ((strcmp (option
, "-v") == 0)
1426 || (strcmp (option
, "--verbose") == 0))
1428 else if (strcmp (option
, "-save-temps") == 0)
1430 else if (strcmp (option
, "-nop") == 0)
1432 else if (startswith (option
, "-pass-through="))
1434 num_pass_through_items
++;
1435 pass_through_items
= xrealloc (pass_through_items
,
1436 num_pass_through_items
* sizeof (char *));
1437 pass_through_items
[num_pass_through_items
- 1] =
1438 xstrdup (option
+ strlen ("-pass-through="));
1440 else if (startswith (option
, "-sym-style="))
1442 switch (option
[sizeof ("-sym-style=") - 1])
1445 sym_style
= ss_win32
;
1448 sym_style
= ss_uscore
;
1451 sym_style
= ss_none
;
1455 else if (startswith (option
, "-ltrans-objects="))
1456 ltrans_objects
= xstrdup (option
+ strlen ("-ltrans-objects="));
1460 char *opt
= xstrdup (option
);
1461 lto_wrapper_num_args
+= 1;
1462 size
= lto_wrapper_num_args
* sizeof (char *);
1463 lto_wrapper_argv
= (char **) xrealloc (lto_wrapper_argv
, size
);
1464 lto_wrapper_argv
[lto_wrapper_num_args
- 1] = opt
;
1465 if (startswith (option
, "-fresolution="))
1466 resolution_file
= opt
+ sizeof ("-fresolution=") - 1;
1468 save_temps
= save_temps
|| debug
;
1469 verbose
= verbose
|| debug
;
1472 /* Negotiate linker API version. */
1475 negotiate_api_version (void)
1477 const char *linker_identifier
;
1478 const char *linker_version
;
1480 enum linker_api_version supported_api
= LAPI_V0
;
1481 #if HAVE_PTHREAD_LOCKING
1482 supported_api
= LAPI_V1
;
1485 api_version
= get_api_version ("GCC", BASE_VERSION
, LAPI_V0
,
1486 supported_api
, &linker_identifier
, &linker_version
);
1487 if (api_version
> supported_api
)
1489 fprintf (stderr
, "requested an unsupported API version (%d)\n", api_version
);
1493 switch (api_version
)
1498 check (get_symbols_v3
, LDPL_FATAL
,
1499 "get_symbols_v3 required for API version 1");
1500 check (add_symbols_v2
, LDPL_FATAL
,
1501 "add_symbols_v2 required for API version 1");
1504 fprintf (stderr
, "unsupported API version (%d)\n", api_version
);
1509 /* Called by a linker after loading the plugin. TV is the transfer vector. */
1511 enum ld_plugin_status
1512 onload (struct ld_plugin_tv
*tv
)
1514 struct ld_plugin_tv
*p
;
1515 enum ld_plugin_status status
;
1517 #if HAVE_PTHREAD_LOCKING
1518 if (pthread_mutex_init (&plugin_lock
, NULL
) != 0)
1520 fprintf (stderr
, "mutex init failed\n");
1531 message
= p
->tv_u
.tv_message
;
1533 case LDPT_REGISTER_CLAIM_FILE_HOOK
:
1534 register_claim_file
= p
->tv_u
.tv_register_claim_file
;
1536 case LDPT_REGISTER_CLAIM_FILE_HOOK_V2
:
1537 register_claim_file_v2
= p
->tv_u
.tv_register_claim_file_v2
;
1539 case LDPT_ADD_SYMBOLS_V2
:
1540 add_symbols_v2
= p
->tv_u
.tv_add_symbols
;
1542 case LDPT_ADD_SYMBOLS
:
1543 add_symbols
= p
->tv_u
.tv_add_symbols
;
1545 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
:
1546 register_all_symbols_read
= p
->tv_u
.tv_register_all_symbols_read
;
1548 case LDPT_GET_SYMBOLS_V3
:
1549 get_symbols_v3
= p
->tv_u
.tv_get_symbols
;
1551 case LDPT_GET_SYMBOLS_V2
:
1552 get_symbols_v2
= p
->tv_u
.tv_get_symbols
;
1554 case LDPT_GET_SYMBOLS
:
1555 get_symbols
= p
->tv_u
.tv_get_symbols
;
1557 case LDPT_REGISTER_CLEANUP_HOOK
:
1558 register_cleanup
= p
->tv_u
.tv_register_cleanup
;
1560 case LDPT_ADD_INPUT_FILE
:
1561 add_input_file
= p
->tv_u
.tv_add_input_file
;
1563 case LDPT_ADD_INPUT_LIBRARY
:
1564 add_input_library
= p
->tv_u
.tv_add_input_library
;
1567 process_option (p
->tv_u
.tv_string
);
1569 case LDPT_GOLD_VERSION
:
1570 gold_version
= p
->tv_u
.tv_val
;
1572 case LDPT_LINKER_OUTPUT
:
1573 linker_output
= (enum ld_plugin_output_file_type
) p
->tv_u
.tv_val
;
1574 linker_output_set
= true;
1576 case LDPT_OUTPUT_NAME
:
1577 /* We only use this to make user-friendly temp file names. */
1578 link_output_name
= p
->tv_u
.tv_string
;
1580 case LDPT_GET_API_VERSION
:
1581 get_api_version
= p
->tv_u
.tv_get_api_version
;
1589 if (get_api_version
)
1590 negotiate_api_version ();
1592 check (register_claim_file
, LDPL_FATAL
, "register_claim_file not found");
1593 check (add_symbols
, LDPL_FATAL
, "add_symbols not found");
1594 status
= register_claim_file (claim_file_handler
);
1595 check (status
== LDPS_OK
, LDPL_FATAL
,
1596 "could not register the claim_file callback");
1598 if (register_claim_file_v2
)
1600 status
= register_claim_file_v2 (claim_file_handler_v2
);
1601 check (status
== LDPS_OK
, LDPL_FATAL
,
1602 "could not register the claim_file_v2 callback");
1605 if (register_cleanup
)
1607 status
= register_cleanup (cleanup_handler
);
1608 check (status
== LDPS_OK
, LDPL_FATAL
,
1609 "could not register the cleanup callback");
1612 if (register_all_symbols_read
)
1614 check (get_symbols
, LDPL_FATAL
, "get_symbols not found");
1615 status
= register_all_symbols_read (all_symbols_read_handler
);
1616 check (status
== LDPS_OK
, LDPL_FATAL
,
1617 "could not register the all_symbols_read callback");
1620 char *collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
1621 if (collect_gcc_options
)
1623 /* Support -fno-use-linker-plugin by failing to load the plugin
1624 for the case where it is auto-loaded by BFD. */
1625 if (strstr (collect_gcc_options
, "'-fno-use-linker-plugin'"))
1628 if (strstr (collect_gcc_options
, "'-save-temps'"))
1631 if (strstr (collect_gcc_options
, "'-flto-incremental="))
1632 flto_incremental
= true;
1634 if (strstr (collect_gcc_options
, "'-v'")
1635 || strstr (collect_gcc_options
, "'--verbose'"))
1639 if ((p
= strstr (collect_gcc_options
, "'-dumpdir'")))
1641 p
+= sizeof ("'-dumpdir'");
1644 const char *start
= p
;
1645 int ticks
= 0, escapes
= 0;
1646 /* Count ticks (') and escaped (\.) characters. Stop at the
1647 end of the options or at a blank after an even number of
1648 ticks (not counting escaped ones. */
1649 for (p
= start
; *p
; p
++)
1656 else if ((ticks
% 2) != 0)
1670 /* Now allocate a new link_output_name and decode dumpdir
1671 into it. The loop uses the same logic, except it counts
1672 ticks and escapes backwards (so ticks is adjusted if we
1673 find an odd number of them), and it copies characters
1674 that are escaped or not otherwise skipped. */
1675 int len
= p
- start
- ticks
- escapes
+ 1;
1676 char *q
= xmalloc (len
);
1677 link_output_name
= q
;
1678 int oddticks
= (ticks
% 2);
1680 for (p
= start
; *p
; p
++)
1687 else if ((ticks
% 2) != 0)
1702 assert (escapes
== 0);
1703 assert (ticks
== oddticks
);
1704 assert (q
- link_output_name
== len
- 1);
1705 skip_in_suffix
= true;