/src/binutils-gdb/bfd/linker.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* linker.c -- BFD linker routines |
2 | | Copyright (C) 1993-2025 Free Software Foundation, Inc. |
3 | | Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support |
4 | | |
5 | | This file is part of BFD, the Binary File Descriptor library. |
6 | | |
7 | | This program is free software; you can redistribute it and/or modify |
8 | | it under the terms of the GNU General Public License as published by |
9 | | the Free Software Foundation; either version 3 of the License, or |
10 | | (at your option) any later version. |
11 | | |
12 | | This program is distributed in the hope that it will be useful, |
13 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | GNU General Public License for more details. |
16 | | |
17 | | You should have received a copy of the GNU General Public License |
18 | | along with this program; if not, write to the Free Software |
19 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
20 | | MA 02110-1301, USA. */ |
21 | | |
22 | | #include "sysdep.h" |
23 | | #include "bfd.h" |
24 | | #include "libbfd.h" |
25 | | #include "bfdlink.h" |
26 | | #include "genlink.h" |
27 | | |
28 | | /* |
29 | | SECTION |
30 | | Linker Functions |
31 | | |
32 | | @cindex Linker |
33 | | The linker uses three special entry points in the BFD target |
34 | | vector. It is not necessary to write special routines for |
35 | | these entry points when creating a new BFD back end, since |
36 | | generic versions are provided. However, writing them can |
37 | | speed up linking and make it use significantly less runtime |
38 | | memory. |
39 | | |
40 | | The first routine creates a hash table used by the other |
41 | | routines. The second routine adds the symbols from an object |
42 | | file to the hash table. The third routine takes all the |
43 | | object files and links them together to create the output |
44 | | file. These routines are designed so that the linker proper |
45 | | does not need to know anything about the symbols in the object |
46 | | files that it is linking. The linker merely arranges the |
47 | | sections as directed by the linker script and lets BFD handle |
48 | | the details of symbols and relocs. |
49 | | |
50 | | The second routine and third routines are passed a pointer to |
51 | | a <<struct bfd_link_info>> structure (defined in |
52 | | <<bfdlink.h>>) which holds information relevant to the link, |
53 | | including the linker hash table (which was created by the |
54 | | first routine) and a set of callback functions to the linker |
55 | | proper. |
56 | | |
57 | | The generic linker routines are in <<linker.c>>, and use the |
58 | | header file <<genlink.h>>. As of this writing, the only back |
59 | | ends which have implemented versions of these routines are |
60 | | a.out (in <<aoutx.h>>) and ECOFF (in <<ecoff.c>>). The a.out |
61 | | routines are used as examples throughout this section. |
62 | | |
63 | | @menu |
64 | | @* Creating a Linker Hash Table:: |
65 | | @* Adding Symbols to the Hash Table:: |
66 | | @* Performing the Final Link:: |
67 | | @end menu |
68 | | |
69 | | INODE |
70 | | Creating a Linker Hash Table, Adding Symbols to the Hash Table, Linker Functions, Linker Functions |
71 | | SUBSECTION |
72 | | Creating a linker hash table |
73 | | |
74 | | @cindex _bfd_link_hash_table_create in target vector |
75 | | @cindex target vector (_bfd_link_hash_table_create) |
76 | | The linker routines must create a hash table, which must be |
77 | | derived from <<struct bfd_link_hash_table>> described in |
78 | | <<bfdlink.c>>. @xref{Hash Tables}, for information on how to |
79 | | create a derived hash table. This entry point is called using |
80 | | the target vector of the linker output file. |
81 | | |
82 | | The <<_bfd_link_hash_table_create>> entry point must allocate |
83 | | and initialize an instance of the desired hash table. If the |
84 | | back end does not require any additional information to be |
85 | | stored with the entries in the hash table, the entry point may |
86 | | simply create a <<struct bfd_link_hash_table>>. Most likely, |
87 | | however, some additional information will be needed. |
88 | | |
89 | | For example, with each entry in the hash table the a.out |
90 | | linker keeps the index the symbol has in the final output file |
91 | | (this index number is used so that when doing a relocatable |
92 | | link the symbol index used in the output file can be quickly |
93 | | filled in when copying over a reloc). The a.out linker code |
94 | | defines the required structures and functions for a hash table |
95 | | derived from <<struct bfd_link_hash_table>>. The a.out linker |
96 | | hash table is created by the function |
97 | | <<NAME(aout,link_hash_table_create)>>; it simply allocates |
98 | | space for the hash table, initializes it, and returns a |
99 | | pointer to it. |
100 | | |
101 | | When writing the linker routines for a new back end, you will |
102 | | generally not know exactly which fields will be required until |
103 | | you have finished. You should simply create a new hash table |
104 | | which defines no additional fields, and then simply add fields |
105 | | as they become necessary. |
106 | | |
107 | | INODE |
108 | | Adding Symbols to the Hash Table, Performing the Final Link, Creating a Linker Hash Table, Linker Functions |
109 | | SUBSECTION |
110 | | Adding symbols to the hash table |
111 | | |
112 | | @cindex _bfd_link_add_symbols in target vector |
113 | | @cindex target vector (_bfd_link_add_symbols) |
114 | | The linker proper will call the <<_bfd_link_add_symbols>> |
115 | | entry point for each object file or archive which is to be |
116 | | linked (typically these are the files named on the command |
117 | | line, but some may also come from the linker script). The |
118 | | entry point is responsible for examining the file. For an |
119 | | object file, BFD must add any relevant symbol information to |
120 | | the hash table. For an archive, BFD must determine which |
121 | | elements of the archive should be used and adding them to the |
122 | | link. |
123 | | |
124 | | The a.out version of this entry point is |
125 | | <<NAME(aout,link_add_symbols)>>. |
126 | | |
127 | | @menu |
128 | | @* Differing file formats:: |
129 | | @* Adding symbols from an object file:: |
130 | | @* Adding symbols from an archive:: |
131 | | @end menu |
132 | | |
133 | | INODE |
134 | | Differing file formats, Adding symbols from an object file, Adding Symbols to the Hash Table, Adding Symbols to the Hash Table |
135 | | SUBSUBSECTION |
136 | | Differing file formats |
137 | | |
138 | | Normally all the files involved in a link will be of the same |
139 | | format, but it is also possible to link together different |
140 | | format object files, and the back end must support that. The |
141 | | <<_bfd_link_add_symbols>> entry point is called via the target |
142 | | vector of the file to be added. This has an important |
143 | | consequence: the function may not assume that the hash table |
144 | | is the type created by the corresponding |
145 | | <<_bfd_link_hash_table_create>> vector. All the |
146 | | <<_bfd_link_add_symbols>> function can assume about the hash |
147 | | table is that it is derived from <<struct |
148 | | bfd_link_hash_table>>. |
149 | | |
150 | | Sometimes the <<_bfd_link_add_symbols>> function must store |
151 | | some information in the hash table entry to be used by the |
152 | | <<_bfd_final_link>> function. In such a case the output bfd |
153 | | xvec must be checked to make sure that the hash table was |
154 | | created by an object file of the same format. |
155 | | |
156 | | The <<_bfd_final_link>> routine must be prepared to handle a |
157 | | hash entry without any extra information added by the |
158 | | <<_bfd_link_add_symbols>> function. A hash entry without |
159 | | extra information will also occur when the linker script |
160 | | directs the linker to create a symbol. Note that, regardless |
161 | | of how a hash table entry is added, all the fields will be |
162 | | initialized to some sort of null value by the hash table entry |
163 | | initialization function. |
164 | | |
165 | | See <<ecoff_link_add_externals>> for an example of how to |
166 | | check the output bfd before saving information (in this |
167 | | case, the ECOFF external symbol debugging information) in a |
168 | | hash table entry. |
169 | | |
170 | | INODE |
171 | | Adding symbols from an object file, Adding symbols from an archive, Differing file formats, Adding Symbols to the Hash Table |
172 | | SUBSUBSECTION |
173 | | Adding symbols from an object file |
174 | | |
175 | | When the <<_bfd_link_add_symbols>> routine is passed an object |
176 | | file, it must add all externally visible symbols in that |
177 | | object file to the hash table. The actual work of adding the |
178 | | symbol to the hash table is normally handled by the function |
179 | | <<_bfd_generic_link_add_one_symbol>>. The |
180 | | <<_bfd_link_add_symbols>> routine is responsible for reading |
181 | | all the symbols from the object file and passing the correct |
182 | | information to <<_bfd_generic_link_add_one_symbol>>. |
183 | | |
184 | | The <<_bfd_link_add_symbols>> routine should not use |
185 | | <<bfd_canonicalize_symtab>> to read the symbols. The point of |
186 | | providing this routine is to avoid the overhead of converting |
187 | | the symbols into generic <<asymbol>> structures. |
188 | | |
189 | | @findex _bfd_generic_link_add_one_symbol |
190 | | <<_bfd_generic_link_add_one_symbol>> handles the details of |
191 | | combining common symbols, warning about multiple definitions, |
192 | | and so forth. It takes arguments which describe the symbol to |
193 | | add, notably symbol flags, a section, and an offset. The |
194 | | symbol flags include such things as <<BSF_WEAK>> or |
195 | | <<BSF_INDIRECT>>. The section is a section in the object |
196 | | file, or something like <<bfd_und_section_ptr>> for an undefined |
197 | | symbol or <<bfd_com_section_ptr>> for a common symbol. |
198 | | |
199 | | If the <<_bfd_final_link>> routine is also going to need to |
200 | | read the symbol information, the <<_bfd_link_add_symbols>> |
201 | | routine should save it somewhere attached to the object file |
202 | | BFD. However, the information should only be saved if the |
203 | | <<keep_memory>> field of the <<info>> argument is TRUE, so |
204 | | that the <<-no-keep-memory>> linker switch is effective. |
205 | | |
206 | | The a.out function which adds symbols from an object file is |
207 | | <<aout_link_add_object_symbols>>, and most of the interesting |
208 | | work is in <<aout_link_add_symbols>>. The latter saves |
209 | | pointers to the hash tables entries created by |
210 | | <<_bfd_generic_link_add_one_symbol>> indexed by symbol number, |
211 | | so that the <<_bfd_final_link>> routine does not have to call |
212 | | the hash table lookup routine to locate the entry. |
213 | | |
214 | | INODE |
215 | | Adding symbols from an archive, , Adding symbols from an object file, Adding Symbols to the Hash Table |
216 | | SUBSUBSECTION |
217 | | Adding symbols from an archive |
218 | | |
219 | | When the <<_bfd_link_add_symbols>> routine is passed an |
220 | | archive, it must look through the symbols defined by the |
221 | | archive and decide which elements of the archive should be |
222 | | included in the link. For each such element it must call the |
223 | | <<add_archive_element>> linker callback, and it must add the |
224 | | symbols from the object file to the linker hash table. (The |
225 | | callback may in fact indicate that a replacement BFD should be |
226 | | used, in which case the symbols from that BFD should be added |
227 | | to the linker hash table instead.) |
228 | | |
229 | | @findex _bfd_generic_link_add_archive_symbols |
230 | | In most cases the work of looking through the symbols in the |
231 | | archive should be done by the |
232 | | <<_bfd_generic_link_add_archive_symbols>> function. |
233 | | <<_bfd_generic_link_add_archive_symbols>> is passed a function |
234 | | to call to make the final decision about adding an archive |
235 | | element to the link and to do the actual work of adding the |
236 | | symbols to the linker hash table. If the element is to |
237 | | be included, the <<add_archive_element>> linker callback |
238 | | routine must be called with the element as an argument, and |
239 | | the element's symbols must be added to the linker hash table |
240 | | just as though the element had itself been passed to the |
241 | | <<_bfd_link_add_symbols>> function. |
242 | | |
243 | | When the a.out <<_bfd_link_add_symbols>> function receives an |
244 | | archive, it calls <<_bfd_generic_link_add_archive_symbols>> |
245 | | passing <<aout_link_check_archive_element>> as the function |
246 | | argument. <<aout_link_check_archive_element>> calls |
247 | | <<aout_link_check_ar_symbols>>. If the latter decides to add |
248 | | the element (an element is only added if it provides a real, |
249 | | non-common, definition for a previously undefined or common |
250 | | symbol) it calls the <<add_archive_element>> callback and then |
251 | | <<aout_link_check_archive_element>> calls |
252 | | <<aout_link_add_symbols>> to actually add the symbols to the |
253 | | linker hash table - possibly those of a substitute BFD, if the |
254 | | <<add_archive_element>> callback avails itself of that option. |
255 | | |
256 | | The ECOFF back end is unusual in that it does not normally |
257 | | call <<_bfd_generic_link_add_archive_symbols>>, because ECOFF |
258 | | archives already contain a hash table of symbols. The ECOFF |
259 | | back end searches the archive itself to avoid the overhead of |
260 | | creating a new hash table. |
261 | | |
262 | | INODE |
263 | | Performing the Final Link, , Adding Symbols to the Hash Table, Linker Functions |
264 | | SUBSECTION |
265 | | Performing the final link |
266 | | |
267 | | @cindex _bfd_link_final_link in target vector |
268 | | @cindex target vector (_bfd_final_link) |
269 | | When all the input files have been processed, the linker calls |
270 | | the <<_bfd_final_link>> entry point of the output BFD. This |
271 | | routine is responsible for producing the final output file, |
272 | | which has several aspects. It must relocate the contents of |
273 | | the input sections and copy the data into the output sections. |
274 | | It must build an output symbol table including any local |
275 | | symbols from the input files and the global symbols from the |
276 | | hash table. When producing relocatable output, it must |
277 | | modify the input relocs and write them into the output file. |
278 | | There may also be object format dependent work to be done. |
279 | | |
280 | | The linker will also call the <<write_object_contents>> entry |
281 | | point when the BFD is closed. The two entry points must work |
282 | | together in order to produce the correct output file. |
283 | | |
284 | | The details of how this works are inevitably dependent upon |
285 | | the specific object file format. The a.out |
286 | | <<_bfd_final_link>> routine is <<NAME(aout,final_link)>>. |
287 | | |
288 | | @menu |
289 | | @* Information provided by the linker:: |
290 | | @* Relocating the section contents:: |
291 | | @* Writing the symbol table:: |
292 | | @end menu |
293 | | |
294 | | INODE |
295 | | Information provided by the linker, Relocating the section contents, Performing the Final Link, Performing the Final Link |
296 | | SUBSUBSECTION |
297 | | Information provided by the linker |
298 | | |
299 | | Before the linker calls the <<_bfd_final_link>> entry point, |
300 | | it sets up some data structures for the function to use. |
301 | | |
302 | | The <<input_bfds>> field of the <<bfd_link_info>> structure |
303 | | will point to a list of all the input files included in the |
304 | | link. These files are linked through the <<link.next>> field |
305 | | of the <<bfd>> structure. |
306 | | |
307 | | Each section in the output file will have a list of |
308 | | <<link_order>> structures attached to the <<map_head.link_order>> |
309 | | field (the <<link_order>> structure is defined in |
310 | | <<bfdlink.h>>). These structures describe how to create the |
311 | | contents of the output section in terms of the contents of |
312 | | various input sections, fill constants, and, eventually, other |
313 | | types of information. They also describe relocs that must be |
314 | | created by the BFD backend, but do not correspond to any input |
315 | | file; this is used to support -Ur, which builds constructors |
316 | | while generating a relocatable object file. |
317 | | |
318 | | INODE |
319 | | Relocating the section contents, Writing the symbol table, Information provided by the linker, Performing the Final Link |
320 | | SUBSUBSECTION |
321 | | Relocating the section contents |
322 | | |
323 | | The <<_bfd_final_link>> function should look through the |
324 | | <<link_order>> structures attached to each section of the |
325 | | output file. Each <<link_order>> structure should either be |
326 | | handled specially, or it should be passed to the function |
327 | | <<_bfd_default_link_order>> which will do the right thing |
328 | | (<<_bfd_default_link_order>> is defined in <<linker.c>>). |
329 | | |
330 | | For efficiency, a <<link_order>> of type |
331 | | <<bfd_indirect_link_order>> whose associated section belongs |
332 | | to a BFD of the same format as the output BFD must be handled |
333 | | specially. This type of <<link_order>> describes part of an |
334 | | output section in terms of a section belonging to one of the |
335 | | input files. The <<_bfd_final_link>> function should read the |
336 | | contents of the section and any associated relocs, apply the |
337 | | relocs to the section contents, and write out the modified |
338 | | section contents. If performing a relocatable link, the |
339 | | relocs themselves must also be modified and written out. |
340 | | |
341 | | @findex _bfd_relocate_contents |
342 | | @findex _bfd_final_link_relocate |
343 | | The functions <<_bfd_relocate_contents>> and |
344 | | <<_bfd_final_link_relocate>> provide some general support for |
345 | | performing the actual relocations, notably overflow checking. |
346 | | Their arguments include information about the symbol the |
347 | | relocation is against and a <<reloc_howto_type>> argument |
348 | | which describes the relocation to perform. These functions |
349 | | are defined in <<reloc.c>>. |
350 | | |
351 | | The a.out function which handles reading, relocating, and |
352 | | writing section contents is <<aout_link_input_section>>. The |
353 | | actual relocation is done in <<aout_link_input_section_std>> |
354 | | and <<aout_link_input_section_ext>>. |
355 | | |
356 | | INODE |
357 | | Writing the symbol table, , Relocating the section contents, Performing the Final Link |
358 | | SUBSUBSECTION |
359 | | Writing the symbol table |
360 | | |
361 | | The <<_bfd_final_link>> function must gather all the symbols |
362 | | in the input files and write them out. It must also write out |
363 | | all the symbols in the global hash table. This must be |
364 | | controlled by the <<strip>> and <<discard>> fields of the |
365 | | <<bfd_link_info>> structure. |
366 | | |
367 | | The local symbols of the input files will not have been |
368 | | entered into the linker hash table. The <<_bfd_final_link>> |
369 | | routine must consider each input file and include the symbols |
370 | | in the output file. It may be convenient to do this when |
371 | | looking through the <<link_order>> structures, or it may be |
372 | | done by stepping through the <<input_bfds>> list. |
373 | | |
374 | | The <<_bfd_final_link>> routine must also traverse the global |
375 | | hash table to gather all the externally visible symbols. It |
376 | | is possible that most of the externally visible symbols may be |
377 | | written out when considering the symbols of each input file, |
378 | | but it is still necessary to traverse the hash table since the |
379 | | linker script may have defined some symbols that are not in |
380 | | any of the input files. |
381 | | |
382 | | The <<strip>> field of the <<bfd_link_info>> structure |
383 | | controls which symbols are written out. The possible values |
384 | | are listed in <<bfdlink.h>>. If the value is <<strip_some>>, |
385 | | then the <<keep_hash>> field of the <<bfd_link_info>> |
386 | | structure is a hash table of symbols to keep; each symbol |
387 | | should be looked up in this hash table, and only symbols which |
388 | | are present should be included in the output file. |
389 | | |
390 | | If the <<strip>> field of the <<bfd_link_info>> structure |
391 | | permits local symbols to be written out, the <<discard>> field |
392 | | is used to further controls which local symbols are included |
393 | | in the output file. If the value is <<discard_l>>, then all |
394 | | local symbols which begin with a certain prefix are discarded; |
395 | | this is controlled by the <<bfd_is_local_label_name>> entry point. |
396 | | |
397 | | The a.out backend handles symbols by calling |
398 | | <<aout_link_write_symbols>> on each input BFD and then |
399 | | traversing the global hash table with the function |
400 | | <<aout_link_write_other_symbol>>. It builds a string table |
401 | | while writing out the symbols, which is written to the output |
402 | | file at the end of <<NAME(aout,final_link)>>. |
403 | | */ |
404 | | |
405 | | /* This structure is used to pass information to |
406 | | _bfd_generic_link_write_global_symbol, which may be called via |
407 | | _bfd_generic_link_hash_traverse. */ |
408 | | |
409 | | struct generic_write_global_symbol_info |
410 | | { |
411 | | struct bfd_link_info *info; |
412 | | bfd *output_bfd; |
413 | | size_t *psymalloc; |
414 | | bool failed; |
415 | | }; |
416 | | |
417 | | static bool generic_link_add_object_symbols |
418 | | (bfd *, struct bfd_link_info *); |
419 | | static bool generic_link_check_archive_element |
420 | | (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, const char *, |
421 | | bool *); |
422 | | static bool generic_link_add_symbol_list |
423 | | (bfd *, struct bfd_link_info *, bfd_size_type count, asymbol **); |
424 | | static bool generic_add_output_symbol |
425 | | (bfd *, size_t *psymalloc, asymbol *); |
426 | | static bool default_data_link_order |
427 | | (bfd *, struct bfd_link_info *, asection *, struct bfd_link_order *); |
428 | | static bool default_indirect_link_order |
429 | | (bfd *, struct bfd_link_info *, asection *, struct bfd_link_order *, |
430 | | bool); |
431 | | static bool _bfd_generic_link_output_symbols |
432 | | (bfd *, bfd *, struct bfd_link_info *, size_t *); |
433 | | static bool _bfd_generic_link_write_global_symbol |
434 | | (struct generic_link_hash_entry *, void *); |
435 | | |
436 | | /* The link hash table structure is defined in bfdlink.h. It provides |
437 | | a base hash table which the backend specific hash tables are built |
438 | | upon. */ |
439 | | |
440 | | /* Routine to create an entry in the link hash table. */ |
441 | | |
442 | | struct bfd_hash_entry * |
443 | | _bfd_link_hash_newfunc (struct bfd_hash_entry *entry, |
444 | | struct bfd_hash_table *table, |
445 | | const char *string) |
446 | 0 | { |
447 | | /* Allocate the structure if it has not already been allocated by a |
448 | | subclass. */ |
449 | 0 | if (entry == NULL) |
450 | 0 | { |
451 | 0 | entry = (struct bfd_hash_entry *) |
452 | 0 | bfd_hash_allocate (table, sizeof (struct bfd_link_hash_entry)); |
453 | 0 | if (entry == NULL) |
454 | 0 | return entry; |
455 | 0 | } |
456 | | |
457 | | /* Call the allocation method of the superclass. */ |
458 | 0 | entry = bfd_hash_newfunc (entry, table, string); |
459 | 0 | if (entry) |
460 | 0 | { |
461 | 0 | struct bfd_link_hash_entry *h = (struct bfd_link_hash_entry *) entry; |
462 | | |
463 | | /* Initialize the local fields. */ |
464 | 0 | memset ((char *) &h->root + sizeof (h->root), 0, |
465 | 0 | sizeof (*h) - sizeof (h->root)); |
466 | 0 | } |
467 | |
|
468 | 0 | return entry; |
469 | 0 | } |
470 | | |
471 | | /* Initialize a link hash table. The BFD argument is the one |
472 | | responsible for creating this table. */ |
473 | | |
474 | | bool |
475 | | _bfd_link_hash_table_init |
476 | | (struct bfd_link_hash_table *table, |
477 | | bfd *abfd ATTRIBUTE_UNUSED, |
478 | | struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *, |
479 | | struct bfd_hash_table *, |
480 | | const char *), |
481 | | unsigned int entsize) |
482 | 5.62k | { |
483 | 5.62k | bool ret; |
484 | | |
485 | 5.62k | BFD_ASSERT (!abfd->is_linker_output && !abfd->link.hash); |
486 | 5.62k | table->undefs = NULL; |
487 | 5.62k | table->undefs_tail = NULL; |
488 | 5.62k | table->type = bfd_link_generic_hash_table; |
489 | | |
490 | 5.62k | ret = bfd_hash_table_init (&table->table, newfunc, entsize); |
491 | 5.62k | if (ret) |
492 | 5.62k | { |
493 | | /* Arrange for destruction of this hash table on closing ABFD. */ |
494 | 5.62k | table->hash_table_free = _bfd_generic_link_hash_table_free; |
495 | 5.62k | abfd->link.hash = table; |
496 | 5.62k | abfd->is_linker_output = true; |
497 | 5.62k | } |
498 | 5.62k | return ret; |
499 | 5.62k | } |
500 | | |
501 | | /* Look up a symbol in a link hash table. If follow is TRUE, we |
502 | | follow bfd_link_hash_indirect and bfd_link_hash_warning links to |
503 | | the real symbol. |
504 | | |
505 | | .{* Return TRUE if the symbol described by a linker hash entry H |
506 | | . is going to be absolute. Linker-script defined symbols can be |
507 | | . converted from absolute to section-relative ones late in the |
508 | | . link. Use this macro to correctly determine whether the symbol |
509 | | . will actually end up absolute in output. *} |
510 | | .#define bfd_is_abs_symbol(H) \ |
511 | | . (((H)->type == bfd_link_hash_defined \ |
512 | | . || (H)->type == bfd_link_hash_defweak) \ |
513 | | . && bfd_is_abs_section ((H)->u.def.section) \ |
514 | | . && !(H)->rel_from_abs) |
515 | | . |
516 | | */ |
517 | | |
518 | | struct bfd_link_hash_entry * |
519 | | bfd_link_hash_lookup (struct bfd_link_hash_table *table, |
520 | | const char *string, |
521 | | bool create, |
522 | | bool copy, |
523 | | bool follow) |
524 | 100 | { |
525 | 100 | struct bfd_link_hash_entry *ret; |
526 | | |
527 | 100 | if (table == NULL || string == NULL) |
528 | 0 | return NULL; |
529 | | |
530 | 100 | ret = ((struct bfd_link_hash_entry *) |
531 | 100 | bfd_hash_lookup (&table->table, string, create, copy)); |
532 | | |
533 | 100 | if (follow && ret != NULL) |
534 | 0 | { |
535 | 0 | while (ret->type == bfd_link_hash_indirect |
536 | 0 | || ret->type == bfd_link_hash_warning) |
537 | 0 | ret = ret->u.i.link; |
538 | 0 | } |
539 | | |
540 | 100 | return ret; |
541 | 100 | } |
542 | | |
543 | | /* Look up a symbol in the main linker hash table if the symbol might |
544 | | be wrapped. This should only be used for references to an |
545 | | undefined symbol, not for definitions of a symbol. */ |
546 | | |
547 | | struct bfd_link_hash_entry * |
548 | | bfd_wrapped_link_hash_lookup (bfd *abfd, |
549 | | struct bfd_link_info *info, |
550 | | const char *string, |
551 | | bool create, |
552 | | bool copy, |
553 | | bool follow) |
554 | 1 | { |
555 | 1 | size_t amt; |
556 | | |
557 | 1 | if (info->wrap_hash != NULL) |
558 | 0 | { |
559 | 0 | const char *l; |
560 | 0 | char prefix = '\0'; |
561 | |
|
562 | 0 | l = string; |
563 | 0 | if (*l |
564 | 0 | && (*l == bfd_get_symbol_leading_char (abfd) |
565 | 0 | || *l == info->wrap_char)) |
566 | 0 | { |
567 | 0 | prefix = *l; |
568 | 0 | ++l; |
569 | 0 | } |
570 | |
|
571 | 0 | #undef WRAP |
572 | 0 | #define WRAP "__wrap_" |
573 | |
|
574 | 0 | if (bfd_hash_lookup (info->wrap_hash, l, false, false) != NULL) |
575 | 0 | { |
576 | 0 | char *n; |
577 | 0 | struct bfd_link_hash_entry *h; |
578 | | |
579 | | /* This symbol is being wrapped. We want to replace all |
580 | | references to SYM with references to __wrap_SYM. */ |
581 | |
|
582 | 0 | amt = strlen (l) + sizeof WRAP + 1; |
583 | 0 | n = (char *) bfd_malloc (amt); |
584 | 0 | if (n == NULL) |
585 | 0 | return NULL; |
586 | | |
587 | 0 | n[0] = prefix; |
588 | 0 | n[1] = '\0'; |
589 | 0 | strcat (n, WRAP); |
590 | 0 | strcat (n, l); |
591 | 0 | h = bfd_link_hash_lookup (info->hash, n, create, true, follow); |
592 | 0 | if (h != NULL) |
593 | 0 | h->wrapper_symbol = true; |
594 | 0 | free (n); |
595 | 0 | return h; |
596 | 0 | } |
597 | | |
598 | 0 | #undef REAL |
599 | 0 | #define REAL "__real_" |
600 | | |
601 | 0 | if (*l == '_' |
602 | 0 | && startswith (l, REAL) |
603 | 0 | && bfd_hash_lookup (info->wrap_hash, l + sizeof REAL - 1, |
604 | 0 | false, false) != NULL) |
605 | 0 | { |
606 | 0 | char *n; |
607 | 0 | struct bfd_link_hash_entry *h; |
608 | | |
609 | | /* This is a reference to __real_SYM, where SYM is being |
610 | | wrapped. We want to replace all references to __real_SYM |
611 | | with references to SYM. */ |
612 | |
|
613 | 0 | amt = strlen (l + sizeof REAL - 1) + 2; |
614 | 0 | n = (char *) bfd_malloc (amt); |
615 | 0 | if (n == NULL) |
616 | 0 | return NULL; |
617 | | |
618 | 0 | n[0] = prefix; |
619 | 0 | n[1] = '\0'; |
620 | 0 | strcat (n, l + sizeof REAL - 1); |
621 | 0 | h = bfd_link_hash_lookup (info->hash, n, create, true, follow); |
622 | 0 | if (h != NULL) |
623 | 0 | h->ref_real = 1; |
624 | 0 | free (n); |
625 | 0 | return h; |
626 | 0 | } |
627 | |
|
628 | 0 | #undef REAL |
629 | 0 | } |
630 | | |
631 | 1 | return bfd_link_hash_lookup (info->hash, string, create, copy, follow); |
632 | 1 | } |
633 | | |
634 | | /* If H is a wrapped symbol, ie. the symbol name starts with "__wrap_" |
635 | | and the remainder is found in wrap_hash, return the real symbol. */ |
636 | | |
637 | | struct bfd_link_hash_entry * |
638 | | unwrap_hash_lookup (struct bfd_link_info *info, |
639 | | bfd *input_bfd, |
640 | | struct bfd_link_hash_entry *h) |
641 | 0 | { |
642 | 0 | const char *l = h->root.string; |
643 | |
|
644 | 0 | if (*l |
645 | 0 | && (*l == bfd_get_symbol_leading_char (input_bfd) |
646 | 0 | || *l == info->wrap_char)) |
647 | 0 | ++l; |
648 | |
|
649 | 0 | if (startswith (l, WRAP)) |
650 | 0 | { |
651 | 0 | l += sizeof WRAP - 1; |
652 | |
|
653 | 0 | if (bfd_hash_lookup (info->wrap_hash, l, false, false) != NULL) |
654 | 0 | { |
655 | 0 | char save = 0; |
656 | 0 | if (l - (sizeof WRAP - 1) != h->root.string) |
657 | 0 | { |
658 | 0 | --l; |
659 | 0 | save = *l; |
660 | 0 | *(char *) l = *h->root.string; |
661 | 0 | } |
662 | 0 | h = bfd_link_hash_lookup (info->hash, l, false, false, false); |
663 | 0 | if (save) |
664 | 0 | *(char *) l = save; |
665 | 0 | } |
666 | 0 | } |
667 | 0 | return h; |
668 | 0 | } |
669 | | #undef WRAP |
670 | | |
671 | | /* Traverse a generic link hash table. Differs from bfd_hash_traverse |
672 | | in the treatment of warning symbols. When warning symbols are |
673 | | created they replace the real symbol, so you don't get to see the |
674 | | real symbol in a bfd_hash_traverse. This traversal calls func with |
675 | | the real symbol. */ |
676 | | |
677 | | void |
678 | | bfd_link_hash_traverse |
679 | | (struct bfd_link_hash_table *htab, |
680 | | bool (*func) (struct bfd_link_hash_entry *, void *), |
681 | | void *info) |
682 | 0 | { |
683 | 0 | unsigned int i; |
684 | |
|
685 | 0 | htab->table.frozen = 1; |
686 | 0 | for (i = 0; i < htab->table.size; i++) |
687 | 0 | { |
688 | 0 | struct bfd_link_hash_entry *p; |
689 | |
|
690 | 0 | p = (struct bfd_link_hash_entry *) htab->table.table[i]; |
691 | 0 | for (; p != NULL; p = (struct bfd_link_hash_entry *) p->root.next) |
692 | 0 | if (!(*func) (p->type == bfd_link_hash_warning ? p->u.i.link : p, info)) |
693 | 0 | goto out; |
694 | 0 | } |
695 | 0 | out: |
696 | 0 | htab->table.frozen = 0; |
697 | 0 | } |
698 | | |
699 | | /* Add a symbol to the linker hash table undefs list. */ |
700 | | |
701 | | void |
702 | | bfd_link_add_undef (struct bfd_link_hash_table *table, |
703 | | struct bfd_link_hash_entry *h) |
704 | 0 | { |
705 | 0 | BFD_ASSERT (h->u.undef.next == NULL); |
706 | 0 | if (table->undefs_tail != NULL) |
707 | 0 | table->undefs_tail->u.undef.next = h; |
708 | 0 | if (table->undefs == NULL) |
709 | 0 | table->undefs = h; |
710 | 0 | table->undefs_tail = h; |
711 | 0 | } |
712 | | |
713 | | /* The undefs list was designed so that in normal use we don't need to |
714 | | remove entries. However, if symbols on the list are changed from |
715 | | bfd_link_hash_undefined to either bfd_link_hash_undefweak or |
716 | | bfd_link_hash_new for some reason, then they must be removed from the |
717 | | list. Failure to do so might result in the linker attempting to add |
718 | | the symbol to the list again at a later stage. */ |
719 | | |
720 | | void |
721 | | bfd_link_repair_undef_list (struct bfd_link_hash_table *table) |
722 | 0 | { |
723 | 0 | struct bfd_link_hash_entry **pun; |
724 | |
|
725 | 0 | pun = &table->undefs; |
726 | 0 | while (*pun != NULL) |
727 | 0 | { |
728 | 0 | struct bfd_link_hash_entry *h = *pun; |
729 | |
|
730 | 0 | if (h->type == bfd_link_hash_new |
731 | 0 | || h->type == bfd_link_hash_undefweak) |
732 | 0 | { |
733 | 0 | *pun = h->u.undef.next; |
734 | 0 | h->u.undef.next = NULL; |
735 | 0 | if (h == table->undefs_tail) |
736 | 0 | { |
737 | 0 | if (pun == &table->undefs) |
738 | 0 | table->undefs_tail = NULL; |
739 | 0 | else |
740 | | /* pun points at an u.undef.next field. Go back to |
741 | | the start of the link_hash_entry. */ |
742 | 0 | table->undefs_tail = (struct bfd_link_hash_entry *) |
743 | 0 | ((char *) pun - ((char *) &h->u.undef.next - (char *) h)); |
744 | 0 | break; |
745 | 0 | } |
746 | 0 | } |
747 | 0 | else |
748 | 0 | pun = &h->u.undef.next; |
749 | 0 | } |
750 | 0 | } |
751 | | |
752 | | /* Routine to create an entry in a generic link hash table. */ |
753 | | |
754 | | static struct bfd_hash_entry * |
755 | | _bfd_generic_link_hash_newfunc (struct bfd_hash_entry *entry, |
756 | | struct bfd_hash_table *table, |
757 | | const char *string) |
758 | 0 | { |
759 | | /* Allocate the structure if it has not already been allocated by a |
760 | | subclass. */ |
761 | 0 | if (entry == NULL) |
762 | 0 | { |
763 | 0 | entry = (struct bfd_hash_entry *) |
764 | 0 | bfd_hash_allocate (table, sizeof (struct generic_link_hash_entry)); |
765 | 0 | if (entry == NULL) |
766 | 0 | return entry; |
767 | 0 | } |
768 | | |
769 | | /* Call the allocation method of the superclass. */ |
770 | 0 | entry = _bfd_link_hash_newfunc (entry, table, string); |
771 | 0 | if (entry) |
772 | 0 | { |
773 | 0 | struct generic_link_hash_entry *ret; |
774 | | |
775 | | /* Set local fields. */ |
776 | 0 | ret = (struct generic_link_hash_entry *) entry; |
777 | 0 | ret->written = false; |
778 | 0 | ret->sym = NULL; |
779 | 0 | } |
780 | |
|
781 | 0 | return entry; |
782 | 0 | } |
783 | | |
784 | | /* Create a generic link hash table. */ |
785 | | |
786 | | struct bfd_link_hash_table * |
787 | | _bfd_generic_link_hash_table_create (bfd *abfd) |
788 | 5.62k | { |
789 | 5.62k | struct generic_link_hash_table *ret; |
790 | 5.62k | size_t amt = sizeof (struct generic_link_hash_table); |
791 | | |
792 | 5.62k | ret = (struct generic_link_hash_table *) bfd_malloc (amt); |
793 | 5.62k | if (ret == NULL) |
794 | 0 | return NULL; |
795 | 5.62k | if (! _bfd_link_hash_table_init (&ret->root, abfd, |
796 | 5.62k | _bfd_generic_link_hash_newfunc, |
797 | 5.62k | sizeof (struct generic_link_hash_entry))) |
798 | 0 | { |
799 | 0 | free (ret); |
800 | 0 | return NULL; |
801 | 0 | } |
802 | 5.62k | return &ret->root; |
803 | 5.62k | } |
804 | | |
805 | | void |
806 | | _bfd_generic_link_hash_table_free (bfd *obfd) |
807 | 5.62k | { |
808 | 5.62k | struct generic_link_hash_table *ret; |
809 | | |
810 | 5.62k | BFD_ASSERT (obfd->is_linker_output && obfd->link.hash); |
811 | 5.62k | ret = (struct generic_link_hash_table *) obfd->link.hash; |
812 | 5.62k | bfd_hash_table_free (&ret->root.table); |
813 | 5.62k | free (ret); |
814 | 5.62k | obfd->link.hash = NULL; |
815 | 5.62k | obfd->is_linker_output = false; |
816 | 5.62k | } |
817 | | |
818 | | /* Grab the symbols for an object file when doing a generic link. We |
819 | | store the symbols in the outsymbols field. We need to keep them |
820 | | around for the entire link to ensure that we only read them once. |
821 | | If we read them multiple times, we might wind up with relocs and |
822 | | the hash table pointing to different instances of the symbol |
823 | | structure. */ |
824 | | |
825 | | bool |
826 | | bfd_generic_link_read_symbols (bfd *abfd) |
827 | 1.81k | { |
828 | 1.81k | if (bfd_get_outsymbols (abfd) == NULL) |
829 | 1.21k | { |
830 | 1.21k | long symsize; |
831 | 1.21k | long symcount; |
832 | | |
833 | 1.21k | symsize = bfd_get_symtab_upper_bound (abfd); |
834 | 1.21k | if (symsize < 0) |
835 | 403 | return false; |
836 | 811 | abfd->outsymbols = bfd_alloc (abfd, symsize); |
837 | 811 | if (bfd_get_outsymbols (abfd) == NULL && symsize != 0) |
838 | 0 | return false; |
839 | 811 | symcount = bfd_canonicalize_symtab (abfd, bfd_get_outsymbols (abfd)); |
840 | 811 | if (symcount < 0) |
841 | 157 | return false; |
842 | 654 | abfd->symcount = symcount; |
843 | 654 | } |
844 | | |
845 | 1.25k | return true; |
846 | 1.81k | } |
847 | | |
848 | | /* Indicate that we are only retrieving symbol values from this |
849 | | section. We want the symbols to act as though the values in the |
850 | | file are absolute. */ |
851 | | |
852 | | void |
853 | | _bfd_generic_link_just_syms (asection *sec, |
854 | | struct bfd_link_info *info ATTRIBUTE_UNUSED) |
855 | 0 | { |
856 | 0 | sec->sec_info_type = SEC_INFO_TYPE_JUST_SYMS; |
857 | 0 | sec->output_section = bfd_abs_section_ptr; |
858 | 0 | sec->output_offset = sec->vma; |
859 | 0 | } |
860 | | |
861 | | /* Copy the symbol type and other attributes for a linker script |
862 | | assignment from HSRC to HDEST. |
863 | | The default implementation does nothing. */ |
864 | | void |
865 | | _bfd_generic_copy_link_hash_symbol_type (bfd *abfd ATTRIBUTE_UNUSED, |
866 | | struct bfd_link_hash_entry *hdest ATTRIBUTE_UNUSED, |
867 | | struct bfd_link_hash_entry *hsrc ATTRIBUTE_UNUSED) |
868 | 0 | { |
869 | 0 | } |
870 | | |
871 | | /* Generic function to add symbols from an object file to the |
872 | | global hash table. */ |
873 | | |
874 | | bool |
875 | | _bfd_generic_link_add_symbols (bfd *abfd, struct bfd_link_info *info) |
876 | 0 | { |
877 | 0 | bool ret; |
878 | |
|
879 | 0 | switch (bfd_get_format (abfd)) |
880 | 0 | { |
881 | 0 | case bfd_object: |
882 | 0 | ret = generic_link_add_object_symbols (abfd, info); |
883 | 0 | break; |
884 | 0 | case bfd_archive: |
885 | 0 | ret = (_bfd_generic_link_add_archive_symbols |
886 | 0 | (abfd, info, generic_link_check_archive_element)); |
887 | 0 | break; |
888 | 0 | default: |
889 | 0 | bfd_set_error (bfd_error_wrong_format); |
890 | 0 | ret = false; |
891 | 0 | } |
892 | | |
893 | 0 | return ret; |
894 | 0 | } |
895 | | |
896 | | /* Add symbols from an object file to the global hash table. */ |
897 | | |
898 | | static bool |
899 | | generic_link_add_object_symbols (bfd *abfd, |
900 | | struct bfd_link_info *info) |
901 | 0 | { |
902 | 0 | bfd_size_type symcount; |
903 | 0 | struct bfd_symbol **outsyms; |
904 | |
|
905 | 0 | if (!bfd_generic_link_read_symbols (abfd)) |
906 | 0 | return false; |
907 | 0 | symcount = _bfd_generic_link_get_symcount (abfd); |
908 | 0 | outsyms = _bfd_generic_link_get_symbols (abfd); |
909 | 0 | return generic_link_add_symbol_list (abfd, info, symcount, outsyms); |
910 | 0 | } |
911 | | |
912 | | /* Generic function to add symbols from an archive file to the global |
913 | | hash file. This function presumes that the archive symbol table |
914 | | has already been read in (this is normally done by the |
915 | | bfd_check_format entry point). It looks through the archive symbol |
916 | | table for symbols that are undefined or common in the linker global |
917 | | symbol hash table. When one is found, the CHECKFN argument is used |
918 | | to see if an object file should be included. This allows targets |
919 | | to customize common symbol behaviour. CHECKFN should set *PNEEDED |
920 | | to TRUE if the object file should be included, and must also call |
921 | | the bfd_link_info add_archive_element callback function and handle |
922 | | adding the symbols to the global hash table. CHECKFN must notice |
923 | | if the callback indicates a substitute BFD, and arrange to add |
924 | | those symbols instead if it does so. CHECKFN should only return |
925 | | FALSE if some sort of error occurs. */ |
926 | | |
927 | | bool |
928 | | _bfd_generic_link_add_archive_symbols |
929 | | (bfd *abfd, |
930 | | struct bfd_link_info *info, |
931 | | bool (*checkfn) (bfd *, struct bfd_link_info *, |
932 | | struct bfd_link_hash_entry *, const char *, bool *)) |
933 | 0 | { |
934 | 0 | bool loop; |
935 | 0 | bfd_size_type amt; |
936 | 0 | unsigned char *included; |
937 | |
|
938 | 0 | if (! bfd_has_map (abfd)) |
939 | 0 | { |
940 | | /* An empty archive is a special case. */ |
941 | 0 | if (bfd_openr_next_archived_file (abfd, NULL) == NULL) |
942 | 0 | return true; |
943 | 0 | bfd_set_error (bfd_error_no_armap); |
944 | 0 | return false; |
945 | 0 | } |
946 | | |
947 | 0 | amt = bfd_ardata (abfd)->symdef_count; |
948 | 0 | if (amt == 0) |
949 | 0 | return true; |
950 | 0 | amt *= sizeof (*included); |
951 | 0 | included = (unsigned char *) bfd_zmalloc (amt); |
952 | 0 | if (included == NULL) |
953 | 0 | return false; |
954 | | |
955 | 0 | do |
956 | 0 | { |
957 | 0 | carsym *arsyms; |
958 | 0 | carsym *arsym_end; |
959 | 0 | carsym *arsym; |
960 | 0 | unsigned int indx; |
961 | 0 | file_ptr last_ar_offset = -1; |
962 | 0 | bool needed = false; |
963 | 0 | bfd *element = NULL; |
964 | |
|
965 | 0 | loop = false; |
966 | 0 | arsyms = bfd_ardata (abfd)->symdefs; |
967 | 0 | arsym_end = arsyms + bfd_ardata (abfd)->symdef_count; |
968 | 0 | for (arsym = arsyms, indx = 0; arsym < arsym_end; arsym++, indx++) |
969 | 0 | { |
970 | 0 | struct bfd_link_hash_entry *h; |
971 | 0 | struct bfd_link_hash_entry *undefs_tail; |
972 | |
|
973 | 0 | if (included[indx]) |
974 | 0 | continue; |
975 | 0 | if (needed && arsym->file_offset == last_ar_offset) |
976 | 0 | { |
977 | 0 | included[indx] = 1; |
978 | 0 | continue; |
979 | 0 | } |
980 | | |
981 | 0 | if (arsym->name == NULL) |
982 | 0 | goto error_return; |
983 | | |
984 | 0 | h = bfd_link_hash_lookup (info->hash, arsym->name, |
985 | 0 | false, false, true); |
986 | |
|
987 | 0 | if (h == NULL |
988 | 0 | && info->pei386_auto_import |
989 | 0 | && startswith (arsym->name, "__imp_")) |
990 | 0 | h = bfd_link_hash_lookup (info->hash, arsym->name + 6, |
991 | 0 | false, false, true); |
992 | 0 | if (h == NULL) |
993 | 0 | continue; |
994 | | |
995 | 0 | if (h->type != bfd_link_hash_undefined |
996 | 0 | && h->type != bfd_link_hash_common) |
997 | 0 | { |
998 | 0 | if (h->type != bfd_link_hash_undefweak) |
999 | | /* Symbol must be defined. Don't check it again. */ |
1000 | 0 | included[indx] = 1; |
1001 | 0 | continue; |
1002 | 0 | } |
1003 | | |
1004 | 0 | if (last_ar_offset != arsym->file_offset) |
1005 | 0 | { |
1006 | 0 | last_ar_offset = arsym->file_offset; |
1007 | 0 | element = _bfd_get_elt_at_filepos (abfd, last_ar_offset, |
1008 | 0 | info); |
1009 | 0 | if (element == NULL |
1010 | 0 | || !bfd_check_format (element, bfd_object)) |
1011 | 0 | goto error_return; |
1012 | 0 | } |
1013 | | |
1014 | 0 | undefs_tail = info->hash->undefs_tail; |
1015 | | |
1016 | | /* CHECKFN will see if this element should be included, and |
1017 | | go ahead and include it if appropriate. */ |
1018 | 0 | if (! (*checkfn) (element, info, h, arsym->name, &needed)) |
1019 | 0 | goto error_return; |
1020 | | |
1021 | 0 | if (needed) |
1022 | 0 | { |
1023 | 0 | unsigned int mark; |
1024 | | |
1025 | | /* Look backward to mark all symbols from this object file |
1026 | | which we have already seen in this pass. */ |
1027 | 0 | mark = indx; |
1028 | 0 | do |
1029 | 0 | { |
1030 | 0 | included[mark] = 1; |
1031 | 0 | if (mark == 0) |
1032 | 0 | break; |
1033 | 0 | --mark; |
1034 | 0 | } |
1035 | 0 | while (arsyms[mark].file_offset == last_ar_offset); |
1036 | | |
1037 | 0 | if (undefs_tail != info->hash->undefs_tail) |
1038 | 0 | loop = true; |
1039 | 0 | } |
1040 | 0 | } |
1041 | 0 | } while (loop); |
1042 | | |
1043 | 0 | free (included); |
1044 | 0 | return true; |
1045 | | |
1046 | 0 | error_return: |
1047 | 0 | free (included); |
1048 | 0 | return false; |
1049 | 0 | } |
1050 | | |
1051 | | /* See if we should include an archive element. */ |
1052 | | |
1053 | | static bool |
1054 | | generic_link_check_archive_element (bfd *abfd, |
1055 | | struct bfd_link_info *info, |
1056 | | struct bfd_link_hash_entry *h, |
1057 | | const char *name ATTRIBUTE_UNUSED, |
1058 | | bool *pneeded) |
1059 | 0 | { |
1060 | 0 | asymbol **pp, **ppend; |
1061 | |
|
1062 | 0 | *pneeded = false; |
1063 | |
|
1064 | 0 | if (!bfd_generic_link_read_symbols (abfd)) |
1065 | 0 | return false; |
1066 | | |
1067 | 0 | pp = _bfd_generic_link_get_symbols (abfd); |
1068 | 0 | ppend = pp + _bfd_generic_link_get_symcount (abfd); |
1069 | 0 | for (; pp < ppend; pp++) |
1070 | 0 | { |
1071 | 0 | asymbol *p; |
1072 | |
|
1073 | 0 | p = *pp; |
1074 | | |
1075 | | /* We are only interested in globally visible symbols. */ |
1076 | 0 | if (! bfd_is_com_section (p->section) |
1077 | 0 | && (p->flags & (BSF_GLOBAL | BSF_INDIRECT | BSF_WEAK)) == 0) |
1078 | 0 | continue; |
1079 | | |
1080 | | /* We are only interested if we know something about this |
1081 | | symbol, and it is undefined or common. An undefined weak |
1082 | | symbol (type bfd_link_hash_undefweak) is not considered to be |
1083 | | a reference when pulling files out of an archive. See the |
1084 | | SVR4 ABI, p. 4-27. */ |
1085 | 0 | h = bfd_link_hash_lookup (info->hash, bfd_asymbol_name (p), false, |
1086 | 0 | false, true); |
1087 | 0 | if (h == NULL |
1088 | 0 | || (h->type != bfd_link_hash_undefined |
1089 | 0 | && h->type != bfd_link_hash_common)) |
1090 | 0 | continue; |
1091 | | |
1092 | | /* P is a symbol we are looking for. */ |
1093 | | |
1094 | 0 | if (! bfd_is_com_section (p->section) |
1095 | 0 | || (h->type == bfd_link_hash_undefined |
1096 | 0 | && h->u.undef.abfd == NULL)) |
1097 | 0 | { |
1098 | | /* P is not a common symbol, or an undefined reference was |
1099 | | created from outside BFD such as from a linker -u option. |
1100 | | This object file defines the symbol, so pull it in. */ |
1101 | 0 | *pneeded = true; |
1102 | 0 | if (!(*info->callbacks |
1103 | 0 | ->add_archive_element) (info, abfd, bfd_asymbol_name (p), |
1104 | 0 | &abfd)) |
1105 | 0 | return false; |
1106 | | /* Potentially, the add_archive_element hook may have set a |
1107 | | substitute BFD for us. */ |
1108 | 0 | return bfd_link_add_symbols (abfd, info); |
1109 | 0 | } |
1110 | | |
1111 | | /* P is a common symbol. */ |
1112 | | |
1113 | 0 | if (h->type == bfd_link_hash_undefined) |
1114 | 0 | { |
1115 | 0 | bfd *symbfd; |
1116 | 0 | bfd_vma size; |
1117 | 0 | unsigned int power; |
1118 | | |
1119 | | /* Turn the symbol into a common symbol but do not link in |
1120 | | the object file. This is how a.out works. Object |
1121 | | formats that require different semantics must implement |
1122 | | this function differently. This symbol is already on the |
1123 | | undefs list. We add the section to a common section |
1124 | | attached to symbfd to ensure that it is in a BFD which |
1125 | | will be linked in. */ |
1126 | 0 | symbfd = h->u.undef.abfd; |
1127 | 0 | h->type = bfd_link_hash_common; |
1128 | 0 | h->u.c.p = (struct bfd_link_hash_common_entry *) |
1129 | 0 | bfd_hash_allocate (&info->hash->table, |
1130 | 0 | sizeof (struct bfd_link_hash_common_entry)); |
1131 | 0 | if (h->u.c.p == NULL) |
1132 | 0 | return false; |
1133 | | |
1134 | 0 | size = bfd_asymbol_value (p); |
1135 | 0 | h->u.c.size = size; |
1136 | |
|
1137 | 0 | power = bfd_log2 (size); |
1138 | 0 | if (power > 4) |
1139 | 0 | power = 4; |
1140 | 0 | h->u.c.p->alignment_power = power; |
1141 | |
|
1142 | 0 | if (p->section == bfd_com_section_ptr) |
1143 | 0 | h->u.c.p->section = bfd_make_section_old_way (symbfd, "COMMON"); |
1144 | 0 | else |
1145 | 0 | h->u.c.p->section = bfd_make_section_old_way (symbfd, |
1146 | 0 | p->section->name); |
1147 | 0 | h->u.c.p->section->flags |= SEC_ALLOC; |
1148 | 0 | } |
1149 | 0 | else |
1150 | 0 | { |
1151 | | /* Adjust the size of the common symbol if necessary. This |
1152 | | is how a.out works. Object formats that require |
1153 | | different semantics must implement this function |
1154 | | differently. */ |
1155 | 0 | if (bfd_asymbol_value (p) > h->u.c.size) |
1156 | 0 | h->u.c.size = bfd_asymbol_value (p); |
1157 | 0 | } |
1158 | 0 | } |
1159 | | |
1160 | | /* This archive element is not needed. */ |
1161 | 0 | return true; |
1162 | 0 | } |
1163 | | |
1164 | | /* Add the symbols from an object file to the global hash table. ABFD |
1165 | | is the object file. INFO is the linker information. SYMBOL_COUNT |
1166 | | is the number of symbols. SYMBOLS is the list of symbols. */ |
1167 | | |
1168 | | static bool |
1169 | | generic_link_add_symbol_list (bfd *abfd, |
1170 | | struct bfd_link_info *info, |
1171 | | bfd_size_type symbol_count, |
1172 | | asymbol **symbols) |
1173 | 0 | { |
1174 | 0 | asymbol **pp, **ppend; |
1175 | |
|
1176 | 0 | pp = symbols; |
1177 | 0 | ppend = symbols + symbol_count; |
1178 | 0 | for (; pp < ppend; pp++) |
1179 | 0 | { |
1180 | 0 | asymbol *p; |
1181 | |
|
1182 | 0 | p = *pp; |
1183 | |
|
1184 | 0 | if ((p->flags & (BSF_INDIRECT |
1185 | 0 | | BSF_WARNING |
1186 | 0 | | BSF_GLOBAL |
1187 | 0 | | BSF_CONSTRUCTOR |
1188 | 0 | | BSF_WEAK)) != 0 |
1189 | 0 | || bfd_is_und_section (bfd_asymbol_section (p)) |
1190 | 0 | || bfd_is_com_section (bfd_asymbol_section (p)) |
1191 | 0 | || bfd_is_ind_section (bfd_asymbol_section (p))) |
1192 | 0 | { |
1193 | 0 | const char *name; |
1194 | 0 | const char *string; |
1195 | 0 | struct generic_link_hash_entry *h; |
1196 | 0 | struct bfd_link_hash_entry *bh; |
1197 | |
|
1198 | 0 | string = name = bfd_asymbol_name (p); |
1199 | 0 | if (((p->flags & BSF_INDIRECT) != 0 |
1200 | 0 | || bfd_is_ind_section (p->section)) |
1201 | 0 | && pp + 1 < ppend) |
1202 | 0 | { |
1203 | 0 | pp++; |
1204 | 0 | string = bfd_asymbol_name (*pp); |
1205 | 0 | } |
1206 | 0 | else if ((p->flags & BSF_WARNING) != 0 |
1207 | 0 | && pp + 1 < ppend) |
1208 | 0 | { |
1209 | | /* The name of P is actually the warning string, and the |
1210 | | next symbol is the one to warn about. */ |
1211 | 0 | pp++; |
1212 | 0 | name = bfd_asymbol_name (*pp); |
1213 | 0 | } |
1214 | |
|
1215 | 0 | bh = NULL; |
1216 | 0 | if (! (_bfd_generic_link_add_one_symbol |
1217 | 0 | (info, abfd, name, p->flags, bfd_asymbol_section (p), |
1218 | 0 | p->value, string, false, false, &bh))) |
1219 | 0 | return false; |
1220 | 0 | h = (struct generic_link_hash_entry *) bh; |
1221 | | |
1222 | | /* If this is a constructor symbol, and the linker didn't do |
1223 | | anything with it, then we want to just pass the symbol |
1224 | | through to the output file. This will happen when |
1225 | | linking with -r. */ |
1226 | 0 | if ((p->flags & BSF_CONSTRUCTOR) != 0 |
1227 | 0 | && (h == NULL || h->root.type == bfd_link_hash_new)) |
1228 | 0 | { |
1229 | 0 | p->udata.p = NULL; |
1230 | 0 | continue; |
1231 | 0 | } |
1232 | | |
1233 | | /* Save the BFD symbol so that we don't lose any backend |
1234 | | specific information that may be attached to it. We only |
1235 | | want this one if it gives more information than the |
1236 | | existing one; we don't want to replace a defined symbol |
1237 | | with an undefined one. This routine may be called with a |
1238 | | hash table other than the generic hash table, so we only |
1239 | | do this if we are certain that the hash table is a |
1240 | | generic one. */ |
1241 | 0 | if (info->output_bfd->xvec == abfd->xvec) |
1242 | 0 | { |
1243 | 0 | if (h->sym == NULL |
1244 | 0 | || (! bfd_is_und_section (bfd_asymbol_section (p)) |
1245 | 0 | && (! bfd_is_com_section (bfd_asymbol_section (p)) |
1246 | 0 | || bfd_is_und_section (bfd_asymbol_section (h->sym))))) |
1247 | 0 | { |
1248 | 0 | h->sym = p; |
1249 | | /* BSF_OLD_COMMON is a hack to support COFF reloc |
1250 | | reading, and it should go away when the COFF |
1251 | | linker is switched to the new version. */ |
1252 | 0 | if (bfd_is_com_section (bfd_asymbol_section (p))) |
1253 | 0 | p->flags |= BSF_OLD_COMMON; |
1254 | 0 | } |
1255 | 0 | } |
1256 | | |
1257 | | /* Store a back pointer from the symbol to the hash |
1258 | | table entry for the benefit of relaxation code until |
1259 | | it gets rewritten to not use asymbol structures. |
1260 | | Setting this is also used to check whether these |
1261 | | symbols were set up by the generic linker. */ |
1262 | 0 | p->udata.p = h; |
1263 | 0 | } |
1264 | 0 | } |
1265 | | |
1266 | 0 | return true; |
1267 | 0 | } |
1268 | | |
1269 | | /* We use a state table to deal with adding symbols from an object |
1270 | | file. The first index into the state table describes the symbol |
1271 | | from the object file. The second index into the state table is the |
1272 | | type of the symbol in the hash table. */ |
1273 | | |
1274 | | /* The symbol from the object file is turned into one of these row |
1275 | | values. */ |
1276 | | |
1277 | | enum link_row |
1278 | | { |
1279 | | UNDEF_ROW, /* Undefined. */ |
1280 | | UNDEFW_ROW, /* Weak undefined. */ |
1281 | | DEF_ROW, /* Defined. */ |
1282 | | DEFW_ROW, /* Weak defined. */ |
1283 | | COMMON_ROW, /* Common. */ |
1284 | | INDR_ROW, /* Indirect. */ |
1285 | | WARN_ROW, /* Warning. */ |
1286 | | SET_ROW /* Member of set. */ |
1287 | | }; |
1288 | | |
1289 | | /* apparently needed for Hitachi 3050R(HI-UX/WE2)? */ |
1290 | | #undef FAIL |
1291 | | |
1292 | | /* The actions to take in the state table. */ |
1293 | | |
1294 | | enum link_action |
1295 | | { |
1296 | | FAIL, /* Abort. */ |
1297 | | UND, /* Mark symbol undefined. */ |
1298 | | WEAK, /* Mark symbol weak undefined. */ |
1299 | | DEF, /* Mark symbol defined. */ |
1300 | | DEFW, /* Mark symbol weak defined. */ |
1301 | | COM, /* Mark symbol common. */ |
1302 | | REF, /* Mark defined symbol referenced. */ |
1303 | | CREF, /* Possibly warn about common reference to defined symbol. */ |
1304 | | CDEF, /* Define existing common symbol. */ |
1305 | | NOACT, /* No action. */ |
1306 | | BIG, /* Mark symbol common using largest size. */ |
1307 | | MDEF, /* Multiple definition error. */ |
1308 | | MIND, /* Multiple indirect symbols. */ |
1309 | | IND, /* Make indirect symbol. */ |
1310 | | CIND, /* Make indirect symbol from existing common symbol. */ |
1311 | | SET, /* Add value to set. */ |
1312 | | MWARN, /* Make warning symbol. */ |
1313 | | WARN, /* Warn if referenced, else MWARN. */ |
1314 | | CYCLE, /* Repeat with symbol pointed to. */ |
1315 | | REFC, /* Mark indirect symbol referenced and then CYCLE. */ |
1316 | | WARNC /* Issue warning and then CYCLE. */ |
1317 | | }; |
1318 | | |
1319 | | /* The state table itself. The first index is a link_row and the |
1320 | | second index is a bfd_link_hash_type. */ |
1321 | | |
1322 | | static const enum link_action link_action[8][8] = |
1323 | | { |
1324 | | /* current\prev new undef undefw def defw com indr warn */ |
1325 | | /* UNDEF_ROW */ {UND, NOACT, UND, REF, REF, NOACT, REFC, WARNC }, |
1326 | | /* UNDEFW_ROW */ {WEAK, NOACT, NOACT, REF, REF, NOACT, REFC, WARNC }, |
1327 | | /* DEF_ROW */ {DEF, DEF, DEF, MDEF, DEF, CDEF, MIND, CYCLE }, |
1328 | | /* DEFW_ROW */ {DEFW, DEFW, DEFW, NOACT, NOACT, NOACT, NOACT, CYCLE }, |
1329 | | /* COMMON_ROW */ {COM, COM, COM, CREF, COM, BIG, REFC, WARNC }, |
1330 | | /* INDR_ROW */ {IND, IND, IND, MDEF, IND, CIND, MIND, CYCLE }, |
1331 | | /* WARN_ROW */ {MWARN, WARN, WARN, WARN, WARN, WARN, WARN, NOACT }, |
1332 | | /* SET_ROW */ {SET, SET, SET, SET, SET, SET, CYCLE, CYCLE } |
1333 | | }; |
1334 | | |
1335 | | /* Most of the entries in the LINK_ACTION table are straightforward, |
1336 | | but a few are somewhat subtle. |
1337 | | |
1338 | | A reference to an indirect symbol (UNDEF_ROW/indr or |
1339 | | UNDEFW_ROW/indr) is counted as a reference both to the indirect |
1340 | | symbol and to the symbol the indirect symbol points to. |
1341 | | |
1342 | | A reference to a warning symbol (UNDEF_ROW/warn or UNDEFW_ROW/warn) |
1343 | | causes the warning to be issued. |
1344 | | |
1345 | | A common definition of an indirect symbol (COMMON_ROW/indr) is |
1346 | | treated as a multiple definition error. Likewise for an indirect |
1347 | | definition of a common symbol (INDR_ROW/com). |
1348 | | |
1349 | | An indirect definition of a warning (INDR_ROW/warn) does not cause |
1350 | | the warning to be issued. |
1351 | | |
1352 | | If a warning is created for an indirect symbol (WARN_ROW/indr) no |
1353 | | warning is created for the symbol the indirect symbol points to. |
1354 | | |
1355 | | Adding an entry to a set does not count as a reference to a set, |
1356 | | and no warning is issued (SET_ROW/warn). */ |
1357 | | |
1358 | | /* Return the BFD in which a hash entry has been defined, if known. */ |
1359 | | |
1360 | | static bfd * |
1361 | | hash_entry_bfd (struct bfd_link_hash_entry *h) |
1362 | 0 | { |
1363 | 0 | while (h->type == bfd_link_hash_warning) |
1364 | 0 | h = h->u.i.link; |
1365 | 0 | switch (h->type) |
1366 | 0 | { |
1367 | 0 | default: |
1368 | 0 | return NULL; |
1369 | 0 | case bfd_link_hash_undefined: |
1370 | 0 | case bfd_link_hash_undefweak: |
1371 | 0 | return h->u.undef.abfd; |
1372 | 0 | case bfd_link_hash_defined: |
1373 | 0 | case bfd_link_hash_defweak: |
1374 | 0 | return h->u.def.section->owner; |
1375 | 0 | case bfd_link_hash_common: |
1376 | 0 | return h->u.c.p->section->owner; |
1377 | 0 | } |
1378 | | /*NOTREACHED*/ |
1379 | 0 | } |
1380 | | |
1381 | | /* |
1382 | | FUNCTION |
1383 | | _bfd_generic_link_add_one_symbol |
1384 | | |
1385 | | SYNOPSIS |
1386 | | bool _bfd_generic_link_add_one_symbol |
1387 | | (struct bfd_link_info *info, |
1388 | | bfd *abfd, |
1389 | | const char *name, |
1390 | | flagword flags, |
1391 | | asection *section, |
1392 | | bfd_vma value, |
1393 | | const char *string, |
1394 | | bool copy, |
1395 | | bool collect, |
1396 | | struct bfd_link_hash_entry **hashp); |
1397 | | |
1398 | | DESCRIPTION |
1399 | | Add a symbol to the global hash table. |
1400 | | ABFD is the BFD the symbol comes from. |
1401 | | NAME is the name of the symbol. |
1402 | | FLAGS is the BSF_* bits associated with the symbol. |
1403 | | SECTION is the section in which the symbol is defined; this may be |
1404 | | bfd_und_section_ptr or bfd_com_section_ptr. |
1405 | | VALUE is the value of the symbol, relative to the section. |
1406 | | STRING is used for either an indirect symbol, in which case it is |
1407 | | the name of the symbol to indirect to, or a warning symbol, in |
1408 | | which case it is the warning string. |
1409 | | COPY is TRUE if NAME or STRING must be copied into locally |
1410 | | allocated memory if they need to be saved. |
1411 | | COLLECT is TRUE if we should automatically collect gcc constructor |
1412 | | or destructor names as collect2 does. |
1413 | | HASHP, if not NULL, is a place to store the created hash table |
1414 | | entry; if *HASHP is not NULL, the caller has already looked up |
1415 | | the hash table entry, and stored it in *HASHP. */ |
1416 | | |
1417 | | bool |
1418 | | _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, |
1419 | | bfd *abfd, |
1420 | | const char *name, |
1421 | | flagword flags, |
1422 | | asection *section, |
1423 | | bfd_vma value, |
1424 | | const char *string, |
1425 | | bool copy, |
1426 | | bool collect, |
1427 | | struct bfd_link_hash_entry **hashp) |
1428 | 0 | { |
1429 | 0 | enum link_row row; |
1430 | 0 | struct bfd_link_hash_entry *h; |
1431 | 0 | struct bfd_link_hash_entry *inh = NULL; |
1432 | 0 | bool cycle; |
1433 | |
|
1434 | 0 | BFD_ASSERT (section != NULL); |
1435 | |
|
1436 | 0 | if (bfd_is_ind_section (section) |
1437 | 0 | || (flags & BSF_INDIRECT) != 0) |
1438 | 0 | { |
1439 | 0 | row = INDR_ROW; |
1440 | | /* Create the indirect symbol here. This is for the benefit of |
1441 | | the plugin "notice" function. |
1442 | | STRING is the name of the symbol we want to indirect to. */ |
1443 | 0 | inh = bfd_wrapped_link_hash_lookup (abfd, info, string, true, |
1444 | 0 | copy, false); |
1445 | 0 | if (inh == NULL) |
1446 | 0 | return false; |
1447 | 0 | } |
1448 | 0 | else if ((flags & BSF_WARNING) != 0) |
1449 | 0 | row = WARN_ROW; |
1450 | 0 | else if ((flags & BSF_CONSTRUCTOR) != 0) |
1451 | 0 | row = SET_ROW; |
1452 | 0 | else if (bfd_is_und_section (section)) |
1453 | 0 | { |
1454 | 0 | if ((flags & BSF_WEAK) != 0) |
1455 | 0 | row = UNDEFW_ROW; |
1456 | 0 | else |
1457 | 0 | row = UNDEF_ROW; |
1458 | 0 | } |
1459 | 0 | else if ((flags & BSF_WEAK) != 0) |
1460 | 0 | row = DEFW_ROW; |
1461 | 0 | else if (bfd_is_com_section (section)) |
1462 | 0 | { |
1463 | 0 | row = COMMON_ROW; |
1464 | 0 | if (!bfd_link_relocatable (info) |
1465 | 0 | && name != NULL |
1466 | 0 | && name[0] == '_' |
1467 | 0 | && name[1] == '_' |
1468 | 0 | && strcmp (name + (name[2] == '_'), "__gnu_lto_slim") == 0) |
1469 | 0 | _bfd_error_handler |
1470 | 0 | (_("%pB: plugin needed to handle lto object"), abfd); |
1471 | 0 | } |
1472 | 0 | else |
1473 | 0 | row = DEF_ROW; |
1474 | | |
1475 | 0 | if (hashp != NULL && *hashp != NULL) |
1476 | 0 | h = *hashp; |
1477 | 0 | else |
1478 | 0 | { |
1479 | 0 | if (row == UNDEF_ROW || row == UNDEFW_ROW) |
1480 | 0 | h = bfd_wrapped_link_hash_lookup (abfd, info, name, true, copy, false); |
1481 | 0 | else |
1482 | 0 | h = bfd_link_hash_lookup (info->hash, name, true, copy, false); |
1483 | 0 | if (h == NULL) |
1484 | 0 | { |
1485 | 0 | if (hashp != NULL) |
1486 | 0 | *hashp = NULL; |
1487 | 0 | return false; |
1488 | 0 | } |
1489 | 0 | } |
1490 | | |
1491 | 0 | if (info->notice_all |
1492 | 0 | || (info->notice_hash != NULL |
1493 | 0 | && bfd_hash_lookup (info->notice_hash, name, false, false) != NULL)) |
1494 | 0 | { |
1495 | 0 | if (! (*info->callbacks->notice) (info, h, inh, |
1496 | 0 | abfd, section, value, flags)) |
1497 | 0 | return false; |
1498 | 0 | } |
1499 | | |
1500 | 0 | if (hashp != NULL) |
1501 | 0 | *hashp = h; |
1502 | |
|
1503 | 0 | do |
1504 | 0 | { |
1505 | 0 | enum link_action action; |
1506 | 0 | int prev; |
1507 | |
|
1508 | 0 | prev = h->type; |
1509 | | /* Treat symbols defined by early linker script pass as undefined. */ |
1510 | 0 | if (h->ldscript_def) |
1511 | 0 | prev = bfd_link_hash_undefined; |
1512 | 0 | cycle = false; |
1513 | 0 | action = link_action[(int) row][prev]; |
1514 | 0 | switch (action) |
1515 | 0 | { |
1516 | 0 | case FAIL: |
1517 | 0 | abort (); |
1518 | | |
1519 | 0 | case NOACT: |
1520 | | /* Do nothing. */ |
1521 | 0 | break; |
1522 | | |
1523 | 0 | case UND: |
1524 | | /* Make a new undefined symbol. */ |
1525 | 0 | h->type = bfd_link_hash_undefined; |
1526 | 0 | h->u.undef.abfd = abfd; |
1527 | 0 | bfd_link_add_undef (info->hash, h); |
1528 | 0 | break; |
1529 | | |
1530 | 0 | case WEAK: |
1531 | | /* Make a new weak undefined symbol. */ |
1532 | 0 | h->type = bfd_link_hash_undefweak; |
1533 | 0 | h->u.undef.abfd = abfd; |
1534 | 0 | break; |
1535 | | |
1536 | 0 | case CDEF: |
1537 | | /* We have found a definition for a symbol which was |
1538 | | previously common. */ |
1539 | 0 | BFD_ASSERT (h->type == bfd_link_hash_common); |
1540 | 0 | (*info->callbacks->multiple_common) (info, h, abfd, |
1541 | 0 | bfd_link_hash_defined, 0); |
1542 | | /* Fall through. */ |
1543 | 0 | case DEF: |
1544 | 0 | case DEFW: |
1545 | 0 | { |
1546 | 0 | enum bfd_link_hash_type oldtype; |
1547 | | |
1548 | | /* Define a symbol. */ |
1549 | 0 | oldtype = h->type; |
1550 | 0 | if (action == DEFW) |
1551 | 0 | h->type = bfd_link_hash_defweak; |
1552 | 0 | else |
1553 | 0 | h->type = bfd_link_hash_defined; |
1554 | 0 | h->u.def.section = section; |
1555 | 0 | h->u.def.value = value; |
1556 | 0 | h->linker_def = 0; |
1557 | 0 | h->ldscript_def = 0; |
1558 | | |
1559 | | /* If we have been asked to, we act like collect2 and |
1560 | | identify all functions that might be global |
1561 | | constructors and destructors and pass them up in a |
1562 | | callback. We only do this for certain object file |
1563 | | types, since many object file types can handle this |
1564 | | automatically. */ |
1565 | 0 | if (collect && name[0] == '_') |
1566 | 0 | { |
1567 | 0 | const char *s; |
1568 | | |
1569 | | /* A constructor or destructor name starts like this: |
1570 | | _+GLOBAL_[_.$][ID][_.$] where the first [_.$] and |
1571 | | the second are the same character (we accept any |
1572 | | character there, in case a new object file format |
1573 | | comes along with even worse naming restrictions). */ |
1574 | |
|
1575 | 0 | #define CONS_PREFIX "GLOBAL_" |
1576 | 0 | #define CONS_PREFIX_LEN (sizeof CONS_PREFIX - 1) |
1577 | |
|
1578 | 0 | s = name + 1; |
1579 | 0 | while (*s == '_') |
1580 | 0 | ++s; |
1581 | 0 | if (s[0] == 'G' && startswith (s, CONS_PREFIX)) |
1582 | 0 | { |
1583 | 0 | char c; |
1584 | |
|
1585 | 0 | c = s[CONS_PREFIX_LEN + 1]; |
1586 | 0 | if ((c == 'I' || c == 'D') |
1587 | 0 | && s[CONS_PREFIX_LEN] == s[CONS_PREFIX_LEN + 2]) |
1588 | 0 | { |
1589 | | /* If this is a definition of a symbol which |
1590 | | was previously weakly defined, we are in |
1591 | | trouble. We have already added a |
1592 | | constructor entry for the weak defined |
1593 | | symbol, and now we are trying to add one |
1594 | | for the new symbol. Fortunately, this case |
1595 | | should never arise in practice. */ |
1596 | 0 | if (oldtype == bfd_link_hash_defweak) |
1597 | 0 | abort (); |
1598 | | |
1599 | 0 | (*info->callbacks->constructor) (info, c == 'I', |
1600 | 0 | h->root.string, abfd, |
1601 | 0 | section, value); |
1602 | 0 | } |
1603 | 0 | } |
1604 | 0 | } |
1605 | 0 | } |
1606 | | |
1607 | 0 | break; |
1608 | | |
1609 | 0 | case COM: |
1610 | | /* We have found a common definition for a symbol. */ |
1611 | 0 | if (h->type == bfd_link_hash_new) |
1612 | 0 | bfd_link_add_undef (info->hash, h); |
1613 | 0 | h->type = bfd_link_hash_common; |
1614 | 0 | h->u.c.p = (struct bfd_link_hash_common_entry *) |
1615 | 0 | bfd_hash_allocate (&info->hash->table, |
1616 | 0 | sizeof (struct bfd_link_hash_common_entry)); |
1617 | 0 | if (h->u.c.p == NULL) |
1618 | 0 | return false; |
1619 | | |
1620 | 0 | h->u.c.size = value; |
1621 | | |
1622 | | /* Select a default alignment based on the size. This may |
1623 | | be overridden by the caller. */ |
1624 | 0 | { |
1625 | 0 | unsigned int power; |
1626 | |
|
1627 | 0 | power = bfd_log2 (value); |
1628 | 0 | if (power > 4) |
1629 | 0 | power = 4; |
1630 | 0 | h->u.c.p->alignment_power = power; |
1631 | 0 | } |
1632 | | |
1633 | | /* The section of a common symbol is only used if the common |
1634 | | symbol is actually allocated. It basically provides a |
1635 | | hook for the linker script to decide which output section |
1636 | | the common symbols should be put in. In most cases, the |
1637 | | section of a common symbol will be bfd_com_section_ptr, |
1638 | | the code here will choose a common symbol section named |
1639 | | "COMMON", and the linker script will contain *(COMMON) in |
1640 | | the appropriate place. A few targets use separate common |
1641 | | sections for small symbols, and they require special |
1642 | | handling. */ |
1643 | 0 | if (section == bfd_com_section_ptr) |
1644 | 0 | { |
1645 | 0 | h->u.c.p->section = bfd_make_section_old_way (abfd, "COMMON"); |
1646 | 0 | h->u.c.p->section->flags |= SEC_ALLOC; |
1647 | 0 | } |
1648 | 0 | else if (section->owner != abfd) |
1649 | 0 | { |
1650 | 0 | h->u.c.p->section = bfd_make_section_old_way (abfd, |
1651 | 0 | section->name); |
1652 | 0 | h->u.c.p->section->flags |= SEC_ALLOC; |
1653 | 0 | } |
1654 | 0 | else |
1655 | 0 | h->u.c.p->section = section; |
1656 | 0 | h->linker_def = 0; |
1657 | 0 | h->ldscript_def = 0; |
1658 | 0 | break; |
1659 | | |
1660 | 0 | case REF: |
1661 | | /* A reference to a defined symbol. */ |
1662 | 0 | if (h->u.undef.next == NULL && info->hash->undefs_tail != h) |
1663 | 0 | h->u.undef.next = h; |
1664 | 0 | break; |
1665 | | |
1666 | 0 | case BIG: |
1667 | | /* We have found a common definition for a symbol which |
1668 | | already had a common definition. Use the maximum of the |
1669 | | two sizes, and use the section required by the larger symbol. */ |
1670 | 0 | BFD_ASSERT (h->type == bfd_link_hash_common); |
1671 | 0 | (*info->callbacks->multiple_common) (info, h, abfd, |
1672 | 0 | bfd_link_hash_common, value); |
1673 | 0 | if (value > h->u.c.size) |
1674 | 0 | { |
1675 | 0 | unsigned int power; |
1676 | |
|
1677 | 0 | h->u.c.size = value; |
1678 | | |
1679 | | /* Select a default alignment based on the size. This may |
1680 | | be overridden by the caller. */ |
1681 | 0 | power = bfd_log2 (value); |
1682 | 0 | if (power > 4) |
1683 | 0 | power = 4; |
1684 | 0 | h->u.c.p->alignment_power = power; |
1685 | | |
1686 | | /* Some systems have special treatment for small commons, |
1687 | | hence we want to select the section used by the larger |
1688 | | symbol. This makes sure the symbol does not go in a |
1689 | | small common section if it is now too large. */ |
1690 | 0 | if (section == bfd_com_section_ptr) |
1691 | 0 | { |
1692 | 0 | h->u.c.p->section |
1693 | 0 | = bfd_make_section_old_way (abfd, "COMMON"); |
1694 | 0 | h->u.c.p->section->flags |= SEC_ALLOC; |
1695 | 0 | } |
1696 | 0 | else if (section->owner != abfd) |
1697 | 0 | { |
1698 | 0 | h->u.c.p->section |
1699 | 0 | = bfd_make_section_old_way (abfd, section->name); |
1700 | 0 | h->u.c.p->section->flags |= SEC_ALLOC; |
1701 | 0 | } |
1702 | 0 | else |
1703 | 0 | h->u.c.p->section = section; |
1704 | 0 | } |
1705 | 0 | break; |
1706 | | |
1707 | 0 | case CREF: |
1708 | | /* We have found a common definition for a symbol which |
1709 | | was already defined. */ |
1710 | 0 | (*info->callbacks->multiple_common) (info, h, abfd, |
1711 | 0 | bfd_link_hash_common, value); |
1712 | 0 | break; |
1713 | | |
1714 | 0 | case MIND: |
1715 | | /* Multiple indirect symbols. This is OK if they both point |
1716 | | to the same symbol. */ |
1717 | 0 | if (h->u.i.link == inh) |
1718 | 0 | break; |
1719 | 0 | if (h->u.i.link->type == bfd_link_hash_defweak) |
1720 | 0 | { |
1721 | | /* It is also OK to redefine a symbol that indirects to |
1722 | | a weak definition. So for sym@ver -> sym@@ver where |
1723 | | sym@@ver is weak and we have a new strong sym@ver, |
1724 | | redefine sym@@ver. Of course if there exists |
1725 | | sym -> sym@@ver then this also redefines sym. */ |
1726 | 0 | h = h->u.i.link; |
1727 | 0 | cycle = true; |
1728 | 0 | break; |
1729 | 0 | } |
1730 | | /* Fall through. */ |
1731 | 0 | case MDEF: |
1732 | | /* Handle a multiple definition. */ |
1733 | 0 | (*info->callbacks->multiple_definition) (info, h, |
1734 | 0 | abfd, section, value); |
1735 | 0 | break; |
1736 | | |
1737 | 0 | case CIND: |
1738 | | /* Create an indirect symbol from an existing common symbol. */ |
1739 | 0 | BFD_ASSERT (h->type == bfd_link_hash_common); |
1740 | 0 | (*info->callbacks->multiple_common) (info, h, abfd, |
1741 | 0 | bfd_link_hash_indirect, 0); |
1742 | | /* Fall through. */ |
1743 | 0 | case IND: |
1744 | 0 | if (inh->type == bfd_link_hash_indirect |
1745 | 0 | && inh->u.i.link == h) |
1746 | 0 | { |
1747 | 0 | _bfd_error_handler |
1748 | | /* xgettext:c-format */ |
1749 | 0 | (_("%pB: indirect symbol `%s' to `%s' is a loop"), |
1750 | 0 | abfd, name, string); |
1751 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1752 | 0 | return false; |
1753 | 0 | } |
1754 | 0 | if (inh->type == bfd_link_hash_new) |
1755 | 0 | { |
1756 | 0 | inh->type = bfd_link_hash_undefined; |
1757 | 0 | inh->u.undef.abfd = abfd; |
1758 | 0 | bfd_link_add_undef (info->hash, inh); |
1759 | 0 | } |
1760 | | |
1761 | | /* If the indirect symbol has been referenced, we need to |
1762 | | push the reference down to the symbol we are referencing. */ |
1763 | 0 | if (h->type != bfd_link_hash_new) |
1764 | 0 | { |
1765 | | /* ??? If inh->type == bfd_link_hash_undefweak this |
1766 | | converts inh to bfd_link_hash_undefined. */ |
1767 | 0 | row = UNDEF_ROW; |
1768 | 0 | cycle = true; |
1769 | 0 | } |
1770 | |
|
1771 | 0 | h->type = bfd_link_hash_indirect; |
1772 | 0 | h->u.i.link = inh; |
1773 | | /* Not setting h = h->u.i.link here means that when cycle is |
1774 | | set above we'll always go to REFC, and then cycle again |
1775 | | to the indirected symbol. This means that any successful |
1776 | | change of an existing symbol to indirect counts as a |
1777 | | reference. ??? That may not be correct when the existing |
1778 | | symbol was defweak. */ |
1779 | 0 | break; |
1780 | | |
1781 | 0 | case SET: |
1782 | | /* Add an entry to a set. */ |
1783 | 0 | (*info->callbacks->add_to_set) (info, h, BFD_RELOC_CTOR, |
1784 | 0 | abfd, section, value); |
1785 | 0 | break; |
1786 | | |
1787 | 0 | case WARNC: |
1788 | | /* Issue a warning and cycle, except when the reference is |
1789 | | in LTO IR. */ |
1790 | 0 | if (h->u.i.warning != NULL |
1791 | 0 | && (abfd->flags & BFD_PLUGIN) == 0) |
1792 | 0 | { |
1793 | 0 | (*info->callbacks->warning) (info, h->u.i.warning, |
1794 | 0 | h->root.string, abfd, NULL, 0); |
1795 | | /* Only issue a warning once. */ |
1796 | 0 | h->u.i.warning = NULL; |
1797 | 0 | } |
1798 | | /* Fall through. */ |
1799 | 0 | case CYCLE: |
1800 | | /* Try again with the referenced symbol. */ |
1801 | 0 | h = h->u.i.link; |
1802 | 0 | cycle = true; |
1803 | 0 | break; |
1804 | | |
1805 | 0 | case REFC: |
1806 | | /* A reference to an indirect symbol. */ |
1807 | 0 | if (h->u.undef.next == NULL && info->hash->undefs_tail != h) |
1808 | 0 | h->u.undef.next = h; |
1809 | 0 | h = h->u.i.link; |
1810 | 0 | cycle = true; |
1811 | 0 | break; |
1812 | | |
1813 | 0 | case WARN: |
1814 | | /* Warn if this symbol has been referenced already from non-IR, |
1815 | | otherwise add a warning. */ |
1816 | 0 | if ((!info->lto_plugin_active |
1817 | 0 | && (h->u.undef.next != NULL || info->hash->undefs_tail == h)) |
1818 | 0 | || h->non_ir_ref_regular |
1819 | 0 | || h->non_ir_ref_dynamic) |
1820 | 0 | { |
1821 | 0 | (*info->callbacks->warning) (info, string, h->root.string, |
1822 | 0 | hash_entry_bfd (h), NULL, 0); |
1823 | | /* PR 31067: If garbage collection is enabled then the |
1824 | | referenced symbol may actually be discarded later on. |
1825 | | This could be very confusing to the user. So give them |
1826 | | a hint as to what might be happening. */ |
1827 | 0 | if (info->gc_sections) |
1828 | 0 | (*info->callbacks->info) |
1829 | 0 | (_("%P: %pB: note: the message above does not take linker garbage collection into account\n"), |
1830 | 0 | hash_entry_bfd (h)); |
1831 | 0 | break; |
1832 | 0 | } |
1833 | | /* Fall through. */ |
1834 | 0 | case MWARN: |
1835 | | /* Make a warning symbol. */ |
1836 | 0 | { |
1837 | 0 | struct bfd_link_hash_entry *sub; |
1838 | | |
1839 | | /* STRING is the warning to give. */ |
1840 | 0 | sub = ((struct bfd_link_hash_entry *) |
1841 | 0 | ((*info->hash->table.newfunc) |
1842 | 0 | (NULL, &info->hash->table, h->root.string))); |
1843 | 0 | if (sub == NULL) |
1844 | 0 | return false; |
1845 | 0 | *sub = *h; |
1846 | 0 | sub->type = bfd_link_hash_warning; |
1847 | 0 | sub->u.i.link = h; |
1848 | 0 | if (! copy) |
1849 | 0 | sub->u.i.warning = string; |
1850 | 0 | else |
1851 | 0 | { |
1852 | 0 | char *w; |
1853 | 0 | size_t len = strlen (string) + 1; |
1854 | |
|
1855 | 0 | w = (char *) bfd_hash_allocate (&info->hash->table, len); |
1856 | 0 | if (w == NULL) |
1857 | 0 | return false; |
1858 | 0 | memcpy (w, string, len); |
1859 | 0 | sub->u.i.warning = w; |
1860 | 0 | } |
1861 | | |
1862 | 0 | bfd_hash_replace (&info->hash->table, |
1863 | 0 | (struct bfd_hash_entry *) h, |
1864 | 0 | (struct bfd_hash_entry *) sub); |
1865 | 0 | if (hashp != NULL) |
1866 | 0 | *hashp = sub; |
1867 | 0 | } |
1868 | 0 | break; |
1869 | 0 | } |
1870 | 0 | } |
1871 | 0 | while (cycle); |
1872 | | |
1873 | 0 | return true; |
1874 | 0 | } |
1875 | | |
1876 | | /* |
1877 | | FUNCTION |
1878 | | bfd_link_align_section |
1879 | | |
1880 | | SYNOPSIS |
1881 | | bool bfd_link_align_section (asection *, unsigned int); |
1882 | | |
1883 | | DESCRIPTION |
1884 | | Increase section alignment if the current section alignment is |
1885 | | less than the requested value. Adjust output section |
1886 | | alignment too, so that linker layout adjusts for alignment on |
1887 | | the current lang_size_sections pass. This is important for |
1888 | | lang_size_relro_segment. If the output section alignment |
1889 | | isn't adjusted, the linker will place the output section at an |
1890 | | address depending on its current alignment. When sizing the |
1891 | | output section, input sections attached transfer any increase |
1892 | | in alignment to the output section, which will affect layout |
1893 | | for the next sizing pass. Which is all well and good except |
1894 | | that lang_size_relro_segment for the current sizing pass uses |
1895 | | that possibly increased alignment with a layout that doesn't |
1896 | | suit. |
1897 | | */ |
1898 | | |
1899 | | bool |
1900 | | bfd_link_align_section (asection *sec, unsigned int align_p2) |
1901 | 0 | { |
1902 | 0 | if (align_p2 > bfd_section_alignment (sec)) |
1903 | 0 | { |
1904 | 0 | if (!bfd_set_section_alignment (sec, align_p2)) |
1905 | 0 | return false; |
1906 | 0 | asection *osec = sec->output_section; |
1907 | 0 | if (osec && align_p2 > bfd_section_alignment (osec)) |
1908 | 0 | { |
1909 | 0 | if (!bfd_set_section_alignment (osec, align_p2)) |
1910 | 0 | return false; |
1911 | 0 | } |
1912 | 0 | } |
1913 | 0 | return true; |
1914 | 0 | } |
1915 | | |
1916 | | /* Generic final link routine. */ |
1917 | | |
1918 | | bool |
1919 | | _bfd_generic_final_link (bfd *abfd, struct bfd_link_info *info) |
1920 | 0 | { |
1921 | 0 | bfd *sub; |
1922 | 0 | asection *o; |
1923 | 0 | struct bfd_link_order *p; |
1924 | 0 | size_t outsymalloc; |
1925 | 0 | struct generic_write_global_symbol_info wginfo; |
1926 | |
|
1927 | 0 | abfd->outsymbols = NULL; |
1928 | 0 | abfd->symcount = 0; |
1929 | 0 | outsymalloc = 0; |
1930 | | |
1931 | | /* Mark all sections which will be included in the output file. */ |
1932 | 0 | for (o = abfd->sections; o != NULL; o = o->next) |
1933 | 0 | for (p = o->map_head.link_order; p != NULL; p = p->next) |
1934 | 0 | if (p->type == bfd_indirect_link_order) |
1935 | 0 | p->u.indirect.section->linker_mark = true; |
1936 | | |
1937 | | /* Build the output symbol table. */ |
1938 | 0 | for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) |
1939 | 0 | if (! _bfd_generic_link_output_symbols (abfd, sub, info, &outsymalloc)) |
1940 | 0 | return false; |
1941 | | |
1942 | | /* Accumulate the global symbols. */ |
1943 | 0 | wginfo.info = info; |
1944 | 0 | wginfo.output_bfd = abfd; |
1945 | 0 | wginfo.psymalloc = &outsymalloc; |
1946 | 0 | wginfo.failed = false; |
1947 | 0 | _bfd_generic_link_hash_traverse (_bfd_generic_hash_table (info), |
1948 | 0 | _bfd_generic_link_write_global_symbol, |
1949 | 0 | &wginfo); |
1950 | 0 | if (wginfo.failed) |
1951 | 0 | return false; |
1952 | | |
1953 | | /* Make sure we have a trailing NULL pointer on OUTSYMBOLS. We |
1954 | | shouldn't really need one, since we have SYMCOUNT, but some old |
1955 | | code still expects one. */ |
1956 | 0 | if (! generic_add_output_symbol (abfd, &outsymalloc, NULL)) |
1957 | 0 | return false; |
1958 | | |
1959 | 0 | if (bfd_link_relocatable (info)) |
1960 | 0 | { |
1961 | | /* Allocate space for the output relocs for each section. */ |
1962 | 0 | for (o = abfd->sections; o != NULL; o = o->next) |
1963 | 0 | { |
1964 | 0 | o->reloc_count = 0; |
1965 | 0 | for (p = o->map_head.link_order; p != NULL; p = p->next) |
1966 | 0 | { |
1967 | 0 | if (p->type == bfd_section_reloc_link_order |
1968 | 0 | || p->type == bfd_symbol_reloc_link_order) |
1969 | 0 | ++o->reloc_count; |
1970 | 0 | else if (p->type == bfd_indirect_link_order) |
1971 | 0 | { |
1972 | 0 | asection *input_section; |
1973 | 0 | bfd *input_bfd; |
1974 | 0 | long relsize; |
1975 | 0 | arelent **relocs; |
1976 | 0 | asymbol **symbols; |
1977 | 0 | long reloc_count; |
1978 | |
|
1979 | 0 | input_section = p->u.indirect.section; |
1980 | 0 | input_bfd = input_section->owner; |
1981 | 0 | relsize = bfd_get_reloc_upper_bound (input_bfd, |
1982 | 0 | input_section); |
1983 | 0 | if (relsize < 0) |
1984 | 0 | return false; |
1985 | 0 | relocs = (arelent **) bfd_malloc (relsize); |
1986 | 0 | if (!relocs && relsize != 0) |
1987 | 0 | return false; |
1988 | 0 | symbols = _bfd_generic_link_get_symbols (input_bfd); |
1989 | 0 | reloc_count = bfd_canonicalize_reloc (input_bfd, |
1990 | 0 | input_section, |
1991 | 0 | relocs, |
1992 | 0 | symbols); |
1993 | 0 | free (relocs); |
1994 | 0 | if (reloc_count < 0) |
1995 | 0 | return false; |
1996 | 0 | BFD_ASSERT ((unsigned long) reloc_count |
1997 | 0 | == input_section->reloc_count); |
1998 | 0 | o->reloc_count += reloc_count; |
1999 | 0 | } |
2000 | 0 | } |
2001 | 0 | if (o->reloc_count > 0) |
2002 | 0 | { |
2003 | 0 | bfd_size_type amt; |
2004 | |
|
2005 | 0 | amt = o->reloc_count; |
2006 | 0 | amt *= sizeof (arelent *); |
2007 | 0 | o->orelocation = (struct reloc_cache_entry **) bfd_alloc (abfd, amt); |
2008 | 0 | if (!o->orelocation) |
2009 | 0 | return false; |
2010 | 0 | o->flags |= SEC_RELOC; |
2011 | | /* Reset the count so that it can be used as an index |
2012 | | when putting in the output relocs. */ |
2013 | 0 | o->reloc_count = 0; |
2014 | 0 | } |
2015 | 0 | } |
2016 | 0 | } |
2017 | | |
2018 | | /* Handle all the link order information for the sections. */ |
2019 | 0 | for (o = abfd->sections; o != NULL; o = o->next) |
2020 | 0 | { |
2021 | 0 | for (p = o->map_head.link_order; p != NULL; p = p->next) |
2022 | 0 | { |
2023 | 0 | switch (p->type) |
2024 | 0 | { |
2025 | 0 | case bfd_section_reloc_link_order: |
2026 | 0 | case bfd_symbol_reloc_link_order: |
2027 | 0 | if (! _bfd_generic_reloc_link_order (abfd, info, o, p)) |
2028 | 0 | return false; |
2029 | 0 | break; |
2030 | 0 | case bfd_indirect_link_order: |
2031 | 0 | if (! default_indirect_link_order (abfd, info, o, p, true)) |
2032 | 0 | return false; |
2033 | 0 | break; |
2034 | 0 | default: |
2035 | 0 | if (! _bfd_default_link_order (abfd, info, o, p)) |
2036 | 0 | return false; |
2037 | 0 | break; |
2038 | 0 | } |
2039 | 0 | } |
2040 | 0 | } |
2041 | | |
2042 | 0 | return true; |
2043 | 0 | } |
2044 | | |
2045 | | /* Add an output symbol to the output BFD. */ |
2046 | | |
2047 | | static bool |
2048 | | generic_add_output_symbol (bfd *output_bfd, size_t *psymalloc, asymbol *sym) |
2049 | 0 | { |
2050 | 0 | if (!(bfd_applicable_file_flags (output_bfd) & HAS_SYMS)) |
2051 | 0 | return true; |
2052 | | |
2053 | 0 | if (bfd_get_symcount (output_bfd) >= *psymalloc) |
2054 | 0 | { |
2055 | 0 | asymbol **newsyms; |
2056 | 0 | bfd_size_type amt; |
2057 | |
|
2058 | 0 | if (*psymalloc == 0) |
2059 | 0 | *psymalloc = 124; |
2060 | 0 | else |
2061 | 0 | *psymalloc *= 2; |
2062 | 0 | amt = *psymalloc; |
2063 | 0 | amt *= sizeof (asymbol *); |
2064 | 0 | newsyms = (asymbol **) bfd_realloc (bfd_get_outsymbols (output_bfd), amt); |
2065 | 0 | if (newsyms == NULL) |
2066 | 0 | return false; |
2067 | 0 | output_bfd->outsymbols = newsyms; |
2068 | 0 | } |
2069 | | |
2070 | 0 | output_bfd->outsymbols[output_bfd->symcount] = sym; |
2071 | 0 | if (sym != NULL) |
2072 | 0 | ++output_bfd->symcount; |
2073 | |
|
2074 | 0 | return true; |
2075 | 0 | } |
2076 | | |
2077 | | /* Handle the symbols for an input BFD. */ |
2078 | | |
2079 | | static bool |
2080 | | _bfd_generic_link_output_symbols (bfd *output_bfd, |
2081 | | bfd *input_bfd, |
2082 | | struct bfd_link_info *info, |
2083 | | size_t *psymalloc) |
2084 | 0 | { |
2085 | 0 | asymbol **sym_ptr; |
2086 | 0 | asymbol **sym_end; |
2087 | |
|
2088 | 0 | if (!bfd_generic_link_read_symbols (input_bfd)) |
2089 | 0 | return false; |
2090 | | |
2091 | | /* Create a filename symbol if we are supposed to. */ |
2092 | 0 | if (info->create_object_symbols_section != NULL) |
2093 | 0 | { |
2094 | 0 | asection *sec; |
2095 | |
|
2096 | 0 | for (sec = input_bfd->sections; sec != NULL; sec = sec->next) |
2097 | 0 | { |
2098 | 0 | if (sec->output_section == info->create_object_symbols_section) |
2099 | 0 | { |
2100 | 0 | asymbol *newsym; |
2101 | |
|
2102 | 0 | newsym = bfd_make_empty_symbol (input_bfd); |
2103 | 0 | if (!newsym) |
2104 | 0 | return false; |
2105 | 0 | newsym->name = bfd_get_filename (input_bfd); |
2106 | 0 | newsym->value = 0; |
2107 | 0 | newsym->flags = BSF_LOCAL | BSF_FILE; |
2108 | 0 | newsym->section = sec; |
2109 | |
|
2110 | 0 | if (! generic_add_output_symbol (output_bfd, psymalloc, |
2111 | 0 | newsym)) |
2112 | 0 | return false; |
2113 | | |
2114 | 0 | break; |
2115 | 0 | } |
2116 | 0 | } |
2117 | 0 | } |
2118 | | |
2119 | | /* Adjust the values of the globally visible symbols, and write out |
2120 | | local symbols. */ |
2121 | 0 | sym_ptr = _bfd_generic_link_get_symbols (input_bfd); |
2122 | 0 | sym_end = sym_ptr + _bfd_generic_link_get_symcount (input_bfd); |
2123 | 0 | for (; sym_ptr < sym_end; sym_ptr++) |
2124 | 0 | { |
2125 | 0 | asymbol *sym; |
2126 | 0 | struct generic_link_hash_entry *h; |
2127 | |
|
2128 | 0 | h = NULL; |
2129 | 0 | sym = *sym_ptr; |
2130 | 0 | if ((sym->flags & (BSF_INDIRECT |
2131 | 0 | | BSF_WARNING |
2132 | 0 | | BSF_GLOBAL |
2133 | 0 | | BSF_CONSTRUCTOR |
2134 | 0 | | BSF_WEAK)) != 0 |
2135 | 0 | || bfd_is_und_section (bfd_asymbol_section (sym)) |
2136 | 0 | || bfd_is_com_section (bfd_asymbol_section (sym)) |
2137 | 0 | || bfd_is_ind_section (bfd_asymbol_section (sym))) |
2138 | 0 | { |
2139 | 0 | if (sym->udata.p != NULL) |
2140 | 0 | h = (struct generic_link_hash_entry *) sym->udata.p; |
2141 | 0 | else if ((sym->flags & BSF_CONSTRUCTOR) != 0) |
2142 | 0 | { |
2143 | | /* This case normally means that the main linker code |
2144 | | deliberately ignored this constructor symbol. We |
2145 | | should just pass it through. This will screw up if |
2146 | | the constructor symbol is from a different, |
2147 | | non-generic, object file format, but the case will |
2148 | | only arise when linking with -r, which will probably |
2149 | | fail anyhow, since there will be no way to represent |
2150 | | the relocs in the output format being used. */ |
2151 | 0 | h = NULL; |
2152 | 0 | } |
2153 | 0 | else if (bfd_is_und_section (bfd_asymbol_section (sym))) |
2154 | 0 | h = ((struct generic_link_hash_entry *) |
2155 | 0 | bfd_wrapped_link_hash_lookup (output_bfd, info, |
2156 | 0 | bfd_asymbol_name (sym), |
2157 | 0 | false, false, true)); |
2158 | 0 | else |
2159 | 0 | h = _bfd_generic_link_hash_lookup (_bfd_generic_hash_table (info), |
2160 | 0 | bfd_asymbol_name (sym), |
2161 | 0 | false, false, true); |
2162 | |
|
2163 | 0 | if (h != NULL) |
2164 | 0 | { |
2165 | | /* Force all references to this symbol to point to |
2166 | | the same area in memory. It is possible that |
2167 | | this routine will be called with a hash table |
2168 | | other than a generic hash table, so we double |
2169 | | check that. */ |
2170 | 0 | if (info->output_bfd->xvec == input_bfd->xvec) |
2171 | 0 | { |
2172 | 0 | if (h->sym != NULL) |
2173 | 0 | *sym_ptr = sym = h->sym; |
2174 | 0 | } |
2175 | |
|
2176 | 0 | switch (h->root.type) |
2177 | 0 | { |
2178 | 0 | default: |
2179 | 0 | case bfd_link_hash_new: |
2180 | 0 | abort (); |
2181 | 0 | case bfd_link_hash_undefined: |
2182 | 0 | break; |
2183 | 0 | case bfd_link_hash_undefweak: |
2184 | 0 | sym->flags |= BSF_WEAK; |
2185 | 0 | break; |
2186 | 0 | case bfd_link_hash_indirect: |
2187 | 0 | h = (struct generic_link_hash_entry *) h->root.u.i.link; |
2188 | | /* fall through */ |
2189 | 0 | case bfd_link_hash_defined: |
2190 | 0 | sym->flags |= BSF_GLOBAL; |
2191 | 0 | sym->flags &=~ (BSF_WEAK | BSF_CONSTRUCTOR); |
2192 | 0 | sym->value = h->root.u.def.value; |
2193 | 0 | sym->section = h->root.u.def.section; |
2194 | 0 | break; |
2195 | 0 | case bfd_link_hash_defweak: |
2196 | 0 | sym->flags |= BSF_WEAK; |
2197 | 0 | sym->flags &=~ BSF_CONSTRUCTOR; |
2198 | 0 | sym->value = h->root.u.def.value; |
2199 | 0 | sym->section = h->root.u.def.section; |
2200 | 0 | break; |
2201 | 0 | case bfd_link_hash_common: |
2202 | 0 | sym->value = h->root.u.c.size; |
2203 | 0 | sym->flags |= BSF_GLOBAL; |
2204 | 0 | if (! bfd_is_com_section (sym->section)) |
2205 | 0 | { |
2206 | 0 | BFD_ASSERT (bfd_is_und_section (sym->section)); |
2207 | 0 | sym->section = bfd_com_section_ptr; |
2208 | 0 | } |
2209 | | /* We do not set the section of the symbol to |
2210 | | h->root.u.c.p->section. That value was saved so |
2211 | | that we would know where to allocate the symbol |
2212 | | if it was defined. In this case the type is |
2213 | | still bfd_link_hash_common, so we did not define |
2214 | | it, so we do not want to use that section. */ |
2215 | 0 | break; |
2216 | 0 | } |
2217 | 0 | } |
2218 | 0 | } |
2219 | | |
2220 | 0 | bool output = false; |
2221 | 0 | if ((sym->flags & BSF_KEEP) == 0 |
2222 | 0 | && (info->strip == strip_all |
2223 | 0 | || (info->strip == strip_some |
2224 | 0 | && bfd_hash_lookup (info->keep_hash, bfd_asymbol_name (sym), |
2225 | 0 | false, false) == NULL))) |
2226 | 0 | ; |
2227 | | /* If this symbol is in a section which is not being included |
2228 | | in the output file, then we don't want to output the |
2229 | | symbol. */ |
2230 | 0 | else if (!bfd_is_abs_section (sym->section) |
2231 | 0 | && bfd_section_removed_from_list (output_bfd, |
2232 | 0 | sym->section->output_section)) |
2233 | 0 | ; |
2234 | 0 | else if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0) |
2235 | 0 | { |
2236 | | /* If this symbol is marked as occurring now, rather |
2237 | | than at the end, output it now. This is used for |
2238 | | COFF C_EXT FCN symbols. FIXME: There must be a |
2239 | | better way. */ |
2240 | 0 | if (bfd_asymbol_bfd (sym) == input_bfd |
2241 | 0 | && (sym->flags & BSF_NOT_AT_END) != 0) |
2242 | 0 | output = true; |
2243 | 0 | } |
2244 | 0 | else if ((sym->flags & BSF_KEEP) != 0) |
2245 | 0 | output = true; |
2246 | 0 | else if (bfd_is_ind_section (sym->section)) |
2247 | 0 | ; |
2248 | 0 | else if ((sym->flags & BSF_DEBUGGING) != 0) |
2249 | 0 | { |
2250 | 0 | if (info->strip == strip_none) |
2251 | 0 | output = true; |
2252 | 0 | } |
2253 | 0 | else if (bfd_is_und_section (sym->section) |
2254 | 0 | || bfd_is_com_section (sym->section)) |
2255 | 0 | ; |
2256 | 0 | else if ((sym->flags & BSF_LOCAL) != 0) |
2257 | 0 | { |
2258 | 0 | if ((sym->flags & BSF_WARNING) == 0) |
2259 | 0 | { |
2260 | 0 | switch (info->discard) |
2261 | 0 | { |
2262 | 0 | default: |
2263 | 0 | case discard_all: |
2264 | 0 | break; |
2265 | 0 | case discard_sec_merge: |
2266 | 0 | output = true; |
2267 | 0 | if (bfd_link_relocatable (info) |
2268 | 0 | || ! (sym->section->flags & SEC_MERGE)) |
2269 | 0 | break; |
2270 | | /* FALLTHROUGH */ |
2271 | 0 | case discard_l: |
2272 | 0 | if (!bfd_is_local_label (input_bfd, sym)) |
2273 | 0 | output = true; |
2274 | 0 | break; |
2275 | 0 | case discard_none: |
2276 | 0 | output = true; |
2277 | 0 | break; |
2278 | 0 | } |
2279 | 0 | } |
2280 | 0 | } |
2281 | 0 | else if ((sym->flags & BSF_CONSTRUCTOR)) |
2282 | 0 | { |
2283 | 0 | if (info->strip != strip_all) |
2284 | 0 | output = true; |
2285 | 0 | } |
2286 | 0 | else if (sym->flags == 0) |
2287 | | /* LTO doesn't set symbol information. We get here with the |
2288 | | generic linker for a symbol that was "common" but no longer |
2289 | | needs to be global. We also get here on fuzzed ELF objects |
2290 | | with bogus symbol type and binding. */ |
2291 | 0 | ; |
2292 | 0 | else |
2293 | 0 | BFD_FAIL (); |
2294 | | |
2295 | 0 | if (output) |
2296 | 0 | { |
2297 | 0 | if (! generic_add_output_symbol (output_bfd, psymalloc, sym)) |
2298 | 0 | return false; |
2299 | 0 | if (h != NULL) |
2300 | 0 | h->written = true; |
2301 | 0 | } |
2302 | 0 | } |
2303 | | |
2304 | 0 | return true; |
2305 | 0 | } |
2306 | | |
2307 | | /* Set the section and value of a generic BFD symbol based on a linker |
2308 | | hash table entry. */ |
2309 | | |
2310 | | static void |
2311 | | set_symbol_from_hash (asymbol *sym, struct bfd_link_hash_entry *h) |
2312 | 0 | { |
2313 | 0 | switch (h->type) |
2314 | 0 | { |
2315 | 0 | default: |
2316 | 0 | abort (); |
2317 | 0 | break; |
2318 | 0 | case bfd_link_hash_new: |
2319 | | /* This can happen when a constructor symbol is seen but we are |
2320 | | not building constructors. */ |
2321 | 0 | if (sym->section != NULL) |
2322 | 0 | { |
2323 | 0 | BFD_ASSERT ((sym->flags & BSF_CONSTRUCTOR) != 0); |
2324 | 0 | } |
2325 | 0 | else |
2326 | 0 | { |
2327 | 0 | sym->flags |= BSF_CONSTRUCTOR; |
2328 | 0 | sym->section = bfd_abs_section_ptr; |
2329 | 0 | sym->value = 0; |
2330 | 0 | } |
2331 | 0 | break; |
2332 | 0 | case bfd_link_hash_undefined: |
2333 | 0 | sym->section = bfd_und_section_ptr; |
2334 | 0 | sym->value = 0; |
2335 | 0 | break; |
2336 | 0 | case bfd_link_hash_undefweak: |
2337 | 0 | sym->section = bfd_und_section_ptr; |
2338 | 0 | sym->value = 0; |
2339 | 0 | sym->flags |= BSF_WEAK; |
2340 | 0 | break; |
2341 | 0 | case bfd_link_hash_defined: |
2342 | 0 | sym->section = h->u.def.section; |
2343 | 0 | sym->value = h->u.def.value; |
2344 | 0 | break; |
2345 | 0 | case bfd_link_hash_defweak: |
2346 | 0 | sym->flags |= BSF_WEAK; |
2347 | 0 | sym->section = h->u.def.section; |
2348 | 0 | sym->value = h->u.def.value; |
2349 | 0 | break; |
2350 | 0 | case bfd_link_hash_common: |
2351 | 0 | sym->value = h->u.c.size; |
2352 | 0 | if (sym->section == NULL) |
2353 | 0 | sym->section = bfd_com_section_ptr; |
2354 | 0 | else if (! bfd_is_com_section (sym->section)) |
2355 | 0 | { |
2356 | 0 | BFD_ASSERT (bfd_is_und_section (sym->section)); |
2357 | 0 | sym->section = bfd_com_section_ptr; |
2358 | 0 | } |
2359 | | /* Do not set the section; see _bfd_generic_link_output_symbols. */ |
2360 | 0 | break; |
2361 | 0 | case bfd_link_hash_indirect: |
2362 | 0 | case bfd_link_hash_warning: |
2363 | | /* FIXME: What should we do here? */ |
2364 | 0 | break; |
2365 | 0 | } |
2366 | 0 | } |
2367 | | |
2368 | | /* Write out a global symbol, if it hasn't already been written out. |
2369 | | This is called for each symbol in the hash table. */ |
2370 | | |
2371 | | static bool |
2372 | | _bfd_generic_link_write_global_symbol (struct generic_link_hash_entry *h, |
2373 | | void *data) |
2374 | 0 | { |
2375 | 0 | struct generic_write_global_symbol_info *wginfo = data; |
2376 | 0 | asymbol *sym; |
2377 | |
|
2378 | 0 | if (h->written) |
2379 | 0 | return true; |
2380 | | |
2381 | 0 | h->written = true; |
2382 | |
|
2383 | 0 | if (wginfo->info->strip == strip_all |
2384 | 0 | || (wginfo->info->strip == strip_some |
2385 | 0 | && bfd_hash_lookup (wginfo->info->keep_hash, h->root.root.string, |
2386 | 0 | false, false) == NULL)) |
2387 | 0 | return true; |
2388 | | |
2389 | 0 | if (h->sym != NULL) |
2390 | 0 | sym = h->sym; |
2391 | 0 | else |
2392 | 0 | { |
2393 | 0 | sym = bfd_make_empty_symbol (wginfo->output_bfd); |
2394 | 0 | if (!sym) |
2395 | 0 | { |
2396 | 0 | wginfo->failed = true; |
2397 | 0 | return false; |
2398 | 0 | } |
2399 | 0 | sym->name = h->root.root.string; |
2400 | 0 | sym->flags = 0; |
2401 | 0 | } |
2402 | | |
2403 | 0 | set_symbol_from_hash (sym, &h->root); |
2404 | |
|
2405 | 0 | sym->flags |= BSF_GLOBAL; |
2406 | |
|
2407 | 0 | if (! generic_add_output_symbol (wginfo->output_bfd, wginfo->psymalloc, |
2408 | 0 | sym)) |
2409 | 0 | { |
2410 | 0 | wginfo->failed = true; |
2411 | 0 | return false; |
2412 | 0 | } |
2413 | | |
2414 | 0 | return true; |
2415 | 0 | } |
2416 | | |
2417 | | /* Create a relocation. */ |
2418 | | |
2419 | | bool |
2420 | | _bfd_generic_reloc_link_order (bfd *abfd, |
2421 | | struct bfd_link_info *info, |
2422 | | asection *sec, |
2423 | | struct bfd_link_order *link_order) |
2424 | 0 | { |
2425 | 0 | arelent *r; |
2426 | |
|
2427 | 0 | if (! bfd_link_relocatable (info)) |
2428 | 0 | abort (); |
2429 | 0 | if (sec->orelocation == NULL) |
2430 | 0 | abort (); |
2431 | | |
2432 | 0 | r = (arelent *) bfd_alloc (abfd, sizeof (arelent)); |
2433 | 0 | if (r == NULL) |
2434 | 0 | return false; |
2435 | | |
2436 | 0 | r->address = link_order->offset; |
2437 | 0 | r->howto = bfd_reloc_type_lookup (abfd, link_order->u.reloc.p->reloc); |
2438 | 0 | if (r->howto == 0) |
2439 | 0 | { |
2440 | 0 | bfd_set_error (bfd_error_bad_value); |
2441 | 0 | return false; |
2442 | 0 | } |
2443 | | |
2444 | | /* Get the symbol to use for the relocation. */ |
2445 | 0 | if (link_order->type == bfd_section_reloc_link_order) |
2446 | 0 | r->sym_ptr_ptr = &link_order->u.reloc.p->u.section->symbol; |
2447 | 0 | else |
2448 | 0 | { |
2449 | 0 | struct generic_link_hash_entry *h; |
2450 | |
|
2451 | 0 | h = ((struct generic_link_hash_entry *) |
2452 | 0 | bfd_wrapped_link_hash_lookup (abfd, info, |
2453 | 0 | link_order->u.reloc.p->u.name, |
2454 | 0 | false, false, true)); |
2455 | 0 | if (h == NULL |
2456 | 0 | || ! h->written) |
2457 | 0 | { |
2458 | 0 | (*info->callbacks->unattached_reloc) |
2459 | 0 | (info, link_order->u.reloc.p->u.name, NULL, NULL, 0); |
2460 | 0 | bfd_set_error (bfd_error_bad_value); |
2461 | 0 | return false; |
2462 | 0 | } |
2463 | 0 | r->sym_ptr_ptr = &h->sym; |
2464 | 0 | } |
2465 | | |
2466 | | /* If this is an inplace reloc, write the addend to the object file. |
2467 | | Otherwise, store it in the reloc addend. */ |
2468 | 0 | if (! r->howto->partial_inplace) |
2469 | 0 | r->addend = link_order->u.reloc.p->addend; |
2470 | 0 | else |
2471 | 0 | { |
2472 | 0 | bfd_size_type size; |
2473 | 0 | bfd_reloc_status_type rstat; |
2474 | 0 | bfd_byte *buf; |
2475 | 0 | bool ok; |
2476 | 0 | file_ptr loc; |
2477 | |
|
2478 | 0 | size = bfd_get_reloc_size (r->howto); |
2479 | 0 | buf = (bfd_byte *) bfd_zmalloc (size); |
2480 | 0 | if (buf == NULL && size != 0) |
2481 | 0 | return false; |
2482 | 0 | rstat = _bfd_relocate_contents (r->howto, abfd, |
2483 | 0 | (bfd_vma) link_order->u.reloc.p->addend, |
2484 | 0 | buf); |
2485 | 0 | switch (rstat) |
2486 | 0 | { |
2487 | 0 | case bfd_reloc_ok: |
2488 | 0 | break; |
2489 | 0 | default: |
2490 | 0 | case bfd_reloc_outofrange: |
2491 | 0 | abort (); |
2492 | 0 | case bfd_reloc_overflow: |
2493 | 0 | (*info->callbacks->reloc_overflow) |
2494 | 0 | (info, NULL, |
2495 | 0 | (link_order->type == bfd_section_reloc_link_order |
2496 | 0 | ? bfd_section_name (link_order->u.reloc.p->u.section) |
2497 | 0 | : link_order->u.reloc.p->u.name), |
2498 | 0 | r->howto->name, link_order->u.reloc.p->addend, |
2499 | 0 | NULL, NULL, 0); |
2500 | 0 | break; |
2501 | 0 | } |
2502 | 0 | loc = link_order->offset * bfd_octets_per_byte (abfd, sec); |
2503 | 0 | ok = bfd_set_section_contents (abfd, sec, buf, loc, size); |
2504 | 0 | free (buf); |
2505 | 0 | if (! ok) |
2506 | 0 | return false; |
2507 | | |
2508 | 0 | r->addend = 0; |
2509 | 0 | } |
2510 | | |
2511 | 0 | sec->orelocation[sec->reloc_count] = r; |
2512 | 0 | ++sec->reloc_count; |
2513 | |
|
2514 | 0 | return true; |
2515 | 0 | } |
2516 | | |
2517 | | /* Allocate a new link_order for a section. */ |
2518 | | |
2519 | | struct bfd_link_order * |
2520 | | bfd_new_link_order (bfd *abfd, asection *section) |
2521 | 0 | { |
2522 | 0 | size_t amt = sizeof (struct bfd_link_order); |
2523 | 0 | struct bfd_link_order *new_lo; |
2524 | |
|
2525 | 0 | new_lo = (struct bfd_link_order *) bfd_zalloc (abfd, amt); |
2526 | 0 | if (!new_lo) |
2527 | 0 | return NULL; |
2528 | | |
2529 | 0 | new_lo->type = bfd_undefined_link_order; |
2530 | |
|
2531 | 0 | if (section->map_tail.link_order != NULL) |
2532 | 0 | section->map_tail.link_order->next = new_lo; |
2533 | 0 | else |
2534 | 0 | section->map_head.link_order = new_lo; |
2535 | 0 | section->map_tail.link_order = new_lo; |
2536 | |
|
2537 | 0 | return new_lo; |
2538 | 0 | } |
2539 | | |
2540 | | /* Default link order processing routine. Note that we can not handle |
2541 | | the reloc_link_order types here, since they depend upon the details |
2542 | | of how the particular backends generates relocs. */ |
2543 | | |
2544 | | bool |
2545 | | _bfd_default_link_order (bfd *abfd, |
2546 | | struct bfd_link_info *info, |
2547 | | asection *sec, |
2548 | | struct bfd_link_order *link_order) |
2549 | 0 | { |
2550 | 0 | switch (link_order->type) |
2551 | 0 | { |
2552 | 0 | case bfd_undefined_link_order: |
2553 | 0 | case bfd_section_reloc_link_order: |
2554 | 0 | case bfd_symbol_reloc_link_order: |
2555 | 0 | default: |
2556 | 0 | abort (); |
2557 | 0 | case bfd_indirect_link_order: |
2558 | 0 | return default_indirect_link_order (abfd, info, sec, link_order, |
2559 | 0 | false); |
2560 | 0 | case bfd_data_link_order: |
2561 | 0 | return default_data_link_order (abfd, info, sec, link_order); |
2562 | 0 | } |
2563 | 0 | } |
2564 | | |
2565 | | /* Default routine to handle a bfd_data_link_order. */ |
2566 | | |
2567 | | static bool |
2568 | | default_data_link_order (bfd *abfd, |
2569 | | struct bfd_link_info *info, |
2570 | | asection *sec, |
2571 | | struct bfd_link_order *link_order) |
2572 | 0 | { |
2573 | 0 | bfd_size_type size; |
2574 | 0 | size_t fill_size; |
2575 | 0 | bfd_byte *fill; |
2576 | 0 | file_ptr loc; |
2577 | 0 | bool result; |
2578 | |
|
2579 | 0 | BFD_ASSERT ((sec->flags & SEC_HAS_CONTENTS) != 0); |
2580 | |
|
2581 | 0 | size = link_order->size; |
2582 | 0 | if (size == 0) |
2583 | 0 | return true; |
2584 | | |
2585 | 0 | fill = link_order->u.data.contents; |
2586 | 0 | fill_size = link_order->u.data.size; |
2587 | 0 | if (fill_size == 0) |
2588 | 0 | { |
2589 | 0 | fill = abfd->arch_info->fill (size, info->big_endian, |
2590 | 0 | (sec->flags & SEC_CODE) != 0); |
2591 | 0 | if (fill == NULL) |
2592 | 0 | return false; |
2593 | 0 | } |
2594 | 0 | else if (fill_size < size) |
2595 | 0 | { |
2596 | 0 | bfd_byte *p; |
2597 | 0 | fill = (bfd_byte *) bfd_malloc (size); |
2598 | 0 | if (fill == NULL) |
2599 | 0 | return false; |
2600 | 0 | p = fill; |
2601 | 0 | if (fill_size == 1) |
2602 | 0 | memset (p, (int) link_order->u.data.contents[0], (size_t) size); |
2603 | 0 | else |
2604 | 0 | { |
2605 | 0 | do |
2606 | 0 | { |
2607 | 0 | memcpy (p, link_order->u.data.contents, fill_size); |
2608 | 0 | p += fill_size; |
2609 | 0 | size -= fill_size; |
2610 | 0 | } |
2611 | 0 | while (size >= fill_size); |
2612 | 0 | if (size != 0) |
2613 | 0 | memcpy (p, link_order->u.data.contents, (size_t) size); |
2614 | 0 | size = link_order->size; |
2615 | 0 | } |
2616 | 0 | } |
2617 | | |
2618 | 0 | loc = link_order->offset * bfd_octets_per_byte (abfd, sec); |
2619 | 0 | result = bfd_set_section_contents (abfd, sec, fill, loc, size); |
2620 | |
|
2621 | 0 | if (fill != link_order->u.data.contents) |
2622 | 0 | free (fill); |
2623 | 0 | return result; |
2624 | 0 | } |
2625 | | |
2626 | | /* Default routine to handle a bfd_indirect_link_order. */ |
2627 | | |
2628 | | static bool |
2629 | | default_indirect_link_order (bfd *output_bfd, |
2630 | | struct bfd_link_info *info, |
2631 | | asection *output_section, |
2632 | | struct bfd_link_order *link_order, |
2633 | | bool generic_linker) |
2634 | 0 | { |
2635 | 0 | asection *input_section; |
2636 | 0 | bfd *input_bfd; |
2637 | 0 | bfd_byte *alloced = NULL; |
2638 | 0 | bfd_byte *new_contents; |
2639 | 0 | file_ptr loc; |
2640 | |
|
2641 | 0 | BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0); |
2642 | |
|
2643 | 0 | input_section = link_order->u.indirect.section; |
2644 | 0 | input_bfd = input_section->owner; |
2645 | 0 | if (input_section->size == 0) |
2646 | 0 | return true; |
2647 | | |
2648 | 0 | BFD_ASSERT (input_section->output_section == output_section); |
2649 | 0 | BFD_ASSERT (input_section->output_offset == link_order->offset); |
2650 | 0 | BFD_ASSERT (input_section->size == link_order->size); |
2651 | |
|
2652 | 0 | if (bfd_link_relocatable (info) |
2653 | 0 | && input_section->reloc_count > 0 |
2654 | 0 | && output_section->orelocation == NULL) |
2655 | 0 | { |
2656 | | /* Space has not been allocated for the output relocations. |
2657 | | This can happen when we are called by a specific backend |
2658 | | because somebody is attempting to link together different |
2659 | | types of object files. Handling this case correctly is |
2660 | | difficult, and sometimes impossible. */ |
2661 | 0 | _bfd_error_handler |
2662 | | /* xgettext:c-format */ |
2663 | 0 | (_("attempt to do relocatable link with %s input and %s output"), |
2664 | 0 | bfd_get_target (input_bfd), bfd_get_target (output_bfd)); |
2665 | 0 | bfd_set_error (bfd_error_wrong_format); |
2666 | 0 | return false; |
2667 | 0 | } |
2668 | | |
2669 | 0 | if (! generic_linker) |
2670 | 0 | { |
2671 | 0 | asymbol **sympp; |
2672 | 0 | asymbol **symppend; |
2673 | | |
2674 | | /* Get the canonical symbols. The generic linker will always |
2675 | | have retrieved them by this point, but we are being called by |
2676 | | a specific linker, presumably because we are linking |
2677 | | different types of object files together. */ |
2678 | 0 | if (!bfd_generic_link_read_symbols (input_bfd)) |
2679 | 0 | return false; |
2680 | | |
2681 | | /* Since we have been called by a specific linker, rather than |
2682 | | the generic linker, the values of the symbols will not be |
2683 | | right. They will be the values as seen in the input file, |
2684 | | not the values of the final link. We need to fix them up |
2685 | | before we can relocate the section. */ |
2686 | 0 | sympp = _bfd_generic_link_get_symbols (input_bfd); |
2687 | 0 | symppend = sympp + _bfd_generic_link_get_symcount (input_bfd); |
2688 | 0 | for (; sympp < symppend; sympp++) |
2689 | 0 | { |
2690 | 0 | asymbol *sym; |
2691 | 0 | struct bfd_link_hash_entry *h; |
2692 | |
|
2693 | 0 | sym = *sympp; |
2694 | |
|
2695 | 0 | if ((sym->flags & (BSF_INDIRECT |
2696 | 0 | | BSF_WARNING |
2697 | 0 | | BSF_GLOBAL |
2698 | 0 | | BSF_CONSTRUCTOR |
2699 | 0 | | BSF_WEAK)) != 0 |
2700 | 0 | || bfd_is_und_section (bfd_asymbol_section (sym)) |
2701 | 0 | || bfd_is_com_section (bfd_asymbol_section (sym)) |
2702 | 0 | || bfd_is_ind_section (bfd_asymbol_section (sym))) |
2703 | 0 | { |
2704 | | /* sym->udata may have been set by |
2705 | | generic_link_add_symbol_list. */ |
2706 | 0 | if (sym->udata.p != NULL) |
2707 | 0 | h = (struct bfd_link_hash_entry *) sym->udata.p; |
2708 | 0 | else if (bfd_is_und_section (bfd_asymbol_section (sym))) |
2709 | 0 | h = bfd_wrapped_link_hash_lookup (output_bfd, info, |
2710 | 0 | bfd_asymbol_name (sym), |
2711 | 0 | false, false, true); |
2712 | 0 | else |
2713 | 0 | h = bfd_link_hash_lookup (info->hash, |
2714 | 0 | bfd_asymbol_name (sym), |
2715 | 0 | false, false, true); |
2716 | 0 | if (h != NULL) |
2717 | 0 | set_symbol_from_hash (sym, h); |
2718 | 0 | } |
2719 | 0 | } |
2720 | 0 | } |
2721 | | |
2722 | 0 | if ((output_section->flags & (SEC_GROUP | SEC_LINKER_CREATED)) == SEC_GROUP |
2723 | 0 | && input_section->size != 0) |
2724 | 0 | { |
2725 | | /* Group section contents are set by bfd_elf_set_group_contents. */ |
2726 | 0 | if (!output_bfd->output_has_begun) |
2727 | 0 | { |
2728 | | /* FIXME: This hack ensures bfd_elf_set_group_contents is called. */ |
2729 | 0 | if (!bfd_set_section_contents (output_bfd, output_section, "", 0, 1)) |
2730 | 0 | goto error_return; |
2731 | 0 | } |
2732 | 0 | new_contents = output_section->contents; |
2733 | 0 | BFD_ASSERT (new_contents != NULL); |
2734 | 0 | BFD_ASSERT (input_section->output_offset == 0); |
2735 | 0 | } |
2736 | 0 | else |
2737 | 0 | { |
2738 | | /* Get and relocate the section contents. */ |
2739 | 0 | new_contents = (bfd_get_relocated_section_contents |
2740 | 0 | (output_bfd, info, link_order, NULL, |
2741 | 0 | bfd_link_relocatable (info), |
2742 | 0 | _bfd_generic_link_get_symbols (input_bfd))); |
2743 | 0 | alloced = new_contents; |
2744 | 0 | if (!new_contents) |
2745 | 0 | goto error_return; |
2746 | 0 | } |
2747 | | |
2748 | | /* Output the section contents. */ |
2749 | 0 | loc = (input_section->output_offset |
2750 | 0 | * bfd_octets_per_byte (output_bfd, output_section)); |
2751 | 0 | if (! bfd_set_section_contents (output_bfd, output_section, |
2752 | 0 | new_contents, loc, input_section->size)) |
2753 | 0 | goto error_return; |
2754 | | |
2755 | 0 | free (alloced); |
2756 | 0 | return true; |
2757 | | |
2758 | 0 | error_return: |
2759 | 0 | free (alloced); |
2760 | 0 | return false; |
2761 | 0 | } |
2762 | | |
2763 | | /* A little routine to count the number of relocs in a link_order |
2764 | | list. */ |
2765 | | |
2766 | | unsigned int |
2767 | | _bfd_count_link_order_relocs (struct bfd_link_order *link_order) |
2768 | 0 | { |
2769 | 0 | register unsigned int c; |
2770 | 0 | register struct bfd_link_order *l; |
2771 | |
|
2772 | 0 | c = 0; |
2773 | 0 | for (l = link_order; l != NULL; l = l->next) |
2774 | 0 | { |
2775 | 0 | if (l->type == bfd_section_reloc_link_order |
2776 | 0 | || l->type == bfd_symbol_reloc_link_order) |
2777 | 0 | ++c; |
2778 | 0 | } |
2779 | |
|
2780 | 0 | return c; |
2781 | 0 | } |
2782 | | |
2783 | | /* |
2784 | | FUNCTION |
2785 | | bfd_link_split_section |
2786 | | |
2787 | | SYNOPSIS |
2788 | | bool bfd_link_split_section (bfd *abfd, asection *sec); |
2789 | | |
2790 | | DESCRIPTION |
2791 | | Return nonzero if @var{sec} should be split during a |
2792 | | reloceatable or final link. |
2793 | | |
2794 | | .#define bfd_link_split_section(abfd, sec) \ |
2795 | | . BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec)) |
2796 | | . |
2797 | | |
2798 | | */ |
2799 | | |
2800 | | bool |
2801 | | _bfd_generic_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, |
2802 | | asection *sec ATTRIBUTE_UNUSED) |
2803 | 0 | { |
2804 | 0 | return false; |
2805 | 0 | } |
2806 | | |
2807 | | /* |
2808 | | FUNCTION |
2809 | | bfd_section_already_linked |
2810 | | |
2811 | | SYNOPSIS |
2812 | | bool bfd_section_already_linked (bfd *abfd, |
2813 | | asection *sec, |
2814 | | struct bfd_link_info *info); |
2815 | | |
2816 | | DESCRIPTION |
2817 | | Check if @var{data} has been already linked during a reloceatable |
2818 | | or final link. Return TRUE if it has. |
2819 | | |
2820 | | .#define bfd_section_already_linked(abfd, sec, info) \ |
2821 | | . BFD_SEND (abfd, _section_already_linked, (abfd, sec, info)) |
2822 | | . |
2823 | | |
2824 | | */ |
2825 | | |
2826 | | /* Sections marked with the SEC_LINK_ONCE flag should only be linked |
2827 | | once into the output. This routine checks each section, and |
2828 | | arrange to discard it if a section of the same name has already |
2829 | | been linked. This code assumes that all relevant sections have the |
2830 | | SEC_LINK_ONCE flag set; that is, it does not depend solely upon the |
2831 | | section name. bfd_section_already_linked is called via |
2832 | | bfd_map_over_sections. */ |
2833 | | |
2834 | | /* The hash table. */ |
2835 | | |
2836 | | static struct bfd_hash_table _bfd_section_already_linked_table; |
2837 | | |
2838 | | /* Support routines for the hash table used by section_already_linked, |
2839 | | initialize the table, traverse, lookup, fill in an entry and remove |
2840 | | the table. */ |
2841 | | |
2842 | | void |
2843 | | bfd_section_already_linked_table_traverse |
2844 | | (bool (*func) (struct bfd_section_already_linked_hash_entry *, void *), |
2845 | | void *info) |
2846 | 0 | { |
2847 | 0 | bfd_hash_traverse (&_bfd_section_already_linked_table, |
2848 | 0 | (bool (*) (struct bfd_hash_entry *, void *)) func, |
2849 | 0 | info); |
2850 | 0 | } |
2851 | | |
2852 | | struct bfd_section_already_linked_hash_entry * |
2853 | | bfd_section_already_linked_table_lookup (const char *name) |
2854 | 0 | { |
2855 | 0 | return ((struct bfd_section_already_linked_hash_entry *) |
2856 | 0 | bfd_hash_lookup (&_bfd_section_already_linked_table, name, |
2857 | 0 | true, false)); |
2858 | 0 | } |
2859 | | |
2860 | | bool |
2861 | | bfd_section_already_linked_table_insert |
2862 | | (struct bfd_section_already_linked_hash_entry *already_linked_list, |
2863 | | asection *sec) |
2864 | 0 | { |
2865 | 0 | struct bfd_section_already_linked *l; |
2866 | | |
2867 | | /* Allocate the memory from the same obstack as the hash table is |
2868 | | kept in. */ |
2869 | 0 | l = (struct bfd_section_already_linked *) |
2870 | 0 | bfd_hash_allocate (&_bfd_section_already_linked_table, sizeof *l); |
2871 | 0 | if (l == NULL) |
2872 | 0 | return false; |
2873 | 0 | l->sec = sec; |
2874 | 0 | l->next = already_linked_list->entry; |
2875 | 0 | already_linked_list->entry = l; |
2876 | 0 | return true; |
2877 | 0 | } |
2878 | | |
2879 | | static struct bfd_hash_entry * |
2880 | | already_linked_newfunc (struct bfd_hash_entry *entry ATTRIBUTE_UNUSED, |
2881 | | struct bfd_hash_table *table, |
2882 | | const char *string ATTRIBUTE_UNUSED) |
2883 | 0 | { |
2884 | 0 | struct bfd_section_already_linked_hash_entry *ret = |
2885 | 0 | (struct bfd_section_already_linked_hash_entry *) |
2886 | 0 | bfd_hash_allocate (table, sizeof *ret); |
2887 | |
|
2888 | 0 | if (ret == NULL) |
2889 | 0 | return NULL; |
2890 | | |
2891 | 0 | ret->entry = NULL; |
2892 | |
|
2893 | 0 | return &ret->root; |
2894 | 0 | } |
2895 | | |
2896 | | bool |
2897 | | bfd_section_already_linked_table_init (void) |
2898 | 0 | { |
2899 | 0 | return bfd_hash_table_init_n (&_bfd_section_already_linked_table, |
2900 | 0 | already_linked_newfunc, |
2901 | 0 | sizeof (struct bfd_section_already_linked_hash_entry), |
2902 | 0 | 42); |
2903 | 0 | } |
2904 | | |
2905 | | void |
2906 | | bfd_section_already_linked_table_free (void) |
2907 | 0 | { |
2908 | 0 | bfd_hash_table_free (&_bfd_section_already_linked_table); |
2909 | 0 | } |
2910 | | |
2911 | | /* Report warnings as appropriate for duplicate section SEC. |
2912 | | Return FALSE if we decide to keep SEC after all. */ |
2913 | | |
2914 | | bool |
2915 | | _bfd_handle_already_linked (asection *sec, |
2916 | | struct bfd_section_already_linked *l, |
2917 | | struct bfd_link_info *info) |
2918 | 0 | { |
2919 | 0 | switch (sec->flags & SEC_LINK_DUPLICATES) |
2920 | 0 | { |
2921 | 0 | default: |
2922 | 0 | abort (); |
2923 | | |
2924 | 0 | case SEC_LINK_DUPLICATES_DISCARD: |
2925 | | /* If we found an LTO IR match for this comdat group on |
2926 | | the first pass, replace it with the LTO output on the |
2927 | | second pass. We can't simply choose real object |
2928 | | files over IR because the first pass may contain a |
2929 | | mix of LTO and normal objects and we must keep the |
2930 | | first match, be it IR or real. */ |
2931 | 0 | if (sec->owner->lto_output |
2932 | 0 | && (l->sec->owner->flags & BFD_PLUGIN) != 0) |
2933 | 0 | { |
2934 | 0 | l->sec = sec; |
2935 | 0 | return false; |
2936 | 0 | } |
2937 | 0 | break; |
2938 | | |
2939 | 0 | case SEC_LINK_DUPLICATES_ONE_ONLY: |
2940 | 0 | info->callbacks->einfo |
2941 | | /* xgettext:c-format */ |
2942 | 0 | (_("%pB: ignoring duplicate section `%pA'\n"), |
2943 | 0 | sec->owner, sec); |
2944 | 0 | break; |
2945 | | |
2946 | 0 | case SEC_LINK_DUPLICATES_SAME_SIZE: |
2947 | 0 | if ((l->sec->owner->flags & BFD_PLUGIN) != 0) |
2948 | 0 | ; |
2949 | 0 | else if (sec->size != l->sec->size) |
2950 | 0 | info->callbacks->einfo |
2951 | | /* xgettext:c-format */ |
2952 | 0 | (_("%pB: duplicate section `%pA' has different size\n"), |
2953 | 0 | sec->owner, sec); |
2954 | 0 | break; |
2955 | | |
2956 | 0 | case SEC_LINK_DUPLICATES_SAME_CONTENTS: |
2957 | 0 | if ((l->sec->owner->flags & BFD_PLUGIN) != 0) |
2958 | 0 | ; |
2959 | 0 | else if (sec->size != l->sec->size) |
2960 | 0 | info->callbacks->einfo |
2961 | | /* xgettext:c-format */ |
2962 | 0 | (_("%pB: duplicate section `%pA' has different size\n"), |
2963 | 0 | sec->owner, sec); |
2964 | 0 | else if (sec->size != 0) |
2965 | 0 | { |
2966 | 0 | bfd_byte *sec_contents, *l_sec_contents; |
2967 | |
|
2968 | 0 | if ((sec->flags & SEC_HAS_CONTENTS) == 0 |
2969 | 0 | && (l->sec->flags & SEC_HAS_CONTENTS) == 0) |
2970 | 0 | ; |
2971 | 0 | else if ((sec->flags & SEC_HAS_CONTENTS) == 0 |
2972 | 0 | || !bfd_malloc_and_get_section (sec->owner, sec, |
2973 | 0 | &sec_contents)) |
2974 | 0 | info->callbacks->einfo |
2975 | | /* xgettext:c-format */ |
2976 | 0 | (_("%pB: could not read contents of section `%pA'\n"), |
2977 | 0 | sec->owner, sec); |
2978 | 0 | else if ((l->sec->flags & SEC_HAS_CONTENTS) == 0 |
2979 | 0 | || !bfd_malloc_and_get_section (l->sec->owner, l->sec, |
2980 | 0 | &l_sec_contents)) |
2981 | 0 | { |
2982 | 0 | info->callbacks->einfo |
2983 | | /* xgettext:c-format */ |
2984 | 0 | (_("%pB: could not read contents of section `%pA'\n"), |
2985 | 0 | l->sec->owner, l->sec); |
2986 | 0 | free (sec_contents); |
2987 | 0 | } |
2988 | 0 | else |
2989 | 0 | { |
2990 | 0 | if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) |
2991 | 0 | info->callbacks->einfo |
2992 | | /* xgettext:c-format */ |
2993 | 0 | (_("%pB: duplicate section `%pA' has different contents\n"), |
2994 | 0 | sec->owner, sec); |
2995 | 0 | free (l_sec_contents); |
2996 | 0 | free (sec_contents); |
2997 | 0 | } |
2998 | 0 | } |
2999 | 0 | break; |
3000 | 0 | } |
3001 | | |
3002 | | /* Set the output_section field so that lang_add_section |
3003 | | does not create a lang_input_section structure for this |
3004 | | section. Since there might be a symbol in the section |
3005 | | being discarded, we must retain a pointer to the section |
3006 | | which we are really going to use. */ |
3007 | 0 | sec->output_section = bfd_abs_section_ptr; |
3008 | 0 | sec->kept_section = l->sec; |
3009 | 0 | return true; |
3010 | 0 | } |
3011 | | |
3012 | | /* This is used on non-ELF inputs. */ |
3013 | | |
3014 | | bool |
3015 | | _bfd_generic_section_already_linked (bfd *abfd ATTRIBUTE_UNUSED, |
3016 | | asection *sec, |
3017 | | struct bfd_link_info *info) |
3018 | 0 | { |
3019 | 0 | const char *name; |
3020 | 0 | struct bfd_section_already_linked *l; |
3021 | 0 | struct bfd_section_already_linked_hash_entry *already_linked_list; |
3022 | |
|
3023 | 0 | if ((sec->flags & SEC_LINK_ONCE) == 0) |
3024 | 0 | return false; |
3025 | | |
3026 | | /* The generic linker doesn't handle section groups. */ |
3027 | 0 | if ((sec->flags & SEC_GROUP) != 0) |
3028 | 0 | return false; |
3029 | | |
3030 | | /* FIXME: When doing a relocatable link, we may have trouble |
3031 | | copying relocations in other sections that refer to local symbols |
3032 | | in the section being discarded. Those relocations will have to |
3033 | | be converted somehow; as of this writing I'm not sure that any of |
3034 | | the backends handle that correctly. |
3035 | | |
3036 | | It is tempting to instead not discard link once sections when |
3037 | | doing a relocatable link (technically, they should be discarded |
3038 | | whenever we are building constructors). However, that fails, |
3039 | | because the linker winds up combining all the link once sections |
3040 | | into a single large link once section, which defeats the purpose |
3041 | | of having link once sections in the first place. */ |
3042 | | |
3043 | 0 | name = bfd_section_name (sec); |
3044 | |
|
3045 | 0 | already_linked_list = bfd_section_already_linked_table_lookup (name); |
3046 | 0 | if (!already_linked_list) |
3047 | 0 | goto bad; |
3048 | | |
3049 | 0 | l = already_linked_list->entry; |
3050 | 0 | if (l != NULL) |
3051 | 0 | { |
3052 | | /* The section has already been linked. See if we should |
3053 | | issue a warning. */ |
3054 | 0 | return _bfd_handle_already_linked (sec, l, info); |
3055 | 0 | } |
3056 | | |
3057 | | /* This is the first section with this name. Record it. */ |
3058 | 0 | if (!bfd_section_already_linked_table_insert (already_linked_list, sec)) |
3059 | 0 | { |
3060 | 0 | bad: |
3061 | 0 | info->callbacks->fatal (_("%P: already_linked_table: %E\n")); |
3062 | 0 | } |
3063 | 0 | return false; |
3064 | 0 | } |
3065 | | |
3066 | | /* Choose a neighbouring section to S in OBFD that will be output, or |
3067 | | the absolute section if ADDR is out of bounds of the neighbours. */ |
3068 | | |
3069 | | asection * |
3070 | | _bfd_nearby_section (bfd *obfd, asection *s, bfd_vma addr) |
3071 | 0 | { |
3072 | 0 | asection *next, *prev, *best; |
3073 | | |
3074 | | /* Find preceding kept section. */ |
3075 | 0 | for (prev = s->prev; prev != NULL; prev = prev->prev) |
3076 | 0 | if ((prev->flags & SEC_EXCLUDE) == 0 |
3077 | 0 | && !bfd_section_removed_from_list (obfd, prev)) |
3078 | 0 | break; |
3079 | | |
3080 | | /* Find following kept section. Start at prev->next because |
3081 | | other sections may have been added after S was removed. */ |
3082 | 0 | if (s->prev != NULL) |
3083 | 0 | next = s->prev->next; |
3084 | 0 | else |
3085 | 0 | next = s->owner->sections; |
3086 | 0 | for (; next != NULL; next = next->next) |
3087 | 0 | if ((next->flags & SEC_EXCLUDE) == 0 |
3088 | 0 | && !bfd_section_removed_from_list (obfd, next)) |
3089 | 0 | break; |
3090 | | |
3091 | | /* Choose better of two sections, based on flags. The idea |
3092 | | is to choose a section that will be in the same segment |
3093 | | as S would have been if it was kept. */ |
3094 | 0 | best = next; |
3095 | 0 | if (prev == NULL) |
3096 | 0 | { |
3097 | 0 | if (next == NULL) |
3098 | 0 | best = bfd_abs_section_ptr; |
3099 | 0 | } |
3100 | 0 | else if (next == NULL) |
3101 | 0 | best = prev; |
3102 | 0 | else if (((prev->flags ^ next->flags) |
3103 | 0 | & (SEC_ALLOC | SEC_THREAD_LOCAL | SEC_LOAD)) != 0) |
3104 | 0 | { |
3105 | 0 | if (((next->flags ^ s->flags) |
3106 | 0 | & (SEC_ALLOC | SEC_THREAD_LOCAL)) != 0 |
3107 | | /* We prefer to choose a loaded section. Section S |
3108 | | doesn't have SEC_LOAD set (it being excluded, that |
3109 | | part of the flag processing didn't happen) so we |
3110 | | can't compare that flag to those of NEXT and PREV. */ |
3111 | 0 | || ((prev->flags & SEC_LOAD) != 0 |
3112 | 0 | && (next->flags & SEC_LOAD) == 0)) |
3113 | 0 | best = prev; |
3114 | 0 | } |
3115 | 0 | else if (((prev->flags ^ next->flags) & SEC_READONLY) != 0) |
3116 | 0 | { |
3117 | 0 | if (((next->flags ^ s->flags) & SEC_READONLY) != 0) |
3118 | 0 | best = prev; |
3119 | 0 | } |
3120 | 0 | else if (((prev->flags ^ next->flags) & SEC_CODE) != 0) |
3121 | 0 | { |
3122 | 0 | if (((next->flags ^ s->flags) & SEC_CODE) != 0) |
3123 | 0 | best = prev; |
3124 | 0 | } |
3125 | 0 | else |
3126 | 0 | { |
3127 | | /* Flags we care about are the same. Prefer the following |
3128 | | section if that will result in a positive valued sym. */ |
3129 | 0 | if (addr < next->vma) |
3130 | 0 | best = prev; |
3131 | 0 | } |
3132 | |
|
3133 | 0 | return best; |
3134 | 0 | } |
3135 | | |
3136 | | /* Convert symbols in excluded output sections to use a kept section. */ |
3137 | | |
3138 | | static bool |
3139 | | fix_syms (struct bfd_link_hash_entry *h, void *data) |
3140 | 0 | { |
3141 | 0 | bfd *obfd = (bfd *) data; |
3142 | |
|
3143 | 0 | if (h->type == bfd_link_hash_defined |
3144 | 0 | || h->type == bfd_link_hash_defweak) |
3145 | 0 | { |
3146 | 0 | asection *s = h->u.def.section; |
3147 | 0 | if (s != NULL |
3148 | 0 | && s->output_section != NULL |
3149 | 0 | && (s->output_section->flags & SEC_EXCLUDE) != 0 |
3150 | 0 | && bfd_section_removed_from_list (obfd, s->output_section)) |
3151 | 0 | { |
3152 | 0 | asection *op; |
3153 | |
|
3154 | 0 | h->u.def.value += s->output_offset + s->output_section->vma; |
3155 | 0 | op = _bfd_nearby_section (obfd, s->output_section, h->u.def.value); |
3156 | 0 | h->u.def.value -= op->vma; |
3157 | 0 | h->u.def.section = op; |
3158 | 0 | } |
3159 | 0 | } |
3160 | |
|
3161 | 0 | return true; |
3162 | 0 | } |
3163 | | |
3164 | | void |
3165 | | _bfd_fix_excluded_sec_syms (bfd *obfd, struct bfd_link_info *info) |
3166 | 0 | { |
3167 | 0 | bfd_link_hash_traverse (info->hash, fix_syms, obfd); |
3168 | 0 | } |
3169 | | |
3170 | | /* |
3171 | | FUNCTION |
3172 | | bfd_generic_define_common_symbol |
3173 | | |
3174 | | SYNOPSIS |
3175 | | bool bfd_generic_define_common_symbol |
3176 | | (bfd *output_bfd, struct bfd_link_info *info, |
3177 | | struct bfd_link_hash_entry *h); |
3178 | | |
3179 | | DESCRIPTION |
3180 | | Convert common symbol @var{h} into a defined symbol. |
3181 | | Return TRUE on success and FALSE on failure. |
3182 | | |
3183 | | .#define bfd_define_common_symbol(output_bfd, info, h) \ |
3184 | | . BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h)) |
3185 | | . |
3186 | | */ |
3187 | | |
3188 | | bool |
3189 | | bfd_generic_define_common_symbol (bfd *output_bfd, |
3190 | | struct bfd_link_info *info ATTRIBUTE_UNUSED, |
3191 | | struct bfd_link_hash_entry *h) |
3192 | 0 | { |
3193 | 0 | unsigned int power_of_two; |
3194 | 0 | bfd_vma alignment, size; |
3195 | 0 | asection *section; |
3196 | |
|
3197 | 0 | BFD_ASSERT (h != NULL && h->type == bfd_link_hash_common); |
3198 | |
|
3199 | 0 | size = h->u.c.size; |
3200 | 0 | power_of_two = h->u.c.p->alignment_power; |
3201 | 0 | section = h->u.c.p->section; |
3202 | | |
3203 | | /* Increase the size of the section to align the common symbol. |
3204 | | The alignment must be a power of two. But if the section does |
3205 | | not have any alignment requirement then do not increase the |
3206 | | alignment unnecessarily. */ |
3207 | 0 | if (power_of_two) |
3208 | 0 | alignment = bfd_octets_per_byte (output_bfd, section) << power_of_two; |
3209 | 0 | else |
3210 | 0 | alignment = 1; |
3211 | 0 | BFD_ASSERT (alignment != 0 && (alignment & -alignment) == alignment); |
3212 | 0 | section->size += alignment - 1; |
3213 | 0 | section->size &= -alignment; |
3214 | | |
3215 | | /* Adjust the section's overall alignment if necessary. */ |
3216 | 0 | if (power_of_two > section->alignment_power) |
3217 | 0 | section->alignment_power = power_of_two; |
3218 | | |
3219 | | /* Change the symbol from common to defined. */ |
3220 | 0 | h->type = bfd_link_hash_defined; |
3221 | 0 | h->u.def.section = section; |
3222 | 0 | h->u.def.value = section->size; |
3223 | | |
3224 | | /* Increase the size of the section. */ |
3225 | 0 | section->size += size; |
3226 | | |
3227 | | /* Make sure the section is allocated in memory, and make sure that |
3228 | | it is no longer a common section. */ |
3229 | 0 | section->flags |= SEC_ALLOC; |
3230 | 0 | section->flags &= ~(SEC_IS_COMMON | SEC_HAS_CONTENTS); |
3231 | 0 | return true; |
3232 | 0 | } |
3233 | | |
3234 | | /* |
3235 | | FUNCTION |
3236 | | _bfd_generic_link_hide_symbol |
3237 | | |
3238 | | SYNOPSIS |
3239 | | void _bfd_generic_link_hide_symbol |
3240 | | (bfd *output_bfd, struct bfd_link_info *info, |
3241 | | struct bfd_link_hash_entry *h); |
3242 | | |
3243 | | DESCRIPTION |
3244 | | Hide symbol @var{h}. |
3245 | | This is an internal function. It should not be called from |
3246 | | outside the BFD library. |
3247 | | |
3248 | | .#define bfd_link_hide_symbol(output_bfd, info, h) \ |
3249 | | . BFD_SEND (output_bfd, _bfd_link_hide_symbol, (output_bfd, info, h)) |
3250 | | . |
3251 | | */ |
3252 | | |
3253 | | void |
3254 | | _bfd_generic_link_hide_symbol (bfd *output_bfd ATTRIBUTE_UNUSED, |
3255 | | struct bfd_link_info *info ATTRIBUTE_UNUSED, |
3256 | | struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED) |
3257 | 0 | { |
3258 | 0 | } |
3259 | | |
3260 | | /* |
3261 | | FUNCTION |
3262 | | bfd_generic_define_start_stop |
3263 | | |
3264 | | SYNOPSIS |
3265 | | struct bfd_link_hash_entry *bfd_generic_define_start_stop |
3266 | | (struct bfd_link_info *info, |
3267 | | const char *symbol, asection *sec); |
3268 | | |
3269 | | DESCRIPTION |
3270 | | Define a __start, __stop, .startof. or .sizeof. symbol. |
3271 | | Return the symbol or NULL if no such undefined symbol exists. |
3272 | | |
3273 | | .#define bfd_define_start_stop(output_bfd, info, symbol, sec) \ |
3274 | | . BFD_SEND (output_bfd, _bfd_define_start_stop, (info, symbol, sec)) |
3275 | | . |
3276 | | */ |
3277 | | |
3278 | | struct bfd_link_hash_entry * |
3279 | | bfd_generic_define_start_stop (struct bfd_link_info *info, |
3280 | | const char *symbol, asection *sec) |
3281 | 0 | { |
3282 | 0 | struct bfd_link_hash_entry *h; |
3283 | |
|
3284 | 0 | h = bfd_link_hash_lookup (info->hash, symbol, false, false, true); |
3285 | 0 | if (h != NULL |
3286 | 0 | && !h->ldscript_def |
3287 | 0 | && (h->type == bfd_link_hash_undefined |
3288 | 0 | || h->type == bfd_link_hash_undefweak)) |
3289 | 0 | { |
3290 | 0 | h->type = bfd_link_hash_defined; |
3291 | 0 | h->u.def.section = sec; |
3292 | 0 | h->u.def.value = 0; |
3293 | 0 | return h; |
3294 | 0 | } |
3295 | 0 | return NULL; |
3296 | 0 | } |
3297 | | |
3298 | | /* |
3299 | | FUNCTION |
3300 | | bfd_find_version_for_sym |
3301 | | |
3302 | | SYNOPSIS |
3303 | | struct bfd_elf_version_tree * bfd_find_version_for_sym |
3304 | | (struct bfd_elf_version_tree *verdefs, |
3305 | | const char *sym_name, bool *hide); |
3306 | | |
3307 | | DESCRIPTION |
3308 | | Search an elf version script tree for symbol versioning |
3309 | | info and export / don't-export status for a given symbol. |
3310 | | Return non-NULL on success and NULL on failure; also sets |
3311 | | the output @samp{hide} boolean parameter. |
3312 | | |
3313 | | */ |
3314 | | |
3315 | | struct bfd_elf_version_tree * |
3316 | | bfd_find_version_for_sym (struct bfd_elf_version_tree *verdefs, |
3317 | | const char *sym_name, |
3318 | | bool *hide) |
3319 | 0 | { |
3320 | 0 | struct bfd_elf_version_tree *t; |
3321 | 0 | struct bfd_elf_version_tree *local_ver, *global_ver, *exist_ver; |
3322 | 0 | struct bfd_elf_version_tree *star_local_ver, *star_global_ver; |
3323 | |
|
3324 | 0 | local_ver = NULL; |
3325 | 0 | global_ver = NULL; |
3326 | 0 | star_local_ver = NULL; |
3327 | 0 | star_global_ver = NULL; |
3328 | 0 | exist_ver = NULL; |
3329 | 0 | for (t = verdefs; t != NULL; t = t->next) |
3330 | 0 | { |
3331 | 0 | if (t->globals.list != NULL) |
3332 | 0 | { |
3333 | 0 | struct bfd_elf_version_expr *d = NULL; |
3334 | |
|
3335 | 0 | while ((d = (*t->match) (&t->globals, d, sym_name)) != NULL) |
3336 | 0 | { |
3337 | 0 | if (d->literal || strcmp (d->pattern, "*") != 0) |
3338 | 0 | global_ver = t; |
3339 | 0 | else |
3340 | 0 | star_global_ver = t; |
3341 | 0 | if (d->symver) |
3342 | 0 | exist_ver = t; |
3343 | 0 | d->script = 1; |
3344 | | /* If the match is a wildcard pattern, keep looking for |
3345 | | a more explicit, perhaps even local, match. */ |
3346 | 0 | if (d->literal) |
3347 | 0 | break; |
3348 | 0 | } |
3349 | |
|
3350 | 0 | if (d != NULL) |
3351 | 0 | break; |
3352 | 0 | } |
3353 | | |
3354 | 0 | if (t->locals.list != NULL) |
3355 | 0 | { |
3356 | 0 | struct bfd_elf_version_expr *d = NULL; |
3357 | |
|
3358 | 0 | while ((d = (*t->match) (&t->locals, d, sym_name)) != NULL) |
3359 | 0 | { |
3360 | 0 | if (d->literal || strcmp (d->pattern, "*") != 0) |
3361 | 0 | local_ver = t; |
3362 | 0 | else |
3363 | 0 | star_local_ver = t; |
3364 | | /* If the match is a wildcard pattern, keep looking for |
3365 | | a more explicit, perhaps even global, match. */ |
3366 | 0 | if (d->literal) |
3367 | 0 | { |
3368 | | /* An exact match overrides a global wildcard. */ |
3369 | 0 | global_ver = NULL; |
3370 | 0 | star_global_ver = NULL; |
3371 | 0 | break; |
3372 | 0 | } |
3373 | 0 | } |
3374 | |
|
3375 | 0 | if (d != NULL) |
3376 | 0 | break; |
3377 | 0 | } |
3378 | 0 | } |
3379 | |
|
3380 | 0 | if (global_ver == NULL && local_ver == NULL) |
3381 | 0 | global_ver = star_global_ver; |
3382 | |
|
3383 | 0 | if (global_ver != NULL) |
3384 | 0 | { |
3385 | | /* If we already have a versioned symbol that matches the |
3386 | | node for this symbol, then we don't want to create a |
3387 | | duplicate from the unversioned symbol. Instead hide the |
3388 | | unversioned symbol. */ |
3389 | 0 | *hide = exist_ver == global_ver; |
3390 | 0 | return global_ver; |
3391 | 0 | } |
3392 | | |
3393 | 0 | if (local_ver == NULL) |
3394 | 0 | local_ver = star_local_ver; |
3395 | |
|
3396 | 0 | if (local_ver != NULL) |
3397 | 0 | { |
3398 | 0 | *hide = true; |
3399 | 0 | return local_ver; |
3400 | 0 | } |
3401 | | |
3402 | 0 | return NULL; |
3403 | 0 | } |
3404 | | |
3405 | | /* |
3406 | | FUNCTION |
3407 | | bfd_hide_sym_by_version |
3408 | | |
3409 | | SYNOPSIS |
3410 | | bool bfd_hide_sym_by_version |
3411 | | (struct bfd_elf_version_tree *verdefs, const char *sym_name); |
3412 | | |
3413 | | DESCRIPTION |
3414 | | Search an elf version script tree for symbol versioning |
3415 | | info for a given symbol. Return TRUE if the symbol is hidden. |
3416 | | |
3417 | | */ |
3418 | | |
3419 | | bool |
3420 | | bfd_hide_sym_by_version (struct bfd_elf_version_tree *verdefs, |
3421 | | const char *sym_name) |
3422 | 0 | { |
3423 | 0 | bool hidden = false; |
3424 | 0 | bfd_find_version_for_sym (verdefs, sym_name, &hidden); |
3425 | 0 | return hidden; |
3426 | 0 | } |
3427 | | |
3428 | | /* |
3429 | | FUNCTION |
3430 | | bfd_link_check_relocs |
3431 | | |
3432 | | SYNOPSIS |
3433 | | bool bfd_link_check_relocs |
3434 | | (bfd *abfd, struct bfd_link_info *info); |
3435 | | |
3436 | | DESCRIPTION |
3437 | | Checks the relocs in ABFD for validity. |
3438 | | Does not execute the relocs. |
3439 | | Return TRUE if everything is OK, FALSE otherwise. |
3440 | | This is the external entry point to this code. |
3441 | | */ |
3442 | | |
3443 | | bool |
3444 | | bfd_link_check_relocs (bfd *abfd, struct bfd_link_info *info) |
3445 | 0 | { |
3446 | 0 | return BFD_SEND (abfd, _bfd_link_check_relocs, (abfd, info)); |
3447 | 0 | } |
3448 | | |
3449 | | /* |
3450 | | FUNCTION |
3451 | | _bfd_generic_link_check_relocs |
3452 | | |
3453 | | SYNOPSIS |
3454 | | bool _bfd_generic_link_check_relocs |
3455 | | (bfd *abfd, struct bfd_link_info *info); |
3456 | | |
3457 | | DESCRIPTION |
3458 | | Stub function for targets that do not implement reloc checking. |
3459 | | Return TRUE. |
3460 | | This is an internal function. It should not be called from |
3461 | | outside the BFD library. |
3462 | | */ |
3463 | | |
3464 | | bool |
3465 | | _bfd_generic_link_check_relocs (bfd *abfd ATTRIBUTE_UNUSED, |
3466 | | struct bfd_link_info *info ATTRIBUTE_UNUSED) |
3467 | 0 | { |
3468 | 0 | return true; |
3469 | 0 | } |
3470 | | |
3471 | | /* |
3472 | | FUNCTION |
3473 | | bfd_merge_private_bfd_data |
3474 | | |
3475 | | SYNOPSIS |
3476 | | bool bfd_merge_private_bfd_data |
3477 | | (bfd *ibfd, struct bfd_link_info *info); |
3478 | | |
3479 | | DESCRIPTION |
3480 | | Merge private BFD information from the BFD @var{ibfd} to the |
3481 | | the output file BFD when linking. Return <<TRUE>> on success, |
3482 | | <<FALSE>> on error. Possible error returns are: |
3483 | | |
3484 | | o <<bfd_error_no_memory>> - |
3485 | | Not enough memory exists to create private data for @var{obfd}. |
3486 | | |
3487 | | .#define bfd_merge_private_bfd_data(ibfd, info) \ |
3488 | | . BFD_SEND ((info)->output_bfd, _bfd_merge_private_bfd_data, \ |
3489 | | . (ibfd, info)) |
3490 | | . |
3491 | | */ |
3492 | | |
3493 | | /* |
3494 | | INTERNAL_FUNCTION |
3495 | | _bfd_generic_verify_endian_match |
3496 | | |
3497 | | SYNOPSIS |
3498 | | bool _bfd_generic_verify_endian_match |
3499 | | (bfd *ibfd, struct bfd_link_info *info); |
3500 | | |
3501 | | DESCRIPTION |
3502 | | Can be used from / for bfd_merge_private_bfd_data to check that |
3503 | | endianness matches between input and output file. Returns |
3504 | | TRUE for a match, otherwise returns FALSE and emits an error. |
3505 | | */ |
3506 | | |
3507 | | bool |
3508 | | _bfd_generic_verify_endian_match (bfd *ibfd, struct bfd_link_info *info) |
3509 | 0 | { |
3510 | 0 | bfd *obfd = info->output_bfd; |
3511 | |
|
3512 | 0 | if (ibfd->xvec->byteorder != obfd->xvec->byteorder |
3513 | 0 | && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN |
3514 | 0 | && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN) |
3515 | 0 | { |
3516 | 0 | if (bfd_big_endian (ibfd)) |
3517 | 0 | _bfd_error_handler (_("%pB: compiled for a big endian system " |
3518 | 0 | "and target is little endian"), ibfd); |
3519 | 0 | else |
3520 | 0 | _bfd_error_handler (_("%pB: compiled for a little endian system " |
3521 | 0 | "and target is big endian"), ibfd); |
3522 | 0 | bfd_set_error (bfd_error_wrong_format); |
3523 | 0 | return false; |
3524 | 0 | } |
3525 | | |
3526 | 0 | return true; |
3527 | 0 | } |
3528 | | |
3529 | | int |
3530 | | _bfd_nolink_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, |
3531 | | struct bfd_link_info *info ATTRIBUTE_UNUSED) |
3532 | 0 | { |
3533 | 0 | return 0; |
3534 | 0 | } |
3535 | | |
3536 | | bool |
3537 | | _bfd_nolink_bfd_relax_section (bfd *abfd, |
3538 | | asection *section ATTRIBUTE_UNUSED, |
3539 | | struct bfd_link_info *link_info ATTRIBUTE_UNUSED, |
3540 | | bool *again ATTRIBUTE_UNUSED) |
3541 | 0 | { |
3542 | 0 | return _bfd_bool_bfd_false_error (abfd); |
3543 | 0 | } |
3544 | | |
3545 | | bfd_byte * |
3546 | | _bfd_nolink_bfd_get_relocated_section_contents |
3547 | | (bfd *abfd, |
3548 | | struct bfd_link_info *link_info ATTRIBUTE_UNUSED, |
3549 | | struct bfd_link_order *link_order ATTRIBUTE_UNUSED, |
3550 | | bfd_byte *data ATTRIBUTE_UNUSED, |
3551 | | bool relocatable ATTRIBUTE_UNUSED, |
3552 | | asymbol **symbols ATTRIBUTE_UNUSED) |
3553 | 0 | { |
3554 | 0 | return (bfd_byte *) _bfd_ptr_bfd_null_error (abfd); |
3555 | 0 | } |
3556 | | |
3557 | | bool |
3558 | | _bfd_nolink_bfd_lookup_section_flags |
3559 | | (struct bfd_link_info *info ATTRIBUTE_UNUSED, |
3560 | | struct flag_info *flaginfo ATTRIBUTE_UNUSED, |
3561 | | asection *section) |
3562 | 0 | { |
3563 | 0 | return _bfd_bool_bfd_false_error (section->owner); |
3564 | 0 | } |
3565 | | |
3566 | | bool |
3567 | | _bfd_nolink_bfd_is_group_section (bfd *abfd, |
3568 | | const asection *sec ATTRIBUTE_UNUSED) |
3569 | 0 | { |
3570 | 0 | return _bfd_bool_bfd_false_error (abfd); |
3571 | 0 | } |
3572 | | |
3573 | | const char * |
3574 | | _bfd_nolink_bfd_group_name (bfd *abfd, |
3575 | | const asection *sec ATTRIBUTE_UNUSED) |
3576 | 0 | { |
3577 | 0 | return _bfd_ptr_bfd_null_error (abfd); |
3578 | 0 | } |
3579 | | |
3580 | | bool |
3581 | | _bfd_nolink_bfd_discard_group (bfd *abfd, asection *sec ATTRIBUTE_UNUSED) |
3582 | 0 | { |
3583 | 0 | return _bfd_bool_bfd_false_error (abfd); |
3584 | 0 | } |
3585 | | |
3586 | | struct bfd_link_hash_table * |
3587 | | _bfd_nolink_bfd_link_hash_table_create (bfd *abfd) |
3588 | 0 | { |
3589 | 0 | return (struct bfd_link_hash_table *) _bfd_ptr_bfd_null_error (abfd); |
3590 | 0 | } |
3591 | | |
3592 | | void |
3593 | | _bfd_nolink_bfd_link_just_syms (asection *sec ATTRIBUTE_UNUSED, |
3594 | | struct bfd_link_info *info ATTRIBUTE_UNUSED) |
3595 | 0 | { |
3596 | 0 | } |
3597 | | |
3598 | | void |
3599 | | _bfd_nolink_bfd_copy_link_hash_symbol_type |
3600 | | (bfd *abfd ATTRIBUTE_UNUSED, |
3601 | | struct bfd_link_hash_entry *from ATTRIBUTE_UNUSED, |
3602 | | struct bfd_link_hash_entry *to ATTRIBUTE_UNUSED) |
3603 | 0 | { |
3604 | 0 | } |
3605 | | |
3606 | | bool |
3607 | | _bfd_nolink_bfd_link_split_section (bfd *abfd, asection *sec ATTRIBUTE_UNUSED) |
3608 | 0 | { |
3609 | 0 | return _bfd_bool_bfd_false_error (abfd); |
3610 | 0 | } |
3611 | | |
3612 | | bool |
3613 | | _bfd_nolink_section_already_linked (bfd *abfd, |
3614 | | asection *sec ATTRIBUTE_UNUSED, |
3615 | | struct bfd_link_info *info ATTRIBUTE_UNUSED) |
3616 | 0 | { |
3617 | 0 | return _bfd_bool_bfd_false_error (abfd); |
3618 | 0 | } |
3619 | | |
3620 | | bool |
3621 | | _bfd_nolink_bfd_define_common_symbol |
3622 | | (bfd *abfd, |
3623 | | struct bfd_link_info *info ATTRIBUTE_UNUSED, |
3624 | | struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED) |
3625 | 0 | { |
3626 | 0 | return _bfd_bool_bfd_false_error (abfd); |
3627 | 0 | } |
3628 | | |
3629 | | struct bfd_link_hash_entry * |
3630 | | _bfd_nolink_bfd_define_start_stop (struct bfd_link_info *info ATTRIBUTE_UNUSED, |
3631 | | const char *name ATTRIBUTE_UNUSED, |
3632 | | asection *sec) |
3633 | 0 | { |
3634 | 0 | return (struct bfd_link_hash_entry *) _bfd_ptr_bfd_null_error (sec->owner); |
3635 | 0 | } |