Automatic date update in version.in
[deliverable/binutils-gdb.git] / ld / ldelfgen.c
CommitLineData
d871d478 1/* Emulation code used by all ELF targets.
250d07de 2 Copyright (C) 1991-2021 Free Software Foundation, Inc.
d871d478
AM
3
4 This file is part of the GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21#include "sysdep.h"
22#include "bfd.h"
0b4453c7 23#include "bfdlink.h"
1ff6de03 24#include "ctf-api.h"
d871d478
AM
25#include "ld.h"
26#include "ldmain.h"
27#include "ldmisc.h"
28#include "ldexp.h"
29#include "ldlang.h"
b209b5a6 30#include "ldctor.h"
d871d478 31#include "elf-bfd.h"
3d16b64e 32#include "elf/internal.h"
d871d478
AM
33#include "ldelfgen.h"
34
b209b5a6
AM
35/* Info attached to an output_section_statement about input sections,
36 used when sorting SHF_LINK_ORDER sections. */
37
38struct os_sections
39{
40 /* Size allocated for isec. */
41 unsigned int alloc;
42 /* Used entries in isec. */
43 unsigned int count;
44 /* How many are SHF_LINK_ORDER. */
45 unsigned int ordered;
46 /* Input sections attached to this output section. */
47 struct os_sections_input {
48 lang_input_section_type *is;
49 unsigned int idx;
50 } isec[1];
51};
52
53/* Add IS to data kept for OS. */
54
f38a2680 55static bool
b209b5a6
AM
56add_link_order_input_section (lang_input_section_type *is,
57 lang_output_section_statement_type *os)
58{
59 struct os_sections *os_info = os->data;
60 asection *s;
61
62 if (os_info == NULL)
63 {
64 os_info = xmalloc (sizeof (*os_info) + 63 * sizeof (*os_info->isec));
65 os_info->alloc = 64;
66 os_info->count = 0;
67 os_info->ordered = 0;
68 os->data = os_info;
69 }
70 if (os_info->count == os_info->alloc)
71 {
72 size_t want;
73 os_info->alloc *= 2;
74 want = sizeof (*os_info) + (os_info->alloc - 1) * sizeof (*os_info->isec);
75 os_info = xrealloc (os_info, want);
76 os->data = os_info;
77 }
78 os_info->isec[os_info->count].is = is;
79 os_info->isec[os_info->count].idx = os_info->count;
80 os_info->count++;
81 s = is->section;
4120e488 82 if (bfd_get_flavour (s->owner) == bfd_target_elf_flavour
b634d11d 83 && (s->flags & SEC_LINKER_CREATED) == 0
b209b5a6
AM
84 && elf_linked_to_section (s) != NULL)
85 os_info->ordered++;
f38a2680 86 return false;
b209b5a6
AM
87}
88
89/* Run over the linker's statement list, extracting info about input
90 sections attached to each output section. */
91
f38a2680 92static bool
b209b5a6
AM
93link_order_scan (lang_statement_union_type *u,
94 lang_output_section_statement_type *os)
95{
96 asection *s;
f38a2680 97 bool ret = false;
b209b5a6
AM
98
99 for (; u != NULL; u = u->header.next)
100 {
101 switch (u->header.type)
102 {
103 case lang_wild_statement_enum:
104 if (link_order_scan (u->wild_statement.children.head, os))
f38a2680 105 ret = true;
b209b5a6
AM
106 break;
107 case lang_constructors_statement_enum:
108 if (link_order_scan (constructor_list.head, os))
f38a2680 109 ret = true;
b209b5a6
AM
110 break;
111 case lang_output_section_statement_enum:
112 if (u->output_section_statement.constraint != -1
113 && link_order_scan (u->output_section_statement.children.head,
114 &u->output_section_statement))
f38a2680 115 ret = true;
b209b5a6
AM
116 break;
117 case lang_group_statement_enum:
118 if (link_order_scan (u->group_statement.children.head, os))
f38a2680 119 ret = true;
b209b5a6
AM
120 break;
121 case lang_input_section_enum:
122 s = u->input_section.section;
123 if (s->output_section != NULL
124 && s->output_section->owner == link_info.output_bfd
125 && (s->output_section->flags & SEC_EXCLUDE) == 0
126 && ((s->output_section->flags & SEC_HAS_CONTENTS) != 0
127 || ((s->output_section->flags & (SEC_LOAD | SEC_THREAD_LOCAL))
128 == (SEC_LOAD | SEC_THREAD_LOCAL))))
129 if (add_link_order_input_section (&u->input_section, os))
f38a2680 130 ret = true;
b209b5a6
AM
131 break;
132 default:
133 break;
134 }
135 }
136 return ret;
137}
138
139/* Compare two sections based on the locations of the sections they are
140 linked to. Used by fixup_link_order. */
141
142static int
143compare_link_order (const void *a, const void *b)
144{
145 const struct os_sections_input *ai = a;
146 const struct os_sections_input *bi = b;
4120e488
AM
147 asection *asec = NULL;
148 asection *bsec = NULL;
b209b5a6
AM
149 bfd_vma apos, bpos;
150
4120e488
AM
151 if (bfd_get_flavour (ai->is->section->owner) == bfd_target_elf_flavour)
152 asec = elf_linked_to_section (ai->is->section);
153 if (bfd_get_flavour (bi->is->section->owner) == bfd_target_elf_flavour)
154 bsec = elf_linked_to_section (bi->is->section);
155
b209b5a6
AM
156 /* Place unordered sections before ordered sections. */
157 if (asec == NULL || bsec == NULL)
158 {
159 if (bsec != NULL)
160 return -1;
161 else if (asec != NULL)
162 return 1;
163 return ai->idx - bi->idx;
164 }
165
166 apos = asec->output_section->lma + asec->output_offset;
167 bpos = bsec->output_section->lma + bsec->output_offset;
168
169 if (apos < bpos)
170 return -1;
171 else if (apos > bpos)
172 return 1;
173
d820a652
NC
174 if (! bfd_link_relocatable (&link_info))
175 {
176 /* The only way we should get matching LMAs is when
177 the first of the two sections has zero size. */
178 if (asec->size < bsec->size)
179 return -1;
180 else if (asec->size > bsec->size)
181 return 1;
182 }
b209b5a6
AM
183
184 /* If they are both zero size then they almost certainly have the same
185 VMA and thus are not ordered with respect to each other. Test VMA
186 anyway, and fall back to id to make the result reproducible across
187 qsort implementations. */
188 apos = asec->output_section->vma + asec->output_offset;
189 bpos = bsec->output_section->vma + bsec->output_offset;
190 if (apos < bpos)
191 return -1;
192 else if (apos > bpos)
193 return 1;
194
195 return asec->id - bsec->id;
196}
197
198/* Rearrange sections with SHF_LINK_ORDER into the same order as their
199 linked sections. */
200
f38a2680 201static bool
b209b5a6
AM
202fixup_link_order (lang_output_section_statement_type *os)
203{
204 struct os_sections *os_info = os->data;
205 unsigned int i, j;
206 lang_input_section_type **orig_is;
207 asection **save_s;
208
209 for (i = 0; i < os_info->count; i = j)
210 {
211 /* Normally a linker script will select SHF_LINK_ORDER sections
212 with an input section wildcard something like the following:
213 *(.IA_64.unwind* .gnu.linkonce.ia64unw.*)
214 However if some other random sections are smashed into an
215 output section, or if SHF_LINK_ORDER are split up by the
216 linker script, then we only want to sort sections matching a
217 given wildcard. That's the purpose of the pattern test. */
218 for (j = i + 1; j < os_info->count; j++)
219 if (os_info->isec[j].is->pattern != os_info->isec[i].is->pattern)
220 break;
221 if (j - i > 1)
222 qsort (&os_info->isec[i], j - i, sizeof (*os_info->isec),
223 compare_link_order);
224 }
225 for (i = 0; i < os_info->count; i++)
226 if (os_info->isec[i].idx != i)
227 break;
228 if (i == os_info->count)
f38a2680 229 return false;
b209b5a6
AM
230
231 /* Now reorder the linker input section statements to reflect the
232 proper sorting. The is done by rewriting the existing statements
233 rather than fiddling with lists, since the only thing we need to
234 change is the bfd section pointer. */
235 orig_is = xmalloc (os_info->count * sizeof (*orig_is));
236 save_s = xmalloc (os_info->count * sizeof (*save_s));
237 for (i = 0; i < os_info->count; i++)
238 {
239 orig_is[os_info->isec[i].idx] = os_info->isec[i].is;
240 save_s[i] = os_info->isec[i].is->section;
241 }
242 for (i = 0; i < os_info->count; i++)
243 if (os_info->isec[i].idx != i)
244 {
245 orig_is[i]->section = save_s[i];
246 /* Restore os_info to pristine state before the qsort, for the
247 next pass over sections. */
248 os_info->isec[i].is = orig_is[i];
249 os_info->isec[i].idx = i;
250 }
251 free (save_s);
252 free (orig_is);
f38a2680 253 return true;
b209b5a6
AM
254}
255
d871d478 256void
f38a2680 257ldelf_map_segments (bool need_layout)
d871d478
AM
258{
259 int tries = 10;
f38a2680 260 static bool done_link_order_scan = false;
d871d478
AM
261
262 do
263 {
264 lang_relax_sections (need_layout);
f38a2680 265 need_layout = false;
d871d478 266
4120e488 267 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
b209b5a6
AM
268 {
269 lang_output_section_statement_type *os;
270 if (!done_link_order_scan)
271 {
272 link_order_scan (statement_list.head, NULL);
f38a2680 273 done_link_order_scan = true;
b209b5a6
AM
274 }
275 for (os = (void *) lang_os_list.head; os != NULL; os = os->next)
276 {
277 struct os_sections *os_info = os->data;
278 if (os_info != NULL && os_info->ordered != 0)
279 {
280 if (os_info->ordered != os_info->count
281 && bfd_link_relocatable (&link_info))
282 {
283 einfo (_("%F%P: "
284 "%pA has both ordered and unordered sections"),
285 os->bfd_section);
286 return;
287 }
288 if (os_info->count > 1
289 && fixup_link_order (os))
f38a2680 290 need_layout = true;
b209b5a6
AM
291 }
292 }
293 }
294
4120e488 295 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
d871d478
AM
296 && !bfd_link_relocatable (&link_info))
297 {
298 bfd_size_type phdr_size;
299
300 phdr_size = elf_program_header_size (link_info.output_bfd);
301 /* If we don't have user supplied phdrs, throw away any
302 previous linker generated program headers. */
303 if (lang_phdr_list == NULL)
304 elf_seg_map (link_info.output_bfd) = NULL;
305 if (!_bfd_elf_map_sections_to_segments (link_info.output_bfd,
306 &link_info))
307 einfo (_("%F%P: map sections to segments failed: %E\n"));
308
309 if (phdr_size != elf_program_header_size (link_info.output_bfd))
310 {
311 if (tries > 6)
312 /* The first few times we allow any change to
313 phdr_size . */
f38a2680 314 need_layout = true;
d871d478
AM
315 else if (phdr_size
316 < elf_program_header_size (link_info.output_bfd))
317 /* After that we only allow the size to grow. */
f38a2680 318 need_layout = true;
d871d478
AM
319 else
320 elf_program_header_size (link_info.output_bfd) = phdr_size;
321 }
322 }
323 }
324 while (need_layout && --tries);
325
326 if (tries == 0)
327 einfo (_("%F%P: looping in map_segments"));
6f6fd151 328
4120e488 329 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
6f6fd151
L
330 && lang_phdr_list == NULL)
331 {
332 /* If we don't have user supplied phdrs, strip zero-sized dynamic
333 sections and regenerate program headers. */
334 const struct elf_backend_data *bed
335 = get_elf_backend_data (link_info.output_bfd);
336 if (bed->elf_backend_strip_zero_sized_dynamic_sections
337 && !bed->elf_backend_strip_zero_sized_dynamic_sections
338 (&link_info))
339 einfo (_("%F%P: failed to strip zero-sized dynamic sections"));
340 }
d871d478 341}
1ff6de03 342
094e34f2 343#ifdef ENABLE_LIBCTF
1ff6de03
NA
344/* We want to emit CTF early if and only if we are not targetting ELF with this
345 invocation. */
346
347int
348ldelf_emit_ctf_early (void)
349{
350 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
351 return 0;
352 return 1;
353}
354
355/* Callbacks used to map from bfd types to libctf types, under libctf's
356 control. */
357
3d16b64e 358struct ctf_strtab_iter_cb_arg
1ff6de03 359{
3d16b64e 360 struct elf_strtab_hash *strtab;
1ff6de03
NA
361 size_t next_i;
362 size_t next_idx;
363};
364
365/* Return strings from the strtab to libctf, one by one. Returns NULL when
366 iteration is complete. */
367
368static const char *
369ldelf_ctf_strtab_iter_cb (uint32_t *offset, void *arg_)
370{
371 bfd_size_type off;
372 const char *ret;
373
3d16b64e
NA
374 struct ctf_strtab_iter_cb_arg *arg =
375 (struct ctf_strtab_iter_cb_arg *) arg_;
1ff6de03
NA
376
377 /* There is no zeroth string. */
378 if (arg->next_i == 0)
379 arg->next_i = 1;
380
211bcd01
NA
381 /* Hunt through strings until we fall off the end or find one with
382 a nonzero refcount. */
383 do
1ff6de03 384 {
211bcd01
NA
385 if (arg->next_i >= _bfd_elf_strtab_len (arg->strtab))
386 {
387 arg->next_i = 0;
388 return NULL;
389 }
390
391 ret = _bfd_elf_strtab_str (arg->strtab, arg->next_i++, &off);
1ff6de03 392 }
211bcd01 393 while (ret == NULL);
1ff6de03 394
1ff6de03
NA
395 *offset = off;
396
397 /* If we've overflowed, we cannot share any further strings: the CTF
398 format cannot encode strings with such high offsets. */
399 if (*offset != off)
400 return NULL;
401
402 return ret;
403}
404
3d16b64e
NA
405void
406ldelf_acquire_strings_for_ctf
407 (struct ctf_dict *ctf_output, struct elf_strtab_hash *strtab)
1ff6de03 408{
3d16b64e
NA
409 struct ctf_strtab_iter_cb_arg args = { strtab, 0, 0 };
410 if (!ctf_output)
411 return;
1ff6de03 412
3d16b64e 413 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
1ff6de03 414 {
3d16b64e
NA
415 if (ctf_link_add_strtab (ctf_output, ldelf_ctf_strtab_iter_cb,
416 &args) < 0)
417 einfo (_("%F%P: warning: CTF strtab association failed; strings will "
418 "not be shared: %s\n"),
419 ctf_errmsg (ctf_errno (ctf_output)));
1ff6de03 420 }
1ff6de03
NA
421}
422
423void
3d16b64e
NA
424ldelf_new_dynsym_for_ctf (struct ctf_dict *ctf_output, int symidx,
425 struct elf_internal_sym *sym)
1ff6de03 426{
3d16b64e
NA
427 ctf_link_sym_t lsym;
428
429 if (!ctf_output)
1ff6de03
NA
430 return;
431
3d16b64e
NA
432 /* New symbol. */
433 if (sym != NULL)
1ff6de03 434 {
3d16b64e
NA
435 lsym.st_name = NULL;
436 lsym.st_nameidx = sym->st_name;
437 lsym.st_nameidx_set = 1;
438 lsym.st_symidx = symidx;
439 lsym.st_shndx = sym->st_shndx;
440 lsym.st_type = ELF_ST_TYPE (sym->st_info);
441 lsym.st_value = sym->st_value;
442 if (ctf_link_add_linker_symbol (ctf_output, &lsym) < 0)
443 {
444 einfo (_("%F%P: warning: CTF symbol addition failed; CTF will "
445 "not be tied to symbols: %s\n"),
446 ctf_errmsg (ctf_errno (ctf_output)));
447 }
448 }
449 else
450 {
451 /* Shuffle all the symbols. */
1ff6de03 452
3d16b64e
NA
453 if (ctf_link_shuffle_syms (ctf_output) < 0)
454 einfo (_("%F%P: warning: CTF symbol shuffling failed; CTF will "
455 "not be tied to symbols: %s\n"),
456 ctf_errmsg (ctf_errno (ctf_output)));
1ff6de03
NA
457 }
458}
094e34f2 459#else
3d16b64e
NA
460int
461ldelf_emit_ctf_early (void)
094e34f2
NA
462{
463 return 0;
464}
465
3d16b64e
NA
466void
467ldelf_acquire_strings_for_ctf (struct ctf_dict *ctf_output ATTRIBUTE_UNUSED,
468 struct elf_strtab_hash *strtab ATTRIBUTE_UNUSED)
469{}
470void
471ldelf_new_dynsym_for_ctf (struct ctf_dict *ctf_output ATTRIBUTE_UNUSED,
472 int symidx ATTRIBUTE_UNUSED,
473 struct elf_internal_sym *sym ATTRIBUTE_UNUSED)
094e34f2
NA
474{}
475#endif
This page took 0.138535 seconds and 4 git commands to generate.