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

Subversion Repositories open8_urisc

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

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 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
3
# Free Software Foundation, Inc.
4
#
5
# This file is part of the GNU Binutils.
6
#
7
# This program is free software; you can redistribute it and/or modify
8
# it under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with this program; if not, write to the Free Software
19
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
# MA 02110-1301, USA.
21
#
22
 
23
# This file is sourced from elf32.em, and defines extra powerpc64-elf
24
# specific routines.
25
#
26
fragment <
27
 
28
#include "ldctor.h"
29
#include "libbfd.h"
30
#include "elf-bfd.h"
31
#include "elf64-ppc.h"
32
 
33
/* Fake input file for stubs.  */
34
static lang_input_statement_type *stub_file;
35
static int stub_added = 0;
36
 
37
/* Whether we need to call ppc_layout_sections_again.  */
38
static int need_laying_out = 0;
39
 
40
/* Maximum size of a group of input sections that can be handled by
41
   one stub section.  A value of +/-1 indicates the bfd back-end
42
   should use a suitable default size.  */
43
static bfd_signed_vma group_size = 1;
44
 
45
/* Whether to add ".foo" entries for each "foo" in a version script.  */
46
static int dotsyms = 1;
47
 
48
/* Whether to run tls optimization.  */
49
static int no_tls_opt = 0;
50
static int no_tls_get_addr_opt = 0;
51
 
52
/* Whether to run opd optimization.  */
53
static int no_opd_opt = 0;
54
 
55
/* Whether to run toc optimization.  */
56
static int no_toc_opt = 0;
57
 
58
/* Whether to allow multiple toc sections.  */
59
static int no_multi_toc = 0;
60
 
61
/* Whether to sort input toc and got sections.  */
62
static int no_toc_sort = 0;
63
 
64 157 khays
/* Set if PLT call stubs should load r11.  */
65
static int plt_static_chain = 0;
66
 
67 145 khays
/* Whether to emit symbols for stubs.  */
68
static int emit_stub_syms = -1;
69
 
70
static asection *toc_section = 0;
71
 
72
/* Whether to canonicalize .opd so that there are no overlapping
73
   .opd entries.  */
74
static int non_overlapping_opd = 0;
75
 
76
/* This is called before the input files are opened.  We create a new
77
   fake input file to hold the stub sections.  */
78
 
79
static void
80
ppc_create_output_section_statements (void)
81
{
82
  if (!(bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
83
        && elf_object_id (link_info.output_bfd) == PPC64_ELF_DATA))
84
    return;
85
 
86
  link_info.wrap_char = '.';
87
 
88
  stub_file = lang_add_input_file ("linker stubs",
89
                                   lang_input_file_is_fake_enum,
90
                                   NULL);
91
  stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
92
  if (stub_file->the_bfd == NULL
93
      || !bfd_set_arch_mach (stub_file->the_bfd,
94
                             bfd_get_arch (link_info.output_bfd),
95
                             bfd_get_mach (link_info.output_bfd)))
96
    {
97 163 khays
      einfo ("%F%P: can not create BFD: %E\n");
98 145 khays
      return;
99
    }
100
 
101
  stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
102
  ldlang_add_file (stub_file);
103
  ppc64_elf_init_stub_bfd (stub_file->the_bfd, &link_info);
104
}
105
 
106
/* Move the input section statement at *U which happens to be on LIST
107
   to be just before *TO.  */
108
 
109
static void
110
move_input_section (lang_statement_list_type *list,
111
                    lang_statement_union_type **u,
112
                    lang_statement_union_type **to)
