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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [ld/] [emultempl/] [elf32.em] - Blame information for rev 818

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 205 julius
# This shell script emits a C file. -*- C -*-
2
# It does some substitutions.
3
# This file is now misnamed, because it supports both 32 bit and 64 bit
4
# ELF emulations.
5
test -z "${ELFSIZE}" && ELFSIZE=32
6
if [ -z "$MACHINE" ]; then
7
  OUTPUT_ARCH=${ARCH}
8
else
9
  OUTPUT_ARCH=${ARCH}:${MACHINE}
10
fi
11
fragment <
12
/* This file is is generated by a shell script.  DO NOT EDIT! */
13
 
14
/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15
   Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16
   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
17
   Free Software Foundation, Inc.
18
   Written by Steve Chamberlain 
19
   ELF support by Ian Lance Taylor 
20
 
21
   This file is part of the GNU Binutils.
22
 
23
   This program is free software; you can redistribute it and/or modify
24
   it under the terms of the GNU General Public License as published by
25
   the Free Software Foundation; either version 3 of the License, or
26
   (at your option) any later version.
27
 
28
   This program is distributed in the hope that it will be useful,
29
   but WITHOUT ANY WARRANTY; without even the implied warranty of
30
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
31
   GNU General Public License for more details.
32
 
33
   You should have received a copy of the GNU General Public License
34
   along with this program; if not, write to the Free Software
35
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
36
   MA 02110-1301, USA.  */
37
 
38
#define TARGET_IS_${EMULATION_NAME}
39
 
40
#include "sysdep.h"
41
#include "bfd.h"
42
#include "libiberty.h"
43
#include "safe-ctype.h"
44
#include "getopt.h"
45
#include "md5.h"
46
#include "sha1.h"
47
#include 
48
 
49
#include "bfdlink.h"
50
 
51
#include "ld.h"
52
#include "ldmain.h"
53
#include "ldmisc.h"
54
#include "ldexp.h"
55
#include "ldlang.h"
56
#include "ldfile.h"
57
#include "ldemul.h"
58
#include 
59
#include "elf/common.h"
60
#include "elf-bfd.h"
61
 
62
/* Declare functions used by various EXTRA_EM_FILEs.  */
63
static void gld${EMULATION_NAME}_before_parse (void);
64
static void gld${EMULATION_NAME}_after_open (void);
65
static void gld${EMULATION_NAME}_before_allocation (void);
66
static void gld${EMULATION_NAME}_after_allocation (void);
67
static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
68
  (asection *, const char *, int);
69
EOF
70
 
71
if [ "x${USE_LIBPATH}" = xyes ] ; then
72
  case ${target} in
73
    *-*-linux-* | *-*-k*bsd*-*)
74
  fragment <
75
#ifdef HAVE_GLOB
76
#include 
77
#endif
78
EOF
79
    ;;
80
  esac
81
fi
82
 
83
# Import any needed special functions and/or overrides.
84
#
85
source_em ${srcdir}/emultempl/elf-generic.em
86
if test -n "$EXTRA_EM_FILE" ; then
87
  source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
88
fi
89
 
90
# Functions in this file can be overridden by setting the LDEMUL_* shell
91
# variables.  If the name of the overriding function is the same as is
92
# defined in this file, then don't output this file's version.
93
# If a different overriding name is given then output the standard function
94
# as presumably it is called from the overriding function.
95
#
96
if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
97
fragment <
98
 
99
static void
100
gld${EMULATION_NAME}_before_parse (void)
101
{
102
  ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
103
  config.dynamic_link = ${DYNAMIC_LINK-TRUE};
104
  config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
105
}
106
 
107
EOF
108
fi
109
 
110
if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
111
fragment <
112
/* Handle as_needed DT_NEEDED.  */
113
 
114
static bfd_boolean
115
gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
116
{
117
  int link_class = 0;
118
 
119
  /* Tell the ELF linker that we don't want the output file to have a
120
     DT_NEEDED entry for this file, unless it is used to resolve
121
     references in a regular object.  */
122
  if (entry->as_needed)
123
    link_class = DYN_AS_NEEDED;
124
 
125
  /* Tell the ELF linker that we don't want the output file to have a
126
     DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
127
     this file at all.  */
128
  if (!entry->add_needed)
129
    link_class |= DYN_NO_ADD_NEEDED;
130
 
131
  if (entry->just_syms_flag
132
      && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
133
    einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
134
           entry->the_bfd);
135
 
136
  if (!link_class
137
      || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
138
    return FALSE;
139
 
140
  bfd_elf_set_dyn_lib_class (entry->the_bfd,
141
                             (enum dynamic_lib_link_class) link_class);
142
 
143
  /* Continue on with normal load_symbols processing.  */
144
  return FALSE;
145
}
146
EOF
147
fi
148
 
149
fragment <
150
 
151
/* These variables are required to pass information back and forth
152
   between after_open and check_needed and stat_needed and vercheck.  */
153
 
154
static struct bfd_link_needed_list *global_needed;
155
static struct stat global_stat;
156
static lang_input_statement_type *global_found;
157
static struct bfd_link_needed_list *global_vercheck_needed;
158
static bfd_boolean global_vercheck_failed;
159
 
160
 
161
/* On Linux, it's possible to have different versions of the same
162
   shared library linked against different versions of libc.  The
163
   dynamic linker somehow tags which libc version to use in
164
   /etc/ld.so.cache, and, based on the libc that it sees in the
165
   executable, chooses which version of the shared library to use.
166
 
167
   We try to do a similar check here by checking whether this shared
168
   library needs any other shared libraries which may conflict with
169
   libraries we have already included in the link.  If it does, we
170
   skip it, and try to find another shared library farther on down the
171
   link path.
172
 
173
   This is called via lang_for_each_input_file.
174
   GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
175
   which we are checking.  This sets GLOBAL_VERCHECK_FAILED if we find
176
   a conflicting version.  */
177
 
178
static void
179
gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
180
{
181
  const char *soname;
182
  struct bfd_link_needed_list *l;
183
 
184
  if (global_vercheck_failed)
185
    return;
186
  if (s->the_bfd == NULL
187
      || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
188
    return;
189
 
190
  soname = bfd_elf_get_dt_soname (s->the_bfd);
191
  if (soname == NULL)
192
    soname = lbasename (bfd_get_filename (s->the_bfd));
193
 
194
  for (l = global_vercheck_needed; l != NULL; l = l->next)
195
    {
196
      const char *suffix;
197
 
198
      if (strcmp (soname, l->name) == 0)
199
        {
200
          /* Probably can't happen, but it's an easy check.  */
201
          continue;
202
        }
203
 
204
      if (strchr (l->name, '/') != NULL)
205
        continue;
206
 
207
      suffix = strstr (l->name, ".so.");
208
      if (suffix == NULL)
209
        continue;
210
 
211
      suffix += sizeof ".so." - 1;
212
 
213
      if (strncmp (soname, l->name, suffix - l->name) == 0)
214
        {
215
          /* Here we know that S is a dynamic object FOO.SO.VER1, and
216
             the object we are considering needs a dynamic object
217
             FOO.SO.VER2, and VER1 and VER2 are different.  This
218
             appears to be a version mismatch, so we tell the caller
219
             to try a different version of this library.  */
220
          global_vercheck_failed = TRUE;
221
          return;
222
        }
223
    }
224
}
225
 
226
 
227
/* See if an input file matches a DT_NEEDED entry by running stat on
228
   the file.  */
229
 
230
static void
231
gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
232
{
233
  struct stat st;
234
  const char *suffix;
235
  const char *soname;
236
 
237
  if (global_found != NULL)
238
    return;
239
  if (s->the_bfd == NULL)
240
    return;
241
 
242
  /* If this input file was an as-needed entry, and wasn't found to be
243
     needed at the stage it was linked, then don't say we have loaded it.  */
244
  if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
245
    return;
246
 
247
  if (bfd_stat (s->the_bfd, &st) != 0)
248
    {
249
      einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
250
      return;
251
    }
252
 
253
  /* Some operating systems, e.g. Windows, do not provide a meaningful
254
     st_ino; they always set it to zero.  (Windows does provide a
255
     meaningful st_dev.)  Do not indicate a duplicate library in that
256
     case.  While there is no guarantee that a system that provides
257
     meaningful inode numbers will never set st_ino to zero, this is
258
     merely an optimization, so we do not need to worry about false
259
     negatives.  */
260
  if (st.st_dev == global_stat.st_dev
261
      && st.st_ino == global_stat.st_ino
262
      && st.st_ino != 0)
263
    {
264
      global_found = s;
265
      return;
266
    }
267
 
268
  /* We issue a warning if it looks like we are including two
269
     different versions of the same shared library.  For example,
270
     there may be a problem if -lc picks up libc.so.6 but some other
271
     shared library has a DT_NEEDED entry of libc.so.5.  This is a
272
     heuristic test, and it will only work if the name looks like
273
     NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
274
     If we really want to issue warnings about mixing version numbers
275
     of shared libraries, we need to find a better way.  */
276
 
277
  if (strchr (global_needed->name, '/') != NULL)
278
    return;
279
  suffix = strstr (global_needed->name, ".so.");
280
  if (suffix == NULL)
281
    return;
282
  suffix += sizeof ".so." - 1;
283
 
284
  soname = bfd_elf_get_dt_soname (s->the_bfd);
285
  if (soname == NULL)
286
    soname = lbasename (s->filename);
287
 
288
  if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
289
    einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
290
           global_needed->name, global_needed->by, soname);
291
}
292
 
293
struct dt_needed
294
{
295
  bfd *by;
296
  const char *name;
297
};
298
 
299
/* This function is called for each possible name for a dynamic object
300
   named by a DT_NEEDED entry.  The FORCE parameter indicates whether
301
   to skip the check for a conflicting version.  */
302
 
303
static bfd_boolean
304
gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
305
                                 int force)
