OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [ld/] [emultempl/] [armelf.em] - Blame information for rev 145

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.