113
{
114
  lang_statement_union_type *s = *u;
115
  asection *i = s->input_section.section;
116
  asection *p, *n;
117
 
118
  /* Snip the input section from the statement list.  If it was the
119
     last statement, fix the list tail pointer.  */
120
  *u = s->header.next;
121
  if (*u == NULL)
122
    list->tail = u;
123
  /* Add it back in the new position.  */
124
  s->header.next = *to;
125
  *to = s;
126
  if (list->tail == to)
127
    list->tail = &s->header.next;
128
 
129
  /* Trim I off the bfd map_head/map_tail doubly linked lists.  */
130
  n = i->map_head.s;
131
  p = i->map_tail.s;
132
  (p != NULL ? p : i->output_section)->map_head.s = n;
133
  (n != NULL ? n : i->output_section)->map_tail.s = p;
134
 
135
  /* Add I back on in its new position.  */
136
  if (s->header.next->header.type == lang_input_section_enum)
137
    {
138
      n = s->header.next->input_section.section;
139
      p = n->map_tail.s;
140
    }
141
  else
142
    {
143
      /* If the next statement is not an input section statement then
144
         TO must point at the previous input section statement
145
         header.next field.  */
146
      lang_input_section_type *prev = (lang_input_section_type *)
147
        ((char *) to - offsetof (lang_statement_union_type, header.next));
148
 
149
      ASSERT (prev->header.type == lang_input_section_enum);
150
      p = prev->section;
151
      n = p->map_head.s;
152
    }
153
  i->map_head.s = n;
154
  i->map_tail.s = p;
155
  (p != NULL ? p : i->output_section)->map_head.s = i;
156
  (n != NULL ? n : i->output_section)->map_tail.s = i;
157
}
158
 
159
/* Sort input section statements in the linker script tree rooted at
160
   LIST so that those whose owning bfd happens to have a section
161
   called .init or .fini are placed first.  Place any TOC sections
162
   referenced by small TOC relocs next, with TOC sections referenced
163
   only by bigtoc relocs last.  */
164
 
165
static void
166
sort_toc_sections (lang_statement_list_type *list,
167
                   lang_statement_union_type **ini,
168
                   lang_statement_union_type **small)
169
{
170
  lang_statement_union_type *s, **u;
171
  asection *i;
172
 
173
  u = &list->head;
174
  while ((s = *u) != NULL)
175
    {
176
      switch (s->header.type)
177
        {
178
        case lang_wild_statement_enum:
179
          sort_toc_sections (&s->wild_statement.children, ini, small);
180
          break;
181
 
182
        case lang_group_statement_enum:
183
          sort_toc_sections (&s->group_statement.children, ini, small);
184
          break;
185
 
186
        case lang_input_section_enum:
187
          i = s->input_section.section;
188
          /* Leave the stub_file .got where it is.  We put the .got
189
             header there.  */
190
          if (i->owner == stub_file->the_bfd)
191
            break;
192
          if (bfd_get_section_by_name (i->owner, ".init") != NULL
193
              || bfd_get_section_by_name (i->owner, ".fini") != NULL)
194
            {
195
              if (ini != NULL && *ini != s)
196
                {
197
                  move_input_section (list, u, ini);
198
                  if (small == ini)
199
                    small = &s->header.next;
200
                  ini = &s->header.next;
201
                  continue;
202
                }
203
              if (small == ini)
204
                small = &s->header.next;
205
              ini = &s->header.next;
206
              break;
207
            }
208
          else if (ini == NULL)
209
            ini = u;
210
 
211
          if (ppc64_elf_has_small_toc_reloc (i))
212
            {
213
              if (small != NULL && *small != s)
214
                {
215
                  move_input_section (list, u, small);
216
                  small = &s->header.next;
217
                  continue;
218
                }
219
              small = &s->header.next;
220
            }
221
          else if (small == NULL)
222
            small = u;
223
          break;
224
 
225
        default:
226
          break;
227
        }
228
      u = &s->header.next;
229
    }
230
}
231
 
232
static void
233
prelim_size_sections (void)
234
{
235
  if (expld.phase != lang_mark_phase_enum)
236
    {
237
      expld.phase = lang_mark_phase_enum;
238
      expld.dataseg.phase = exp_dataseg_none;
239
      one_lang_size_sections_pass (NULL, FALSE);
240
      /* We must not cache anything from the preliminary sizing.  */
241
      lang_reset_memory_regions ();
242
    }
243
}
244
 