306
{
307
  bfd *abfd;
308
  const char *name = needed->name;
309
  const char *soname;
310
  int link_class;
311
 
312
  abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
313
  if (abfd == NULL)
314
    return FALSE;
315
  if (! bfd_check_format (abfd, bfd_object))
316
    {
317
      bfd_close (abfd);
318
      return FALSE;
319
    }
320
  if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
321
    {
322
      bfd_close (abfd);
323
      return FALSE;
324
    }
325
 
326
  /* For DT_NEEDED, they have to match.  */
327
  if (abfd->xvec != link_info.output_bfd->xvec)
328
    {
329
      bfd_close (abfd);
330
      return FALSE;
331
    }
332
 
333
  /* Check whether this object would include any conflicting library
334
     versions.  If FORCE is set, then we skip this check; we use this
335
     the second time around, if we couldn't find any compatible
336
     instance of the shared library.  */
337
 
338
  if (! force)
339
    {
340
      struct bfd_link_needed_list *needed;
341
 
342
      if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
343
        einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
344
 
345
      if (needed != NULL)
346
        {
347
          global_vercheck_needed = needed;
348
          global_vercheck_failed = FALSE;
349
          lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
350
          if (global_vercheck_failed)
351
            {
352
              bfd_close (abfd);
353
              /* Return FALSE to force the caller to move on to try
354
                 another file on the search path.  */
355
              return FALSE;
356
            }
357
 
358
          /* But wait!  It gets much worse.  On Linux, if a shared
359
             library does not use libc at all, we are supposed to skip
360
             it the first time around in case we encounter a shared
361
             library later on with the same name which does use the
362
             version of libc that we want.  This is much too horrible
363
             to use on any system other than Linux.  */
364
 
365
EOF
366
case ${target} in
367
  *-*-linux-* | *-*-k*bsd*-*)
368
    fragment <
369
          {
370
            struct bfd_link_needed_list *l;
371
 
372
            for (l = needed; l != NULL; l = l->next)
373
              if (CONST_STRNEQ (l->name, "libc.so"))
374
                break;
375
            if (l == NULL)
376
              {
377
                bfd_close (abfd);
378
                return FALSE;
379
              }
380
          }
381
 
382
EOF
383
    ;;
384
esac
385
fragment <
386
        }
387
    }
388
 
389
  /* We've found a dynamic object matching the DT_NEEDED entry.  */
390
 
391
  /* We have already checked that there is no other input file of the
392
     same name.  We must now check again that we are not including the
393
     same file twice.  We need to do this because on many systems
394
     libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
395
     reference libc.so.1.  If we have already included libc.so, we
396
     don't want to include libc.so.1 if they are the same file, and we
397
     can only check that using stat.  */
398
 
399
  if (bfd_stat (abfd, &global_stat) != 0)
400
    einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
401
 
402
  /* First strip off everything before the last '/'.  */
403
  soname = lbasename (abfd->filename);
404
 
405
  if (trace_file_tries)
406
    info_msg (_("found %s at %s\n"), soname, name);
407
 
408
  global_found = NULL;
409
  lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
410
  if (global_found != NULL)
411
    {
412
      /* Return TRUE to indicate that we found the file, even though
413
         we aren't going to do anything with it.  */
414
      return TRUE;
415
    }
416
 
417
  /* Specify the soname to use.  */
418
  bfd_elf_set_dt_needed_name (abfd, soname);
419
 
420
  /* Tell the ELF linker that we don't want the output file to have a
421
     DT_NEEDED entry for this file, unless it is used to resolve
422
     references in a regular object.  */
423
  link_class = DYN_DT_NEEDED;
424
 
425
  /* Tell the ELF linker that we don't want the output file to have a
426
     DT_NEEDED entry for this file at all if the entry is from a file
427
     with DYN_NO_ADD_NEEDED.  */
428
  if (needed->by != NULL
429
      && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
430
    link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
431
 
432
  bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
433
 
434
  /* Add this file into the symbol table.  */
435
  if (! bfd_link_add_symbols (abfd, &link_info))
436
    einfo ("%F%B: could not read symbols: %E\n", abfd);
437
 
438
  return TRUE;
439
}
440
 
441
 
442
/* Search for a needed file in a path.  */
443
 
444
static bfd_boolean
445
gld${EMULATION_NAME}_search_needed (const char *path,
446
                                    struct dt_needed *n, int force)
447
{
448
  const char *s;
449
  const char *name = n->name;
450
  size_t len;
451
  struct dt_needed needed;
452
 
453
  if (name[0] == '/')
454
    return gld${EMULATION_NAME}_try_needed (n, force);
455
 
456
  if (path == NULL || *path == '\0')
457
    return FALSE;
458
 
459
  needed.by = n->by;
460
  needed.name = n->name;
461
 
462
  len = strlen (name);
463
  while (1)
464
    {
465
      char *filename, *sset;
466
 
467
      s = strchr (path, config.rpath_separator);
468
      if (s == NULL)
469
        s = path + strlen (path);
470
 
471
      filename = (char *) xmalloc (s - path + len + 2);
472
      if (s == path)
473
        sset = filename;
474
      else
475
        {
476
          memcpy (filename, path, s - path);
477
          filename[s - path] = '/';
478
          sset = filename + (s - path) + 1;
479
        }
480
      strcpy (sset, name);
481
 
482
      needed.name = filename;
483
      if (gld${EMULATION_NAME}_try_needed (&needed, force))
484
        return TRUE;
485
 
486
      free (filename);
487
 
488
      if (*s == '\0')
489
        break;
490
      path = s + 1;
491
    }
492
 
493
  return FALSE;
494
}
495
 
496
EOF
497
if [ "x${USE_LIBPATH}" = xyes ] ; then
498
  fragment <
499
 
500
/* Add the sysroot to every entry in a path separated by
501
   config.rpath_separator.  */
502
 
503
static char *
504
gld${EMULATION_NAME}_add_sysroot (const char *path)
505
{
506
  int len, colons, i;
507
  char *ret, *p;
508
 
509
  len = strlen (path);
510
  colons = 0;
511
  i = 0;
512
  while (path[i])
513
    if (path[i++] == config.rpath_separator)
514
      colons++;
515
 
516
  if (path[i])
517
    colons++;
518
 
519
  len = len + (colons + 1) * strlen (ld_sysroot);
520
  ret = xmalloc (len + 1);
521
  strcpy (ret, ld_sysroot);
522
  p = ret + strlen (ret);
523
  i = 0;
524
  while (path[i])
525
    if (path[i] == config.rpath_separator)
526
      {
527
        *p++ = path[i++];
528
        strcpy (p, ld_sysroot);
529
        p = p + strlen (p);
530
      }
531
    else
532
      *p++ = path[i++];
533
 
534
  *p = 0;
535
  return ret;
536
}
537
 
538
EOF
539
  case ${target} in
540
    *-*-freebsd* | *-*-dragonfly*)
541
      fragment <
542
/* Read the system search path the FreeBSD way rather than the Linux way.  */
543
#ifdef HAVE_ELF_HINTS_H
544
#include 
545
#else
546
#include "elf-hints-local.h"
547
#endif
548
 
549
static bfd_boolean
550
gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
551
{
552
  static bfd_boolean initialized;
553
  static char *ld_elf_hints;
554
  struct dt_needed needed;
555
 
556
  if (!initialized)
557
    {
558
      FILE *f;
559
      char *tmppath;
560
 
561
      tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
562
      f = fopen (tmppath, FOPEN_RB);
563
      free (tmppath);
564
      if (f != NULL)
565
        {
566
          struct elfhints_hdr hdr;
567
 
568
          if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
569
              && hdr.magic == ELFHINTS_MAGIC
570
              && hdr.version == 1)
571
            {
572
              if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
573
                {
574
                  char *b;
575
 
576
                  b = xmalloc (hdr.dirlistlen + 1);
577
                  if (fread (b, 1, hdr.dirlistlen + 1, f) ==
578
                      hdr.dirlistlen + 1)
579
                    ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
580
 
581
                  free (b);
582
                }
583
            }
584
          fclose (f);
585
        }
586
 
587
      initialized = TRUE;
588
    }
589
 
590
  if (ld_elf_hints == NULL)
591
    return FALSE;
592
 
593
  needed.by = NULL;
594
  needed.name = name;
595
  return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
596
                                             force);
597
}
598
EOF
599
    # FreeBSD
600
    ;;
601
 
602
    *-*-linux-* | *-*-k*bsd*-*)
603
      fragment <
604
/* For a native linker, check the file /etc/ld.so.conf for directories
605
   in which we may find shared libraries.  /etc/ld.so.conf is really
606
   only meaningful on Linux.  */
607
 
