Add top-level .editorconfig file
[binutils-gdb.git] / ld / ldelf.c
1 /* ELF emulation code for targets using elf.em.
2 Copyright (C) 1991-2022 Free Software Foundation, Inc.
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"
23 #include "libiberty.h"
24 #include "filenames.h"
25 #include "safe-ctype.h"
26 #include "bfdlink.h"
27 #include "ctf-api.h"
28 #include "ld.h"
29 #include "ldmain.h"
30 #include "ldmisc.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include "ldfile.h"
34 #include "ldemul.h"
35 #include "ldbuildid.h"
36 #include <ldgram.h>
37 #include "elf-bfd.h"
38 #ifdef HAVE_GLOB
39 #include <glob.h>
40 #endif
41 #include "ldelf.h"
42
43 struct dt_needed
44 {
45 bfd *by;
46 const char *name;
47 };
48
49 /* Style of .note.gnu.build-id section. */
50 const char *ldelf_emit_note_gnu_build_id;
51
52 /* These variables are required to pass information back and forth
53 between after_open and check_needed and stat_needed and vercheck. */
54
55 static struct bfd_link_needed_list *global_needed;
56 static lang_input_statement_type *global_found;
57 static struct stat global_stat;
58 static struct bfd_link_needed_list *global_vercheck_needed;
59 static bool global_vercheck_failed;
60
61 void
62 ldelf_after_parse (void)
63 {
64 if (bfd_link_pie (&link_info))
65 link_info.flags_1 |= (bfd_vma) DF_1_PIE;
66
67 if (bfd_link_executable (&link_info)
68 && link_info.nointerp)
69 {
70 if (link_info.dynamic_undefined_weak > 0)
71 einfo (_("%P: warning: -z dynamic-undefined-weak ignored\n"));
72 link_info.dynamic_undefined_weak = 0;
73 }
74
75 /* Disable DT_RELR if not building PIE nor shared library. */
76 if (!bfd_link_pic (&link_info))
77 link_info.enable_dt_relr = 0;
78
79 /* Add 3 spare tags for DT_RELR, DT_RELRSZ and DT_RELRENT. */
80 if (link_info.enable_dt_relr)
81 link_info.spare_dynamic_tags += 3;
82
83 after_parse_default ();
84 if (link_info.commonpagesize > link_info.maxpagesize)
85 {
86 if (!link_info.commonpagesize_is_set)
87 link_info.commonpagesize = link_info.maxpagesize;
88 else if (!link_info.maxpagesize_is_set)
89 link_info.maxpagesize = link_info.commonpagesize;
90 else
91 einfo (_("%F%P: common page size (0x%v) > maximum page size (0x%v)\n"),
92 link_info.commonpagesize, link_info.maxpagesize);
93 }
94 }
95
96 /* Handle the generation of DT_NEEDED tags. */
97
98 bool
99 ldelf_load_symbols (lang_input_statement_type *entry)
100 {
101 int link_class = 0;
102
103 /* Tell the ELF linker that we don't want the output file to have a
104 DT_NEEDED entry for this file, unless it is used to resolve
105 references in a regular object. */
106 if (entry->flags.add_DT_NEEDED_for_regular)
107 link_class = DYN_AS_NEEDED;
108
109 /* Tell the ELF linker that we don't want the output file to have a
110 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
111 this file at all. */
112 if (!entry->flags.add_DT_NEEDED_for_dynamic)
113 link_class |= DYN_NO_ADD_NEEDED;
114
115 if (entry->flags.just_syms
116 && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
117 einfo (_("%F%P: %pB: --just-symbols may not be used on DSO\n"),
118 entry->the_bfd);
119
120 if (link_class == 0
121 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
122 return false;
123
124 bfd_elf_set_dyn_lib_class (entry->the_bfd,
125 (enum dynamic_lib_link_class) link_class);
126
127 /* Continue on with normal load_symbols processing. */
128 return false;
129 }
130
131 /* On Linux, it's possible to have different versions of the same
132 shared library linked against different versions of libc. The
133 dynamic linker somehow tags which libc version to use in
134 /etc/ld.so.cache, and, based on the libc that it sees in the
135 executable, chooses which version of the shared library to use.
136
137 We try to do a similar check here by checking whether this shared
138 library needs any other shared libraries which may conflict with
139 libraries we have already included in the link. If it does, we
140 skip it, and try to find another shared library farther on down the
141 link path.
142
143 This is called via lang_for_each_input_file.
144 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
145 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
146 a conflicting version. */
147
148 static void
149 ldelf_vercheck (lang_input_statement_type *s)
150 {
151 const char *soname;
152 struct bfd_link_needed_list *l;
153
154 if (global_vercheck_failed)
155 return;
156 if (s->the_bfd == NULL
157 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
158 return;
159
160 soname = bfd_elf_get_dt_soname (s->the_bfd);
161 if (soname == NULL)
162 soname = lbasename (bfd_get_filename (s->the_bfd));
163
164 for (l = global_vercheck_needed; l != NULL; l = l->next)
165 {
166 const char *suffix;
167
168 if (filename_cmp (soname, l->name) == 0)
169 {
170 /* Probably can't happen, but it's an easy check. */
171 continue;
172 }
173
174 if (strchr (l->name, '/') != NULL)
175 continue;
176
177 suffix = strstr (l->name, ".so.");
178 if (suffix == NULL)
179 continue;
180
181 suffix += sizeof ".so." - 1;
182
183 if (filename_ncmp (soname, l->name, suffix - l->name) == 0)
184 {
185 /* Here we know that S is a dynamic object FOO.SO.VER1, and
186 the object we are considering needs a dynamic object
187 FOO.SO.VER2, and VER1 and VER2 are different. This
188 appears to be a version mismatch, so we tell the caller
189 to try a different version of this library. */
190 global_vercheck_failed = true;
191 return;
192 }
193 }
194 }
195
196
197 /* See if an input file matches a DT_NEEDED entry by running stat on
198 the file. */
199
200 static void
201 ldelf_stat_needed (lang_input_statement_type *s)
202 {
203 struct stat st;
204 const char *suffix;
205 const char *soname;
206
207 if (global_found != NULL)
208 return;
209 if (s->the_bfd == NULL)
210 return;
211
212 /* If this input file was an as-needed entry, and wasn't found to be
213 needed at the stage it was linked, then don't say we have loaded it. */
214 if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
215 return;
216
217 if (bfd_stat (s->the_bfd, &st) != 0)
218 {
219 einfo (_("%P: %pB: bfd_stat failed: %E\n"), s->the_bfd);
220 return;
221 }
222
223 /* Some operating systems, e.g. Windows, do not provide a meaningful
224 st_ino; they always set it to zero. (Windows does provide a
225 meaningful st_dev.) Do not indicate a duplicate library in that
226 case. While there is no guarantee that a system that provides
227 meaningful inode numbers will never set st_ino to zero, this is
228 merely an optimization, so we do not need to worry about false
229 negatives. */
230 if (st.st_dev == global_stat.st_dev
231 && st.st_ino == global_stat.st_ino
232 && st.st_ino != 0)
233 {
234 global_found = s;
235 return;
236 }
237
238 /* We issue a warning if it looks like we are including two
239 different versions of the same shared library. For example,
240 there may be a problem if -lc picks up libc.so.6 but some other
241 shared library has a DT_NEEDED entry of libc.so.5. This is a
242 heuristic test, and it will only work if the name looks like
243 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
244 If we really want to issue warnings about mixing version numbers
245 of shared libraries, we need to find a better way. */
246
247 if (strchr (global_needed->name, '/') != NULL)
248 return;
249 suffix = strstr (global_needed->name, ".so.");
250 if (suffix == NULL)
251 return;
252 suffix += sizeof ".so." - 1;
253
254 soname = bfd_elf_get_dt_soname (s->the_bfd);
255 if (soname == NULL)
256 soname = lbasename (s->filename);
257
258 if (filename_ncmp (soname, global_needed->name,
259 suffix - global_needed->name) == 0)
260 einfo (_("%P: warning: %s, needed by %pB, may conflict with %s\n"),
261 global_needed->name, global_needed->by, soname);
262 }
263
264 /* This function is called for each possible name for a dynamic object
265 named by a DT_NEEDED entry. The FORCE parameter indicates whether
266 to skip the check for a conflicting version. */
267
268 static bool
269 ldelf_try_needed (struct dt_needed *needed, int force, int is_linux)
270 {
271 bfd *abfd;
272 const char *name = needed->name;
273 const char *soname;
274 int link_class;
275
276 abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
277 if (abfd == NULL)
278 {
279 if (verbose)
280 info_msg (_("attempt to open %s failed\n"), name);
281 return false;
282 }
283
284 track_dependency_files (name);
285
286 /* Linker needs to decompress sections. */
287 abfd->flags |= BFD_DECOMPRESS;
288
289 if (! bfd_check_format (abfd, bfd_object))
290 {
291 bfd_close (abfd);
292 return false;
293 }
294 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
295 {
296 bfd_close (abfd);
297 return false;
298 }
299
300 /* For DT_NEEDED, they have to match. */
301 if (abfd->xvec != link_info.output_bfd->xvec)
302 {
303 bfd_close (abfd);
304 return false;
305 }
306
307 /* Check whether this object would include any conflicting library
308 versions. If FORCE is set, then we skip this check; we use this
309 the second time around, if we couldn't find any compatible
310 instance of the shared library. */
311
312 if (!force)
313 {
314 struct bfd_link_needed_list *needs;
315
316 if (! bfd_elf_get_bfd_needed_list (abfd, &needs))
317 einfo (_("%F%P: %pB: bfd_elf_get_bfd_needed_list failed: %E\n"), abfd);
318
319 if (needs != NULL)
320 {
321 global_vercheck_needed = needs;
322 global_vercheck_failed = false;
323 lang_for_each_input_file (ldelf_vercheck);
324 if (global_vercheck_failed)
325 {
326 bfd_close (abfd);
327 /* Return FALSE to force the caller to move on to try
328 another file on the search path. */
329 return false;
330 }
331
332 /* But wait! It gets much worse. On Linux, if a shared
333 library does not use libc at all, we are supposed to skip
334 it the first time around in case we encounter a shared
335 library later on with the same name which does use the
336 version of libc that we want. This is much too horrible
337 to use on any system other than Linux. */
338 if (is_linux)
339 {
340 struct bfd_link_needed_list *l;
341
342 for (l = needs; l != NULL; l = l->next)
343 if (startswith (l->name, "libc.so"))
344 break;
345 if (l == NULL)
346 {
347 bfd_close (abfd);
348 return false;
349 }
350 }
351 }
352 }
353
354 /* We've found a dynamic object matching the DT_NEEDED entry. */
355
356 /* We have already checked that there is no other input file of the
357 same name. We must now check again that we are not including the
358 same file twice. We need to do this because on many systems
359 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
360 reference libc.so.1. If we have already included libc.so, we
361 don't want to include libc.so.1 if they are the same file, and we
362 can only check that using stat. */
363
364 if (bfd_stat (abfd, &global_stat) != 0)
365 einfo (_("%F%P: %pB: bfd_stat failed: %E\n"), abfd);
366
367 /* First strip off everything before the last '/'. */
368 soname = lbasename (bfd_get_filename (abfd));
369
370 if (verbose)
371 info_msg (_("found %s at %s\n"), soname, name);
372
373 global_found = NULL;
374 lang_for_each_input_file (ldelf_stat_needed);
375 if (global_found != NULL)
376 {
377 /* Return TRUE to indicate that we found the file, even though
378 we aren't going to do anything with it. */
379 return true;
380 }
381
382 /* Specify the soname to use. */
383 bfd_elf_set_dt_needed_name (abfd, soname);
384
385 /* Tell the ELF linker that we don't want the output file to have a
386 DT_NEEDED entry for this file, unless it is used to resolve
387 references in a regular object. */
388 link_class = DYN_DT_NEEDED;
389
390 /* Tell the ELF linker that we don't want the output file to have a
391 DT_NEEDED entry for this file at all if the entry is from a file
392 with DYN_NO_ADD_NEEDED. */
393 if (needed->by != NULL
394 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
395 link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
396
397 bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
398
399 *link_info.input_bfds_tail = abfd;
400 link_info.input_bfds_tail = &abfd->link.next;
401
402 /* Add this file into the symbol table. */
403 if (! bfd_link_add_symbols (abfd, &link_info))
404 einfo (_("%F%P: %pB: error adding symbols: %E\n"), abfd);
405
406 return true;
407 }
408
409 /* Search for a needed file in a path. */
410
411 static bool
412 ldelf_search_needed (const char *path, struct dt_needed *n, int force,
413 int is_linux, int elfsize)
414 {
415 const char *s;
416 const char *name = n->name;
417 size_t len;
418 struct dt_needed needed;
419
420 if (name[0] == '/')
421 return ldelf_try_needed (n, force, is_linux);
422
423 if (path == NULL || *path == '\0')
424 return false;
425
426 needed.by = n->by;
427 needed.name = n->name;
428
429 len = strlen (name);
430 while (1)
431 {
432 unsigned offset = 0;
433 char * var;
434 char *filename, *sset;
435
436 s = strchr (path, config.rpath_separator);
437 if (s == NULL)
438 s = path + strlen (path);
439
440 #if HAVE_DOS_BASED_FILE_SYSTEM
441 /* Assume a match on the second char is part of drive specifier. */
442 else if (config.rpath_separator == ':'
443 && s == path + 1
444 && ISALPHA (*path))
445 {
446 s = strchr (s + 1, config.rpath_separator);
447 if (s == NULL)
448 s = path + strlen (path);
449 }
450 #endif
451 filename = (char *) xmalloc (s - path + len + 2);
452 if (s == path)
453 sset = filename;
454 else
455 {
456 memcpy (filename, path, s - path);
457 filename[s - path] = '/';
458 sset = filename + (s - path) + 1;
459 }
460 strcpy (sset, name);
461
462 /* PR 20535: Support the same pseudo-environment variables that
463 are supported by ld.so. Namely, $ORIGIN, $LIB and $PLATFORM.
464 Since there can be more than one occurrence of these tokens in
465 the path we loop until no more are found. Since we might not
466 be able to substitute some of the tokens we maintain an offset
467 into the filename for where we should begin our scan. */
468 while ((var = strchr (filename + offset, '$')) != NULL)
469 {
470 /* The ld.so manual page does not say, but I am going to assume that
471 these tokens are terminated by a directory separator character
472 (/) or the end of the string. There is also an implication that
473 $ORIGIN should only be used at the start of a path, but that is
474 not enforced here.
475
476 The ld.so manual page also states that it allows ${ORIGIN},
477 ${LIB} and ${PLATFORM}, so these are supported as well.
478
479 FIXME: The code could be a lot cleverer about allocating space
480 for the processed string. */
481 char * end = strchr (var, '/');
482 const char *replacement = NULL;
483 char * v = var + 1;
484 char * freeme = NULL;
485 unsigned flen = strlen (filename);
486
487 if (end != NULL)
488 /* Temporarily terminate the filename at the end of the token. */
489 * end = 0;
490
491 if (*v == '{')
492 ++ v;
493 switch (*v++)
494 {
495 case 'O':
496 if (strcmp (v, "RIGIN") == 0 || strcmp (v, "RIGIN}") == 0)
497 {
498 /* ORIGIN - replace with the full path to the directory
499 containing the program or shared object. */
500 if (needed.by == NULL)
501 {
502 if (link_info.output_bfd == NULL)
503 {
504 break;
505 }
506 else
507 replacement = bfd_get_filename (link_info.output_bfd);
508 }
509 else
510 replacement = bfd_get_filename (needed.by);
511
512 if (replacement)
513 {
514 char * slash;
515
516 if (replacement[0] == '/')
517 freeme = xstrdup (replacement);
518 else
519 {
520 char * current_dir = getpwd ();
521
522 freeme = xmalloc (strlen (replacement)
523 + strlen (current_dir) + 2);
524 sprintf (freeme, "%s/%s", current_dir, replacement);
525 }
526
527 replacement = freeme;
528 if ((slash = strrchr (replacement, '/')) != NULL)
529 * slash = 0;
530 }
531 }
532 break;
533
534 case 'L':
535 if (strcmp (v, "IB") == 0 || strcmp (v, "IB}") == 0)
536 {
537 /* LIB - replace with "lib" in 32-bit environments
538 and "lib64" in 64-bit environments. */
539
540 switch (elfsize)
541 {
542 case 32: replacement = "lib"; break;
543 case 64: replacement = "lib64"; break;
544 default:
545 abort ();
546 }
547 }
548 break;
549
550 case 'P':
551 /* Supporting $PLATFORM in a cross-hosted environment is not
552 possible. Supporting it in a native environment involves
553 loading the <sys/auxv.h> header file which loads the
554 system <elf.h> header file, which conflicts with the
555 "include/elf/mips.h" header file. */
556 /* Fall through. */
557 default:
558 break;
559 }
560
561 if (replacement)
562 {
563 char * filename2 = xmalloc (flen + strlen (replacement));
564
565 if (end)
566 {
567 sprintf (filename2, "%.*s%s/%s",
568 (int)(var - filename), filename,
569 replacement, end + 1);
570 offset = (var - filename) + 1 + strlen (replacement);
571 }
572 else
573 {
574 sprintf (filename2, "%.*s%s",
575 (int)(var - filename), filename,
576 replacement);
577 offset = var - filename + strlen (replacement);
578 }
579
580 free (filename);
581 filename = filename2;
582 /* There is no need to restore the path separator (when
583 end != NULL) as we have replaced the entire string. */
584 }
585 else
586 {
587 if (verbose)
588 /* We only issue an "unrecognised" message in verbose mode
589 as the $<foo> token might be a legitimate component of
590 a path name in the target's file system. */
591 info_msg (_("unrecognised or unsupported token "
592 "'%s' in search path\n"), var);
593 if (end)
594 /* Restore the path separator. */
595 * end = '/';
596
597 /* PR 20784: Make sure that we resume the scan *after*
598 the token that we could not replace. */
599 offset = (var + 1) - filename;
600 }
601
602 free (freeme);
603 }
604
605 needed.name = filename;
606
607 if (ldelf_try_needed (&needed, force, is_linux))
608 return true;
609
610 free (filename);
611
612 if (*s == '\0')
613 break;
614 path = s + 1;
615 }
616
617 return false;
618 }
619
620 /* Prefix the sysroot to absolute paths in PATH, a string containing
621 paths separated by config.rpath_separator. If running on a DOS
622 file system, paths containing a drive spec won't have the sysroot
623 prefix added, unless the sysroot also specifies the same drive. */
624
625 static const char *
626 ldelf_add_sysroot (const char *path)
627 {
628 size_t len, extra;
629 const char *p;
630 char *ret, *q;
631 int dos_drive_sysroot = HAS_DRIVE_SPEC (ld_sysroot);
632
633 len = strlen (ld_sysroot);
634 for (extra = 0, p = path; ; )
635 {
636 int dos_drive = HAS_DRIVE_SPEC (p);
637
638 if (dos_drive)
639 p += 2;
640 if (IS_DIR_SEPARATOR (*p)
641 && (!dos_drive
642 || (dos_drive_sysroot
643 && ld_sysroot[0] == p[-2])))
644 {
645 if (dos_drive && dos_drive_sysroot)
646 extra += len - 2;
647 else
648 extra += len;
649 }
650 p = strchr (p, config.rpath_separator);
651 if (!p)
652 break;
653 ++p;
654 }
655
656 ret = xmalloc (strlen (path) + extra + 1);
657
658 for (q = ret, p = path; ; )
659 {
660 const char *end;
661 int dos_drive = HAS_DRIVE_SPEC (p);
662
663 if (dos_drive)
664 {
665 *q++ = *p++;
666 *q++ = *p++;
667 }
668 if (IS_DIR_SEPARATOR (*p)
669 && (!dos_drive
670 || (dos_drive_sysroot
671 && ld_sysroot[0] == p[-2])))
672 {
673 if (dos_drive && dos_drive_sysroot)
674 {
675 strcpy (q, ld_sysroot + 2);
676 q += len - 2;
677 }
678 else
679 {
680 strcpy (q, ld_sysroot);
681 q += len;
682 }
683 }
684 end = strchr (p, config.rpath_separator);
685 if (end)
686 {
687 size_t n = end - p + 1;
688 strncpy (q, p, n);
689 q += n;
690 p += n;
691 }
692 else
693 {
694 strcpy (q, p);
695 break;
696 }
697 }
698
699 return ret;
700 }
701
702 /* Read the system search path the FreeBSD way rather than the Linux way. */
703 #ifdef HAVE_ELF_HINTS_H
704 #include <elf-hints.h>
705 #else
706 #include "elf-hints-local.h"
707 #endif
708
709 static bool
710 ldelf_check_ld_elf_hints (const struct bfd_link_needed_list *l, int force,
711 int elfsize)
712 {
713 static bool initialized;
714 static const char *ld_elf_hints;
715 struct dt_needed needed;
716
717 if (!initialized)
718 {
719 FILE *f;
720 char *tmppath;
721
722 tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
723 f = fopen (tmppath, FOPEN_RB);
724 free (tmppath);
725 if (f != NULL)
726 {
727 struct elfhints_hdr hdr;
728
729 if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
730 && hdr.magic == ELFHINTS_MAGIC
731 && hdr.version == 1)
732 {
733 if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
734 {
735 char *b;
736
737 b = xmalloc (hdr.dirlistlen + 1);
738 if (fread (b, 1, hdr.dirlistlen + 1, f) ==
739 hdr.dirlistlen + 1)
740 ld_elf_hints = ldelf_add_sysroot (b);
741
742 free (b);
743 }
744 }
745 fclose (f);
746 }
747
748 initialized = true;
749 }
750
751 if (ld_elf_hints == NULL)
752 return false;
753
754 needed.by = l->by;
755 needed.name = l->name;
756 return ldelf_search_needed (ld_elf_hints, &needed, force, false, elfsize);
757 }
758
759 /* For a native linker, check the file /etc/ld.so.conf for directories
760 in which we may find shared libraries. /etc/ld.so.conf is really
761 only meaningful on Linux. */
762
763 struct ldelf_ld_so_conf
764 {
765 char *path;
766 size_t len, alloc;
767 };
768
769 static bool
770 ldelf_parse_ld_so_conf (struct ldelf_ld_so_conf *, const char *);
771
772 static void
773 ldelf_parse_ld_so_conf_include (struct ldelf_ld_so_conf *info,
774 const char *filename,
775 const char *pattern)
776 {
777 char *newp = NULL;
778 #ifdef HAVE_GLOB
779 glob_t gl;
780 #endif
781
782 if (pattern[0] != '/')
783 {
784 char *p = strrchr (filename, '/');
785 size_t patlen = strlen (pattern) + 1;
786
787 newp = xmalloc (p - filename + 1 + patlen);
788 memcpy (newp, filename, p - filename + 1);
789 memcpy (newp + (p - filename + 1), pattern, patlen);
790 pattern = newp;
791 }
792
793 #ifdef HAVE_GLOB
794 if (glob (pattern, 0, NULL, &gl) == 0)
795 {
796 size_t i;
797
798 for (i = 0; i < gl.gl_pathc; ++i)
799 ldelf_parse_ld_so_conf (info, gl.gl_pathv[i]);
800 globfree (&gl);
801 }
802 #else
803 /* If we do not have glob, treat the pattern as a literal filename. */
804 ldelf_parse_ld_so_conf (info, pattern);
805 #endif
806
807 free (newp);
808 }
809
810 static bool
811 ldelf_parse_ld_so_conf (struct ldelf_ld_so_conf *info, const char *filename)
812 {
813 FILE *f = fopen (filename, FOPEN_RT);
814 char *line;
815 size_t linelen;
816
817 if (f == NULL)
818 return false;
819
820 linelen = 256;
821 line = xmalloc (linelen);
822 do
823 {
824 char *p = line, *q;
825
826 /* Normally this would use getline(3), but we need to be portable. */
827 while ((q = fgets (p, linelen - (p - line), f)) != NULL
828 && strlen (q) == linelen - (p - line) - 1
829 && line[linelen - 2] != '\n')
830 {
831 line = xrealloc (line, 2 * linelen);
832 p = line + linelen - 1;
833 linelen += linelen;
834 }
835
836 if (q == NULL && p == line)
837 break;
838
839 p = strchr (line, '\n');
840 if (p)
841 *p = '\0';
842
843 /* Because the file format does not know any form of quoting we
844 can search forward for the next '#' character and if found
845 make it terminating the line. */
846 p = strchr (line, '#');
847 if (p)
848 *p = '\0';
849
850 /* Remove leading whitespace. NUL is no whitespace character. */
851 p = line;
852 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
853 ++p;
854
855 /* If the line is blank it is ignored. */
856 if (p[0] == '\0')
857 continue;
858
859 if (startswith (p, "include") && (p[7] == ' ' || p[7] == '\t'))
860 {
861 char *dir, c;
862 p += 8;
863 do
864 {
865 while (*p == ' ' || *p == '\t')
866 ++p;
867
868 if (*p == '\0')
869 break;
870
871 dir = p;
872
873 while (*p != ' ' && *p != '\t' && *p)
874 ++p;
875
876 c = *p;
877 *p++ = '\0';
878 if (dir[0] != '\0')
879 ldelf_parse_ld_so_conf_include (info, filename, dir);
880 }
881 while (c != '\0');
882 }
883 else
884 {
885 char *dir = p;
886 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
887 && *p != '\r' && *p != '\v')
888 ++p;
889
890 while (p != dir && p[-1] == '/')
891 --p;
892 if (info->path == NULL)
893 {
894 info->alloc = p - dir + 1 + 256;
895 info->path = xmalloc (info->alloc);
896 info->len = 0;
897 }
898 else
899 {
900 if (info->len + 1 + (p - dir) >= info->alloc)
901 {
902 info->alloc += p - dir + 256;
903 info->path = xrealloc (info->path, info->alloc);
904 }
905 info->path[info->len++] = config.rpath_separator;
906 }
907 memcpy (info->path + info->len, dir, p - dir);
908 info->len += p - dir;
909 info->path[info->len] = '\0';
910 }
911 }
912 while (! feof (f));
913 free (line);
914 fclose (f);
915 return true;
916 }
917
918 static bool
919 ldelf_check_ld_so_conf (const struct bfd_link_needed_list *l, int force,
920 int elfsize, const char *prefix)
921 {
922 static bool initialized;
923 static const char *ld_so_conf;
924 struct dt_needed needed;
925
926 if (! initialized)
927 {
928 char *tmppath;
929 struct ldelf_ld_so_conf info;
930
931 info.path = NULL;
932 info.len = info.alloc = 0;
933 tmppath = concat (ld_sysroot, prefix, "/etc/ld.so.conf",
934 (const char *) NULL);
935 if (!ldelf_parse_ld_so_conf (&info, tmppath))
936 {
937 free (tmppath);
938 tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
939 (const char *) NULL);
940 ldelf_parse_ld_so_conf (&info, tmppath);
941 }
942 free (tmppath);
943
944 if (info.path)
945 {
946 ld_so_conf = ldelf_add_sysroot (info.path);
947 free (info.path);
948 }
949 initialized = true;
950 }
951
952 if (ld_so_conf == NULL)
953 return false;
954
955
956 needed.by = l->by;
957 needed.name = l->name;
958 return ldelf_search_needed (ld_so_conf, &needed, force, true, elfsize);
959 }
960
961 /* See if an input file matches a DT_NEEDED entry by name. */
962
963 static void
964 ldelf_check_needed (lang_input_statement_type *s)
965 {
966 const char *soname;
967
968 /* Stop looking if we've found a loaded lib. */
969 if (global_found != NULL
970 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
971 & DYN_AS_NEEDED) == 0)
972 return;
973
974 if (s->filename == NULL || s->the_bfd == NULL)
975 return;
976
977 /* Don't look for a second non-loaded as-needed lib. */
978 if (global_found != NULL
979 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
980 return;
981
982 if (filename_cmp (s->filename, global_needed->name) == 0)
983 {
984 global_found = s;
985 return;
986 }
987
988 if (s->flags.search_dirs)
989 {
990 const char *f = strrchr (s->filename, '/');
991 if (f != NULL
992 && filename_cmp (f + 1, global_needed->name) == 0)
993 {
994 global_found = s;
995 return;
996 }
997 }
998
999 soname = bfd_elf_get_dt_soname (s->the_bfd);
1000 if (soname != NULL
1001 && filename_cmp (soname, global_needed->name) == 0)
1002 {
1003 global_found = s;
1004 return;
1005 }
1006 }
1007
1008 /* This is called after all the input files have been opened. */
1009
1010 void
1011 ldelf_after_open (int use_libpath, int native, int is_linux, int is_freebsd,
1012 int elfsize, const char *prefix)
1013 {
1014 struct bfd_link_needed_list *needed, *l;
1015 struct elf_link_hash_table *htab;
1016 asection *s;
1017 bfd *abfd;
1018 bfd **save_input_bfd_tail;
1019
1020 after_open_default ();
1021
1022 htab = elf_hash_table (&link_info);
1023 if (!is_elf_hash_table (&htab->root))
1024 return;
1025
1026 if (command_line.out_implib_filename)
1027 {
1028 unlink_if_ordinary (command_line.out_implib_filename);
1029 link_info.out_implib_bfd
1030 = bfd_openw (command_line.out_implib_filename,
1031 bfd_get_target (link_info.output_bfd));
1032
1033 if (link_info.out_implib_bfd == NULL)
1034 {
1035 einfo (_("%F%P: %s: can't open for writing: %E\n"),
1036 command_line.out_implib_filename);
1037 }
1038 }
1039
1040 if (ldelf_emit_note_gnu_build_id != NULL)
1041 {
1042 /* Find an ELF input. */
1043 for (abfd = link_info.input_bfds;
1044 abfd != (bfd *) NULL; abfd = abfd->link.next)
1045 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1046 && bfd_count_sections (abfd) != 0
1047 && !bfd_input_just_syms (abfd))
1048 break;
1049
1050 /* PR 10555: If there are no ELF input files do not try to
1051 create a .note.gnu-build-id section. */
1052 if (abfd == NULL
1053 || !ldelf_setup_build_id (abfd))
1054 {
1055 free ((char *) ldelf_emit_note_gnu_build_id);
1056 ldelf_emit_note_gnu_build_id = NULL;
1057 }
1058 }
1059
1060 get_elf_backend_data (link_info.output_bfd)->setup_gnu_properties (&link_info);
1061
1062 /* Do not allow executable files to be used as inputs to the link. */
1063 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1064 {
1065 /* Discard input .note.gnu.build-id sections. */
1066 s = bfd_get_section_by_name (abfd, ".note.gnu.build-id");
1067 while (s != NULL)
1068 {
1069 if (s != elf_tdata (link_info.output_bfd)->o->build_id.sec)
1070 s->flags |= SEC_EXCLUDE;
1071 s = bfd_get_next_section_by_name (NULL, s);
1072 }
1073
1074 if (abfd->xvec->flavour == bfd_target_elf_flavour
1075 && !bfd_input_just_syms (abfd)
1076 && elf_tdata (abfd) != NULL
1077 /* FIXME: Maybe check for other non-supportable types as well ? */
1078 && (elf_tdata (abfd)->elf_header->e_type == ET_EXEC
1079 || (elf_tdata (abfd)->elf_header->e_type == ET_DYN
1080 && elf_tdata (abfd)->is_pie)))
1081 einfo (_("%F%P: cannot use executable file '%pB' as input to a link\n"),
1082 abfd);
1083 }
1084
1085 if (bfd_link_relocatable (&link_info))
1086 {
1087 if (link_info.execstack == !link_info.noexecstack)
1088 {
1089 /* PR ld/16744: If "-z [no]execstack" has been specified on the
1090 command line and we are perfoming a relocatable link then no
1091 PT_GNU_STACK segment will be created and so the
1092 linkinfo.[no]execstack values set in _handle_option() will have no
1093 effect. Instead we create a .note.GNU-stack section in much the
1094 same way as the assembler does with its --[no]execstack option. */
1095 flagword flags = SEC_READONLY | (link_info.execstack ? SEC_CODE : 0);
1096 (void) bfd_make_section_with_flags (link_info.input_bfds,
1097 ".note.GNU-stack", flags);
1098 }
1099 return;
1100 }
1101
1102 if (!link_info.traditional_format)
1103 {
1104 bfd *elfbfd = NULL;
1105 bool warn_eh_frame = false;
1106 int seen_type = 0;
1107
1108 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1109 {
1110 int type = 0;
1111
1112 if (bfd_input_just_syms (abfd))
1113 continue;
1114
1115 for (s = abfd->sections; s && type < COMPACT_EH_HDR; s = s->next)
1116 {
1117 const char *name = bfd_section_name (s);
1118
1119 if (bfd_is_abs_section (s->output_section))
1120 continue;
1121 if (startswith (name, ".eh_frame_entry"))
1122 type = COMPACT_EH_HDR;
1123 else if (strcmp (name, ".eh_frame") == 0 && s->size > 8)
1124 type = DWARF2_EH_HDR;
1125 }
1126
1127 if (type != 0)
1128 {
1129 if (seen_type == 0)
1130 {
1131 seen_type = type;
1132 }
1133 else if (seen_type != type)
1134 {
1135 einfo (_("%F%P: compact frame descriptions incompatible with"
1136 " DWARF2 .eh_frame from %pB\n"),
1137 type == DWARF2_EH_HDR ? abfd : elfbfd);
1138 break;
1139 }
1140
1141 if (!elfbfd
1142 && (type == COMPACT_EH_HDR
1143 || link_info.eh_frame_hdr_type != 0))
1144 {
1145 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1146 elfbfd = abfd;
1147
1148 warn_eh_frame = true;
1149 }
1150 }
1151
1152 if (seen_type == COMPACT_EH_HDR)
1153 link_info.eh_frame_hdr_type = COMPACT_EH_HDR;
1154 }
1155 if (elfbfd)
1156 {
1157 const struct elf_backend_data *bed;
1158
1159 bed = get_elf_backend_data (elfbfd);
1160 s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1161 bed->dynamic_sec_flags
1162 | SEC_READONLY);
1163 if (s != NULL
1164 && bfd_set_section_alignment (s, 2))
1165 {
1166 htab->eh_info.hdr_sec = s;
1167 warn_eh_frame = false;
1168 }
1169 }
1170 if (warn_eh_frame)
1171 einfo (_("%P: warning: cannot create .eh_frame_hdr section,"
1172 " --eh-frame-hdr ignored\n"));
1173 }
1174
1175 /* Get the list of files which appear in DT_NEEDED entries in
1176 dynamic objects included in the link (often there will be none).
1177 For each such file, we want to track down the corresponding
1178 library, and include the symbol table in the link. This is what
1179 the runtime dynamic linker will do. Tracking the files down here
1180 permits one dynamic object to include another without requiring
1181 special action by the person doing the link. Note that the
1182 needed list can actually grow while we are stepping through this
1183 loop. */
1184 save_input_bfd_tail = link_info.input_bfds_tail;
1185 needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1186 for (l = needed; l != NULL; l = l->next)
1187 {
1188 struct bfd_link_needed_list *ll;
1189 struct dt_needed n, nn;
1190 int force;
1191
1192 /* If the lib that needs this one was --as-needed and wasn't
1193 found to be needed, then this lib isn't needed either. */
1194 if (l->by != NULL
1195 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1196 continue;
1197
1198 /* Skip the lib if --no-copy-dt-needed-entries and
1199 --allow-shlib-undefined is in effect. */
1200 if (l->by != NULL
1201 && link_info.unresolved_syms_in_shared_libs == RM_IGNORE
1202 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_NO_ADD_NEEDED) != 0)
1203 continue;
1204
1205 /* If we've already seen this file, skip it. */
1206 for (ll = needed; ll != l; ll = ll->next)
1207 if ((ll->by == NULL
1208 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1209 && strcmp (ll->name, l->name) == 0)
1210 break;
1211 if (ll != l)
1212 continue;
1213
1214 /* See if this file was included in the link explicitly. */
1215 global_needed = l;
1216 global_found = NULL;
1217 lang_for_each_input_file (ldelf_check_needed);
1218 if (global_found != NULL
1219 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1220 & DYN_AS_NEEDED) == 0)
1221 continue;
1222
1223 n.by = l->by;
1224 n.name = l->name;
1225 nn.by = l->by;
1226 if (verbose)
1227 info_msg (_("%s needed by %pB\n"), l->name, l->by);
1228
1229 /* As-needed libs specified on the command line (or linker script)
1230 take priority over libs found in search dirs. */
1231 if (global_found != NULL)
1232 {
1233 nn.name = global_found->filename;
1234 if (ldelf_try_needed (&nn, true, is_linux))
1235 continue;
1236 }
1237
1238 /* We need to find this file and include the symbol table. We
1239 want to search for the file in the same way that the dynamic
1240 linker will search. That means that we want to use
1241 rpath_link, rpath, then the environment variable
1242 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1243 entries (native only), then the linker script LIB_SEARCH_DIRS.
1244 We do not search using the -L arguments.
1245
1246 We search twice. The first time, we skip objects which may
1247 introduce version mismatches. The second time, we force
1248 their use. See ldelf_vercheck comment. */
1249 for (force = 0; force < 2; force++)
1250 {
1251 size_t len;
1252 search_dirs_type *search;
1253 const char *path;
1254 struct bfd_link_needed_list *rp;
1255 int found;
1256
1257 if (ldelf_search_needed (command_line.rpath_link, &n, force,
1258 is_linux, elfsize))
1259 break;
1260
1261 if (use_libpath)
1262 {
1263 path = command_line.rpath;
1264 if (path)
1265 {
1266 path = ldelf_add_sysroot (path);
1267 found = ldelf_search_needed (path, &n, force,
1268 is_linux, elfsize);
1269 free ((char *) path);
1270 if (found)
1271 break;
1272 }
1273 }
1274 if (native)
1275 {
1276 if (command_line.rpath_link == NULL
1277 && command_line.rpath == NULL)
1278 {
1279 path = (const char *) getenv ("LD_RUN_PATH");
1280 if (path
1281 && ldelf_search_needed (path, &n, force,
1282 is_linux, elfsize))
1283 break;
1284 }
1285 path = (const char *) getenv ("LD_LIBRARY_PATH");
1286 if (path
1287 && ldelf_search_needed (path, &n, force,
1288 is_linux, elfsize))
1289 break;
1290 }
1291 if (use_libpath)
1292 {
1293 found = 0;
1294 rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1295 for (; !found && rp != NULL; rp = rp->next)
1296 {
1297 path = ldelf_add_sysroot (rp->name);
1298 found = (rp->by == l->by
1299 && ldelf_search_needed (path, &n, force,
1300 is_linux, elfsize));
1301 free ((char *) path);
1302 }
1303 if (found)
1304 break;
1305
1306 if (is_freebsd
1307 && ldelf_check_ld_elf_hints (l, force, elfsize))
1308 break;
1309
1310 if (is_linux
1311 && ldelf_check_ld_so_conf (l, force, elfsize, prefix))
1312 break;
1313 }
1314
1315 len = strlen (l->name);
1316 for (search = search_head; search != NULL; search = search->next)
1317 {
1318 char *filename;
1319
1320 if (search->cmdline)
1321 continue;
1322 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1323 sprintf (filename, "%s/%s", search->name, l->name);
1324 nn.name = filename;
1325 if (ldelf_try_needed (&nn, force, is_linux))
1326 break;
1327 free (filename);
1328 }
1329 if (search != NULL)
1330 break;
1331 }
1332
1333 if (force < 2)
1334 continue;
1335
1336 einfo (_("%P: warning: %s, needed by %pB, not found "
1337 "(try using -rpath or -rpath-link)\n"),
1338 l->name, l->by);
1339 }
1340
1341 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1342 if (bfd_get_format (abfd) == bfd_object
1343 && ((abfd->flags) & DYNAMIC) != 0
1344 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
1345 && (elf_dyn_lib_class (abfd) & (DYN_AS_NEEDED | DYN_NO_NEEDED)) == 0
1346 && elf_dt_name (abfd) != NULL)
1347 {
1348 if (bfd_elf_add_dt_needed_tag (abfd, &link_info) < 0)
1349 einfo (_("%F%P: failed to add DT_NEEDED dynamic tag\n"));
1350 }
1351
1352 link_info.input_bfds_tail = save_input_bfd_tail;
1353 *save_input_bfd_tail = NULL;
1354
1355 if (link_info.eh_frame_hdr_type == COMPACT_EH_HDR)
1356 if (!bfd_elf_parse_eh_frame_entries (NULL, &link_info))
1357 einfo (_("%F%P: failed to parse EH frame entries\n"));
1358 }
1359
1360 static bfd_size_type
1361 id_note_section_size (bfd *abfd ATTRIBUTE_UNUSED)
1362 {
1363 const char *style = ldelf_emit_note_gnu_build_id;
1364 bfd_size_type size;
1365 bfd_size_type build_id_size;
1366
1367 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
1368 size = (size + 3) & -(bfd_size_type) 4;
1369
1370 build_id_size = compute_build_id_size (style);
1371 if (build_id_size)
1372 size += build_id_size;
1373 else
1374 size = 0;
1375
1376 return size;
1377 }
1378
1379 static bool
1380 write_build_id (bfd *abfd)
1381 {
1382 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1383 struct elf_obj_tdata *t = elf_tdata (abfd);
1384 const char *style;
1385 asection *asec;
1386 Elf_Internal_Shdr *i_shdr;
1387 unsigned char *contents, *id_bits;
1388 bfd_size_type size;
1389 file_ptr position;
1390 Elf_External_Note *e_note;
1391
1392 style = t->o->build_id.style;
1393 asec = t->o->build_id.sec;
1394 if (bfd_is_abs_section (asec->output_section))
1395 {
1396 einfo (_("%P: warning: .note.gnu.build-id section discarded,"
1397 " --build-id ignored\n"));
1398 return true;
1399 }
1400 i_shdr = &elf_section_data (asec->output_section)->this_hdr;
1401
1402 if (i_shdr->contents == NULL)
1403 {
1404 if (asec->contents == NULL)
1405 asec->contents = (unsigned char *) xmalloc (asec->size);
1406 contents = asec->contents;
1407 }
1408 else
1409 contents = i_shdr->contents + asec->output_offset;
1410
1411 e_note = (Elf_External_Note *) contents;
1412 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
1413 size = (size + 3) & -(bfd_size_type) 4;
1414 id_bits = contents + size;
1415 size = asec->size - size;
1416
1417 /* Clear the build ID field. */
1418 memset (id_bits, 0, size);
1419
1420 bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
1421 bfd_h_put_32 (abfd, size, &e_note->descsz);
1422 bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
1423 memcpy (e_note->name, "GNU", sizeof "GNU");
1424
1425 generate_build_id (abfd, style, bed->s->checksum_contents, id_bits, size);
1426
1427 position = i_shdr->sh_offset + asec->output_offset;
1428 size = asec->size;
1429 return (bfd_seek (abfd, position, SEEK_SET) == 0
1430 && bfd_bwrite (contents, size, abfd) == size);
1431 }
1432
1433 /* Make .note.gnu.build-id section, and set up elf_tdata->build_id. */
1434
1435 bool
1436 ldelf_setup_build_id (bfd *ibfd)
1437 {
1438 asection *s;
1439 bfd_size_type size;
1440 flagword flags;
1441
1442 size = id_note_section_size (ibfd);
1443 if (size == 0)
1444 {
1445 einfo (_("%P: warning: unrecognized --build-id style ignored\n"));
1446 return false;
1447 }
1448
1449 flags = (SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY
1450 | SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA);
1451 s = bfd_make_section_anyway_with_flags (ibfd, ".note.gnu.build-id",
1452 flags);
1453 if (s != NULL && bfd_set_section_alignment (s, 2))
1454 {
1455 struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1456 t->o->build_id.after_write_object_contents = &write_build_id;
1457 t->o->build_id.style = ldelf_emit_note_gnu_build_id;
1458 t->o->build_id.sec = s;
1459 elf_section_type (s) = SHT_NOTE;
1460 s->size = size;
1461 return true;
1462 }
1463
1464 einfo (_("%P: warning: cannot create .note.gnu.build-id section,"
1465 " --build-id ignored\n"));
1466 return false;
1467 }
1468
1469 /* Look through an expression for an assignment statement. */
1470
1471 static void
1472 ldelf_find_exp_assignment (etree_type *exp)
1473 {
1474 bool provide = false;
1475
1476 switch (exp->type.node_class)
1477 {
1478 case etree_provide:
1479 case etree_provided:
1480 provide = true;
1481 /* Fallthru */
1482 case etree_assign:
1483 /* We call record_link_assignment even if the symbol is defined.
1484 This is because if it is defined by a dynamic object, we
1485 actually want to use the value defined by the linker script,
1486 not the value from the dynamic object (because we are setting
1487 symbols like etext). If the symbol is defined by a regular
1488 object, then, as it happens, calling record_link_assignment
1489 will do no harm. */
1490 if (strcmp (exp->assign.dst, ".") != 0)
1491 {
1492 if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1493 &link_info,
1494 exp->assign.dst, provide,
1495 exp->assign.hidden))
1496 einfo (_("%F%P: failed to record assignment to %s: %E\n"),
1497 exp->assign.dst);
1498 }
1499 ldelf_find_exp_assignment (exp->assign.src);
1500 break;
1501
1502 case etree_binary:
1503 ldelf_find_exp_assignment (exp->binary.lhs);
1504 ldelf_find_exp_assignment (exp->binary.rhs);
1505 break;
1506
1507 case etree_trinary:
1508 ldelf_find_exp_assignment (exp->trinary.cond);
1509 ldelf_find_exp_assignment (exp->trinary.lhs);
1510 ldelf_find_exp_assignment (exp->trinary.rhs);
1511 break;
1512
1513 case etree_unary:
1514 ldelf_find_exp_assignment (exp->unary.child);
1515 break;
1516
1517 default:
1518 break;
1519 }
1520 }
1521
1522 /* This is called by the before_allocation routine via
1523 lang_for_each_statement. It locates any assignment statements, and
1524 tells the ELF backend about them, in case they are assignments to
1525 symbols which are referred to by dynamic objects. */
1526
1527 static void
1528 ldelf_find_statement_assignment (lang_statement_union_type *s)
1529 {
1530 if (s->header.type == lang_assignment_statement_enum)
1531 ldelf_find_exp_assignment (s->assignment_statement.exp);
1532 }
1533
1534 /* Used by before_allocation and handle_option. */
1535
1536 void
1537 ldelf_append_to_separated_string (char **to, char *op_arg)
1538 {
1539 if (*to == NULL)
1540 *to = xstrdup (op_arg);
1541 else
1542 {
1543 size_t to_len = strlen (*to);
1544 size_t op_arg_len = strlen (op_arg);
1545 char *buf;
1546 char *cp = *to;
1547
1548 /* First see whether OPTARG is already in the path. */
1549 do
1550 {
1551 if (strncmp (op_arg, cp, op_arg_len) == 0
1552 && (cp[op_arg_len] == 0
1553 || cp[op_arg_len] == config.rpath_separator))
1554 /* We found it. */
1555 break;
1556
1557 /* Not yet found. */
1558 cp = strchr (cp, config.rpath_separator);
1559 if (cp != NULL)
1560 ++cp;
1561 }
1562 while (cp != NULL);
1563
1564 if (cp == NULL)
1565 {
1566 buf = xmalloc (to_len + op_arg_len + 2);
1567 sprintf (buf, "%s%c%s", *to,
1568 config.rpath_separator, op_arg);
1569 free (*to);
1570 *to = buf;
1571 }
1572 }
1573 }
1574
1575 /* This is called after the sections have been attached to output
1576 sections, but before any sizes or addresses have been set. */
1577
1578 void
1579 ldelf_before_allocation (char *audit, char *depaudit,
1580 const char *default_interpreter_name)
1581 {
1582 const char *rpath;
1583 asection *sinterp;
1584 bfd *abfd;
1585 struct bfd_link_hash_entry *ehdr_start = NULL;
1586 unsigned char ehdr_start_save_type = 0;
1587 char ehdr_start_save_u[sizeof ehdr_start->u
1588 - sizeof ehdr_start->u.def.next] = "";
1589
1590 if (is_elf_hash_table (link_info.hash))
1591 {
1592 _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1593
1594 /* Make __ehdr_start hidden if it has been referenced, to
1595 prevent the symbol from being dynamic. */
1596 if (!bfd_link_relocatable (&link_info))
1597 {
1598 struct elf_link_hash_table *htab = elf_hash_table (&link_info);
1599 struct elf_link_hash_entry *h
1600 = elf_link_hash_lookup (htab, "__ehdr_start", false, false, true);
1601
1602 /* Only adjust the export class if the symbol was referenced
1603 and not defined, otherwise leave it alone. */
1604 if (h != NULL
1605 && (h->root.type == bfd_link_hash_new
1606 || h->root.type == bfd_link_hash_undefined
1607 || h->root.type == bfd_link_hash_undefweak
1608 || h->root.type == bfd_link_hash_common))
1609 {
1610 /* Don't leave the symbol undefined. Undefined hidden
1611 symbols typically won't have dynamic relocations, but
1612 we most likely will need dynamic relocations for
1613 __ehdr_start if we are building a PIE or shared
1614 library. */
1615 ehdr_start = &h->root;
1616 ehdr_start_save_type = ehdr_start->type;
1617 memcpy (ehdr_start_save_u,
1618 (char *) &ehdr_start->u + sizeof ehdr_start->u.def.next,
1619 sizeof ehdr_start_save_u);
1620 ehdr_start->type = bfd_link_hash_defined;
1621 /* It will be converted to section-relative later. */
1622 ehdr_start->u.def.section = bfd_abs_section_ptr;
1623 ehdr_start->u.def.value = 0;
1624 }
1625 }
1626
1627 /* If we are going to make any variable assignments, we need to
1628 let the ELF backend know about them in case the variables are
1629 referred to by dynamic objects. */
1630 lang_for_each_statement (ldelf_find_statement_assignment);
1631 }
1632
1633 /* Let the ELF backend work out the sizes of any sections required
1634 by dynamic linking. */
1635 rpath = command_line.rpath;
1636 if (rpath == NULL)
1637 rpath = (const char *) getenv ("LD_RUN_PATH");
1638
1639 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1640 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1641 {
1642 const char *audit_libs = elf_dt_audit (abfd);
1643
1644 /* If the input bfd contains an audit entry, we need to add it as
1645 a dep audit entry. */
1646 if (audit_libs && *audit_libs != '\0')
1647 {
1648 char *cp = xstrdup (audit_libs);
1649 do
1650 {
1651 int more = 0;
1652 char *cp2 = strchr (cp, config.rpath_separator);
1653
1654 if (cp2)
1655 {
1656 *cp2 = '\0';
1657 more = 1;
1658 }
1659
1660 if (cp != NULL && *cp != '\0')
1661 ldelf_append_to_separated_string (&depaudit, cp);
1662
1663 cp = more ? ++cp2 : NULL;
1664 }
1665 while (cp != NULL);
1666 }
1667 }
1668
1669 if (! (bfd_elf_size_dynamic_sections
1670 (link_info.output_bfd, command_line.soname, rpath,
1671 command_line.filter_shlib, audit, depaudit,
1672 (const char * const *) command_line.auxiliary_filters,
1673 &link_info, &sinterp)))
1674 einfo (_("%F%P: failed to set dynamic section sizes: %E\n"));
1675
1676 if (sinterp != NULL)
1677 {
1678 /* Let the user override the dynamic linker we are using. */
1679 if (command_line.interpreter != NULL)
1680 default_interpreter_name = command_line.interpreter;
1681 if (default_interpreter_name != NULL)
1682 {
1683 sinterp->contents = (bfd_byte *) default_interpreter_name;
1684 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1685 }
1686 }
1687
1688 /* Look for any sections named .gnu.warning. As a GNU extensions,
1689 we treat such sections as containing warning messages. We print
1690 out the warning message, and then zero out the section size so
1691 that it does not get copied into the output file. */
1692
1693 {
1694 LANG_FOR_EACH_INPUT_STATEMENT (is)
1695 {
1696 asection *s;
1697 bfd_size_type sz;
1698 char *msg;
1699
1700 if (is->flags.just_syms)
1701 continue;
1702
1703 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1704 if (s == NULL)
1705 continue;
1706
1707 sz = s->size;
1708 msg = (char *) xmalloc ((size_t) (sz + 1));
1709 if (! bfd_get_section_contents (is->the_bfd, s, msg,
1710 (file_ptr) 0, sz))
1711 einfo (_("%F%P: %pB: can't read contents of section .gnu.warning: %E\n"),
1712 is->the_bfd);
1713 msg[sz] = '\0';
1714 (*link_info.callbacks->warning) (&link_info, msg,
1715 (const char *) NULL, is->the_bfd,
1716 (asection *) NULL, (bfd_vma) 0);
1717 free (msg);
1718
1719 /* Clobber the section size, so that we don't waste space
1720 copying the warning into the output file. If we've already
1721 sized the output section, adjust its size. The adjustment
1722 is on rawsize because targets that size sections early will
1723 have called lang_reset_memory_regions after sizing. */
1724 if (s->output_section != NULL
1725 && s->output_section->rawsize >= s->size)
1726 s->output_section->rawsize -= s->size;
1727
1728 s->size = 0;
1729
1730 /* Also set SEC_EXCLUDE, so that local symbols defined in the
1731 warning section don't get copied to the output. */
1732 s->flags |= SEC_EXCLUDE | SEC_KEEP;
1733 }
1734 }
1735
1736 before_allocation_default ();
1737
1738 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1739 einfo (_("%F%P: failed to set dynamic section sizes: %E\n"));
1740
1741 if (ehdr_start != NULL)
1742 {
1743 /* If we twiddled __ehdr_start to defined earlier, put it back
1744 as it was. */
1745 ehdr_start->type = ehdr_start_save_type;
1746 memcpy ((char *) &ehdr_start->u + sizeof ehdr_start->u.def.next,
1747 ehdr_start_save_u,
1748 sizeof ehdr_start_save_u);
1749 }
1750 }
1751 /* Try to open a dynamic archive. This is where we know that ELF
1752 dynamic libraries have an extension of .so (or .sl on oddball systems
1753 like hpux). */
1754
1755 bool
1756 ldelf_open_dynamic_archive (const char *arch, search_dirs_type *search,
1757 lang_input_statement_type *entry)
1758 {
1759 const char *filename;
1760 char *string;
1761 size_t len;
1762 bool opened = false;
1763
1764 if (! entry->flags.maybe_archive)
1765 return false;
1766
1767 filename = entry->filename;
1768 len = strlen (search->name) + strlen (filename);
1769 if (entry->flags.full_name_provided)
1770 {
1771 len += sizeof "/";
1772 string = (char *) xmalloc (len);
1773 sprintf (string, "%s/%s", search->name, filename);
1774 }
1775 else
1776 {
1777 size_t xlen = 0;
1778
1779 len += strlen (arch) + sizeof "/lib.so";
1780 #ifdef EXTRA_SHLIB_EXTENSION
1781 xlen = (strlen (EXTRA_SHLIB_EXTENSION) > 3
1782 ? strlen (EXTRA_SHLIB_EXTENSION) - 3
1783 : 0);
1784 #endif
1785 string = (char *) xmalloc (len + xlen);
1786 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1787 #ifdef EXTRA_SHLIB_EXTENSION
1788 /* Try the .so extension first. If that fails build a new filename
1789 using EXTRA_SHLIB_EXTENSION. */
1790 opened = ldfile_try_open_bfd (string, entry);
1791 if (!opened)
1792 strcpy (string + len - 4, EXTRA_SHLIB_EXTENSION);
1793 #endif
1794 }
1795
1796 if (!opened && !ldfile_try_open_bfd (string, entry))
1797 {
1798 free (string);
1799 return false;
1800 }
1801
1802 entry->filename = string;
1803
1804 /* We have found a dynamic object to include in the link. The ELF
1805 backend linker will create a DT_NEEDED entry in the .dynamic
1806 section naming this file. If this file includes a DT_SONAME
1807 entry, it will be used. Otherwise, the ELF linker will just use
1808 the name of the file. For an archive found by searching, like
1809 this one, the DT_NEEDED entry should consist of just the name of
1810 the file, without the path information used to find it. Note
1811 that we only need to do this if we have a dynamic object; an
1812 archive will never be referenced by a DT_NEEDED entry.
1813
1814 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1815 very pretty. I haven't been able to think of anything that is
1816 pretty, though. */
1817 if (bfd_check_format (entry->the_bfd, bfd_object)
1818 && (entry->the_bfd->flags & DYNAMIC) != 0)
1819 {
1820 ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
1821
1822 /* Rather than duplicating the logic above. Just use the
1823 filename we recorded earlier. */
1824
1825 if (!entry->flags.full_name_provided)
1826 filename = lbasename (entry->filename);
1827 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1828 }
1829
1830 return true;
1831 }
1832
1833 /* A variant of lang_output_section_find used by place_orphan. */
1834
1835 static lang_output_section_statement_type *
1836 output_rel_find (int isdyn, int rela)
1837 {
1838 lang_output_section_statement_type *lookup;
1839 lang_output_section_statement_type *last = NULL;
1840 lang_output_section_statement_type *last_alloc = NULL;
1841 lang_output_section_statement_type *last_ro_alloc = NULL;
1842 lang_output_section_statement_type *last_rel = NULL;
1843 lang_output_section_statement_type *last_rel_alloc = NULL;
1844
1845 for (lookup = (void *) lang_os_list.head;
1846 lookup != NULL;
1847 lookup = lookup->next)
1848 {
1849 if (lookup->constraint >= 0
1850 && startswith (lookup->name, ".rel"))
1851 {
1852 int lookrela = lookup->name[4] == 'a';
1853
1854 /* .rel.dyn must come before all other reloc sections, to suit
1855 GNU ld.so. */
1856 if (isdyn)
1857 break;
1858
1859 /* Don't place after .rel.plt as doing so results in wrong
1860 dynamic tags. */
1861 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1862 break;
1863
1864 if (rela == lookrela || last_rel == NULL)
1865 last_rel = lookup;
1866 if ((rela == lookrela || last_rel_alloc == NULL)
1867 && lookup->bfd_section != NULL
1868 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1869 last_rel_alloc = lookup;
1870 }
1871
1872 last = lookup;
1873 if (lookup->bfd_section != NULL
1874 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1875 {
1876 last_alloc = lookup;
1877 if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1878 last_ro_alloc = lookup;
1879 }
1880 }
1881
1882 if (last_rel_alloc)
1883 return last_rel_alloc;
1884
1885 if (last_rel)
1886 return last_rel;
1887
1888 if (last_ro_alloc)
1889 return last_ro_alloc;
1890
1891 if (last_alloc)
1892 return last_alloc;
1893
1894 return last;
1895 }
1896
1897 /* Return whether IN is suitable to be part of OUT. */
1898
1899 static bool
1900 elf_orphan_compatible (asection *in, asection *out)
1901 {
1902 /* Non-zero sh_info implies a section with SHF_INFO_LINK with
1903 unknown semantics for the generic linker, or a SHT_REL/SHT_RELA
1904 section where sh_info specifies a symbol table. (We won't see
1905 SHT_GROUP, SHT_SYMTAB or SHT_DYNSYM sections here.) We clearly
1906 can't merge SHT_REL/SHT_RELA using differing symbol tables, and
1907 shouldn't merge sections with differing unknown semantics. */
1908 if (elf_section_data (out)->this_hdr.sh_info
1909 != elf_section_data (in)->this_hdr.sh_info)
1910 return false;
1911 /* We can't merge with a member of an output section group or merge
1912 two sections with differing SHF_EXCLUDE or other processor and OS
1913 specific flags when doing a relocatable link. */
1914 if (bfd_link_relocatable (&link_info)
1915 && (elf_next_in_group (out) != NULL
1916 || ((elf_section_flags (out) ^ elf_section_flags (in))
1917 & (SHF_MASKPROC | SHF_MASKOS)) != 0))
1918 return false;
1919 return _bfd_elf_match_sections_by_type (link_info.output_bfd, out,
1920 in->owner, in);
1921 }
1922
1923 /* Place an orphan section. We use this to put random SHF_ALLOC
1924 sections in the right segment. */
1925
1926 lang_output_section_statement_type *
1927 ldelf_place_orphan (asection *s, const char *secname, int constraint)
1928 {
1929 static struct orphan_save hold[] =
1930 {
1931 { ".text",
1932 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1933 0, 0, 0, 0 },
1934 { ".rodata",
1935 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1936 0, 0, 0, 0 },
1937 { ".tdata",
1938 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_THREAD_LOCAL,
1939 0, 0, 0, 0 },
1940 { ".data",
1941 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1942 0, 0, 0, 0 },
1943 { ".bss",
1944 SEC_ALLOC,
1945 0, 0, 0, 0 },
1946 { 0,
1947 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1948 0, 0, 0, 0 },
1949 { ".interp",
1950 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1951 0, 0, 0, 0 },
1952 { ".sdata",
1953 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1954 0, 0, 0, 0 },
1955 { ".comment",
1956 SEC_HAS_CONTENTS,
1957 0, 0, 0, 0 },
1958 };
1959 enum orphan_save_index
1960 {
1961 orphan_text = 0,
1962 orphan_rodata,
1963 orphan_tdata,
1964 orphan_data,
1965 orphan_bss,
1966 orphan_rel,
1967 orphan_interp,
1968 orphan_sdata,
1969 orphan_nonalloc
1970 };
1971 static int orphan_init_done = 0;
1972 struct orphan_save *place;
1973 lang_output_section_statement_type *after;
1974 lang_output_section_statement_type *os;
1975 lang_output_section_statement_type *match_by_name = NULL;
1976 int isdyn = 0;
1977 int elfinput = s->owner->xvec->flavour == bfd_target_elf_flavour;
1978 int elfoutput = link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour;
1979 unsigned int sh_type = elfinput ? elf_section_type (s) : SHT_NULL;
1980 flagword flags;
1981 asection *nexts;
1982
1983 if (!bfd_link_relocatable (&link_info)
1984 && link_info.combreloc
1985 && (s->flags & SEC_ALLOC))
1986 {
1987 if (elfinput)
1988 switch (sh_type)
1989 {
1990 case SHT_RELA:
1991 secname = ".rela.dyn";
1992 isdyn = 1;
1993 break;
1994 case SHT_REL:
1995 secname = ".rel.dyn";
1996 isdyn = 1;
1997 break;
1998 default:
1999 break;
2000 }
2001 else if (startswith (secname, ".rel"))
2002 {
2003 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
2004 isdyn = 1;
2005 }
2006 }
2007
2008 if (!bfd_link_relocatable (&link_info)
2009 && elfinput
2010 && elfoutput
2011 && (s->flags & SEC_ALLOC) != 0
2012 && (elf_tdata (s->owner)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0
2013 && (elf_section_flags (s) & SHF_GNU_MBIND) != 0)
2014 {
2015 /* Find the output mbind section with the same type, attributes
2016 and sh_info field. */
2017 for (os = (void *) lang_os_list.head;
2018 os != NULL;
2019 os = os->next)
2020 if (os->bfd_section != NULL
2021 && !bfd_is_abs_section (os->bfd_section)
2022 && (elf_section_flags (os->bfd_section) & SHF_GNU_MBIND) != 0
2023 && ((s->flags & (SEC_ALLOC
2024 | SEC_LOAD
2025 | SEC_HAS_CONTENTS
2026 | SEC_READONLY
2027 | SEC_CODE))
2028 == (os->bfd_section->flags & (SEC_ALLOC
2029 | SEC_LOAD
2030 | SEC_HAS_CONTENTS
2031 | SEC_READONLY
2032 | SEC_CODE)))
2033 && (elf_section_data (os->bfd_section)->this_hdr.sh_info
2034 == elf_section_data (s)->this_hdr.sh_info))
2035 {
2036 lang_add_section (&os->children, s, NULL, NULL, os);
2037 return os;
2038 }
2039
2040 /* Create the output mbind section with the ".mbind." prefix
2041 in section name. */
2042 if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2043 secname = ".mbind.bss";
2044 else if ((s->flags & SEC_READONLY) == 0)
2045 secname = ".mbind.data";
2046 else if ((s->flags & SEC_CODE) == 0)
2047 secname = ".mbind.rodata";
2048 else
2049 secname = ".mbind.text";
2050 elf_tdata (link_info.output_bfd)->has_gnu_osabi |= elf_gnu_osabi_mbind;
2051 }
2052
2053 /* Look through the script to see where to place this section. The
2054 script includes entries added by previous lang_insert_orphan
2055 calls, so this loop puts multiple compatible orphans of the same
2056 name into a single output section. */
2057 if (constraint == 0)
2058 for (os = lang_output_section_find (secname);
2059 os != NULL;
2060 os = next_matching_output_section_statement (os, 0))
2061 {
2062 /* If we don't match an existing output section, tell
2063 lang_insert_orphan to create a new output section. */
2064 constraint = SPECIAL;
2065
2066 /* Check to see if we already have an output section statement
2067 with this name, and its bfd section has compatible flags.
2068 If the section already exists but does not have any flags
2069 set, then it has been created by the linker, possibly as a
2070 result of a --section-start command line switch. */
2071 if (os->bfd_section != NULL
2072 && (os->bfd_section->flags == 0
2073 || (((s->flags ^ os->bfd_section->flags)
2074 & (SEC_LOAD | SEC_ALLOC)) == 0
2075 && (!elfinput
2076 || !elfoutput
2077 || elf_orphan_compatible (s, os->bfd_section)))))
2078 {
2079 lang_add_section (&os->children, s, NULL, NULL, os);
2080 return os;
2081 }
2082
2083 /* Save unused output sections in case we can match them
2084 against orphans later. */
2085 if (os->bfd_section == NULL)
2086 match_by_name = os;
2087 }
2088
2089 /* If we didn't match an active output section, see if we matched an
2090 unused one and use that. */
2091 if (match_by_name)
2092 {
2093 lang_add_section (&match_by_name->children, s, NULL, NULL, match_by_name);
2094 return match_by_name;
2095 }
2096
2097 if (!orphan_init_done)
2098 {
2099 struct orphan_save *ho;
2100
2101 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
2102 if (ho->name != NULL)
2103 {
2104 ho->os = lang_output_section_find (ho->name);
2105 if (ho->os != NULL && ho->os->flags == 0)
2106 ho->os->flags = ho->flags;
2107 }
2108 orphan_init_done = 1;
2109 }
2110
2111 /* If this is a final link, then always put .gnu.warning.SYMBOL
2112 sections into the .text section to get them out of the way. */
2113 if (bfd_link_executable (&link_info)
2114 && startswith (s->name, ".gnu.warning.")
2115 && hold[orphan_text].os != NULL)
2116 {
2117 os = hold[orphan_text].os;
2118 lang_add_section (&os->children, s, NULL, NULL, os);
2119 return os;
2120 }
2121
2122 flags = s->flags;
2123 if (!bfd_link_relocatable (&link_info))
2124 {
2125 nexts = s;
2126 while ((nexts = bfd_get_next_section_by_name (nexts->owner, nexts))
2127 != NULL)
2128 if (nexts->output_section == NULL
2129 && (nexts->flags & SEC_EXCLUDE) == 0
2130 && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0
2131 && (nexts->owner->flags & DYNAMIC) == 0
2132 && !bfd_input_just_syms (nexts->owner)
2133 && _bfd_elf_match_sections_by_type (nexts->owner, nexts,
2134 s->owner, s))
2135 flags = (((flags ^ SEC_READONLY)
2136 | (nexts->flags ^ SEC_READONLY))
2137 ^ SEC_READONLY);
2138 }
2139
2140 /* Decide which segment the section should go in based on the
2141 section name and section flags. We put loadable .note sections
2142 right after the .interp section, so that the PT_NOTE segment is
2143 stored right after the program headers where the OS can read it
2144 in the first page. */
2145
2146 place = NULL;
2147 if ((flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
2148 place = &hold[orphan_nonalloc];
2149 else if ((flags & SEC_ALLOC) == 0)
2150 ;
2151 else if ((flags & SEC_LOAD) != 0
2152 && (elfinput
2153 ? sh_type == SHT_NOTE
2154 : startswith (secname, ".note")))
2155 place = &hold[orphan_interp];
2156 else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0)
2157 place = &hold[orphan_bss];
2158 else if ((flags & SEC_SMALL_DATA) != 0)
2159 place = &hold[orphan_sdata];
2160 else if ((flags & SEC_THREAD_LOCAL) != 0)
2161 place = &hold[orphan_tdata];
2162 else if ((flags & SEC_READONLY) == 0)
2163 place = &hold[orphan_data];
2164 else if ((flags & SEC_LOAD) != 0
2165 && (elfinput
2166 ? sh_type == SHT_RELA || sh_type == SHT_REL
2167 : startswith (secname, ".rel")))
2168 place = &hold[orphan_rel];
2169 else if ((flags & SEC_CODE) == 0)
2170 place = &hold[orphan_rodata];
2171 else
2172 place = &hold[orphan_text];
2173
2174 after = NULL;
2175 if (place != NULL)
2176 {
2177 if (place->os == NULL)
2178 {
2179 if (place->name != NULL)
2180 place->os = lang_output_section_find (place->name);
2181 else
2182 {
2183 int rela = elfinput ? sh_type == SHT_RELA : secname[4] == 'a';
2184 place->os = output_rel_find (isdyn, rela);
2185 }
2186 }
2187 after = place->os;
2188 if (after == NULL)
2189 after
2190 = lang_output_section_find_by_flags (s, flags, &place->os,
2191 _bfd_elf_match_sections_by_type);
2192 if (after == NULL)
2193 /* *ABS* is always the first output section statement. */
2194 after = (void *) lang_os_list.head;
2195 }
2196
2197 return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
2198 }
2199
2200 void
2201 ldelf_before_place_orphans (void)
2202 {
2203 bfd *abfd;
2204
2205 for (abfd = link_info.input_bfds;
2206 abfd != (bfd *) NULL; abfd = abfd->link.next)
2207 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2208 && bfd_count_sections (abfd) != 0
2209 && !bfd_input_just_syms (abfd))
2210 {
2211 asection *isec;
2212 for (isec = abfd->sections; isec != NULL; isec = isec->next)
2213 {
2214 /* Discard a section if any of its linked-to section has
2215 been discarded. */
2216 asection *linked_to_sec;
2217 for (linked_to_sec = elf_linked_to_section (isec);
2218 linked_to_sec != NULL && !linked_to_sec->linker_mark;
2219 linked_to_sec = elf_linked_to_section (linked_to_sec))
2220 {
2221 if (discarded_section (linked_to_sec))
2222 {
2223 isec->output_section = bfd_abs_section_ptr;
2224 isec->flags |= SEC_EXCLUDE;
2225 break;
2226 }
2227 linked_to_sec->linker_mark = 1;
2228 }
2229 for (linked_to_sec = elf_linked_to_section (isec);
2230 linked_to_sec != NULL && linked_to_sec->linker_mark;
2231 linked_to_sec = elf_linked_to_section (linked_to_sec))
2232 linked_to_sec->linker_mark = 0;
2233 }
2234 }
2235 }
2236
2237 void
2238 ldelf_set_output_arch (void)
2239 {
2240 set_output_arch_default ();
2241 if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour)
2242 elf_link_info (link_info.output_bfd) = &link_info;
2243 }