245
static void
246
ppc_before_allocation (void)
247
{
248
  if (stub_file != NULL)
249
    {
250
      if (!no_opd_opt
251
          && !ppc64_elf_edit_opd (&link_info, non_overlapping_opd))
252 163 khays
        einfo ("%X%P: can not edit %s: %E\n", "opd");
253 145 khays
 
254
      if (ppc64_elf_tls_setup (&link_info, no_tls_get_addr_opt, &no_multi_toc)
255
          && !no_tls_opt)
256
        {
257
          /* Size the sections.  This is premature, but we want to know the
258
             TLS segment layout so that certain optimizations can be done.  */
259
          prelim_size_sections ();
260
 
261
          if (!ppc64_elf_tls_optimize (&link_info))
262
            einfo ("%X%P: TLS problem %E\n");
263
        }
264
 
265
      if (!no_toc_opt
266
          && !link_info.relocatable)
267
        {
268
          prelim_size_sections ();
269
 
270
          if (!ppc64_elf_edit_toc (&link_info))
271 163 khays
            einfo ("%X%P: can not edit %s: %E\n", "toc");
272 145 khays
        }
273
 
274
      if (!no_toc_sort)
275
        {
276
          lang_output_section_statement_type *toc_os;
277
 
278
          toc_os = lang_output_section_find (".got");
279
          if (toc_os != NULL)
280
            sort_toc_sections (&toc_os->children, NULL, NULL);
281
        }
282
    }
283
 
284
  gld${EMULATION_NAME}_before_allocation ();
285
}
286
 
287
struct hook_stub_info
288
{
289
  lang_statement_list_type add;
290
  asection *input_section;
291
};
292
 
293
/* Traverse the linker tree to find the spot where the stub goes.  */
294
 
295
static bfd_boolean
296
hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
297
{
298
  lang_statement_union_type *l;
299
  bfd_boolean ret;
300
 
301
  for (; (l = *lp) != NULL; lp = &l->header.next)
302
    {
303
      switch (l->header.type)
304
        {
305
        case lang_constructors_statement_enum:
306
          ret = hook_in_stub (info, &constructor_list.head);
307
          if (ret)
308
            return ret;
309
          break;
310
 
311
        case lang_output_section_statement_enum:
312
          ret = hook_in_stub (info,
313
                              &l->output_section_statement.children.head);
314
          if (ret)
315
            return ret;
316
          break;
317
 
318
        case lang_wild_statement_enum:
319
          ret = hook_in_stub (info, &l->wild_statement.children.head);
320
          if (ret)
321
            return ret;
322
          break;
323
 
324
        case lang_group_statement_enum:
325
          ret = hook_in_stub (info, &l->group_statement.children.head);
326
          if (ret)
327
            return ret;
328
          break;
329
 
330
        case lang_input_section_enum:
331
          if (l->input_section.section == info->input_section)
332
            {
333
              /* We've found our section.  Insert the stub immediately
334
                 before its associated input section.  */
335
              *lp = info->add.head;
336
              *(info->add.tail) = l;
337
              return TRUE;
338
            }
339
          break;
340
 
341
        case lang_data_statement_enum:
342
        case lang_reloc_statement_enum:
343
        case lang_object_symbols_statement_enum:
344
        case lang_output_statement_enum:
345
        case lang_target_statement_enum:
346
        case lang_input_statement_enum:
347
        case lang_assignment_statement_enum:
348
        case lang_padding_statement_enum:
349
        case lang_address_statement_enum:
350
        case lang_fill_statement_enum:
351
          break;
352
 
353
        default:
354
          FAIL ();
355
          break;
356
        }
357
    }
358
  return FALSE;
359
}
360
 
361
 
362
/* Call-back for ppc64_elf_size_stubs.  */
363
 
364
/* Create a new stub section, and arrange for it to be linked
365
   immediately before INPUT_SECTION.  */
366
 
367
static asection *
368
ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
369
{
370
  asection *stub_sec;
371
  flagword flags;
372
  asection *output_section;
373
  const char *secname;
374
  lang_output_section_statement_type *os;
375
  struct hook_stub_info info;
376
 
377
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
378
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_KEEP);
379
  stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