608
struct gld${EMULATION_NAME}_ld_so_conf
609
{
610
  char *path;
611
  size_t len, alloc;
612
};
613
 
614
static bfd_boolean
615
gld${EMULATION_NAME}_parse_ld_so_conf
616
     (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
617
 
618
static void
619
gld${EMULATION_NAME}_parse_ld_so_conf_include
620
     (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
621
      const char *pattern)
622
{
623
  char *newp = NULL;
624
#ifdef HAVE_GLOB
625
  glob_t gl;
626
#endif
627
 
628
  if (pattern[0] != '/')
629
    {
630
      char *p = strrchr (filename, '/');
631
      size_t patlen = strlen (pattern) + 1;
632
 
633
      newp = xmalloc (p - filename + 1 + patlen);
634
      memcpy (newp, filename, p - filename + 1);
635
      memcpy (newp + (p - filename + 1), pattern, patlen);
636
      pattern = newp;
637
    }
638
 
639
#ifdef HAVE_GLOB
640
  if (glob (pattern, 0, NULL, &gl) == 0)
641
    {
642
      size_t i;
643
 
644
      for (i = 0; i < gl.gl_pathc; ++i)
645
        gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
646
      globfree (&gl);
647
    }
648
#else
649
  /* If we do not have glob, treat the pattern as a literal filename.  */
650
  gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
651
#endif
652
 
653
  if (newp)
654
    free (newp);
655
}
656
 
657
static bfd_boolean
658
gld${EMULATION_NAME}_parse_ld_so_conf
659
     (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
660
{
661
  FILE *f = fopen (filename, FOPEN_RT);
662
  char *line;
663
  size_t linelen;
664
 
665
  if (f == NULL)
666
    return FALSE;
667
 
668
  linelen = 256;
669
  line = xmalloc (linelen);
670
  do
671
    {
672
      char *p = line, *q;
673
 
674
      /* Normally this would use getline(3), but we need to be portable.  */
675
      while ((q = fgets (p, linelen - (p - line), f)) != NULL
676
             && strlen (q) == linelen - (p - line) - 1
677
             && line[linelen - 2] != '\n')
678
        {
679
          line = xrealloc (line, 2 * linelen);
680
          p = line + linelen - 1;
681
          linelen += linelen;
682
        }
683
 
684
      if (q == NULL && p == line)
685
        break;
686
 
687
      p = strchr (line, '\n');
688
      if (p)
689
        *p = '\0';
690
 
691
      /* Because the file format does not know any form of quoting we
692
         can search forward for the next '#' character and if found
693
         make it terminating the line.  */
694
      p = strchr (line, '#');
695
      if (p)
696
        *p = '\0';
697
 
698
      /* Remove leading whitespace.  NUL is no whitespace character.  */
699
      p = line;
700
      while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
701
        ++p;
702
 
703
      /* If the line is blank it is ignored.  */
704
      if (p[0] == '\0')
705
        continue;
706
 
707
      if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
708
        {
709
          char *dir, c;
710
          p += 8;
711
          do
712
            {
713
              while (*p == ' ' || *p == '\t')
714
                ++p;
715
 
716
              if (*p == '\0')
717
                break;
718
 
719
              dir = p;
720
 
721
              while (*p != ' ' && *p != '\t' && *p)
722
                ++p;
723
 
724
              c = *p;
725
              *p++ = '\0';
726
              if (dir[0] != '\0')
727
                gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
728
                                                               dir);
729
            }
730
          while (c != '\0');
731
        }
732
      else
733
        {
734
          char *dir = p;
735
          while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
736
                 && *p != '\r' && *p != '\v')
737
            ++p;
738
 
739
          while (p != dir && p[-1] == '/')
740
            --p;
741
          if (info->path == NULL)
742
            {
743
              info->alloc = p - dir + 1 + 256;
744
              info->path = xmalloc (info->alloc);
745
              info->len = 0;
746
            }
747
          else
748
            {
749
              if (info->len + 1 + (p - dir) >= info->alloc)
750
                {
751
                  info->alloc += p - dir + 256;
752
                  info->path = xrealloc (info->path, info->alloc);
753
                }
754
              info->path[info->len++] = config.rpath_separator;
755
            }
756
          memcpy (info->path + info->len, dir, p - dir);
757
          info->len += p - dir;
758
          info->path[info->len] = '\0';
759
        }
760
    }
761
  while (! feof (f));
762
  free (line);
763
  fclose (f);
764
  return TRUE;
765
}
766
 
767
static bfd_boolean
768
gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
769
{
770
  static bfd_boolean initialized;
771
  static char *ld_so_conf;
772
  struct dt_needed needed;
773
 
774
  if (! initialized)
775
    {
776
      char *tmppath;
777
      struct gld${EMULATION_NAME}_ld_so_conf info;
778
 
779
      info.path = NULL;
780
      info.len = info.alloc = 0;
781
      tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
782
                        (const char *) NULL);
783
      if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
784
        {
785
          free (tmppath);
786
          tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
787
                            (const char *) NULL);
788
          gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
789
        }
790
      free (tmppath);
791
 
792
      if (info.path)
793
        {
794
          char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
795
          free (info.path);
796
          ld_so_conf = d;
797
        }
798
      initialized = TRUE;
799
    }
800
 
801
  if (ld_so_conf == NULL)
802
    return FALSE;
803
 
804
 
805
  needed.by = NULL;
806
  needed.name = name;
807
  return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
808
}
809
 
810
EOF
811
    # Linux
812
    ;;
813
  esac
814
fi
815
fragment <
816
 
817
/* See if an input file matches a DT_NEEDED entry by name.  */
818
 
819
static void
820
gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
821
{
822
  const char *soname;
823
 
824
  /* Stop looking if we've found a loaded lib.  */
825
  if (global_found != NULL
826
      && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
827
          & DYN_AS_NEEDED) == 0)
828
    return;
829
 
830
  if (s->filename == NULL || s->the_bfd == NULL)
831
    return;
832
 
833
  /* Don't look for a second non-loaded as-needed lib.  */
834
  if (global_found != NULL
835
      && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
836
    return;
837
 
838
  if (strcmp (s->filename, global_needed->name) == 0)
839
    {
840
      global_found = s;
841
      return;
842
    }
843
 
844
  if (s->search_dirs_flag)
845
    {
846
      const char *f = strrchr (s->filename, '/');
847
      if (f != NULL
848
          && strcmp (f + 1, global_needed->name) == 0)
849
        {
850
          global_found = s;
851
          return;
852
        }
853
    }
854
 
855
  soname = bfd_elf_get_dt_soname (s->the_bfd);
856
  if (soname != NULL
857
      && strcmp (soname, global_needed->name) == 0)
858
    {
859
      global_found = s;
860
      return;
861
    }
862
}
863
 
864
EOF
865
 
866
if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
867
fragment <
868
 
869
static bfd_size_type
870
gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
871
                                           struct bfd_link_info *link_info)
872
{
873
  const char *style = link_info->emit_note_gnu_build_id;
874
  bfd_size_type size;
875
 
876
  abfd = abfd;
877
 
878
  size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
879
  size = (size + 3) & -(bfd_size_type) 4;
880
 
881
  if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
882
    size += 128 / 8;
883
  else if (!strcmp (style, "sha1"))
884
    size += 160 / 8;
885
  else if (!strncmp (style, "0x", 2))
886
    {
887
      /* ID is in string form (hex).  Convert to bits.  */
888
      const char *id = style + 2;
889
      do
890
        {
891
          if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
892
            {
893
              ++size;
894
              id += 2;
895
            }
896
          else if (*id == '-' || *id == ':')
897
            ++id;
898
          else
899
            {
900
              size = 0;
901
              break;
902
            }
903
        } while (*id != '\0');
904
    }
905
  else
906
    size = 0;
907
 
908
  return size;
909
}
910
 
911
static unsigned char
912
read_hex (const char xdigit)
913
{
914
  if (ISDIGIT (xdigit))
915
    return xdigit - '0';
916
  if (ISUPPER (xdigit))
917
    return xdigit - 'A' + 0xa;
918
  if (ISLOWER (xdigit))
919
    return xdigit - 'a' + 0xa;
920
  abort ();
921
  return 0;
922
}
923
 
924
struct build_id_info
925
{
926
  const char *style;
927
  asection *sec;
928
};
929
 
