2009-02-24 Joseph Myers <joseph@codesourcery.com>
[platform/upstream/binutils.git] / ld / emultempl / armelf.em
1 # This shell script emits a C file. -*- C -*-
2 #   Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 #   2004, 2005, 2007, 2008
4 #   Free Software Foundation, Inc.
5 #
6 # This file is part of the GNU Binutils.
7 #
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 # MA 02110-1301, USA.
22 #
23
24 # This file is sourced from elf32.em, and defines extra arm-elf
25 # specific routines.
26 #
27 test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel"
28 fragment <<EOF
29
30 #include "ldctor.h"
31 #include "elf/arm.h"
32
33 static char *thumb_entry_symbol = NULL;
34 static bfd *bfd_for_interwork;
35 static int byteswap_code = 0;
36 static int target1_is_rel = 0${TARGET1_IS_REL};
37 static char *target2_type = "${TARGET2_TYPE}";
38 static int fix_v4bx = 0;
39 static int use_blx = 0;
40 static bfd_arm_vfp11_fix vfp11_denorm_fix = BFD_ARM_VFP11_FIX_DEFAULT;
41 static int no_enum_size_warning = 0;
42 static int no_wchar_size_warning = 0;
43 static int pic_veneer = 0;
44
45 static void
46 gld${EMULATION_NAME}_before_parse (void)
47 {
48 #ifndef TARGET_                 /* I.e., if not generic.  */
49   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
50 #endif /* not TARGET_ */
51   config.dynamic_link = ${DYNAMIC_LINK-TRUE};
52   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
53 }
54
55 static void
56 arm_elf_after_open (void)
57 {
58   {
59     LANG_FOR_EACH_INPUT_STATEMENT (is)
60       {
61         bfd_elf32_arm_add_glue_sections_to_bfd (is->the_bfd, & link_info);
62       }
63   }
64
65   /* Call the standard elf routine.  */
66   gld${EMULATION_NAME}_after_open ();
67 }
68
69 static void
70 arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement)
71 {
72   if (statement->header.type == lang_input_section_enum)
73     {
74       asection *i = statement->input_section.section;
75
76       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
77           && (i->flags & SEC_EXCLUDE) == 0)
78         {
79           asection *output_section = i->output_section;
80
81           ASSERT (output_section->owner == link_info.output_bfd);
82
83           /* Don't attach the interworking stubs to a dynamic object, to
84              an empty section, etc.  */
85           if ((output_section->flags & SEC_HAS_CONTENTS) != 0
86               && (i->flags & SEC_NEVER_LOAD) == 0
87               && ! (i->owner->flags & DYNAMIC))
88             bfd_for_interwork = i->owner;
89         }
90     }
91 }
92
93 static void
94 arm_elf_before_allocation (void)
95 {
96   if (link_info.input_bfds != NULL)
97     {
98       /* The interworking bfd must be the last one in the link.  */
99       bfd_for_interwork = NULL;
100
101       lang_for_each_statement (arm_elf_set_bfd_for_interworking);
102
103       /* If bfd_for_interwork is NULL, then there are no loadable sections
104          with real contents to be linked, so we are not going to have to
105          create any interworking stubs, so it is OK not to call
106          bfd_elf32_arm_get_bfd_for_interworking.  */
107       if (bfd_for_interwork != NULL)
108         bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info);
109     }
110
111   bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code);
112
113   /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary
114      due to architecture version.  */
115   bfd_elf32_arm_set_vfp11_fix (link_info.output_bfd, &link_info);
116
117   /* We should be able to set the size of the interworking stub section.  We
118      can't do it until later if we have dynamic sections, though.  */
119   if (! elf_hash_table (&link_info)->dynamic_sections_created)
120     {
121       /* Here we rummage through the found bfds to collect glue information.  */
122       LANG_FOR_EACH_INPUT_STATEMENT (is)
123         {
124           /* Initialise mapping tables for code/data.  */
125           bfd_elf32_arm_init_maps (is->the_bfd);
126
127           if (!bfd_elf32_arm_process_before_allocation (is->the_bfd,
128                                                         &link_info)
129               || !bfd_elf32_arm_vfp11_erratum_scan (is->the_bfd, &link_info))
130             /* xgettext:c-format */
131             einfo (_("Errors encountered processing file %s"), is->filename);
132         }
133     }
134
135   /* Call the standard elf routine.  */
136   gld${EMULATION_NAME}_before_allocation ();
137
138   /* We have seen it all. Allocate it, and carry on.  */
139   bfd_elf32_arm_allocate_interworking_sections (& link_info);
140 }
141
142 static void
143 arm_elf_after_allocation (void)
144 {
145   /* Call the standard elf routine.  */
146   after_allocation_default ();
147
148   {
149     LANG_FOR_EACH_INPUT_STATEMENT (is)
150       {
151         /* Figure out where VFP11 erratum veneers (and the labels returning
152            from same) have been placed.  */
153         bfd_elf32_arm_vfp11_fix_veneer_locations (is->the_bfd, &link_info);
154       }
155   }
156 }
157
158 /* Fake input file for stubs.  */
159 static lang_input_statement_type *stub_file;
160
161 /* Whether we need to call gldarm_layout_sections_again.  */
162 static int need_laying_out = 0;
163
164 /* Maximum size of a group of input sections that can be handled by
165    one stub section.  A value of +/-1 indicates the bfd back-end
166    should use a suitable default size.  */
167 static bfd_signed_vma group_size = 1;
168
169 struct hook_stub_info
170 {
171   lang_statement_list_type add;
172   asection *input_section;
173 };
174
175 /* Traverse the linker tree to find the spot where the stub goes.  */
176
177 static bfd_boolean
178 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
179 {
180   lang_statement_union_type *l;
181   bfd_boolean ret;
182
183   for (; (l = *lp) != NULL; lp = &l->header.next)
184     {
185       switch (l->header.type)
186         {
187         case lang_constructors_statement_enum:
188           ret = hook_in_stub (info, &constructor_list.head);
189           if (ret)
190             return ret;
191           break;
192
193         case lang_output_section_statement_enum:
194           ret = hook_in_stub (info,
195                               &l->output_section_statement.children.head);
196           if (ret)
197             return ret;
198           break;
199
200         case lang_wild_statement_enum:
201           ret = hook_in_stub (info, &l->wild_statement.children.head);
202           if (ret)
203             return ret;
204           break;
205
206         case lang_group_statement_enum:
207           ret = hook_in_stub (info, &l->group_statement.children.head);
208           if (ret)
209             return ret;
210           break;
211
212         case lang_input_section_enum:
213           if (l->input_section.section == info->input_section)
214             {
215               /* We've found our section.  Insert the stub immediately
216                  after its associated input section.  */
217               *(info->add.tail) = l->header.next;
218               l->header.next = info->add.head;
219               return TRUE;
220             }
221           break;
222
223         case lang_data_statement_enum:
224         case lang_reloc_statement_enum:
225         case lang_object_symbols_statement_enum:
226         case lang_output_statement_enum:
227         case lang_target_statement_enum:
228         case lang_input_statement_enum:
229         case lang_assignment_statement_enum:
230         case lang_padding_statement_enum:
231         case lang_address_statement_enum:
232         case lang_fill_statement_enum:
233           break;
234
235         default:
236           FAIL ();
237           break;
238         }
239     }
240   return FALSE;
241 }
242
243
244 /* Call-back for elf32_arm_size_stubs.  */
245
246 /* Create a new stub section, and arrange for it to be linked
247    immediately after INPUT_SECTION.  */
248
249 static asection *
250 elf32_arm_add_stub_section (const char *stub_sec_name,
251                             asection *input_section)
252 {
253   asection *stub_sec;
254   flagword flags;
255   asection *output_section;
256   const char *secname;
257   lang_output_section_statement_type *os;
258   struct hook_stub_info info;
259
260   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
261            | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
262   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
263                                                  stub_sec_name, flags);
264   if (stub_sec == NULL)
265     goto err_ret;
266
267   bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 3);
268
269   output_section = input_section->output_section;
270   secname = bfd_get_section_name (output_section->owner, output_section);
271   os = lang_output_section_find (secname);
272
273   info.input_section = input_section;
274   lang_list_init (&info.add);
275   lang_add_section (&info.add, stub_sec, os);
276
277   if (info.add.head == NULL)
278     goto err_ret;
279
280   if (hook_in_stub (&info, &os->children.head))
281     return stub_sec;
282
283  err_ret:
284   einfo ("%X%P: can not make stub section: %E\n");
285   return NULL;
286 }
287
288 /* Another call-back for elf_arm_size_stubs.  */
289
290 static void
291 gldarm_layout_sections_again (void)
292 {
293   /* If we have changed sizes of the stub sections, then we need
294      to recalculate all the section offsets.  This may mean we need to
295      add even more stubs.  */
296   gld${EMULATION_NAME}_map_segments (TRUE);
297   need_laying_out = -1;
298 }
299
300 static void
301 build_section_lists (lang_statement_union_type *statement)
302 {
303   if (statement->header.type == lang_input_section_enum)
304     {
305       asection *i = statement->input_section.section;
306
307       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
308           && (i->flags & SEC_EXCLUDE) == 0
309           && i->output_section != NULL
310           && i->output_section->owner == link_info.output_bfd)
311         elf32_arm_next_input_section (& link_info, i);
312     }
313 }
314
315 static void
316 gld${EMULATION_NAME}_finish (void)
317 {
318   struct bfd_link_hash_entry * h;
319
320   /* bfd_elf32_discard_info just plays with debugging sections,
321      ie. doesn't affect any code, so we can delay resizing the
322      sections.  It's likely we'll resize everything in the process of
323      adding stubs.  */
324   if (bfd_elf_discard_info (link_info.output_bfd, & link_info))
325     need_laying_out = 1;
326
327   /* If generating a relocatable output file, then we don't
328      have to examine the relocs.  */
329   if (stub_file != NULL && !link_info.relocatable)
330     {
331       int  ret = elf32_arm_setup_section_lists (link_info.output_bfd, & link_info);
332
333       if (ret != 0)
334         {
335           if (ret < 0)
336             {
337               einfo ("%X%P: could not compute sections lists for stub generation: %E\n");
338               return;
339             }
340
341           lang_for_each_statement (build_section_lists);
342
343           /* Call into the BFD backend to do the real work.  */
344           if (! elf32_arm_size_stubs (link_info.output_bfd,
345                                       stub_file->the_bfd,
346                                       & link_info,
347                                       group_size,
348                                       & elf32_arm_add_stub_section,
349                                       & gldarm_layout_sections_again))
350             {
351               einfo ("%X%P: cannot size stub section: %E\n");
352               return;
353             }
354         }
355     }
356
357   if (need_laying_out != -1)
358     gld${EMULATION_NAME}_map_segments (need_laying_out);
359
360   if (! link_info.relocatable)
361     {
362       /* Now build the linker stubs.  */
363       if (stub_file->the_bfd->sections != NULL)
364         {
365           if (! elf32_arm_build_stubs (& link_info))
366             einfo ("%X%P: can not build stubs: %E\n");
367         }
368     }
369
370   finish_default ();
371
372   if (thumb_entry_symbol)
373     {
374       h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
375                                 FALSE, FALSE, TRUE);
376     }
377   else
378     {
379       struct elf_link_hash_entry * eh;
380
381       if (!entry_symbol.name)
382         return;
383
384       h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
385                                 FALSE, FALSE, TRUE);
386       eh = (struct elf_link_hash_entry *)h;
387       if (!h || ELF_ST_TYPE(eh->type) != STT_ARM_TFUNC)
388         return;
389     }
390
391
392   if (h != (struct bfd_link_hash_entry *) NULL
393       && (h->type == bfd_link_hash_defined
394           || h->type == bfd_link_hash_defweak)
395       && h->u.def.section->output_section != NULL)
396     {
397       static char buffer[32];
398       bfd_vma val;
399
400       /* Special procesing is required for a Thumb entry symbol.  The
401          bottom bit of its address must be set.  */
402       val = (h->u.def.value
403              + bfd_get_section_vma (link_info.output_bfd,
404                                     h->u.def.section->output_section)
405              + h->u.def.section->output_offset);
406
407       val |= 1;
408
409       /* Now convert this value into a string and store it in entry_symbol
410          where the lang_finish() function will pick it up.  */
411       buffer[0] = '0';
412       buffer[1] = 'x';
413
414       sprintf_vma (buffer + 2, val);
415
416       if (thumb_entry_symbol != NULL && entry_symbol.name != NULL
417           && entry_from_cmdline)
418         einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
419                thumb_entry_symbol, entry_symbol.name);
420       entry_symbol.name = buffer;
421     }
422   else
423     einfo (_("%P: warning: cannot find thumb start symbol %s\n"),
424            thumb_entry_symbol);
425 }
426
427 /* This is a convenient point to tell BFD about target specific flags.
428    After the output has been created, but before inputs are read.  */
429 static void
430 arm_elf_create_output_section_statements (void)
431 {
432   if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
433     {
434       /* The arm backend needs special fields in the output hash structure.
435          These will only be created if the output format is an arm format,
436          hence we do not support linking and changing output formats at the
437          same time.  Use a link followed by objcopy to change output formats.  */
438       einfo ("%F%X%P: error: Cannot change output format whilst linking ARM binaries.\n");
439       return;
440     }
441
442   bfd_elf32_arm_set_target_relocs (link_info.output_bfd, &link_info,
443                                    target1_is_rel,
444                                    target2_type, fix_v4bx, use_blx,
445                                    vfp11_denorm_fix, no_enum_size_warning,
446                                    no_wchar_size_warning,
447                                    pic_veneer);
448
449   stub_file = lang_add_input_file ("linker stubs",
450                                    lang_input_file_is_fake_enum,
451                                    NULL);
452   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
453   if (stub_file->the_bfd == NULL
454       || ! bfd_set_arch_mach (stub_file->the_bfd,
455                               bfd_get_arch (link_info.output_bfd),
456                               bfd_get_mach (link_info.output_bfd)))
457     {
458       einfo ("%X%P: can not create BFD %E\n");
459       return;
460     }
461  
462   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
463   ldlang_add_file (stub_file);
464 }
465
466 /* Avoid processing the fake stub_file in vercheck, stat_needed and
467    check_needed routines.  */
468
469 static void (*real_func) (lang_input_statement_type *);
470
471 static void arm_for_each_input_file_wrapper (lang_input_statement_type *l)
472 {
473   if (l != stub_file)
474     (*real_func) (l);
475 }
476
477 static void
478 arm_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
479 {
480   real_func = func;
481   lang_for_each_input_file (&arm_for_each_input_file_wrapper);
482 }
483
484 #define lang_for_each_input_file arm_lang_for_each_input_file
485
486 EOF
487
488 # Define some shell vars to insert bits of code into the standard elf
489 # parse_args and list_options functions.
490 #
491 PARSE_AND_LIST_PROLOGUE='
492 #define OPTION_THUMB_ENTRY              301
493 #define OPTION_BE8                      302
494 #define OPTION_TARGET1_REL              303
495 #define OPTION_TARGET1_ABS              304
496 #define OPTION_TARGET2                  305
497 #define OPTION_FIX_V4BX                 306
498 #define OPTION_USE_BLX                  307
499 #define OPTION_VFP11_DENORM_FIX         308
500 #define OPTION_NO_ENUM_SIZE_WARNING     309
501 #define OPTION_PIC_VENEER               310
502 #define OPTION_FIX_V4BX_INTERWORKING    311
503 #define OPTION_STUBGROUP_SIZE           312
504 #define OPTION_NO_WCHAR_SIZE_WARNING    313
505 '
506
507 PARSE_AND_LIST_SHORTOPTS=p
508
509 PARSE_AND_LIST_LONGOPTS='
510   { "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
511   { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
512   { "be8", no_argument, NULL, OPTION_BE8},
513   { "target1-rel", no_argument, NULL, OPTION_TARGET1_REL},
514   { "target1-abs", no_argument, NULL, OPTION_TARGET1_ABS},
515   { "target2", required_argument, NULL, OPTION_TARGET2},
516   { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
517   { "fix-v4bx-interworking", no_argument, NULL, OPTION_FIX_V4BX_INTERWORKING},
518   { "use-blx", no_argument, NULL, OPTION_USE_BLX},
519   { "vfp11-denorm-fix", required_argument, NULL, OPTION_VFP11_DENORM_FIX},
520   { "no-enum-size-warning", no_argument, NULL, OPTION_NO_ENUM_SIZE_WARNING},
521   { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER},
522   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
523   { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING},
524 '
525
526 PARSE_AND_LIST_OPTIONS='
527   fprintf (file, _("  --thumb-entry=<sym>         Set the entry point to be Thumb symbol <sym>\n"));
528   fprintf (file, _("  --be8                       Output BE8 format image\n"));
529   fprintf (file, _("  --target1=rel               Interpret R_ARM_TARGET1 as R_ARM_REL32\n"));
530   fprintf (file, _("  --target1=abs               Interpret R_ARM_TARGET1 as R_ARM_ABS32\n"));
531   fprintf (file, _("  --target2=<type>            Specify definition of R_ARM_TARGET2\n"));
532   fprintf (file, _("  --fix-v4bx                  Rewrite BX rn as MOV pc, rn for ARMv4\n"));
533   fprintf (file, _("  --fix-v4bx-interworking     Rewrite BX rn branch to ARMv4 interworking veneer\n"));
534   fprintf (file, _("  --use-blx                   Enable use of BLX instructions\n"));
535   fprintf (file, _("  --vfp11-denorm-fix          Specify how to fix VFP11 denorm erratum\n"));
536   fprintf (file, _("  --no-enum-size-warning      Don'\''t warn about objects with incompatible\n"
537                    "                                enum sizes\n"));
538   fprintf (file, _("  --no-wchar-size-warning     Don'\''t warn about objects with incompatible"
539                    "                                wchar_t sizes\n"));
540   fprintf (file, _("  --pic-veneer                Always generate PIC interworking veneers\n"));
541   fprintf (file, _("\
542    --stub-group-size=N   Maximum size of a group of input sections that can be\n\
543                            handled by one stub section.  A negative value\n\
544                            locates all stubs after their branches (with a\n\
545                            group size of -N), while a positive value allows\n\
546                            two groups of input sections, one before, and one\n\
547                            after each stub section.  Values of +/-1 indicate\n\
548                            the linker should choose suitable defaults.\n"
549                    ));
550 '
551
552 PARSE_AND_LIST_ARGS_CASES='
553     case '\'p\'':
554       /* Only here for backwards compatibility.  */
555       break;
556
557     case OPTION_THUMB_ENTRY:
558       thumb_entry_symbol = optarg;
559       break;
560
561     case OPTION_BE8:
562       byteswap_code = 1;
563       break;
564
565     case OPTION_TARGET1_REL:
566       target1_is_rel = 1;
567       break;
568
569     case OPTION_TARGET1_ABS:
570       target1_is_rel = 0;
571       break;
572
573     case OPTION_TARGET2:
574       target2_type = optarg;
575       break;
576
577     case OPTION_FIX_V4BX:
578       fix_v4bx = 1;
579       break;
580
581     case OPTION_FIX_V4BX_INTERWORKING:
582       fix_v4bx = 2;
583       break;
584
585     case OPTION_USE_BLX:
586       use_blx = 1;
587       break;
588
589     case OPTION_VFP11_DENORM_FIX:
590       if (strcmp (optarg, "none") == 0)
591         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE;
592       else if (strcmp (optarg, "scalar") == 0)
593         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR;
594       else if (strcmp (optarg, "vector") == 0)
595         vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
596       else
597         einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg);
598       break;
599
600     case OPTION_NO_ENUM_SIZE_WARNING:
601       no_enum_size_warning = 1;
602       break;
603
604     case OPTION_NO_WCHAR_SIZE_WARNING:
605       no_wchar_size_warning = 1;
606       break;
607
608     case OPTION_PIC_VENEER:
609       pic_veneer = 1;
610       break;
611
612     case OPTION_STUBGROUP_SIZE:
613       {
614         const char *end;
615
616         group_size = bfd_scan_vma (optarg, &end, 0);
617         if (*end)
618           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
619       }
620       break;
621 '
622
623 # We have our own after_open and before_allocation functions, but they call
624 # the standard routines, so give them a different name.
625 LDEMUL_AFTER_OPEN=arm_elf_after_open
626 LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
627 LDEMUL_AFTER_ALLOCATION=arm_elf_after_allocation
628 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements
629
630 # Replace the elf before_parse function with our own.
631 LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
632
633 # Call the extra arm-elf function
634 LDEMUL_FINISH=gld${EMULATION_NAME}_finish