380
                                                 stub_sec_name, flags);
381 163 khays
  if (stub_sec == NULL
382
      || !bfd_set_section_alignment (stub_file->the_bfd, stub_sec, 5))
383 145 khays
    goto err_ret;
384
 
385
  output_section = input_section->output_section;
386
  secname = bfd_get_section_name (output_section->owner, output_section);
387
  os = lang_output_section_find (secname);
388
 
389
  info.input_section = input_section;
390
  lang_list_init (&info.add);
391
  lang_add_section (&info.add, stub_sec, os);
392
 
393
  if (info.add.head == NULL)
394
    goto err_ret;
395
 
396
  stub_added = 1;
397
  if (hook_in_stub (&info, &os->children.head))
398
    return stub_sec;
399
 
400
 err_ret:
401
  einfo ("%X%P: can not make stub section: %E\n");
402
  return NULL;
403
}
404
 
405
 
406
/* Another call-back for ppc64_elf_size_stubs.  */
407
 
408
static void
409
ppc_layout_sections_again (void)
410
{
411
  /* If we have changed sizes of the stub sections, then we need
412
     to recalculate all the section offsets.  This may mean we need to
413
     add even more stubs.  */
414
  gld${EMULATION_NAME}_map_segments (TRUE);
415
 
416
  if (!link_info.relocatable)
417
    _bfd_set_gp_value (link_info.output_bfd,
418
                       ppc64_elf_toc (link_info.output_bfd));
419
 
420
  need_laying_out = -1;
421
}
422
 
423
 
424
static void
425
build_toc_list (lang_statement_union_type *statement)
426
{
427
  if (statement->header.type == lang_input_section_enum)
428
    {
429
      asection *i = statement->input_section.section;
430
 
431
      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
432
          && (i->flags & SEC_EXCLUDE) == 0
433
          && i->output_section == toc_section)
434
        {
435
          if (!ppc64_elf_next_toc_section (&link_info, i))
436
            einfo ("%X%P: linker script separates .got and .toc\n");
437
        }
438
    }
439
}
440
 
441
 
442
static void
443
build_section_lists (lang_statement_union_type *statement)
444
{
445
  if (statement->header.type == lang_input_section_enum)
446
    {
447
      asection *i = statement->input_section.section;
448
 
449
      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
450
          && (i->flags & SEC_EXCLUDE) == 0
451
          && i->output_section != NULL
452
          && i->output_section->owner == link_info.output_bfd)
453
        {
454
          if (!ppc64_elf_next_input_section (&link_info, i))
455
            einfo ("%X%P: can not size stub section: %E\n");
456
        }
457
    }
458
}
459
 
460
 
461
/* Call the back-end function to set TOC base after we have placed all
462
   the sections.  */
463
static void
464
gld${EMULATION_NAME}_after_allocation (void)
465
{
466
  /* bfd_elf_discard_info just plays with data and debugging sections,
467
     ie. doesn't affect code size, so we can delay resizing the
468
     sections.  It's likely we'll resize everything in the process of
469
     adding stubs.  */
470
  if (bfd_elf_discard_info (link_info.output_bfd, &link_info))
471
    need_laying_out = 1;
472
 
473
  /* If generating a relocatable output file, then we don't have any
474
     stubs.  */
475
  if (stub_file != NULL && !link_info.relocatable)
476
    {
477
      int ret = ppc64_elf_setup_section_lists (&link_info,
478
                                               &ppc_add_stub_section,
479
                                               &ppc_layout_sections_again);
480
      if (ret < 0)
481
        einfo ("%X%P: can not size stub section: %E\n");
482
      else if (ret > 0)
483
        {
484
          ppc64_elf_start_multitoc_partition (&link_info);
485
 
486
          if (!no_multi_toc)
487
            {
488
              toc_section = bfd_get_section_by_name (link_info.output_bfd,
489
                                                     ".got");
490
              if (toc_section != NULL)
491
                lang_for_each_statement (build_toc_list);
492
            }
493
 
494
          if (ppc64_elf_layout_multitoc (&link_info)
495
              && !no_multi_toc
496
              && toc_section != NULL)
497
            lang_for_each_statement (build_toc_list);
498
 
499
          ppc64_elf_finish_multitoc_partition (&link_info);
500
 
501
          lang_for_each_statement (build_section_lists);
502
 
503
          if (!ppc64_elf_check_init_fini (&link_info))
504
            einfo ("%P: .init/.fini fragments use differing TOC pointers\n");
505
 
506
          /* Call into the BFD backend to do the real work.  */
507 157 khays
          if (!ppc64_elf_size_stubs (&link_info, group_size, plt_static_chain))
508 145 khays
            einfo ("%X%P: can not size stub section: %E\n");
509
        }
510
    }
511
 
512
  if (need_laying_out != -1)
513
    {
514
      gld${EMULATION_NAME}_map_segments (need_laying_out);
515
 
516
      if (!link_info.relocatable)
517
        _bfd_set_gp_value (link_info.output_bfd,
518
                           ppc64_elf_toc (link_info.output_bfd));
519
    }
520
}
521
 