930
static bfd_boolean
931
gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
932
{
933
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
934
  struct build_id_info *info = (struct build_id_info *)
935
    elf_tdata (abfd)->after_write_object_contents_info;
936
  asection *asec;
937
  Elf_Internal_Shdr *i_shdr;
938
  unsigned char *contents, *id_bits;
939
  bfd_size_type size;
940
  Elf_External_Note *e_note;
941
 
942
  asec = info->sec;
943
  if (bfd_is_abs_section (asec->output_section))
944
    {
945
      einfo (_("%P: warning: .note.gnu.build-id section discarded,"
946
               " --build-id ignored.\n"));
947
      return TRUE;
948
    }
949
  i_shdr = &elf_section_data (asec->output_section)->this_hdr;
950
 
951
  if (i_shdr->contents == NULL)
952
    {
953
      if (asec->contents == NULL)
954
        asec->contents = (unsigned char *) xmalloc (asec->size);
955
      contents = asec->contents;
956
    }
957
  else
958
    contents = i_shdr->contents + asec->output_offset;
959
 
960
  e_note = (Elf_External_Note *) contents;
961
  size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
962
  size = (size + 3) & -(bfd_size_type) 4;
963
  id_bits = contents + size;
964
  size = asec->size - size;
965
 
966
  bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
967
  bfd_h_put_32 (abfd, size, &e_note->descsz);
968
  bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
969
  memcpy (e_note->name, "GNU", sizeof "GNU");
970
 
971
  if (!strcmp (info->style, "md5"))
972
    {
973
      struct md5_ctx ctx;
974
      md5_init_ctx (&ctx);
975
      if (bed->s->checksum_contents (abfd,
976
                                     (void (*) (const void *, size_t, void *))
977
                                     &md5_process_bytes,
978
                                     &ctx))
979
        md5_finish_ctx (&ctx, id_bits);
980
      else
981
        return FALSE;
982
    }
983
  else if (!strcmp (info->style, "sha1"))
984
    {
985
      struct sha1_ctx ctx;
986
      sha1_init_ctx (&ctx);
987
      if (bed->s->checksum_contents (abfd,
988
                                     (void (*) (const void *, size_t, void *))
989
                                     &sha1_process_bytes,
990
                                     &ctx))
991
        sha1_finish_ctx (&ctx, id_bits);
992
      else
993
        return FALSE;
994
    }
995
  else if (!strcmp (info->style, "uuid"))
996
    {
997
      int n;
998
      int fd = open ("/dev/urandom", O_RDONLY);
999
      if (fd < 0)
1000
        return FALSE;
1001
      n = read (fd, id_bits, size);
1002
      close (fd);
1003
      if (n < (int) size)
1004
        return FALSE;
1005
    }
1006
  else if (!strncmp (info->style, "0x", 2))
1007
    {
1008
      /* ID is in string form (hex).  Convert to bits.  */
1009
      const char *id = info->style + 2;
1010
      size_t n = 0;
1011
      do
1012
        {
1013
          if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1014
            {
1015
              id_bits[n] = read_hex (*id++) << 4;
1016
              id_bits[n++] |= read_hex (*id++);
1017
            }
1018
          else if (*id == '-' || *id == ':')
1019
            ++id;
1020
          else
1021
            abort ();           /* Should have been validated earlier.  */
1022
        } while (*id != '\0');
1023
    }
1024
  else
1025
    abort ();                   /* Should have been validated earlier.  */
1026
 
1027
  size = asec->size;
1028
  return (bfd_seek (abfd,
1029
                    i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1030
          && bfd_bwrite (contents, size, abfd) == size);
1031
}
1032
 
1033
 
1034
/* This is called after all the input files have been opened.  */
1035
 
1036
static void
1037
gld${EMULATION_NAME}_after_open (void)
1038
{
1039
  struct bfd_link_needed_list *needed, *l;
1040
  struct elf_link_hash_table *htab;
1041
 
1042
  htab = elf_hash_table (&link_info);
1043
  if (!is_elf_hash_table (htab))
1044
    return;
1045
 
1046
  if (link_info.emit_note_gnu_build_id)
1047
    {
1048
      bfd *abfd;
1049
      asection *s;
1050
      bfd_size_type size;
1051
 
1052
      abfd = link_info.input_bfds;
1053
 
1054
      if (abfd == NULL)
1055
        {
1056
          /* PR 10555: If there are no input files do not
1057
             try to create a .note.gnu-build-id section.  */
1058
          free (link_info.emit_note_gnu_build_id);
1059
          link_info.emit_note_gnu_build_id = NULL;
1060
        }
1061
      else
1062
        {
1063
          size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1064
          if (size == 0)
1065
            {
1066
              einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1067
              free (link_info.emit_note_gnu_build_id);
1068
              link_info.emit_note_gnu_build_id = NULL;
1069
            }
1070
          else
1071
            {
1072
              s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1073
                                               SEC_ALLOC | SEC_LOAD
1074
                                               | SEC_IN_MEMORY | SEC_LINKER_CREATED
1075
                                               | SEC_READONLY | SEC_DATA);
1076
              if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1077
                {
1078
                  struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1079
                  struct build_id_info *b =
1080
                      (struct build_id_info *) xmalloc (sizeof *b);
1081
 
1082
                  b->style = link_info.emit_note_gnu_build_id;
1083
                  b->sec = s;
1084
                  elf_section_type (s) = SHT_NOTE;
1085
                  s->size = size;
1086
                  t->after_write_object_contents
1087
                    = &gld${EMULATION_NAME}_write_build_id_section;
1088
                  t->after_write_object_contents_info = b;
1089
                }
1090
              else
1091
                {
1092
                  einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1093
                         " --build-id ignored.\n");
1094
                  free (link_info.emit_note_gnu_build_id);
1095
                  link_info.emit_note_gnu_build_id = NULL;
1096
                }
1097
            }
1098
        }
1099
    }
1100
 
1101
  if (link_info.relocatable)
1102
    return;
1103
 
1104
  if (link_info.eh_frame_hdr
1105
      && !link_info.traditional_format)
1106
    {
1107
      bfd *abfd;
1108
      asection *s;
1109
 
1110
      for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1111
        {
1112
          s = bfd_get_section_by_name (abfd, ".eh_frame");
1113
          if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
1114
            break;
1115
        }
1116
      if (abfd)
1117
        {
1118
          const struct elf_backend_data *bed;
1119
 
1120
          bed = get_elf_backend_data (abfd);
1121
          s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
1122
                                           bed->dynamic_sec_flags
1123
                                           | SEC_READONLY);
1124
          if (s != NULL
1125
              && bfd_set_section_alignment (abfd, s, 2))
1126
            htab->eh_info.hdr_sec = s;
1127
          else
1128
            einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1129
                   " --eh-frame-hdr ignored.\n");
1130
        }
1131
    }
1132
 
1133
  /* Get the list of files which appear in DT_NEEDED entries in
1134
     dynamic objects included in the link (often there will be none).
1135
     For each such file, we want to track down the corresponding
1136
     library, and include the symbol table in the link.  This is what
1137
     the runtime dynamic linker will do.  Tracking the files down here
1138
     permits one dynamic object to include another without requiring
1139
     special action by the person doing the link.  Note that the
1140
     needed list can actually grow while we are stepping through this
1141
     loop.  */
1142
  if (!link_info.executable)
1143
    return;
1144
  needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1145
  for (l = needed; l != NULL; l = l->next)
1146
    {
1147
      struct bfd_link_needed_list *ll;
1148
      struct dt_needed n, nn;
1149
      int force;
1150
 
1151
      /* If the lib that needs this one was --as-needed and wasn't
1152
         found to be needed, then this lib isn't needed either.  */
1153
      if (l->by != NULL
1154
          && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1155
        continue;
1156
 
1157
      /* If we've already seen this file, skip it.  */
1158
      for (ll = needed; ll != l; ll = ll->next)
1159
        if ((ll->by == NULL
1160
             || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1161
            && strcmp (ll->name, l->name) == 0)
1162
          break;
1163
      if (ll != l)
1164
        continue;
1165
 
1166
      /* See if this file was included in the link explicitly.  */
1167
      global_needed = l;
1168
      global_found = NULL;
1169
      lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1170
      if (global_found != NULL
1171
          && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1172
              & DYN_AS_NEEDED) == 0)
1173
        continue;
1174
 
1175
      n.by = l->by;
1176
      n.name = l->name;
1177
      nn.by = l->by;
1178
      if (trace_file_tries)
1179
        info_msg (_("%s needed by %B\n"), l->name, l->by);
1180
 
1181
      /* As-needed libs specified on the command line (or linker script)
1182
         take priority over libs found in search dirs.  */
1183
      if (global_found != NULL)
1184
        {
1185
          nn.name = global_found->filename;
1186
          if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1187
            continue;
1188
        }
1189
 
1190
      /* We need to find this file and include the symbol table.  We
1191
         want to search for the file in the same way that the dynamic
1192
         linker will search.  That means that we want to use
1193
         rpath_link, rpath, then the environment variable
1194
         LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1195
         entries (native only), then the linker script LIB_SEARCH_DIRS.
1196
         We do not search using the -L arguments.
1197
 
1198
         We search twice.  The first time, we skip objects which may
1199
         introduce version mismatches.  The second time, we force
1200
         their use.  See gld${EMULATION_NAME}_vercheck comment.  */
1201
      for (force = 0; force < 2; force++)
1202
        {
1203
          size_t len;
1204
          search_dirs_type *search;
1205
EOF
1206
if [ "x${NATIVE}" = xyes ] ; then
1207
fragment <
1208
          const char *lib_path;
1209
EOF
1210
fi
1211
if [ "x${USE_LIBPATH}" = xyes ] ; then
1212
fragment <
1213
          struct bfd_link_needed_list *rp;
1214
          int found;
1215
EOF
1216
fi
1217
fragment <
1218
 
1219
          if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1220
                                                  &n, force))
1221
            break;
1222
EOF
1223
if [ "x${USE_LIBPATH}" = xyes ] ; then
1224
fragment <
1225
          if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1226
                                                  &n, force))
1227
            break;
1228
EOF
1229
fi
1230
if [ "x${NATIVE}" = xyes ] ; then
1231
fragment <
1232
          if (command_line.rpath_link == NULL
1233
              && command_line.rpath == NULL)
