Abort if input format is ARM and output format is not
[deliverable/binutils-gdb.git] / ld / emultempl / armelf.em
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 ELFSIZE=32
4 cat >e${EMULATION_NAME}.c <<EOF
5 /* This file is is generated by a shell script. DO NOT EDIT! */
6
7 /* emulate the original gld for the given ${EMULATION_NAME}
8 Copyright (C) 1991, 93, 96, 97, 98, 1999 Free Software Foundation, Inc.
9 Written by Steve Chamberlain steve@cygnus.com
10
11 This file is part of GLD, the Gnu Linker.
12
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26
27 #define TARGET_IS_${EMULATION_NAME}
28
29 #include "bfd.h"
30 #include "sysdep.h"
31 #include "bfdlink.h"
32 #include "getopt.h"
33
34 #include "ld.h"
35 #include "ldmain.h"
36 #include "ldemul.h"
37 #include "ldfile.h"
38 #include "ldmisc.h"
39
40 #include "ldexp.h"
41 #include "ldlang.h"
42 #include "ldgram.h"
43
44 static boolean gld${EMULATION_NAME}_open_dynamic_archive
45 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
46 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
47 static void gld${EMULATION_NAME}_check_needed
48 PARAMS ((lang_input_statement_type *));
49 static void gld${EMULATION_NAME}_stat_needed
50 PARAMS ((lang_input_statement_type *));
51 static boolean gld${EMULATION_NAME}_search_needed
52 PARAMS ((const char *, const char *, int));
53 static boolean gld${EMULATION_NAME}_try_needed PARAMS ((const char *, int));
54 static void gld${EMULATION_NAME}_vercheck
55 PARAMS ((lang_input_statement_type *));
56 static void gld${EMULATION_NAME}_find_statement_assignment
57 PARAMS ((lang_statement_union_type *));
58 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
59 static boolean gld${EMULATION_NAME}_place_orphan
60 PARAMS ((lang_input_statement_type *, asection *));
61 static void gld${EMULATION_NAME}_place_section
62 PARAMS ((lang_statement_union_type *));
63 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
64 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
65 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
66 static int gld${EMULATION_NAME}_parse_args PARAMS((int, char **));
67 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE *));
68 static void gld_${EMULATION_NAME}_finish PARAMS ((void));
69
70 \f
71 static int no_pipeline_knowledge = 0;
72 static char * thumb_entry_symbol = NULL;
73
74 #define OPTION_THUMB_ENTRY 301
75
76 static struct option longopts[] =
77 {
78 { "no-pipeline-knowledge", no_argument, NULL, 'p'},
79 { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
80 { NULL, no_argument, NULL, 0 }
81 };
82
83 static void
84 gld${EMULATION_NAME}_list_options (file)
85 FILE * file;
86 {
87 fprintf (file, _(" -p --no-pipeline-knowledge Stop the linker knowing about the pipeline length\n"));
88 fprintf (file, _(" --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym>\n"));
89 }
90
91 static int
92 gld${EMULATION_NAME}_parse_args (argc, argv)
93 int argc;
94 char ** argv;
95 {
96 int longind;
97 int optc;
98 int prevoptind = optind;
99 int prevopterr = opterr;
100 int wanterror;
101 static int lastoptind = -1;
102
103 if (lastoptind != optind)
104 opterr = 0;
105
106 wanterror = opterr;
107 lastoptind = optind;
108
109 optc = getopt_long_only (argc, argv, "-p", longopts, & longind);
110 opterr = prevopterr;
111
112 switch (optc)
113 {
114 default:
115 if (wanterror)
116 xexit (1);
117 optind = prevoptind;
118 return 0;
119
120 case 'p':
121 no_pipeline_knowledge = 1;
122 break;
123
124 case OPTION_THUMB_ENTRY:
125 thumb_entry_symbol = optarg;
126 break;
127 }
128
129 return 1;
130 }
131 \f
132
133 static void
134 gld${EMULATION_NAME}_before_parse ()
135 {
136 #ifndef TARGET_ /* I.e., if not generic. */
137 ldfile_set_output_arch ("`echo ${ARCH}`");
138 #endif /* not TARGET_ */
139 config.dynamic_link = ${DYNAMIC_LINK-true};
140 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
141 }
142
143 /* Try to open a dynamic archive. This is where we know that ELF
144 dynamic libraries have an extension of .so. */
145
146 static boolean
147 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
148 const char *arch;
149 search_dirs_type *search;
150 lang_input_statement_type *entry;
151 {
152 const char *filename;
153 char *string;
154
155 if (! entry->is_archive)
156 return false;
157
158 filename = entry->filename;
159
160 string = (char *) xmalloc (strlen (search->name)
161 + strlen (filename)
162 + strlen (arch)
163 + sizeof "/lib.so");
164
165 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
166
167 if (! ldfile_try_open_bfd (string, entry))
168 {
169 free (string);
170 return false;
171 }
172
173 entry->filename = string;
174
175 /* We have found a dynamic object to include in the link. The ELF
176 backend linker will create a DT_NEEDED entry in the .dynamic
177 section naming this file. If this file includes a DT_SONAME
178 entry, it will be used. Otherwise, the ELF linker will just use
179 the name of the file. For an archive found by searching, like
180 this one, the DT_NEEDED entry should consist of just the name of
181 the file, without the path information used to find it. Note
182 that we only need to do this if we have a dynamic object; an
183 archive will never be referenced by a DT_NEEDED entry.
184
185 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
186 very pretty. I haven't been able to think of anything that is
187 pretty, though. */
188 if (bfd_check_format (entry->the_bfd, bfd_object)
189 && (entry->the_bfd->flags & DYNAMIC) != 0)
190 {
191 char *needed_name;
192
193 ASSERT (entry->is_archive && entry->search_dirs_flag);
194 needed_name = (char *) xmalloc (strlen (filename)
195 + strlen (arch)
196 + sizeof "lib.so");
197 sprintf (needed_name, "lib%s%s.so", filename, arch);
198 bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
199 }
200
201 return true;
202 }
203
204 EOF
205 if [ "x${host}" = "x${target}" ] ; then
206 case " ${EMULATION_LIBPATH} " in
207 *" ${EMULATION_NAME} "*)
208 cat >>e${EMULATION_NAME}.c <<EOF
209
210 /* For a native linker, check the file /etc/ld.so.conf for directories
211 in which we may find shared libraries. /etc/ld.so.conf is really
212 only meaningful on Linux, but we check it on other systems anyhow. */
213
214 static boolean gld${EMULATION_NAME}_check_ld_so_conf
215 PARAMS ((const char *, int));
216
217 static boolean
218 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
219 const char *name;
220 int force;
221 {
222 static boolean initialized;
223 static char *ld_so_conf;
224
225 if (! initialized)
226 {
227 FILE *f;
228
229 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
230 if (f != NULL)
231 {
232 char *b;
233 size_t len, alloc;
234 int c;
235
236 len = 0;
237 alloc = 100;
238 b = (char *) xmalloc (alloc);
239
240 while ((c = getc (f)) != EOF)
241 {
242 if (len + 1 >= alloc)
243 {
244 alloc *= 2;
245 b = (char *) xrealloc (b, alloc);
246 }
247 if (c != ':'
248 && c != ' '
249 && c != '\t'
250 && c != '\n'
251 && c != ',')
252 {
253 b[len] = c;
254 ++len;
255 }
256 else
257 {
258 if (len > 0 && b[len - 1] != ':')
259 {
260 b[len] = ':';
261 ++len;
262 }
263 }
264 }
265
266 if (len > 0 && b[len - 1] == ':')
267 --len;
268
269 if (len > 0)
270 b[len] = '\0';
271 else
272 {
273 free (b);
274 b = NULL;
275 }
276
277 fclose (f);
278
279 ld_so_conf = b;
280 }
281
282 initialized = true;
283 }
284
285 if (ld_so_conf == NULL)
286 return false;
287
288 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
289 }
290
291 EOF
292 ;;
293 esac
294 fi
295 cat >>e${EMULATION_NAME}.c <<EOF
296
297 /* These variables are required to pass information back and forth
298 between after_open and check_needed and stat_needed and vercheck. */
299
300 static struct bfd_link_needed_list *global_needed;
301 static struct stat global_stat;
302 static boolean global_found;
303 static struct bfd_link_needed_list *global_vercheck_needed;
304 static boolean global_vercheck_failed;
305
306 static void
307 gld${EMULATION_NAME}_after_open ()
308 {
309 struct bfd_link_needed_list *needed, *l;
310
311 if (strstr (bfd_get_target (output_bfd), "arm") == NULL)
312 {
313 /* The arm backend needs special fields in the output hash structure.
314 These will only be created if the output format is an arm format,
315 hence we do not support linking and changing output formats at the
316 same time. Use a link followed by objcopy to change output formats. */
317 einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
318 return;
319 }
320
321 {
322 LANG_FOR_EACH_INPUT_STATEMENT (is)
323 {
324 /* The interworking bfd must be the last one to be processed */
325 if (!is->next)
326 bfd_elf32_arm_get_bfd_for_interworking (is->the_bfd, & link_info);
327 }
328 }
329
330 /* We only need to worry about this when doing a final link. */
331 if (link_info.relocateable || link_info.shared)
332 return;
333
334 /* Get the list of files which appear in DT_NEEDED entries in
335 dynamic objects included in the link (often there will be none).
336 For each such file, we want to track down the corresponding
337 library, and include the symbol table in the link. This is what
338 the runtime dynamic linker will do. Tracking the files down here
339 permits one dynamic object to include another without requiring
340 special action by the person doing the link. Note that the
341 needed list can actually grow while we are stepping through this
342 loop. */
343 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
344 for (l = needed; l != NULL; l = l->next)
345 {
346 struct bfd_link_needed_list *ll;
347 int force;
348
349 /* If we've already seen this file, skip it. */
350 for (ll = needed; ll != l; ll = ll->next)
351 if (strcmp (ll->name, l->name) == 0)
352 break;
353 if (ll != l)
354 continue;
355
356 /* See if this file was included in the link explicitly. */
357 global_needed = l;
358 global_found = false;
359 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
360 if (global_found)
361 continue;
362
363 /* We need to find this file and include the symbol table. We
364 want to search for the file in the same way that the dynamic
365 linker will search. That means that we want to use
366 rpath_link, rpath, then the environment variable
367 LD_LIBRARY_PATH (native only), then the linker script
368 LIB_SEARCH_DIRS. We do not search using the -L arguments.
369
370 We search twice. The first time, we skip objects which may
371 introduce version mismatches. The second time, we force
372 their use. See gld${EMULATION_NAME}_vercheck comment. */
373 for (force = 0; force < 2; force++)
374 {
375 const char *lib_path;
376 size_t len;
377 search_dirs_type *search;
378
379 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
380 l->name, force))
381 break;
382 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
383 l->name, force))
384 break;
385 if (command_line.rpath_link == NULL
386 && command_line.rpath == NULL)
387 {
388 lib_path = (const char *) getenv ("LD_RUN_PATH");
389 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
390 force))
391 break;
392 }
393 EOF
394 if [ "x${host}" = "x${target}" ] ; then
395 case " ${EMULATION_LIBPATH} " in
396 *" ${EMULATION_NAME} "*)
397 cat >>e${EMULATION_NAME}.c <<EOF
398 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
399 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
400 break;
401 EOF
402 ;;
403 esac
404 fi
405 cat >>e${EMULATION_NAME}.c <<EOF
406 len = strlen (l->name);
407 for (search = search_head; search != NULL; search = search->next)
408 {
409 char *filename;
410
411 if (search->cmdline)
412 continue;
413 filename = (char *) xmalloc (strlen (search->name) + len + 2);
414 sprintf (filename, "%s/%s", search->name, l->name);
415 if (gld${EMULATION_NAME}_try_needed (filename, force))
416 break;
417 free (filename);
418 }
419 if (search != NULL)
420 break;
421 EOF
422 if [ "x${host}" = "x${target}" ] ; then
423 case " ${EMULATION_LIBPATH} " in
424 *" ${EMULATION_NAME} "*)
425 cat >>e${EMULATION_NAME}.c <<EOF
426 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
427 break;
428 EOF
429 ;;
430 esac
431 fi
432 cat >>e${EMULATION_NAME}.c <<EOF
433 }
434
435 if (force < 2)
436 continue;
437
438 einfo ("%P: warning: %s, needed by %B, not found (try using --rpath)\n",
439 l->name, l->by);
440 }
441 }
442
443 /* Search for a needed file in a path. */
444
445 static boolean
446 gld${EMULATION_NAME}_search_needed (path, name, force)
447 const char *path;
448 const char *name;
449 int force;
450 {
451 const char *s;
452 size_t len;
453
454 if (path == NULL || *path == '\0')
455 return false;
456 len = strlen (name);
457 while (1)
458 {
459 char *filename, *sset;
460
461 s = strchr (path, ':');
462 if (s == NULL)
463 s = path + strlen (path);
464
465 filename = (char *) xmalloc (s - path + len + 2);
466 if (s == path)
467 sset = filename;
468 else
469 {
470 memcpy (filename, path, s - path);
471 filename[s - path] = '/';
472 sset = filename + (s - path) + 1;
473 }
474 strcpy (sset, name);
475
476 if (gld${EMULATION_NAME}_try_needed (filename, force))
477 return true;
478
479 free (filename);
480
481 if (*s == '\0')
482 break;
483 path = s + 1;
484 }
485
486 return false;
487 }
488
489 /* This function is called for each possible name for a dynamic object
490 named by a DT_NEEDED entry. The FORCE parameter indicates whether
491 to skip the check for a conflicting version. */
492
493 static boolean
494 gld${EMULATION_NAME}_try_needed (name, force)
495 const char *name;
496 int force;
497 {
498 bfd *abfd;
499
500 abfd = bfd_openr (name, bfd_get_target (output_bfd));
501 if (abfd == NULL)
502 return false;
503 if (! bfd_check_format (abfd, bfd_object))
504 {
505 (void) bfd_close (abfd);
506 return false;
507 }
508 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
509 {
510 (void) bfd_close (abfd);
511 return false;
512 }
513
514 /* Check whether this object would include any conflicting library
515 versions. If FORCE is set, then we skip this check; we use this
516 the second time around, if we couldn't find any compatible
517 instance of the shared library. */
518
519 if (! force)
520 {
521 struct bfd_link_needed_list *needed;
522
523 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
524 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
525
526 if (needed != NULL)
527 {
528 global_vercheck_needed = needed;
529 global_vercheck_failed = false;
530 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
531 if (global_vercheck_failed)
532 {
533 (void) bfd_close (abfd);
534 /* Return false to force the caller to move on to try
535 another file on the search path. */
536 return false;
537 }
538
539 /* But wait! It gets much worse. On Linux, if a shared
540 library does not use libc at all, we are supposed to skip
541 it the first time around in case we encounter a shared
542 library later on with the same name which does use the
543 version of libc that we want. This is much too horrible
544 to use on any system other than Linux. */
545
546 EOF
547 case ${target} in
548 *-*-linux-gnu*)
549 cat >>e${EMULATION_NAME}.c <<EOF
550 {
551 struct bfd_link_needed_list *l;
552
553 for (l = needed; l != NULL; l = l->next)
554 if (strncmp (l->name, "libc.so", 7) == 0)
555 break;
556 if (l == NULL)
557 {
558 (void) bfd_close (abfd);
559 return false;
560 }
561 }
562
563 EOF
564 ;;
565 esac
566 cat >>e${EMULATION_NAME}.c <<EOF
567 }
568 }
569
570 /* We've found a dynamic object matching the DT_NEEDED entry. */
571
572 /* We have already checked that there is no other input file of the
573 same name. We must now check again that we are not including the
574 same file twice. We need to do this because on many systems
575 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
576 reference libc.so.1. If we have already included libc.so, we
577 don't want to include libc.so.1 if they are the same file, and we
578 can only check that using stat. */
579
580 if (bfd_stat (abfd, &global_stat) != 0)
581 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
582 global_found = false;
583 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
584 if (global_found)
585 {
586 /* Return true to indicate that we found the file, even though
587 we aren't going to do anything with it. */
588 return true;
589 }
590
591 /* Tell the ELF backend that don't want the output file to have a
592 DT_NEEDED entry for this file. */
593 bfd_elf_set_dt_needed_name (abfd, "");
594
595 /* Add this file into the symbol table. */
596 if (! bfd_link_add_symbols (abfd, &link_info))
597 einfo ("%F%B: could not read symbols: %E\n", abfd);
598
599 return true;
600 }
601
602 /* See if an input file matches a DT_NEEDED entry by name. */
603
604 static void
605 gld${EMULATION_NAME}_check_needed (s)
606 lang_input_statement_type *s;
607 {
608 if (global_found)
609 return;
610
611 if (s->filename != NULL
612 && strcmp (s->filename, global_needed->name) == 0)
613 {
614 global_found = true;
615 return;
616 }
617
618 if (s->the_bfd != NULL)
619 {
620 const char *soname;
621
622 soname = bfd_elf_get_dt_soname (s->the_bfd);
623 if (soname != NULL
624 && strcmp (soname, global_needed->name) == 0)
625 {
626 global_found = true;
627 return;
628 }
629 }
630
631 if (s->search_dirs_flag
632 && s->filename != NULL
633 && strchr (global_needed->name, '/') == NULL)
634 {
635 const char *f;
636
637 f = strrchr (s->filename, '/');
638 if (f != NULL
639 && strcmp (f + 1, global_needed->name) == 0)
640 {
641 global_found = true;
642 return;
643 }
644 }
645 }
646
647 /* See if an input file matches a DT_NEEDED entry by running stat on
648 the file. */
649
650 static void
651 gld${EMULATION_NAME}_stat_needed (s)
652 lang_input_statement_type *s;
653 {
654 struct stat st;
655 const char *suffix;
656 const char *soname;
657 const char *f;
658
659 if (global_found)
660 return;
661 if (s->the_bfd == NULL)
662 return;
663
664 if (bfd_stat (s->the_bfd, &st) != 0)
665 {
666 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
667 return;
668 }
669
670 if (st.st_dev == global_stat.st_dev
671 && st.st_ino == global_stat.st_ino)
672 {
673 global_found = true;
674 return;
675 }
676
677 /* We issue a warning if it looks like we are including two
678 different versions of the same shared library. For example,
679 there may be a problem if -lc picks up libc.so.6 but some other
680 shared library has a DT_NEEDED entry of libc.so.5. This is a
681 hueristic test, and it will only work if the name looks like
682 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
683 If we really want to issue warnings about mixing version numbers
684 of shared libraries, we need to find a better way. */
685
686 if (strchr (global_needed->name, '/') != NULL)
687 return;
688 suffix = strstr (global_needed->name, ".so.");
689 if (suffix == NULL)
690 return;
691 suffix += sizeof ".so." - 1;
692
693 soname = bfd_elf_get_dt_soname (s->the_bfd);
694 if (soname == NULL)
695 soname = s->filename;
696
697 f = strrchr (soname, '/');
698 if (f != NULL)
699 ++f;
700 else
701 f = soname;
702
703 if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
704 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
705 global_needed->name, global_needed->by, f);
706 }
707
708 /* On Linux, it's possible to have different versions of the same
709 shared library linked against different versions of libc. The
710 dynamic linker somehow tags which libc version to use in
711 /etc/ld.so.cache, and, based on the libc that it sees in the
712 executable, chooses which version of the shared library to use.
713
714 We try to do a similar check here by checking whether this shared
715 library needs any other shared libraries which may conflict with
716 libraries we have already included in the link. If it does, we
717 skip it, and try to find another shared library farther on down the
718 link path.
719
720 This is called via lang_for_each_input_file.
721 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
722 which we ar checking. This sets GLOBAL_VERCHECK_FAILED if we find
723 a conflicting version. */
724
725 static void
726 gld${EMULATION_NAME}_vercheck (s)
727 lang_input_statement_type *s;
728 {
729 const char *soname, *f;
730 struct bfd_link_needed_list *l;
731
732 if (global_vercheck_failed)
733 return;
734 if (s->the_bfd == NULL
735 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
736 return;
737
738 soname = bfd_elf_get_dt_soname (s->the_bfd);
739 if (soname == NULL)
740 soname = bfd_get_filename (s->the_bfd);
741
742 f = strrchr (soname, '/');
743 if (f != NULL)
744 ++f;
745 else
746 f = soname;
747
748 for (l = global_vercheck_needed; l != NULL; l = l->next)
749 {
750 const char *suffix;
751
752 if (strcmp (f, l->name) == 0)
753 {
754 /* Probably can't happen, but it's an easy check. */
755 continue;
756 }
757
758 if (strchr (l->name, '/') != NULL)
759 continue;
760
761 suffix = strstr (l->name, ".so.");
762 if (suffix == NULL)
763 continue;
764
765 suffix += sizeof ".so." - 1;
766
767 if (strncmp (f, l->name, suffix - l->name) == 0)
768 {
769 /* Here we know that S is a dynamic object FOO.SO.VER1, and
770 the object we are considering needs a dynamic object
771 FOO.SO.VER2, and VER1 and VER2 are different. This
772 appears to be a version mismatch, so we tell the caller
773 to try a different version of this library. */
774 global_vercheck_failed = true;
775 return;
776 }
777 }
778 }
779
780 /* Place an orphan section. We use this to put random SHF_ALLOC
781 sections in the right segment. */
782
783 static asection *hold_section;
784 static lang_output_section_statement_type *hold_use;
785 static lang_output_section_statement_type *hold_text;
786 static lang_output_section_statement_type *hold_rodata;
787 static lang_output_section_statement_type *hold_data;
788 static lang_output_section_statement_type *hold_bss;
789 static lang_output_section_statement_type *hold_rel;
790 static lang_output_section_statement_type *hold_interp;
791
792 /*ARGSUSED*/
793 static boolean
794 gld${EMULATION_NAME}_place_orphan (file, s)
795 lang_input_statement_type *file;
796 asection *s;
797 {
798 lang_output_section_statement_type *place;
799 asection *snew, **pps;
800 lang_statement_list_type *old;
801 lang_statement_list_type add;
802 etree_type *address;
803 const char *secname, *ps;
804 const char *outsecname;
805 lang_output_section_statement_type *os;
806
807 if ((s->flags & SEC_ALLOC) == 0)
808 return false;
809
810 /* Look through the script to see where to place this section. */
811 hold_section = s;
812 hold_use = NULL;
813 lang_for_each_statement (gld${EMULATION_NAME}_place_section);
814
815 if (hold_use != NULL)
816 {
817 /* We have already placed a section with this name. */
818 wild_doit (&hold_use->children, s, hold_use, file);
819 return true;
820 }
821
822 secname = bfd_get_section_name (s->owner, s);
823
824 /* If this is a final link, then always put .gnu.warning.SYMBOL
825 sections into the .text section to get them out of the way. */
826 if (! link_info.shared
827 && ! link_info.relocateable
828 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
829 && hold_text != NULL)
830 {
831 wild_doit (&hold_text->children, s, hold_text, file);
832 return true;
833 }
834
835 /* Decide which segment the section should go in based on the
836 section name and section flags. We put loadable .note sections
837 right after the .interp section, so that the PT_NOTE segment is
838 stored right after the program headers where the OS can read it
839 in the first page. */
840 place = NULL;
841 if (s->flags & SEC_EXCLUDE)
842 return false;
843 else if ((s->flags & SEC_LOAD) != 0
844 && strncmp (secname, ".note", 4) == 0
845 && hold_interp != NULL)
846 place = hold_interp;
847 else if ((s->flags & SEC_HAS_CONTENTS) == 0
848 && hold_bss != NULL)
849 place = hold_bss;
850 else if ((s->flags & SEC_READONLY) == 0
851 && hold_data != NULL)
852 place = hold_data;
853 else if (strncmp (secname, ".rel", 4) == 0
854 && hold_rel != NULL)
855 place = hold_rel;
856 else if ((s->flags & SEC_CODE) == 0
857 && (s->flags & SEC_READONLY) != 0
858 && hold_rodata != NULL)
859 place = hold_rodata;
860 else if ((s->flags & SEC_READONLY) != 0
861 && hold_text != NULL)
862 place = hold_text;
863 if (place == NULL)
864 return false;
865
866 /* Choose a unique name for the section. This will be needed if the
867 same section name appears in the input file with different
868 loadable or allocateable characteristics. */
869 outsecname = secname;
870 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
871 {
872 unsigned int len;
873 char *newname;
874 unsigned int i;
875
876 len = strlen (outsecname);
877 newname = xmalloc (len + 5);
878 strcpy (newname, outsecname);
879 i = 0;
880 do
881 {
882 sprintf (newname + len, "%d", i);
883 ++i;
884 }
885 while (bfd_get_section_by_name (output_bfd, newname) != NULL);
886
887 outsecname = newname;
888 }
889
890 /* Create the section in the output file, and put it in the right
891 place. This shuffling is to make the output file look neater. */
892 snew = bfd_make_section (output_bfd, outsecname);
893 if (snew == NULL)
894 einfo ("%P%F: output format %s cannot represent section called %s\n",
895 output_bfd->xvec->name, outsecname);
896 if (place->bfd_section != NULL)
897 {
898 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
899 ;
900 *pps = snew->next;
901 snew->next = place->bfd_section->next;
902 place->bfd_section->next = snew;
903 }
904
905 /* Start building a list of statements for this section. */
906 old = stat_ptr;
907 stat_ptr = &add;
908 lang_list_init (stat_ptr);
909
910 /* If the name of the section is representable in C, then create
911 symbols to mark the start and the end of the section. */
912 for (ps = outsecname; *ps != '\0'; ps++)
913 if (! isalnum ((unsigned char) *ps) && *ps != '_')
914 break;
915 if (*ps == '\0' && config.build_constructors)
916 {
917 char *symname;
918
919 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
920 sprintf (symname, "__start_%s", outsecname);
921 lang_add_assignment (exp_assop ('=', symname,
922 exp_unop (ALIGN_K,
923 exp_intop ((bfd_vma) 1
924 << s->alignment_power))));
925 }
926
927 if (! link_info.relocateable)
928 address = NULL;
929 else
930 address = exp_intop ((bfd_vma) 0);
931
932 lang_enter_output_section_statement (outsecname, address, 0,
933 (bfd_vma) 0,
934 (etree_type *) NULL,
935 (etree_type *) NULL,
936 (etree_type *) NULL);
937
938 os = lang_output_section_statement_lookup (outsecname);
939 wild_doit (&os->children, s, os, file);
940
941 lang_leave_output_section_statement
942 ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL);
943 stat_ptr = &add;
944
945 if (*ps == '\0' && config.build_constructors)
946 {
947 char *symname;
948
949 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
950 sprintf (symname, "__stop_%s", outsecname);
951 lang_add_assignment (exp_assop ('=', symname,
952 exp_nameop (NAME, ".")));
953 }
954
955 /* Now stick the new statement list right after PLACE. */
956 *add.tail = place->header.next;
957 place->header.next = add.head;
958
959 stat_ptr = old;
960
961 return true;
962 }
963
964 static void
965 gld${EMULATION_NAME}_place_section (s)
966 lang_statement_union_type *s;
967 {
968 lang_output_section_statement_type *os;
969
970 if (s->header.type != lang_output_section_statement_enum)
971 return;
972
973 os = &s->output_section_statement;
974
975 if (strcmp (os->name, hold_section->name) == 0
976 && os->bfd_section != NULL
977 && ((hold_section->flags & (SEC_LOAD | SEC_ALLOC))
978 == (os->bfd_section->flags & (SEC_LOAD | SEC_ALLOC))))
979 hold_use = os;
980
981 if (strcmp (os->name, ".text") == 0)
982 hold_text = os;
983 else if (strcmp (os->name, ".rodata") == 0)
984 hold_rodata = os;
985 else if (strcmp (os->name, ".data") == 0)
986 hold_data = os;
987 else if (strcmp (os->name, ".bss") == 0)
988 hold_bss = os;
989 else if (hold_rel == NULL
990 && os->bfd_section != NULL
991 && (os->bfd_section->flags & SEC_ALLOC) != 0
992 && strncmp (os->name, ".rel", 4) == 0)
993 hold_rel = os;
994 else if (strcmp (os->name, ".interp") == 0)
995 hold_interp = os;
996 }
997
998 /* Look through an expression for an assignment statement. */
999
1000 static void
1001 gld${EMULATION_NAME}_find_exp_assignment (exp)
1002 etree_type *exp;
1003 {
1004 struct bfd_link_hash_entry *h;
1005
1006 switch (exp->type.node_class)
1007 {
1008 case etree_provide:
1009 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
1010 false, false, false);
1011 if (h == NULL)
1012 break;
1013
1014 /* We call record_link_assignment even if the symbol is defined.
1015 This is because if it is defined by a dynamic object, we
1016 actually want to use the value defined by the linker script,
1017 not the value from the dynamic object (because we are setting
1018 symbols like etext). If the symbol is defined by a regular
1019 object, then, as it happens, calling record_link_assignment
1020 will do no harm. */
1021
1022 /* Fall through. */
1023 case etree_assign:
1024 if (strcmp (exp->assign.dst, ".") != 0)
1025 {
1026 if (! (bfd_elf${ELFSIZE}_record_link_assignment
1027 (output_bfd, &link_info, exp->assign.dst,
1028 exp->type.node_class == etree_provide ? true : false)))
1029 einfo ("%P%F: failed to record assignment to %s: %E\n",
1030 exp->assign.dst);
1031 }
1032 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1033 break;
1034
1035 case etree_binary:
1036 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1037 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1038 break;
1039
1040 case etree_trinary:
1041 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1042 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1043 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1044 break;
1045
1046 case etree_unary:
1047 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1048 break;
1049
1050 default:
1051 break;
1052 }
1053 }
1054
1055 /* This is called by the before_allocation routine via
1056 lang_for_each_statement. It locates any assignment statements, and
1057 tells the ELF backend about them, in case they are assignments to
1058 symbols which are referred to by dynamic objects. */
1059
1060 static void
1061 gld${EMULATION_NAME}_find_statement_assignment (s)
1062 lang_statement_union_type *s;
1063 {
1064 if (s->header.type == lang_assignment_statement_enum)
1065 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1066 }
1067
1068 /* This is called after the sections have been attached to output
1069 sections, but before any sizes or addresses have been set. */
1070
1071 static void
1072 gld${EMULATION_NAME}_before_allocation ()
1073 {
1074 const char *rpath;
1075 asection *sinterp;
1076
1077 /* If we are going to make any variable assignments, we need to let
1078 the ELF backend know about them in case the variables are
1079 referred to by dynamic objects. */
1080 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1081
1082 /* Let the ELF backend work out the sizes of any sections required
1083 by dynamic linking. */
1084 rpath = command_line.rpath;
1085 if (rpath == NULL)
1086 rpath = (const char *) getenv ("LD_RUN_PATH");
1087 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
1088 (output_bfd, command_line.soname, rpath,
1089 command_line.export_dynamic, command_line.filter_shlib,
1090 (const char * const *) command_line.auxiliary_filters,
1091 &link_info, &sinterp, lang_elf_version_info)))
1092 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1093
1094 /* Let the user override the dynamic linker we are using. */
1095 if (command_line.interpreter != NULL
1096 && sinterp != NULL)
1097 {
1098 sinterp->contents = (bfd_byte *) command_line.interpreter;
1099 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
1100 }
1101
1102 /* Look for any sections named .gnu.warning. As a GNU extensions,
1103 we treat such sections as containing warning messages. We print
1104 out the warning message, and then zero out the section size so
1105 that it does not get copied into the output file. */
1106
1107 {
1108 LANG_FOR_EACH_INPUT_STATEMENT (is)
1109 {
1110 asection *s;
1111 bfd_size_type sz;
1112 char *msg;
1113 boolean ret;
1114
1115 if (is->just_syms_flag)
1116 continue;
1117
1118 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1119 if (s == NULL)
1120 continue;
1121
1122 sz = bfd_section_size (is->the_bfd, s);
1123 msg = xmalloc ((size_t) sz + 1);
1124 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
1125 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1126 is->the_bfd);
1127 msg[sz] = '\0';
1128 ret = link_info.callbacks->warning (&link_info, msg,
1129 (const char *) NULL,
1130 is->the_bfd, (asection *) NULL,
1131 (bfd_vma) 0);
1132 ASSERT (ret);
1133 free (msg);
1134
1135 /* Clobber the section size, so that we don't waste copying the
1136 warning into the output file. */
1137 s->_raw_size = 0;
1138 }
1139 }
1140
1141 /* we should be able to set the size of the interworking stub section */
1142
1143 /* Here we rummage through the found bfds to collect glue information */
1144 /* FIXME: should this be based on a command line option? krk@cygnus.com */
1145 {
1146 LANG_FOR_EACH_INPUT_STATEMENT (is)
1147 {
1148 if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, & link_info,
1149 no_pipeline_knowledge))
1150 {
1151 /* xgettext:c-format */
1152 einfo (_("Errors encountered processing file %s"), is->filename);
1153 }
1154 }
1155 }
1156
1157 /* We have seen it all. Allocate it, and carry on */
1158 bfd_elf32_arm_allocate_interworking_sections (& link_info);
1159 }
1160
1161 static void
1162 gld${EMULATION_NAME}_finish PARAMS((void))
1163 {
1164 struct bfd_link_hash_entry * h;
1165
1166 if (thumb_entry_symbol == NULL)
1167 return;
1168
1169 h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, false, false, true);
1170
1171 if (h != (struct bfd_link_hash_entry *) NULL
1172 && (h->type == bfd_link_hash_defined
1173 || h->type == bfd_link_hash_defweak)
1174 && h->u.def.section->output_section != NULL)
1175 {
1176 static char buffer[32];
1177 bfd_vma val;
1178
1179 /* Special procesing is required for a Thumb entry symbol. The
1180 bottom bit of its address must be set. */
1181 val = (h->u.def.value
1182 + bfd_get_section_vma (output_bfd,
1183 h->u.def.section->output_section)
1184 + h->u.def.section->output_offset);
1185
1186 val |= 1;
1187
1188 /* Now convert this value into a string and store it in entry_symbol
1189 where the lang_finish() function will pick it up. */
1190 buffer[0] = '0';
1191 buffer[1] = 'x';
1192
1193 sprintf_vma (buffer + 2, val);
1194
1195 if (entry_symbol != NULL && entry_from_cmdline)
1196 einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
1197 thumb_entry_symbol, entry_symbol);
1198 entry_symbol = buffer;
1199 }
1200 else
1201 einfo (_("%P: warning: connot find thumb start symbol %s\n"), thumb_entry_symbol);
1202 }
1203
1204 static char *
1205 gld${EMULATION_NAME}_get_script (isfile)
1206 int *isfile;
1207 EOF
1208
1209 if test -n "$COMPILE_IN"
1210 then
1211 # Scripts compiled in.
1212
1213 # sed commands to quote an ld script as a C string.
1214 sc="-f ${srcdir}/emultempl/stringify.sed"
1215
1216 cat >>e${EMULATION_NAME}.c <<EOF
1217 {
1218 *isfile = 0;
1219
1220 if (link_info.relocateable == true && config.build_constructors == true)
1221 return
1222 EOF
1223 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1224 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1225 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1226 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1227 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1228 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1229 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1230 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1231 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1232 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1233 fi
1234 echo ' ; else return' >> e${EMULATION_NAME}.c
1235 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1236 echo '; }' >> e${EMULATION_NAME}.c
1237
1238 else
1239 # Scripts read from the filesystem.
1240
1241 cat >>e${EMULATION_NAME}.c <<EOF
1242 {
1243 *isfile = 1;
1244
1245 if (link_info.relocateable == true && config.build_constructors == true)
1246 return "ldscripts/${EMULATION_NAME}.xu";
1247 else if (link_info.relocateable == true)
1248 return "ldscripts/${EMULATION_NAME}.xr";
1249 else if (!config.text_read_only)
1250 return "ldscripts/${EMULATION_NAME}.xbn";
1251 else if (!config.magic_demand_paged)
1252 return "ldscripts/${EMULATION_NAME}.xn";
1253 else if (link_info.shared)
1254 return "ldscripts/${EMULATION_NAME}.xs";
1255 else
1256 return "ldscripts/${EMULATION_NAME}.x";
1257 }
1258 EOF
1259
1260 fi
1261
1262 cat >>e${EMULATION_NAME}.c <<EOF
1263
1264 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1265 {
1266 gld${EMULATION_NAME}_before_parse,
1267 syslib_default,
1268 hll_default,
1269 after_parse_default,
1270 gld${EMULATION_NAME}_after_open,
1271 after_allocation_default,
1272 set_output_arch_default,
1273 ldemul_default_target,
1274 gld${EMULATION_NAME}_before_allocation,
1275 gld${EMULATION_NAME}_get_script,
1276 "${EMULATION_NAME}",
1277 "${OUTPUT_FORMAT}",
1278 gld${EMULATION_NAME}_finish, /* finish */
1279 NULL, /* create output section statements */
1280 gld${EMULATION_NAME}_open_dynamic_archive,
1281 gld${EMULATION_NAME}_place_orphan,
1282 NULL, /* set_symbols */
1283 gld${EMULATION_NAME}_parse_args,
1284 NULL, /* unrecognised file */
1285 gld${EMULATION_NAME}_list_options,
1286 NULL /* recognized file */
1287 };
1288 EOF
This page took 0.07147 seconds and 5 git commands to generate.