522
 
523
/* Final emulation specific call.  */
524
 
525
static void
526
gld${EMULATION_NAME}_finish (void)
527
{
528
  /* e_entry on PowerPC64 points to the function descriptor for
529
     _start.  If _start is missing, default to the first function
530
     descriptor in the .opd section.  */
531
  entry_section = ".opd";
532
 
533
  if (stub_added)
534
    {
535
      char *msg = NULL;
536
      char *line, *endline;
537
 
538
      if (emit_stub_syms < 0)
539
        emit_stub_syms = 1;
540
      if (!ppc64_elf_build_stubs (emit_stub_syms, &link_info,
541
                                  config.stats ? &msg : NULL))
542
        einfo ("%X%P: can not build stubs: %E\n");
543
 
544
      fflush (stdout);
545
      for (line = msg; line != NULL; line = endline)
546
        {
547
          endline = strchr (line, '\n');
548
          if (endline != NULL)
549
            *endline++ = '\0';
550
          fprintf (stderr, "%s: %s\n", program_name, line);
551
        }
552
      fflush (stderr);
553
      if (msg != NULL)
554
        free (msg);
555
    }
556
 
557
  ppc64_elf_restore_symbols (&link_info);
558
  finish_default ();
559
}
560
 
561
 
562
/* Add a pattern matching ".foo" for every "foo" in a version script.
563
 
564
   The reason for doing this is that many shared library version
565
   scripts export a selected set of functions or data symbols, forcing
566
   others local.  eg.
567
 
568
   . VERS_1 {
569
   .       global:
570
   .               this; that; some; thing;
571
   .       local:
572
   .               *;
573
   .   };
574
 
575
   To make the above work for PowerPC64, we need to export ".this",
576
   ".that" and so on, otherwise only the function descriptor syms are
577
   exported.  Lack of an exported function code sym may cause a
578
   definition to be pulled in from a static library.  */
579
 
580
static struct bfd_elf_version_expr *
581
gld${EMULATION_NAME}_new_vers_pattern (struct bfd_elf_version_expr *entry)
582
{
583
  struct bfd_elf_version_expr *dot_entry;
584
  unsigned int len;
585
  char *dot_pat;
586
 
587
  if (!dotsyms
588
      || entry->pattern[0] == '.'
589
      || (!entry->literal && entry->pattern[0] == '*'))
590
    return entry;
591
 
592
  dot_entry = xmalloc (sizeof *dot_entry);
593
  *dot_entry = *entry;
594
  dot_entry->next = entry;
595
  len = strlen (entry->pattern) + 2;
596
  dot_pat = xmalloc (len);
597
  dot_pat[0] = '.';
598
  memcpy (dot_pat + 1, entry->pattern, len - 1);
599
  dot_entry->pattern = dot_pat;
600
  dot_entry->script = 1;
601
  return dot_entry;
602
}
603
 
604
 
605
/* Avoid processing the fake stub_file in vercheck, stat_needed and
606
   check_needed routines.  */