1234
            {
1235
              lib_path = (const char *) getenv ("LD_RUN_PATH");
1236
              if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1237
                                                      force))
1238
                break;
1239
            }
1240
          lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1241
          if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1242
            break;
1243
EOF
1244
fi
1245
if [ "x${USE_LIBPATH}" = xyes ] ; then
1246
fragment <
1247
          found = 0;
1248
          rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1249
          for (; !found && rp != NULL; rp = rp->next)
1250
            {
1251
              char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1252
              found = (rp->by == l->by
1253
                       && gld${EMULATION_NAME}_search_needed (tmpname,
1254
                                                              &n,
1255
                                                              force));
1256
              free (tmpname);
1257
            }
1258
          if (found)
1259
            break;
1260
 
1261
EOF
1262
fi
1263
if [ "x${USE_LIBPATH}" = xyes ] ; then
1264
  case ${target} in
1265
    *-*-freebsd* | *-*-dragonfly*)
1266
      fragment <
1267
          if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1268
            break;
1269
EOF
1270
    # FreeBSD
1271
    ;;
1272
 
1273
    *-*-linux-* | *-*-k*bsd*-*)
1274
    # Linux
1275
      fragment <
1276
          if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1277
            break;
1278
 
1279
EOF
1280
    ;;
1281
  esac
1282
fi
1283
fragment <
1284
          len = strlen (l->name);
1285
          for (search = search_head; search != NULL; search = search->next)
1286
            {
1287
              char *filename;
1288
 
1289
              if (search->cmdline)
1290
                continue;
1291
              filename = (char *) xmalloc (strlen (search->name) + len + 2);
1292
              sprintf (filename, "%s/%s", search->name, l->name);
1293
              nn.name = filename;
1294
              if (gld${EMULATION_NAME}_try_needed (&nn, force))
1295
                break;
1296
              free (filename);
1297
            }
1298
          if (search != NULL)
1299
            break;
1300
EOF
1301
fragment <
1302
        }
1303
 
1304
      if (force < 2)
1305
        continue;
1306
 
1307
      einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1308
             l->name, l->by);
1309
    }
1310
}
1311
 
1312
EOF
1313
fi
1314
 
1315
fragment <
1316
 
1317
/* Look through an expression for an assignment statement.  */
1318
 
1319
static void
1320
gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1321
{
1322
  bfd_boolean provide = FALSE;
1323
 
1324
  switch (exp->type.node_class)
1325
    {
1326
    case etree_provide:
1327
      provide = TRUE;
1328
      /* Fall thru */
1329
    case etree_assign:
1330
      /* We call record_link_assignment even if the symbol is defined.
1331
         This is because if it is defined by a dynamic object, we
1332
         actually want to use the value defined by the linker script,
1333
         not the value from the dynamic object (because we are setting
1334
         symbols like etext).  If the symbol is defined by a regular
1335
         object, then, as it happens, calling record_link_assignment
1336
         will do no harm.  */
1337
      if (strcmp (exp->assign.dst, ".") != 0)
1338
        {
1339
          if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1340
                                               &link_info,
1341
                                               exp->assign.dst, provide,
1342
                                               exp->assign.hidden))
1343
            einfo ("%P%F: failed to record assignment to %s: %E\n",
1344
                   exp->assign.dst);
1345
        }
1346
      gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1347
      break;
1348
 
1349
    case etree_binary:
1350
      gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1351
      gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1352
      break;
1353
 
1354
    case etree_trinary:
1355
      gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1356
      gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1357
      gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1358
      break;
1359
 
1360
    case etree_unary:
1361
      gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1362
      break;
1363
 
1364
    default:
1365
      break;
1366
    }
1367
}
1368
 
1369
 
1370
/* This is called by the before_allocation routine via
1371
   lang_for_each_statement.  It locates any assignment statements, and
1372
   tells the ELF backend about them, in case they are assignments to
1373
   symbols which are referred to by dynamic objects.  */
1374
 
1375
static void
1376
gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1377
{
1378
  if (s->header.type == lang_assignment_statement_enum)
1379
    gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1380
}
1381
 
1382
EOF
1383
 
1384
if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1385
  if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1386
    ELF_INTERPRETER_SET_DEFAULT="
1387
  if (sinterp != NULL)
1388
    {
1389
      sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1390
      sinterp->size = strlen ((char *) sinterp->contents) + 1;
1391
    }
1392
 
1393
"
1394
  else
1395
    ELF_INTERPRETER_SET_DEFAULT=
1396
  fi
1397
fragment <
1398
 
1399
/* This is called after the sections have been attached to output
1400
   sections, but before any sizes or addresses have been set.  */
1401
 
1402
static void
1403
gld${EMULATION_NAME}_before_allocation (void)
1404
{
1405
  const char *rpath;
1406
  asection *sinterp;
1407
 
1408
  if (link_info.hash->type == bfd_link_elf_hash_table)
1409
    _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1410
 
1411
  /* If we are going to make any variable assignments, we need to let
1412
     the ELF backend know about them in case the variables are
1413
     referred to by dynamic objects.  */
1414
  lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1415
 
1416
  /* Let the ELF backend work out the sizes of any sections required
1417
     by dynamic linking.  */
1418
  rpath = command_line.rpath;
1419
  if (rpath == NULL)
1420
    rpath = (const char *) getenv ("LD_RUN_PATH");
1421
  if (! (bfd_elf_size_dynamic_sections
1422
         (link_info.output_bfd, command_line.soname, rpath,
1423
          command_line.filter_shlib,
1424
          (const char * const *) command_line.auxiliary_filters,
1425
          &link_info, &sinterp, lang_elf_version_info)))
1426
    einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1427
 
1428
${ELF_INTERPRETER_SET_DEFAULT}
1429
  /* Let the user override the dynamic linker we are using.  */
1430
  if (command_line.interpreter != NULL
1431
      && sinterp != NULL)
1432
    {
1433
      sinterp->contents = (bfd_byte *) command_line.interpreter;
1434
      sinterp->size = strlen (command_line.interpreter) + 1;
1435
    }
1436
 
1437
  /* Look for any sections named .gnu.warning.  As a GNU extensions,
1438
     we treat such sections as containing warning messages.  We print
1439
     out the warning message, and then zero out the section size so
1440
     that it does not get copied into the output file.  */
1441
 
1442
  {
1443
    LANG_FOR_EACH_INPUT_STATEMENT (is)
1444
      {
1445
        asection *s;
1446
        bfd_size_type sz;
1447
        char *msg;
1448
        bfd_boolean ret;
1449
 
1450
        if (is->just_syms_flag)
1451
          continue;
1452
 
1453
        s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1454
        if (s == NULL)
1455
          continue;
1456
 
1457
        sz = s->size;
1458
        msg = (char *) xmalloc ((size_t) (sz + 1));
1459
        if (! bfd_get_section_contents (is->the_bfd, s, msg,
1460
                                        (file_ptr) 0, sz))
1461
          einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1462
                 is->the_bfd);
1463
        msg[sz] = '\0';
1464
        ret = link_info.callbacks->warning (&link_info, msg,
1465
                                            (const char *) NULL,
1466
                                            is->the_bfd, (asection *) NULL,
1467
                                            (bfd_vma) 0);
1468
        ASSERT (ret);
1469
        free (msg);
1470
 
1471
        /* Clobber the section size, so that we don't waste space
1472
           copying the warning into the output file.  If we've already
1473
           sized the output section, adjust its size.  The adjustment
1474
           is on rawsize because targets that size sections early will
1475
           have called lang_reset_memory_regions after sizing.  */
1476
        if (s->output_section != NULL
1477
            && s->output_section->rawsize >= s->size)
1478
          s->output_section->rawsize -= s->size;
1479
 
1480
        s->size = 0;
1481
 
1482
        /* Also set SEC_EXCLUDE, so that local symbols defined in the
1483
           warning section don't get copied to the output.  */
1484
        s->flags |= SEC_EXCLUDE | SEC_KEEP;
1485
      }
1486
  }
1487
 
1488
  before_allocation_default ();
1489
 
1490
  if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1491
    einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1492
}
1493
 
1494
EOF
1495
fi
1496
 
1497
if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1498
fragment <
1499
 
1500
/* Try to open a dynamic archive.  This is where we know that ELF
1501
   dynamic libraries have an extension of .so (or .sl on oddball systems
1502
   like hpux).  */
1503
 
