xref: /netbsd-src/external/gpl3/binutils.old/dist/ld/emultempl/solaris2.em (revision e992f068c547fd6e84b3f104dc2340adcc955732)
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
3if [ -z "$MACHINE" ]; then
4  OUTPUT_ARCH=${ARCH}
5else
6  OUTPUT_ARCH=${ARCH}:${MACHINE}
7fi
8fragment <<EOF
9/* This file is generated by a shell script.  DO NOT EDIT! */
10
11/* Solaris 2 emulation code for ${EMULATION_NAME}
12   Copyright (C) 2010-2022 Free Software Foundation, Inc.
13   Written by Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
14
15   This file is part of the GNU Binutils.
16
17   This program is free software; you can redistribute it and/or modify
18   it under the terms of the GNU General Public License as published by
19   the Free Software Foundation; either version 3 of the License, or
20   (at your option) any later version.
21
22   This program is distributed in the hope that it will be useful,
23   but WITHOUT ANY WARRANTY; without even the implied warranty of
24   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25   GNU General Public License for more details.
26
27   You should have received a copy of the GNU General Public License
28   along with this program; if not, write to the Free Software
29   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
30   MA 02110-1301, USA.  */
31
32#define TARGET_IS_${EMULATION_NAME}
33
34/* The Solaris 2 ABI requires some global symbols to be present in the
35   .dynsym table of executables and shared objects.  If generating a
36   versioned shared object, they must always be bound to the base version.
37
38   The Solaris 2 ABI also requires two local symbols to be emitted for
39   every executable and shared object.
40
41   Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
42   File, p.63.  */
43
44static void
45elf_solaris2_before_allocation (void)
46{
47  /* Global symbols required by the Solaris 2 ABI.  */
48  static const char *global_syms[] = {
49    "_DYNAMIC",
50    "_GLOBAL_OFFSET_TABLE_",
51    "_PROCEDURE_LINKAGE_TABLE_",
52    "_edata",
53    "_end",
54    "_etext",
55    NULL
56  };
57  /* Local symbols required by the Solaris 2 ABI.  Already emitted by
58     emulparams/solaris2.sh.  */
59  static const char *local_syms[] = {
60    "_START_",
61    "_END_",
62    NULL
63  };
64  const char **sym;
65
66  /* Do this for both executables and shared objects.  */
67  if (!bfd_link_relocatable (&link_info)
68      && is_elf_hash_table (link_info.hash))
69    {
70      for (sym = global_syms; *sym != NULL; sym++)
71	{
72	  struct elf_link_hash_entry *h;
73
74	  /* Lookup symbol.  */
75	  h = elf_link_hash_lookup (elf_hash_table (&link_info), *sym,
76				    false, false, false);
77	  if (h == NULL)
78	    continue;
79
80	  /* Undo the hiding done by _bfd_elf_define_linkage_sym.  */
81	  h->forced_local = 0;
82	  h->other &= ~STV_HIDDEN;
83
84	  /* Emit it into the .dynamic section, too.  */
85	  bfd_elf_link_record_dynamic_symbol (&link_info, h);
86	}
87
88      for (sym = local_syms; *sym != NULL; sym++)
89	{
90	  struct elf_link_hash_entry *h;
91
92	  /* Lookup symbol.  */
93	  h = elf_link_hash_lookup (elf_hash_table (&link_info), *sym,
94				    false, false, false);
95	  if (h == NULL)
96	    continue;
97
98	  /* Turn it local.  */
99	  h->forced_local = 1;
100	  /* Type should be STT_OBJECT, not STT_NOTYPE.  */
101	  h->type = STT_OBJECT;
102	}
103    }
104
105  /* Only do this if emitting a shared object and versioning is in place. */
106  if (bfd_link_dll (&link_info)
107      && ((link_info.version_info != NULL
108	   && link_info.version_info->name[0] != '\0')
109	  || link_info.create_default_symver))
110    {
111      struct bfd_elf_version_expr *globals = NULL, *locals = NULL;
112      struct bfd_elf_version_tree *basever;
113      const char *soname;
114
115      for (sym = global_syms; *sym != NULL; sym++)
116	{
117	  /* Create a version pattern for this symbol.  Some of them start
118	     off as local, others as global, so try both.  */
119	  globals = lang_new_vers_pattern (globals, *sym, NULL, true);
120	  locals = lang_new_vers_pattern (locals, *sym, NULL, true);
121	}
122
123      /* New version node for those symbols.  */
124      basever = lang_new_vers_node (globals, locals);
125
126      /* The version name matches what bfd_elf_size_dynamic_sections uses
127	 for the base version.  */
128      soname = bfd_elf_get_dt_soname (link_info.output_bfd);
129      if (soname == NULL)
130	soname = lbasename (bfd_get_filename (link_info.output_bfd));
131
132      /* Register the node.  */
133      lang_register_vers_node (soname, basever, NULL);
134      /* Enforce base version.  The encoded vd_ndx is vernum + 1.  */
135      basever->vernum = 0;
136    }
137
138  gld${EMULATION_NAME}_before_allocation ();
139}
140
141EOF
142
143LDEMUL_BEFORE_ALLOCATION=elf_solaris2_before_allocation
144