607
 
608
static void (*real_func) (lang_input_statement_type *);
609
 
610
static void ppc_for_each_input_file_wrapper (lang_input_statement_type *l)
611
{
612
  if (l != stub_file)
613
    (*real_func) (l);
614
}
615
 
616
static void
617
ppc_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
618
{
619
  real_func = func;
620
  lang_for_each_input_file (&ppc_for_each_input_file_wrapper);
621
}
622
 
623
#define lang_for_each_input_file ppc_lang_for_each_input_file
624
 
625
EOF
626
 
627
if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
628
  fragment <
629
/* Special handling for embedded SPU executables.  */
630
extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
631
static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
632
 
633
static bfd_boolean
634
ppc64_recognized_file (lang_input_statement_type *entry)
635
{
636
  if (embedded_spu_file (entry, "-m64"))
637
    return TRUE;
638
 
639
  return gld${EMULATION_NAME}_load_symbols (entry);
640
}
641
EOF
642
LDEMUL_RECOGNIZED_FILE=ppc64_recognized_file
643
fi
644
 
645
# Define some shell vars to insert bits of code into the standard elf
646
# parse_args and list_options functions.
647
#
648 157 khays
PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
649
#define OPTION_STUBGROUP_SIZE           321
650
#define OPTION_PLT_STATIC_CHAIN         (OPTION_STUBGROUP_SIZE + 1)
651
#define OPTION_NO_PLT_STATIC_CHAIN      (OPTION_PLT_STATIC_CHAIN + 1)
652
#define OPTION_STUBSYMS                 (OPTION_NO_PLT_STATIC_CHAIN + 1)
653 145 khays
#define OPTION_NO_STUBSYMS              (OPTION_STUBSYMS + 1)
654
#define OPTION_DOTSYMS                  (OPTION_NO_STUBSYMS + 1)
655
#define OPTION_NO_DOTSYMS               (OPTION_DOTSYMS + 1)
656
#define OPTION_NO_TLS_OPT               (OPTION_NO_DOTSYMS + 1)
657
#define OPTION_NO_TLS_GET_ADDR_OPT      (OPTION_NO_TLS_OPT + 1)
658
#define OPTION_NO_OPD_OPT               (OPTION_NO_TLS_GET_ADDR_OPT + 1)
659
#define OPTION_NO_TOC_OPT               (OPTION_NO_OPD_OPT + 1)
660
#define OPTION_NO_MULTI_TOC             (OPTION_NO_TOC_OPT + 1)
661
#define OPTION_NO_TOC_SORT              (OPTION_NO_MULTI_TOC + 1)
662
#define OPTION_NON_OVERLAPPING_OPD      (OPTION_NO_TOC_SORT + 1)
663
'
664
 