1504
static bfd_boolean
1505
gld${EMULATION_NAME}_open_dynamic_archive
1506
  (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1507
{
1508
  const char *filename;
1509
  char *string;
1510
 
1511
  if (! entry->is_archive)
1512
    return FALSE;
1513
 
1514
  filename = entry->filename;
1515
 
1516
  /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1517
     is defined, but it does not seem worth the headache to optimize
1518
     away those two bytes of space.  */
1519
  string = (char *) xmalloc (strlen (search->name)
1520
                             + strlen (filename)
1521
                             + strlen (arch)
1522
#ifdef EXTRA_SHLIB_EXTENSION
1523
                             + strlen (EXTRA_SHLIB_EXTENSION)
1524
#endif
1525
                             + sizeof "/lib.so");
1526
 
1527
  sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1528
 
1529
#ifdef EXTRA_SHLIB_EXTENSION
1530
  /* Try the .so extension first.  If that fails build a new filename
1531
     using EXTRA_SHLIB_EXTENSION.  */
1532
  if (! ldfile_try_open_bfd (string, entry))
1533
    {
1534
      sprintf (string, "%s/lib%s%s%s", search->name,
1535
               filename, arch, EXTRA_SHLIB_EXTENSION);
1536
#endif
1537
 
1538
  if (! ldfile_try_open_bfd (string, entry))
1539
    {
1540
      free (string);
1541
      return FALSE;
1542
    }
1543
#ifdef EXTRA_SHLIB_EXTENSION
1544
    }
1545
#endif
1546
 
1547
  entry->filename = string;
1548
 
1549
  /* We have found a dynamic object to include in the link.  The ELF
1550
     backend linker will create a DT_NEEDED entry in the .dynamic
1551
     section naming this file.  If this file includes a DT_SONAME
1552
     entry, it will be used.  Otherwise, the ELF linker will just use
1553
     the name of the file.  For an archive found by searching, like
1554
     this one, the DT_NEEDED entry should consist of just the name of
1555
     the file, without the path information used to find it.  Note
1556
     that we only need to do this if we have a dynamic object; an
1557
     archive will never be referenced by a DT_NEEDED entry.
1558
 
1559
     FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1560
     very pretty.  I haven't been able to think of anything that is
1561
     pretty, though.  */
1562
  if (bfd_check_format (entry->the_bfd, bfd_object)
1563
      && (entry->the_bfd->flags & DYNAMIC) != 0)
1564
    {
1565
      ASSERT (entry->is_archive && entry->search_dirs_flag);
1566
 
1567
      /* Rather than duplicating the logic above.  Just use the
1568
         filename we recorded earlier.  */
1569
 
1570
      filename = lbasename (entry->filename);
1571
      bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1572
    }
1573
 
1574
  return TRUE;
1575
}
1576
 
1577
EOF
1578
fi
1579
 
1580
if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1581
fragment <
1582
 
1583
/* A variant of lang_output_section_find used by place_orphan.  */
1584
 
1585
static lang_output_section_statement_type *
1586
output_rel_find (asection *sec, int isdyn)
1587
{
1588
  lang_output_section_statement_type *lookup;
1589
  lang_output_section_statement_type *last = NULL;
1590
  lang_output_section_statement_type *last_alloc = NULL;
1591
  lang_output_section_statement_type *last_ro_alloc = NULL;
1592
  lang_output_section_statement_type *last_rel = NULL;
1593
  lang_output_section_statement_type *last_rel_alloc = NULL;
1594
  int rela = sec->name[4] == 'a';
1595
 
1596
  for (lookup = &lang_output_section_statement.head->output_section_statement;
1597
       lookup != NULL;
1598
       lookup = lookup->next)
1599
    {
1600
      if (lookup->constraint >= 0
1601
          && CONST_STRNEQ (lookup->name, ".rel"))
1602
        {
1603
          int lookrela = lookup->name[4] == 'a';
1604
 
1605
          /* .rel.dyn must come before all other reloc sections, to suit
1606
             GNU ld.so.  */
1607
          if (isdyn)
1608
            break;
1609
 
1610
          /* Don't place after .rel.plt as doing so results in wrong
1611
             dynamic tags.  */
1612
          if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1613
            break;
1614
 
1615
          if (rela == lookrela || last_rel == NULL)
1616
            last_rel = lookup;
1617
          if ((rela == lookrela || last_rel_alloc == NULL)
1618
              && lookup->bfd_section != NULL
1619
              && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1620
            last_rel_alloc = lookup;
1621
        }
1622
 
1623
      last = lookup;
1624
      if (lookup->bfd_section != NULL
1625
          && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1626
        {
1627
          last_alloc = lookup;
1628
          if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1629
            last_ro_alloc = lookup;
1630
        }
1631
    }
1632
 
1633
  if (last_rel_alloc)
1634
    return last_rel_alloc;
1635
 
1636
  if (last_rel)
1637
    return last_rel;
1638
 
1639
  if (last_ro_alloc)
1640
    return last_ro_alloc;
1641
 
1642
  if (last_alloc)
1643
    return last_alloc;
1644
 
1645
  return last;
1646
}
1647
 
1648
/* Place an orphan section.  We use this to put random SHF_ALLOC
1649
   sections in the right segment.  */
1650
 
1651
static lang_output_section_statement_type *
1652
gld${EMULATION_NAME}_place_orphan (asection *s,
1653
                                   const char *secname,
1654
                                   int constraint)
1655
{
1656
  static struct orphan_save hold[] =
1657
    {
1658
      { ".text",
1659
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1660
        0, 0, 0, 0 },
1661
      { ".rodata",
1662
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1663
        0, 0, 0, 0 },
1664
      { ".data",
1665
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1666
        0, 0, 0, 0 },
1667
      { ".bss",
1668
        SEC_ALLOC,
1669
        0, 0, 0, 0 },
1670
      { 0,
1671
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1672
        0, 0, 0, 0 },
1673
      { ".interp",
1674
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1675
        0, 0, 0, 0 },
1676
      { ".sdata",
1677
        SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1678
        0, 0, 0, 0 },
1679
      { 0,
1680
        SEC_HAS_CONTENTS,
1681
        0, 0, 0, 0 },
1682
    };
1683
  enum orphan_save_index
1684
    {
1685
      orphan_text = 0,
1686
      orphan_rodata,
1687
      orphan_data,
1688
      orphan_bss,
1689
      orphan_rel,
1690
      orphan_interp,
1691
      orphan_sdata,
1692
      orphan_nonalloc
1693
    };
1694
  static int orphan_init_done = 0;
1695
  struct orphan_save *place;
1696
  lang_output_section_statement_type *after;
1697
  lang_output_section_statement_type *os;
1698
  int isdyn = 0;
1699
  int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1700
  unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1701
 
1702
  if (! link_info.relocatable
1703
      && link_info.combreloc
1704
      && (s->flags & SEC_ALLOC))
1705
    {
1706
      if (iself)
1707
        switch (sh_type)
1708
          {
1709
          case SHT_RELA:
1710
            secname = ".rela.dyn";
1711
            isdyn = 1;
1712
            break;
1713
          case SHT_REL:
1714
            secname = ".rel.dyn";
1715
            isdyn = 1;
1716
            break;
1717
          default:
1718
            break;
1719
          }
1720
      else if (CONST_STRNEQ (secname, ".rel"))
1721
        {
1722
          secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1723
          isdyn = 1;
1724
        }
1725
    }
1726
 
1727
  /* Look through the script to see where to place this section.  */
1728
  if (constraint == 0)
1729
    for (os = lang_output_section_find (secname);
1730
         os != NULL;
1731
         os = next_matching_output_section_statement (os, 0))
1732
      {
1733
        /* If we don't match an existing output section, tell
1734
           lang_insert_orphan to create a new output section.  */
1735
        constraint = SPECIAL;
1736
 
1737
        if (os->bfd_section != NULL
1738
            && (os->bfd_section->flags == 0
1739
                || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1740
                                                     os->bfd_section,
1741
                                                     s->owner, s)
1742
                    && ((s->flags ^ os->bfd_section->flags)
1743
                        & (SEC_LOAD | SEC_ALLOC)) == 0)))
1744
          {
1745
            /* We already have an output section statement with this
1746
               name, and its bfd section has compatible flags.
1747
               If the section already exists but does not have any flags
1748
               set, then it has been created by the linker, probably as a
1749
               result of a --section-start command line switch.  */
1750
            lang_add_section (&os->children, s, os);
1751
            return os;
1752
          }
1753
      }
1754
 
1755
  if (!orphan_init_done)
1756
    {
1757
      lang_output_section_statement_type *lookup;
1758
      struct orphan_save *ho;
1759
 
1760
      for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1761
        if (ho->name != NULL)
1762
          {
1763
            ho->os = lang_output_section_find (ho->name);
1764
            if (ho->os != NULL && ho->os->flags == 0)
1765
              ho->os->flags = ho->flags;
1766
          }
1767
      lookup = hold[orphan_bss].os;
1768
      if (lookup == NULL)
1769
        lookup = &lang_output_section_statement.head->output_section_statement;
1770
      for (; lookup != NULL; lookup = lookup->next)
1771
        if ((lookup->bfd_section != NULL
1772
             && (lookup->bfd_section->flags & SEC_DEBUGGING) != 0)
1773
            || strcmp (lookup->name, ".comment") == 0)
1774
          break;
1775
      hold[orphan_nonalloc].os = lookup ? lookup->prev : NULL;
1776
      hold[orphan_nonalloc].name = ".comment";
1777
      orphan_init_done = 1;
1778
    }
1779
 
1780
  /* If this is a final link, then always put .gnu.warning.SYMBOL
1781
     sections into the .text section to get them out of the way.  */
1782
  if (link_info.executable
1783
      && ! link_info.relocatable
1784
      && CONST_STRNEQ (s->name, ".gnu.warning.")
1785
      && hold[orphan_text].os != NULL)
1786
    {
1787
      os = hold[orphan_text].os;
1788
      lang_add_section (&os->children, s, os);
1789
      return os;
1790
    }
1791
 
1792
  /* Decide which segment the section should go in based on the
1793
     section name and section flags.  We put loadable .note sections
1794
     right after the .interp section, so that the PT_NOTE segment is
1795
     stored right after the program headers where the OS can read it
1796
     in the first page.  */
1797
 
1798
  place = NULL;
1799
  if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1800
    place = &hold[orphan_nonalloc];
1801
  else if ((s->flags & SEC_ALLOC) == 0)
1802
    ;
1803
  else if ((s->flags & SEC_LOAD) != 0
1804
           && ((iself && sh_type == SHT_NOTE)
1805
               || (!iself && CONST_STRNEQ (secname, ".note"))))
1806
    place = &hold[orphan_interp];
1807
  else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1808
    place = &hold[orphan_bss];
1809
  else if ((s->flags & SEC_SMALL_DATA) != 0)
1810
    place = &hold[orphan_sdata];
1811
  else if ((s->flags & SEC_READONLY) == 0)
1812
    place = &hold[orphan_data];
1813
  else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1814
            || (!iself && CONST_STRNEQ (secname, ".rel")))
1815
           && (s->flags & SEC_LOAD) != 0)
1816
    place = &hold[orphan_rel];
1817
  else if ((s->flags & SEC_CODE) == 0)
1818
    place = &hold[orphan_rodata];
1819
  else
1820
    place = &hold[orphan_text];
1821
 
1822
  after = NULL;
1823
  if (place != NULL)
1824
    {
1825
      if (place->os == NULL)
1826
        {
1827
          if (place->name != NULL)
1828
            place->os = lang_output_section_find (place->name);
1829
          else
1830
            place->os = output_rel_find (s, isdyn);
1831
        }
1832
      after = place->os;
1833
      if (after == NULL)
1834
        after = lang_output_section_find_by_flags
1835
          (s, &place->os, _bfd_elf_match_sections_by_type);
1836
      if (after == NULL)
1837
        /* *ABS* is always the first output section statement.  */
1838
        after = &lang_output_section_statement.head->output_section_statement;
1839
    }
1840
 
1841
  return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1842
}
1843
EOF
1844
fi
1845
 
1846
if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
1847
fragment <
1848
 
1849
static void
1850
gld${EMULATION_NAME}_after_allocation (void)
1851
{
1852
  bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
1853
                                                  &link_info);
1854
  gld${EMULATION_NAME}_map_segments (need_layout);
1855
}
1856
EOF
1857
fi
1858
 
1859
if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1860
fragment <
1861
 
1862
static char *
1863
gld${EMULATION_NAME}_get_script (int *isfile)
1864
EOF
1865
 
1866
if test -n "$COMPILE_IN"
1867
then
1868
# Scripts compiled in.
1869
 
1870
# sed commands to quote an ld script as a C string.
1871
sc="-f stringify.sed"
1872
 