665 157 khays
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
666 145 khays
  { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
667 157 khays
  { "plt-static-chain", no_argument, NULL, OPTION_PLT_STATIC_CHAIN },
668
  { "no-plt-static-chain", no_argument, NULL, OPTION_NO_PLT_STATIC_CHAIN },
669 145 khays
  { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
670
  { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
671
  { "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
672
  { "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
673
  { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
674
  { "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },
675
  { "no-opd-optimize", no_argument, NULL, OPTION_NO_OPD_OPT },
676
  { "no-toc-optimize", no_argument, NULL, OPTION_NO_TOC_OPT },
677
  { "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
678
  { "no-toc-sort", no_argument, NULL, OPTION_NO_TOC_SORT },
679
  { "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
680
'
681
 
682 157 khays
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
683 145 khays
  fprintf (file, _("\
684
  --stub-group-size=N         Maximum size of a group of input sections that\n\
685
                                can be handled by one stub section.  A negative\n\
686
                                value locates all stubs before their branches\n\
687
                                (with a group size of -N), while a positive\n\
688
                                value allows two groups of input sections, one\n\
689
                                before, and one after each stub section.\n\
690
                                Values of +/-1 indicate the linker should\n\
691
                                choose suitable defaults.\n"
692
                   ));
693
  fprintf (file, _("\
694 157 khays
  --plt-static-chain          PLT call stubs should load r11.\n"
695
                   ));
696
  fprintf (file, _("\
697
  --no-plt-static-chain       PLT call stubs should not load r11. (default)\n"
698
                   ));
699
  fprintf (file, _("\
700 145 khays
  --emit-stub-syms            Label linker stubs with a symbol.\n"
701
                   ));
702
  fprintf (file, _("\
703
  --no-emit-stub-syms         Don'\''t label linker stubs with a symbol.\n"
704
                   ));
705
  fprintf (file, _("\
706
  --dotsyms                   For every version pattern \"foo\" in a version\n\
707
                                script, add \".foo\" so that function code\n\
708
                                symbols are treated the same as function\n\
709
                                descriptor symbols.  Defaults to on.\n"
710
                   ));
711
  fprintf (file, _("\
712
  --no-dotsyms                Don'\''t do anything special in version scripts.\n"
713
                   ));
714
  fprintf (file, _("\
715
  --no-tls-optimize           Don'\''t try to optimize TLS accesses.\n"
716
                   ));
717
  fprintf (file, _("\
718
  --no-tls-get-addr-optimize  Don'\''t use a special __tls_get_addr call.\n"
719
                   ));
720
  fprintf (file, _("\
721
  --no-opd-optimize           Don'\''t optimize the OPD section.\n"
722
                   ));
723
  fprintf (file, _("\
724
  --no-toc-optimize           Don'\''t optimize the TOC section.\n"
725
                   ));
726
  fprintf (file, _("\
727
  --no-multi-toc              Disallow automatic multiple toc sections.\n"
728
                   ));
729
  fprintf (file, _("\
730
  --no-toc-sort               Don'\''t sort TOC and GOT sections.\n"
731
                   ));
732
  fprintf (file, _("\
733
  --non-overlapping-opd       Canonicalize .opd, so that there are no\n\
734
                                overlapping .opd entries.\n"
735
                   ));
736
'
737
 
738 157 khays
PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
739 145 khays
    case OPTION_STUBGROUP_SIZE:
740
      {
741
        const char *end;
742
        group_size = bfd_scan_vma (optarg, &end, 0);
743
        if (*end)
744
          einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
745
      }
746
      break;
747
 
748 157 khays
    case OPTION_PLT_STATIC_CHAIN:
749
      plt_static_chain = 1;
750
      break;
751
 
752
    case OPTION_NO_PLT_STATIC_CHAIN:
753
      plt_static_chain = 0;
754
      break;
755
 
756 145 khays
    case OPTION_STUBSYMS:
757
      emit_stub_syms = 1;
758
      break;
759
 
760
    case OPTION_NO_STUBSYMS:
761
      emit_stub_syms = 0;
762
      break;
763
 
764
    case OPTION_DOTSYMS:
765
      dotsyms = 1;
766
      break;
767
 
768
    case OPTION_NO_DOTSYMS:
769
      dotsyms = 0;
770
      break;
771
 
772
    case OPTION_NO_TLS_OPT:
773
      no_tls_opt = 1;
774
      break;
775
 
776
    case OPTION_NO_TLS_GET_ADDR_OPT:
777
      no_tls_get_addr_opt = 1;
778
      break;
779
 
780
    case OPTION_NO_OPD_OPT:
781
      no_opd_opt = 1;
782
      break;
783
 
784
    case OPTION_NO_TOC_OPT:
785
      no_toc_opt = 1;
786
      break;
787
 
788
    case OPTION_NO_MULTI_TOC:
789
      no_multi_toc = 1;
790
      break;
791
 
792
    case OPTION_NO_TOC_SORT:
793
      no_toc_sort = 1;
794
      break;
795
 
796
    case OPTION_NON_OVERLAPPING_OPD:
797
      non_overlapping_opd = 1;
798
      break;
799
'
800
 
801
# Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
802
#
803
LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
804
LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
805
LDEMUL_FINISH=gld${EMULATION_NAME}_finish
806
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
807
LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern

powered by: WebSVN 2.1.0

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