1873
fragment <
1874
{
1875
  *isfile = 0;
1876
 
1877
  if (link_info.relocatable && config.build_constructors)
1878
    return
1879
EOF
1880
sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1881
echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1882
sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1883
echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1884
sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1885
if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1886
echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1887
sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1888
fi
1889
if test -n "$GENERATE_PIE_SCRIPT" ; then
1890
if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1891
echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1892
echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1893
echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1894
sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
1895
echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1896
sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
1897
fi
1898
echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
1899
sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
1900
fi
1901
if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1902
if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1903
echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1904
echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1905
echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1906
sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
1907
echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1908
sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
1909
fi
1910
echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
1911
sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
1912
fi
1913
if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1914
echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1915
echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1916
sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
1917
echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
1918
sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
1919
fi
1920
echo '  ; else return'                                  >> e${EMULATION_NAME}.c
1921
sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
1922
echo '; }'                                              >> e${EMULATION_NAME}.c
1923
 
1924
else
1925
# Scripts read from the filesystem.
1926
 
1927
fragment <
1928
{
1929
  *isfile = 1;
1930
 
1931
  if (link_info.relocatable && config.build_constructors)
1932
    return "ldscripts/${EMULATION_NAME}.xu";
1933
  else if (link_info.relocatable)
1934
    return "ldscripts/${EMULATION_NAME}.xr";
1935
  else if (!config.text_read_only)
1936
    return "ldscripts/${EMULATION_NAME}.xbn";
1937
EOF
1938
if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1939
else
1940
fragment <
1941
  else if (!config.magic_demand_paged)
1942
    return "ldscripts/${EMULATION_NAME}.xn";
1943
EOF
1944
fi
1945
if test -n "$GENERATE_PIE_SCRIPT" ; then
1946
if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1947
fragment <
1948
  else if (link_info.pie && link_info.combreloc
1949
           && link_info.relro && (link_info.flags & DF_BIND_NOW))
1950
    return "ldscripts/${EMULATION_NAME}.xdw";
1951
  else if (link_info.pie && link_info.combreloc)
1952
    return "ldscripts/${EMULATION_NAME}.xdc";
1953
EOF
1954
fi
1955
fragment <
1956
  else if (link_info.pie)
1957
    return "ldscripts/${EMULATION_NAME}.xd";
1958
EOF
1959
fi
1960
if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1961
if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1962
fragment <
1963
  else if (link_info.shared && link_info.combreloc
1964
           && link_info.relro && (link_info.flags & DF_BIND_NOW))
1965
    return "ldscripts/${EMULATION_NAME}.xsw";
1966
  else if (link_info.shared && link_info.combreloc)
1967
    return "ldscripts/${EMULATION_NAME}.xsc";
1968
EOF
1969
fi
1970
fragment <
1971
  else if (link_info.shared)
1972
    return "ldscripts/${EMULATION_NAME}.xs";
1973
EOF
1974
fi
1975
if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1976
fragment <
1977
  else if (link_info.combreloc && link_info.relro
1978
           && (link_info.flags & DF_BIND_NOW))
1979
    return "ldscripts/${EMULATION_NAME}.xw";
1980
  else if (link_info.combreloc)
1981
    return "ldscripts/${EMULATION_NAME}.xc";
1982
EOF
1983
fi
1984
fragment <
1985
  else
1986
    return "ldscripts/${EMULATION_NAME}.x";
1987
}
1988
 
1989
EOF
1990
fi
1991
fi
1992
 
1993
if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1994
 
1995
if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1996
fragment <
1997
 $PARSE_AND_LIST_PROLOGUE
1998
EOF
1999
fi
2000
 
2001
fragment <
2002
 
2003
#define OPTION_DISABLE_NEW_DTAGS        (400)
2004
#define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
2005
#define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
2006
#define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
2007
#define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
2008
#define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
2009
#define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
2010
 
2011
static void
2012
gld${EMULATION_NAME}_add_options
2013
  (int ns, char **shortopts, int nl, struct option **longopts,
2014
   int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2015
{
2016
  static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
2017
  static const struct option xtra_long[] = {
2018
    {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2019
EOF
2020
 
2021
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2022
fragment <
2023
    {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2024
    {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2025
    {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2026
    {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2027
    {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2028
    {"Bgroup", no_argument, NULL, OPTION_GROUP},
2029
EOF
2030
fi
2031
 
2032
if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2033
fragment <
2034
    $PARSE_AND_LIST_LONGOPTS
2035
EOF
2036
fi
2037
 
2038
fragment <
2039
    {NULL, no_argument, NULL, 0}
2040
  };
2041
 
2042
  *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2043
  memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2044
  *longopts = (struct option *)
2045
    xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2046
  memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2047
}
2048
 
2049
#define DEFAULT_BUILD_ID_STYLE  "sha1"
2050
 
2051
static bfd_boolean
2052
gld${EMULATION_NAME}_handle_option (int optc)
2053
{
2054
  switch (optc)
2055
    {
2056
    default:
2057
      return FALSE;
2058
 
2059
    case OPTION_BUILD_ID:
2060
      if (link_info.emit_note_gnu_build_id != NULL)
2061
        {
2062
          free (link_info.emit_note_gnu_build_id);
2063
          link_info.emit_note_gnu_build_id = NULL;
2064
        }
2065
      if (optarg == NULL)
2066
        optarg = DEFAULT_BUILD_ID_STYLE;
2067
      if (strcmp (optarg, "none"))
2068
        link_info.emit_note_gnu_build_id = xstrdup (optarg);
2069
      break;
2070
 
2071
EOF
2072
 
2073
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2074
fragment <
2075
    case OPTION_DISABLE_NEW_DTAGS:
2076
      link_info.new_dtags = FALSE;
2077
      break;
2078
 
2079
    case OPTION_ENABLE_NEW_DTAGS:
2080
      link_info.new_dtags = TRUE;
2081
      break;
2082
 
2083
    case OPTION_EH_FRAME_HDR:
2084
      link_info.eh_frame_hdr = TRUE;
2085
      break;
2086
 
2087
    case OPTION_GROUP:
2088
      link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2089
      /* Groups must be self-contained.  */
2090
      link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2091
      link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2092
      break;
2093
 
2094
    case OPTION_EXCLUDE_LIBS:
2095
      add_excluded_libs (optarg);
2096
      break;
2097
 
2098
    case OPTION_HASH_STYLE:
2099
      link_info.emit_hash = FALSE;
2100
      link_info.emit_gnu_hash = FALSE;
2101
      if (strcmp (optarg, "sysv") == 0)
2102
        link_info.emit_hash = TRUE;
2103
      else if (strcmp (optarg, "gnu") == 0)
2104
        link_info.emit_gnu_hash = TRUE;
2105
      else if (strcmp (optarg, "both") == 0)
2106
        {
2107
          link_info.emit_hash = TRUE;
2108
          link_info.emit_gnu_hash = TRUE;
2109
        }
2110
      else
2111
        einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2112
      break;
2113
 
2114
    case 'z':
2115
      if (strcmp (optarg, "initfirst") == 0)
2116
        link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2117
      else if (strcmp (optarg, "interpose") == 0)
2118
        link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2119
      else if (strcmp (optarg, "loadfltr") == 0)
2120
        link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2121
      else if (strcmp (optarg, "nodefaultlib") == 0)
2122
        link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2123
      else if (strcmp (optarg, "nodelete") == 0)
2124
        link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2125
      else if (strcmp (optarg, "nodlopen") == 0)
2126
        link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2127
      else if (strcmp (optarg, "nodump") == 0)
2128
        link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2129
      else if (strcmp (optarg, "now") == 0)
2130
        {
2131
          link_info.flags |= (bfd_vma) DF_BIND_NOW;
2132
          link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2133
        }
2134
      else if (strcmp (optarg, "lazy") == 0)
2135
        {
2136
          link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2137
          link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2138
        }
2139
      else if (strcmp (optarg, "origin") == 0)
2140
        {
2141
          link_info.flags |= (bfd_vma) DF_ORIGIN;
2142
          link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2143
        }
2144
      else if (strcmp (optarg, "defs") == 0)
2145
        link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2146
      else if (strcmp (optarg, "muldefs") == 0)
2147
        link_info.allow_multiple_definition = TRUE;
2148
      else if (strcmp (optarg, "combreloc") == 0)
2149
        link_info.combreloc = TRUE;
2150
      else if (strcmp (optarg, "nocombreloc") == 0)
2151
        link_info.combreloc = FALSE;
2152
      else if (strcmp (optarg, "nocopyreloc") == 0)
2153
        link_info.nocopyreloc = TRUE;
2154
      else if (strcmp (optarg, "execstack") == 0)
2155
        {
2156
          link_info.execstack = TRUE;
2157
          link_info.noexecstack = FALSE;
2158
        }
2159
      else if (strcmp (optarg, "noexecstack") == 0)
2160
        {
2161
          link_info.noexecstack = TRUE;
2162
          link_info.execstack = FALSE;
2163
        }
2164
EOF
2165
 
2166
  if test -n "$COMMONPAGESIZE"; then
2167
fragment <
2168
      else if (strcmp (optarg, "relro") == 0)
2169
        link_info.relro = TRUE;
2170
      else if (strcmp (optarg, "norelro") == 0)
2171
        link_info.relro = FALSE;
2172
EOF
2173
  fi
2174
 
2175
fragment <
2176
      else if (CONST_STRNEQ (optarg, "max-page-size="))
2177
        {
2178
          char *end;
2179
 
2180
          config.maxpagesize = strtoul (optarg + 14, &end, 0);
2181
          if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2182
            einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2183
                   optarg + 14);
2184
        }
2185
      else if (CONST_STRNEQ (optarg, "common-page-size="))
2186
        {
2187
          char *end;
2188
          config.commonpagesize = strtoul (optarg + 17, &end, 0);
2189
          if (*end
2190
              || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2191
            einfo (_("%P%F: invalid common page size \`%s'\n"),
2192
                   optarg + 17);
2193
        }
2194
      /* What about the other Solaris -z options? FIXME.  */
2195
      break;
2196
EOF
2197
fi
2198
 
2199
if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2200
fragment <
2201
 $PARSE_AND_LIST_ARGS_CASES
2202
EOF
2203
fi
2204
 
2205
fragment <
2206
    }
2207
 
2208
  return TRUE;
2209
}
2210
 
2211
EOF
2212
 
2213
if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2214
fragment <
2215
 
2216
static void
2217
gld${EMULATION_NAME}_list_options (FILE * file)
2218
{
2219
  fprintf (file, _("\
2220
  --build-id[=STYLE]          Generate build ID note\n"));
2221
EOF
2222
 
2223
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2224
fragment <
2225
  fprintf (file, _("\
2226
  -Bgroup                     Selects group name lookup rules for DSO\n"));
2227
  fprintf (file, _("\
2228
  --disable-new-dtags         Disable new dynamic tags\n"));
2229
  fprintf (file, _("\
2230
  --enable-new-dtags          Enable new dynamic tags\n"));
2231
  fprintf (file, _("\
2232
  --eh-frame-hdr              Create .eh_frame_hdr section\n"));
2233
  fprintf (file, _("\
2234
  --hash-style=STYLE          Set hash style to sysv, gnu or both\n"));
2235
  fprintf (file, _("\
2236
  -z combreloc                Merge dynamic relocs into one section and sort\n"));
2237
  fprintf (file, _("\
2238
  -z defs                     Report unresolved symbols in object files.\n"));
2239
  fprintf (file, _("\
2240
  -z execstack                Mark executable as requiring executable stack\n"));
2241
  fprintf (file, _("\
2242
  -z initfirst                Mark DSO to be initialized first at runtime\n"));
2243
  fprintf (file, _("\
2244
  -z interpose                Mark object to interpose all DSOs but executable\n"));
2245
  fprintf (file, _("\
2246
  -z lazy                     Mark object lazy runtime binding (default)\n"));
2247
  fprintf (file, _("\
2248
  -z loadfltr                 Mark object requiring immediate process\n"));
2249
  fprintf (file, _("\
2250
  -z muldefs                  Allow multiple definitions\n"));
2251
  fprintf (file, _("\
2252
  -z nocombreloc              Don't merge dynamic relocs into one section\n"));
2253
  fprintf (file, _("\
2254
  -z nocopyreloc              Don't create copy relocs\n"));
2255
  fprintf (file, _("\
2256
  -z nodefaultlib             Mark object not to use default search paths\n"));
2257
  fprintf (file, _("\
2258
  -z nodelete                 Mark DSO non-deletable at runtime\n"));
2259
  fprintf (file, _("\
2260
  -z nodlopen                 Mark DSO not available to dlopen\n"));
2261
  fprintf (file, _("\
2262
  -z nodump                   Mark DSO not available to dldump\n"));
2263
  fprintf (file, _("\
2264
  -z noexecstack              Mark executable as not requiring executable stack\n"));
2265
EOF
2266
 
2267
  if test -n "$COMMONPAGESIZE"; then
2268
fragment <
2269
  fprintf (file, _("\
2270
  -z norelro                  Don't create RELRO program header\n"));
2271
EOF
2272
  fi
2273
 
2274
fragment <
2275
  fprintf (file, _("\
2276
  -z now                      Mark object non-lazy runtime binding\n"));
2277
  fprintf (file, _("\
2278
  -z origin                   Mark object requiring immediate \$ORIGIN\n\
2279
                                processing at runtime\n"));
2280
EOF
2281
 
2282
  if test -n "$COMMONPAGESIZE"; then
2283
fragment <
2284
  fprintf (file, _("\
2285
  -z relro                    Create RELRO program header\n"));
2286
EOF
2287
  fi
2288
 
2289
fragment <
2290
  fprintf (file, _("\
2291
  -z max-page-size=SIZE       Set maximum page size to SIZE\n"));
2292
  fprintf (file, _("\
2293
  -z common-page-size=SIZE    Set common page size to SIZE\n"));
2294
  fprintf (file, _("\
2295
  -z KEYWORD                  Ignored for Solaris compatibility\n"));
2296
EOF
2297
fi
2298
 
2299
if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2300
fragment <
2301
 $PARSE_AND_LIST_OPTIONS
2302
EOF
2303
fi
2304
 
2305
fragment <
2306
}
2307
EOF
2308
 
2309
if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2310
fragment <
2311
 $PARSE_AND_LIST_EPILOGUE
2312
EOF
2313
fi
2314
fi
2315
else
2316
fragment <
2317
#define gld${EMULATION_NAME}_add_options NULL
2318
#define gld${EMULATION_NAME}_handle_option NULL
2319
EOF
2320
if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2321
fragment <
2322
#define gld${EMULATION_NAME}_list_options NULL
2323
EOF
2324
fi
2325
fi
2326
 
2327
fragment <
2328
 
2329
struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2330
{
2331
  ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2332
  ${LDEMUL_SYSLIB-syslib_default},
2333
  ${LDEMUL_HLL-hll_default},
2334
  ${LDEMUL_AFTER_PARSE-after_parse_default},
2335
  ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2336
  ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2337
  ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2338
  ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2339
  ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2340
  ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2341
  "${EMULATION_NAME}",
2342
  "${OUTPUT_FORMAT}",
2343
  ${LDEMUL_FINISH-finish_default},
2344
  ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2345
  ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2346
  ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2347
  ${LDEMUL_SET_SYMBOLS-NULL},
2348
  ${LDEMUL_PARSE_ARGS-NULL},
2349
  gld${EMULATION_NAME}_add_options,
2350
  gld${EMULATION_NAME}_handle_option,
2351
  ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2352
  ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2353
  ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2354
  ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2355
  ${LDEMUL_NEW_VERS_PATTERN-NULL}
2356
};
2357
EOF

powered by: WebSVN 2.1.0

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