elf64-x86-64.c revision 1.1.1.8 1 1.1 christos /* X86-64 specific support for ELF
2 1.1.1.8 christos Copyright (C) 2000-2025 Free Software Foundation, Inc.
3 1.1 christos Contributed by Jan Hubicka <jh (at) suse.cz>.
4 1.1 christos
5 1.1 christos This file is part of BFD, the Binary File Descriptor library.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program; if not, write to the Free Software
19 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1 christos MA 02110-1301, USA. */
21 1.1 christos
22 1.1.1.4 christos #include "elfxx-x86.h"
23 1.1 christos #include "dwarf2.h"
24 1.1 christos #include "libiberty.h"
25 1.1.1.7 christos #include "sframe.h"
26 1.1 christos
27 1.1.1.2 christos #include "opcode/i386.h"
28 1.1 christos
29 1.1 christos #ifdef CORE_HEADER
30 1.1 christos #include <stdarg.h>
31 1.1 christos #include CORE_HEADER
32 1.1 christos #endif
33 1.1 christos
34 1.1 christos /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
35 1.1 christos #define MINUS_ONE (~ (bfd_vma) 0)
36 1.1 christos
37 1.1 christos /* Since both 32-bit and 64-bit x86-64 encode relocation type in the
38 1.1 christos identical manner, we use ELF32_R_TYPE instead of ELF64_R_TYPE to get
39 1.1 christos relocation type. We also use ELF_ST_TYPE instead of ELF64_ST_TYPE
40 1.1 christos since they are the same. */
41 1.1 christos
42 1.1 christos /* The relocation "howto" table. Order of fields:
43 1.1 christos type, rightshift, size, bitsize, pc_relative, bitpos, complain_on_overflow,
44 1.1 christos special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset. */
45 1.1 christos static reloc_howto_type x86_64_elf_howto_table[] =
46 1.1 christos {
47 1.1.1.6 christos HOWTO(R_X86_64_NONE, 0, 0, 0, false, 0, complain_overflow_dont,
48 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_NONE", false, 0, 0x00000000,
49 1.1.1.6 christos false),
50 1.1.1.6 christos HOWTO(R_X86_64_64, 0, 8, 64, false, 0, complain_overflow_dont,
51 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_64", false, 0, MINUS_ONE,
52 1.1.1.6 christos false),
53 1.1.1.6 christos HOWTO(R_X86_64_PC32, 0, 4, 32, true, 0, complain_overflow_signed,
54 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PC32", false, 0, 0xffffffff,
55 1.1.1.6 christos true),
56 1.1.1.6 christos HOWTO(R_X86_64_GOT32, 0, 4, 32, false, 0, complain_overflow_signed,
57 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOT32", false, 0, 0xffffffff,
58 1.1.1.6 christos false),
59 1.1.1.6 christos HOWTO(R_X86_64_PLT32, 0, 4, 32, true, 0, complain_overflow_signed,
60 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PLT32", false, 0, 0xffffffff,
61 1.1.1.6 christos true),
62 1.1.1.6 christos HOWTO(R_X86_64_COPY, 0, 4, 32, false, 0, complain_overflow_bitfield,
63 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_COPY", false, 0, 0xffffffff,
64 1.1.1.6 christos false),
65 1.1.1.6 christos HOWTO(R_X86_64_GLOB_DAT, 0, 8, 64, false, 0, complain_overflow_dont,
66 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", false, 0, MINUS_ONE,
67 1.1.1.6 christos false),
68 1.1.1.6 christos HOWTO(R_X86_64_JUMP_SLOT, 0, 8, 64, false, 0, complain_overflow_dont,
69 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", false, 0, MINUS_ONE,
70 1.1.1.6 christos false),
71 1.1.1.6 christos HOWTO(R_X86_64_RELATIVE, 0, 8, 64, false, 0, complain_overflow_dont,
72 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_RELATIVE", false, 0, MINUS_ONE,
73 1.1.1.6 christos false),
74 1.1.1.6 christos HOWTO(R_X86_64_GOTPCREL, 0, 4, 32, true, 0, complain_overflow_signed,
75 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", false, 0, 0xffffffff,
76 1.1.1.6 christos true),
77 1.1.1.6 christos HOWTO(R_X86_64_32, 0, 4, 32, false, 0, complain_overflow_unsigned,
78 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_32", false, 0, 0xffffffff,
79 1.1.1.6 christos false),
80 1.1.1.6 christos HOWTO(R_X86_64_32S, 0, 4, 32, false, 0, complain_overflow_signed,
81 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_32S", false, 0, 0xffffffff,
82 1.1.1.6 christos false),
83 1.1.1.6 christos HOWTO(R_X86_64_16, 0, 2, 16, false, 0, complain_overflow_bitfield,
84 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_16", false, 0, 0xffff, false),
85 1.1.1.6 christos HOWTO(R_X86_64_PC16, 0, 2, 16, true, 0, complain_overflow_bitfield,
86 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PC16", false, 0, 0xffff, true),
87 1.1.1.6 christos HOWTO(R_X86_64_8, 0, 1, 8, false, 0, complain_overflow_bitfield,
88 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_8", false, 0, 0xff, false),
89 1.1.1.6 christos HOWTO(R_X86_64_PC8, 0, 1, 8, true, 0, complain_overflow_signed,
90 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PC8", false, 0, 0xff, true),
91 1.1.1.6 christos HOWTO(R_X86_64_DTPMOD64, 0, 8, 64, false, 0, complain_overflow_dont,
92 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_DTPMOD64", false, 0, MINUS_ONE,
93 1.1.1.6 christos false),
94 1.1.1.6 christos HOWTO(R_X86_64_DTPOFF64, 0, 8, 64, false, 0, complain_overflow_dont,
95 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_DTPOFF64", false, 0, MINUS_ONE,
96 1.1.1.6 christos false),
97 1.1.1.6 christos HOWTO(R_X86_64_TPOFF64, 0, 8, 64, false, 0, complain_overflow_dont,
98 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_TPOFF64", false, 0, MINUS_ONE,
99 1.1.1.6 christos false),
100 1.1.1.6 christos HOWTO(R_X86_64_TLSGD, 0, 4, 32, true, 0, complain_overflow_signed,
101 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_TLSGD", false, 0, 0xffffffff,
102 1.1.1.6 christos true),
103 1.1.1.6 christos HOWTO(R_X86_64_TLSLD, 0, 4, 32, true, 0, complain_overflow_signed,
104 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_TLSLD", false, 0, 0xffffffff,
105 1.1.1.6 christos true),
106 1.1.1.6 christos HOWTO(R_X86_64_DTPOFF32, 0, 4, 32, false, 0, complain_overflow_signed,
107 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_DTPOFF32", false, 0, 0xffffffff,
108 1.1.1.6 christos false),
109 1.1.1.6 christos HOWTO(R_X86_64_GOTTPOFF, 0, 4, 32, true, 0, complain_overflow_signed,
110 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTTPOFF", false, 0, 0xffffffff,
111 1.1.1.6 christos true),
112 1.1.1.6 christos HOWTO(R_X86_64_TPOFF32, 0, 4, 32, false, 0, complain_overflow_signed,
113 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_TPOFF32", false, 0, 0xffffffff,
114 1.1.1.6 christos false),
115 1.1.1.6 christos HOWTO(R_X86_64_PC64, 0, 8, 64, true, 0, complain_overflow_dont,
116 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PC64", false, 0, MINUS_ONE,
117 1.1.1.6 christos true),
118 1.1.1.6 christos HOWTO(R_X86_64_GOTOFF64, 0, 8, 64, false, 0, complain_overflow_dont,
119 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTOFF64", false, 0, MINUS_ONE,
120 1.1.1.6 christos false),
121 1.1.1.6 christos HOWTO(R_X86_64_GOTPC32, 0, 4, 32, true, 0, complain_overflow_signed,
122 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTPC32", false, 0, 0xffffffff,
123 1.1.1.6 christos true),
124 1.1.1.6 christos HOWTO(R_X86_64_GOT64, 0, 8, 64, false, 0, complain_overflow_signed,
125 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOT64", false, 0, MINUS_ONE,
126 1.1.1.6 christos false),
127 1.1.1.6 christos HOWTO(R_X86_64_GOTPCREL64, 0, 8, 64, true, 0, complain_overflow_signed,
128 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTPCREL64", false, 0, MINUS_ONE,
129 1.1.1.6 christos true),
130 1.1.1.6 christos HOWTO(R_X86_64_GOTPC64, 0, 8, 64, true, 0, complain_overflow_signed,
131 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTPC64", false, 0, MINUS_ONE,
132 1.1.1.6 christos true),
133 1.1.1.6 christos HOWTO(R_X86_64_GOTPLT64, 0, 8, 64, false, 0, complain_overflow_signed,
134 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTPLT64", false, 0, MINUS_ONE,
135 1.1.1.6 christos false),
136 1.1.1.6 christos HOWTO(R_X86_64_PLTOFF64, 0, 8, 64, false, 0, complain_overflow_signed,
137 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PLTOFF64", false, 0, MINUS_ONE,
138 1.1.1.6 christos false),
139 1.1.1.6 christos HOWTO(R_X86_64_SIZE32, 0, 4, 32, false, 0, complain_overflow_unsigned,
140 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_SIZE32", false, 0, 0xffffffff,
141 1.1.1.6 christos false),
142 1.1.1.6 christos HOWTO(R_X86_64_SIZE64, 0, 8, 64, false, 0, complain_overflow_dont,
143 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_SIZE64", false, 0, MINUS_ONE,
144 1.1.1.6 christos false),
145 1.1.1.6 christos HOWTO(R_X86_64_GOTPC32_TLSDESC, 0, 4, 32, true, 0,
146 1.1 christos complain_overflow_bitfield, bfd_elf_generic_reloc,
147 1.1.1.6 christos "R_X86_64_GOTPC32_TLSDESC", false, 0, 0xffffffff, true),
148 1.1.1.6 christos HOWTO(R_X86_64_TLSDESC_CALL, 0, 0, 0, false, 0,
149 1.1 christos complain_overflow_dont, bfd_elf_generic_reloc,
150 1.1 christos "R_X86_64_TLSDESC_CALL",
151 1.1.1.6 christos false, 0, 0, false),
152 1.1.1.6 christos HOWTO(R_X86_64_TLSDESC, 0, 8, 64, false, 0,
153 1.1.1.6 christos complain_overflow_dont, bfd_elf_generic_reloc,
154 1.1.1.6 christos "R_X86_64_TLSDESC", false, 0, MINUS_ONE, false),
155 1.1.1.6 christos HOWTO(R_X86_64_IRELATIVE, 0, 8, 64, false, 0, complain_overflow_dont,
156 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", false, 0, MINUS_ONE,
157 1.1.1.6 christos false),
158 1.1.1.6 christos HOWTO(R_X86_64_RELATIVE64, 0, 8, 64, false, 0, complain_overflow_dont,
159 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", false, 0, MINUS_ONE,
160 1.1.1.6 christos false),
161 1.1.1.6 christos HOWTO(R_X86_64_PC32_BND, 0, 4, 32, true, 0, complain_overflow_signed,
162 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PC32_BND", false, 0, 0xffffffff,
163 1.1.1.6 christos true),
164 1.1.1.6 christos HOWTO(R_X86_64_PLT32_BND, 0, 4, 32, true, 0, complain_overflow_signed,
165 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_PLT32_BND", false, 0, 0xffffffff,
166 1.1.1.6 christos true),
167 1.1.1.6 christos HOWTO(R_X86_64_GOTPCRELX, 0, 4, 32, true, 0, complain_overflow_signed,
168 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_GOTPCRELX", false, 0, 0xffffffff,
169 1.1.1.6 christos true),
170 1.1.1.6 christos HOWTO(R_X86_64_REX_GOTPCRELX, 0, 4, 32, true, 0, complain_overflow_signed,
171 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_REX_GOTPCRELX", false, 0, 0xffffffff,
172 1.1.1.6 christos true),
173 1.1.1.7 christos HOWTO(R_X86_64_CODE_4_GOTPCRELX, 0, 4, 32, true, 0, complain_overflow_signed,
174 1.1.1.7 christos bfd_elf_generic_reloc, "R_X86_64_CODE_4_GOTPCRELX", false, 0, 0xffffffff,
175 1.1.1.7 christos true),
176 1.1.1.7 christos HOWTO(R_X86_64_CODE_4_GOTTPOFF, 0, 4, 32, true, 0, complain_overflow_signed,
177 1.1.1.7 christos bfd_elf_generic_reloc, "R_X86_64_CODE_4_GOTTPOFF", false, 0, 0xffffffff,
178 1.1.1.7 christos true),
179 1.1.1.7 christos HOWTO(R_X86_64_CODE_4_GOTPC32_TLSDESC, 0, 4, 32, true, 0,
180 1.1.1.7 christos complain_overflow_bitfield, bfd_elf_generic_reloc,
181 1.1.1.7 christos "R_X86_64_CODE_4_GOTPC32_TLSDESC", false, 0, 0xffffffff, true),
182 1.1.1.8 christos HOWTO(R_X86_64_CODE_5_GOTPCRELX, 0, 4, 32, true, 0,
183 1.1.1.8 christos complain_overflow_signed, bfd_elf_generic_reloc,
184 1.1.1.8 christos "R_X86_64_CODE_5_GOTPCRELX", false, 0, 0xffffffff, true),
185 1.1.1.8 christos HOWTO(R_X86_64_CODE_5_GOTTPOFF, 0, 4, 32, true, 0,
186 1.1.1.8 christos complain_overflow_signed, bfd_elf_generic_reloc,
187 1.1.1.8 christos "R_X86_64_CODE_5_GOTTPOFF", false, 0, 0xffffffff, true),
188 1.1.1.8 christos HOWTO(R_X86_64_CODE_5_GOTPC32_TLSDESC, 0, 4, 32, true, 0,
189 1.1.1.8 christos complain_overflow_bitfield, bfd_elf_generic_reloc,
190 1.1.1.8 christos "R_X86_64_CODE_5_GOTPC32_TLSDESC", false, 0, 0xffffffff, true),
191 1.1.1.8 christos HOWTO(R_X86_64_CODE_6_GOTPCRELX, 0, 4, 32, true, 0,
192 1.1.1.8 christos complain_overflow_signed, bfd_elf_generic_reloc,
193 1.1.1.8 christos "R_X86_64_CODE_6_GOTPCRELX", false, 0, 0xffffffff, true),
194 1.1.1.8 christos HOWTO(R_X86_64_CODE_6_GOTTPOFF, 0, 4, 32, true, 0,
195 1.1.1.8 christos complain_overflow_signed, bfd_elf_generic_reloc,
196 1.1.1.8 christos "R_X86_64_CODE_6_GOTTPOFF", false, 0, 0xffffffff, true),
197 1.1.1.8 christos HOWTO(R_X86_64_CODE_6_GOTPC32_TLSDESC, 0, 4, 32, true, 0,
198 1.1.1.8 christos complain_overflow_bitfield, bfd_elf_generic_reloc,
199 1.1.1.8 christos "R_X86_64_CODE_6_GOTPC32_TLSDESC", false, 0, 0xffffffff, true),
200 1.1 christos
201 1.1 christos /* We have a gap in the reloc numbers here.
202 1.1 christos R_X86_64_standard counts the number up to this point, and
203 1.1 christos R_X86_64_vt_offset is the value to subtract from a reloc type of
204 1.1 christos R_X86_64_GNU_VT* to form an index into this table. */
205 1.1.1.8 christos #define R_X86_64_standard (R_X86_64_CODE_6_GOTPC32_TLSDESC + 1)
206 1.1 christos #define R_X86_64_vt_offset (R_X86_64_GNU_VTINHERIT - R_X86_64_standard)
207 1.1 christos
208 1.1 christos /* GNU extension to record C++ vtable hierarchy. */
209 1.1.1.6 christos HOWTO (R_X86_64_GNU_VTINHERIT, 0, 8, 0, false, 0, complain_overflow_dont,
210 1.1.1.6 christos NULL, "R_X86_64_GNU_VTINHERIT", false, 0, 0, false),
211 1.1 christos
212 1.1 christos /* GNU extension to record C++ vtable member usage. */
213 1.1.1.6 christos HOWTO (R_X86_64_GNU_VTENTRY, 0, 8, 0, false, 0, complain_overflow_dont,
214 1.1.1.6 christos _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", false, 0, 0,
215 1.1.1.6 christos false),
216 1.1 christos
217 1.1 christos /* Use complain_overflow_bitfield on R_X86_64_32 for x32. */
218 1.1.1.6 christos HOWTO(R_X86_64_32, 0, 4, 32, false, 0, complain_overflow_bitfield,
219 1.1.1.6 christos bfd_elf_generic_reloc, "R_X86_64_32", false, 0, 0xffffffff,
220 1.1.1.6 christos false)
221 1.1 christos };
222 1.1 christos
223 1.1 christos /* Map BFD relocs to the x86_64 elf relocs. */
224 1.1 christos struct elf_reloc_map
225 1.1 christos {
226 1.1 christos bfd_reloc_code_real_type bfd_reloc_val;
227 1.1 christos unsigned char elf_reloc_val;
228 1.1 christos };
229 1.1 christos
230 1.1 christos static const struct elf_reloc_map x86_64_reloc_map[] =
231 1.1 christos {
232 1.1 christos { BFD_RELOC_NONE, R_X86_64_NONE, },
233 1.1 christos { BFD_RELOC_64, R_X86_64_64, },
234 1.1 christos { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
235 1.1 christos { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
236 1.1 christos { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
237 1.1 christos { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
238 1.1 christos { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
239 1.1 christos { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
240 1.1 christos { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
241 1.1 christos { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
242 1.1 christos { BFD_RELOC_32, R_X86_64_32, },
243 1.1 christos { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
244 1.1 christos { BFD_RELOC_16, R_X86_64_16, },
245 1.1 christos { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
246 1.1 christos { BFD_RELOC_8, R_X86_64_8, },
247 1.1 christos { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
248 1.1 christos { BFD_RELOC_X86_64_DTPMOD64, R_X86_64_DTPMOD64, },
249 1.1 christos { BFD_RELOC_X86_64_DTPOFF64, R_X86_64_DTPOFF64, },
250 1.1 christos { BFD_RELOC_X86_64_TPOFF64, R_X86_64_TPOFF64, },
251 1.1 christos { BFD_RELOC_X86_64_TLSGD, R_X86_64_TLSGD, },
252 1.1 christos { BFD_RELOC_X86_64_TLSLD, R_X86_64_TLSLD, },
253 1.1 christos { BFD_RELOC_X86_64_DTPOFF32, R_X86_64_DTPOFF32, },
254 1.1 christos { BFD_RELOC_X86_64_GOTTPOFF, R_X86_64_GOTTPOFF, },
255 1.1 christos { BFD_RELOC_X86_64_TPOFF32, R_X86_64_TPOFF32, },
256 1.1 christos { BFD_RELOC_64_PCREL, R_X86_64_PC64, },
257 1.1 christos { BFD_RELOC_X86_64_GOTOFF64, R_X86_64_GOTOFF64, },
258 1.1 christos { BFD_RELOC_X86_64_GOTPC32, R_X86_64_GOTPC32, },
259 1.1 christos { BFD_RELOC_X86_64_GOT64, R_X86_64_GOT64, },
260 1.1 christos { BFD_RELOC_X86_64_GOTPCREL64,R_X86_64_GOTPCREL64, },
261 1.1 christos { BFD_RELOC_X86_64_GOTPC64, R_X86_64_GOTPC64, },
262 1.1 christos { BFD_RELOC_X86_64_GOTPLT64, R_X86_64_GOTPLT64, },
263 1.1 christos { BFD_RELOC_X86_64_PLTOFF64, R_X86_64_PLTOFF64, },
264 1.1.1.2 christos { BFD_RELOC_SIZE32, R_X86_64_SIZE32, },
265 1.1.1.2 christos { BFD_RELOC_SIZE64, R_X86_64_SIZE64, },
266 1.1 christos { BFD_RELOC_X86_64_GOTPC32_TLSDESC, R_X86_64_GOTPC32_TLSDESC, },
267 1.1 christos { BFD_RELOC_X86_64_TLSDESC_CALL, R_X86_64_TLSDESC_CALL, },
268 1.1 christos { BFD_RELOC_X86_64_TLSDESC, R_X86_64_TLSDESC, },
269 1.1 christos { BFD_RELOC_X86_64_IRELATIVE, R_X86_64_IRELATIVE, },
270 1.1.1.2 christos { BFD_RELOC_X86_64_PC32_BND, R_X86_64_PC32_BND, },
271 1.1.1.2 christos { BFD_RELOC_X86_64_PLT32_BND, R_X86_64_PLT32_BND, },
272 1.1.1.2 christos { BFD_RELOC_X86_64_GOTPCRELX, R_X86_64_GOTPCRELX, },
273 1.1.1.2 christos { BFD_RELOC_X86_64_REX_GOTPCRELX, R_X86_64_REX_GOTPCRELX, },
274 1.1.1.7 christos { BFD_RELOC_X86_64_CODE_4_GOTPCRELX, R_X86_64_CODE_4_GOTPCRELX, },
275 1.1.1.7 christos { BFD_RELOC_X86_64_CODE_4_GOTTPOFF, R_X86_64_CODE_4_GOTTPOFF, },
276 1.1.1.7 christos { BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC, R_X86_64_CODE_4_GOTPC32_TLSDESC, },
277 1.1.1.8 christos { BFD_RELOC_X86_64_CODE_5_GOTPCRELX, R_X86_64_CODE_5_GOTPCRELX, },
278 1.1.1.8 christos { BFD_RELOC_X86_64_CODE_5_GOTTPOFF, R_X86_64_CODE_5_GOTTPOFF, },
279 1.1.1.8 christos { BFD_RELOC_X86_64_CODE_5_GOTPC32_TLSDESC, R_X86_64_CODE_5_GOTPC32_TLSDESC, },
280 1.1.1.8 christos { BFD_RELOC_X86_64_CODE_6_GOTPCRELX, R_X86_64_CODE_6_GOTPCRELX, },
281 1.1.1.8 christos { BFD_RELOC_X86_64_CODE_6_GOTTPOFF, R_X86_64_CODE_6_GOTTPOFF, },
282 1.1.1.8 christos { BFD_RELOC_X86_64_CODE_6_GOTPC32_TLSDESC, R_X86_64_CODE_6_GOTPC32_TLSDESC, },
283 1.1 christos { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
284 1.1 christos { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
285 1.1 christos };
286 1.1 christos
287 1.1 christos static reloc_howto_type *
288 1.1 christos elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
289 1.1 christos {
290 1.1 christos unsigned i;
291 1.1 christos
292 1.1 christos if (r_type == (unsigned int) R_X86_64_32)
293 1.1 christos {
294 1.1 christos if (ABI_64_P (abfd))
295 1.1 christos i = r_type;
296 1.1 christos else
297 1.1 christos i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
298 1.1 christos }
299 1.1 christos else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
300 1.1 christos || r_type >= (unsigned int) R_X86_64_max)
301 1.1 christos {
302 1.1 christos if (r_type >= (unsigned int) R_X86_64_standard)
303 1.1 christos {
304 1.1.1.4 christos /* xgettext:c-format */
305 1.1.1.4 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
306 1.1.1.4 christos abfd, r_type);
307 1.1.1.4 christos bfd_set_error (bfd_error_bad_value);
308 1.1.1.4 christos return NULL;
309 1.1 christos }
310 1.1 christos i = r_type;
311 1.1 christos }
312 1.1 christos else
313 1.1 christos i = r_type - (unsigned int) R_X86_64_vt_offset;
314 1.1 christos BFD_ASSERT (x86_64_elf_howto_table[i].type == r_type);
315 1.1 christos return &x86_64_elf_howto_table[i];
316 1.1 christos }
317 1.1 christos
318 1.1 christos /* Given a BFD reloc type, return a HOWTO structure. */
319 1.1 christos static reloc_howto_type *
320 1.1 christos elf_x86_64_reloc_type_lookup (bfd *abfd,
321 1.1 christos bfd_reloc_code_real_type code)
322 1.1 christos {
323 1.1 christos unsigned int i;
324 1.1 christos
325 1.1 christos for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
326 1.1 christos i++)
327 1.1 christos {
328 1.1 christos if (x86_64_reloc_map[i].bfd_reloc_val == code)
329 1.1 christos return elf_x86_64_rtype_to_howto (abfd,
330 1.1 christos x86_64_reloc_map[i].elf_reloc_val);
331 1.1 christos }
332 1.1.1.2 christos return NULL;
333 1.1 christos }
334 1.1 christos
335 1.1 christos static reloc_howto_type *
336 1.1 christos elf_x86_64_reloc_name_lookup (bfd *abfd,
337 1.1 christos const char *r_name)
338 1.1 christos {
339 1.1 christos unsigned int i;
340 1.1 christos
341 1.1 christos if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
342 1.1 christos {
343 1.1 christos /* Get x32 R_X86_64_32. */
344 1.1 christos reloc_howto_type *reloc
345 1.1 christos = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
346 1.1 christos BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
347 1.1 christos return reloc;
348 1.1 christos }
349 1.1 christos
350 1.1 christos for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
351 1.1 christos if (x86_64_elf_howto_table[i].name != NULL
352 1.1 christos && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
353 1.1 christos return &x86_64_elf_howto_table[i];
354 1.1 christos
355 1.1 christos return NULL;
356 1.1 christos }
357 1.1 christos
358 1.1 christos /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
359 1.1 christos
360 1.1.1.6 christos static bool
361 1.1.1.4 christos elf_x86_64_info_to_howto (bfd *abfd, arelent *cache_ptr,
362 1.1 christos Elf_Internal_Rela *dst)
363 1.1 christos {
364 1.1 christos unsigned r_type;
365 1.1 christos
366 1.1 christos r_type = ELF32_R_TYPE (dst->r_info);
367 1.1 christos cache_ptr->howto = elf_x86_64_rtype_to_howto (abfd, r_type);
368 1.1.1.4 christos if (cache_ptr->howto == NULL)
369 1.1.1.6 christos return false;
370 1.1.1.4 christos BFD_ASSERT (r_type == cache_ptr->howto->type || cache_ptr->howto->type == R_X86_64_NONE);
371 1.1.1.6 christos return true;
372 1.1 christos }
373 1.1 christos
374 1.1 christos /* Support for core dump NOTE sections. */
376 1.1 christos static bool
377 1.1 christos elf_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
378 1.1 christos {
379 1.1 christos int offset;
380 1.1 christos size_t size;
381 1.1 christos
382 1.1 christos switch (note->descsz)
383 1.1 christos {
384 1.1.1.6 christos default:
385 1.1 christos return false;
386 1.1 christos
387 1.1 christos case 296: /* sizeof(istruct elf_prstatus) on Linux/x32 */
388 1.1.1.2 christos /* pr_cursig */
389 1.1 christos elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
390 1.1 christos
391 1.1.1.2 christos /* pr_pid */
392 1.1 christos elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
393 1.1 christos
394 1.1 christos /* pr_reg */
395 1.1 christos offset = 72;
396 1.1 christos size = 216;
397 1.1 christos
398 1.1 christos break;
399 1.1 christos
400 1.1 christos case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
401 1.1.1.2 christos /* pr_cursig */
402 1.1 christos elf_tdata (abfd)->core->signal
403 1.1 christos = bfd_get_16 (abfd, note->descdata + 12);
404 1.1 christos
405 1.1.1.2 christos /* pr_pid */
406 1.1 christos elf_tdata (abfd)->core->lwpid
407 1.1 christos = bfd_get_32 (abfd, note->descdata + 32);
408 1.1 christos
409 1.1 christos /* pr_reg */
410 1.1 christos offset = 112;
411 1.1 christos size = 216;
412 1.1 christos
413 1.1 christos break;
414 1.1 christos }
415 1.1 christos
416 1.1 christos /* Make a ".reg/999" section. */
417 1.1 christos return _bfd_elfcore_make_pseudosection (abfd, ".reg",
418 1.1 christos size, note->descpos + offset);
419 1.1 christos }
420 1.1.1.6 christos
421 1.1 christos static bool
422 1.1 christos elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
423 1.1 christos {
424 1.1 christos switch (note->descsz)
425 1.1 christos {
426 1.1.1.6 christos default:
427 1.1 christos return false;
428 1.1.1.7 christos
429 1.1.1.7 christos case 124:
430 1.1.1.2 christos /* sizeof (struct elf_external_linux_prpsinfo32_ugid16). */
431 1.1 christos elf_tdata (abfd)->core->pid
432 1.1.1.2 christos = bfd_get_32 (abfd, note->descdata + 12);
433 1.1 christos elf_tdata (abfd)->core->program
434 1.1.1.2 christos = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
435 1.1 christos elf_tdata (abfd)->core->command
436 1.1 christos = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
437 1.1 christos break;
438 1.1.1.7 christos
439 1.1.1.7 christos case 128:
440 1.1.1.7 christos /* sizeof (struct elf_external_linux_prpsinfo32_ugid32). */
441 1.1.1.7 christos elf_tdata (abfd)->core->pid
442 1.1.1.7 christos = bfd_get_32 (abfd, note->descdata + 12);
443 1.1.1.7 christos elf_tdata (abfd)->core->program
444 1.1.1.7 christos = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
445 1.1.1.7 christos elf_tdata (abfd)->core->command
446 1.1.1.7 christos = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
447 1.1.1.7 christos break;
448 1.1.1.7 christos
449 1.1.1.7 christos case 136:
450 1.1.1.2 christos /* sizeof (struct elf_prpsinfo) on Linux/x86_64. */
451 1.1 christos elf_tdata (abfd)->core->pid
452 1.1.1.2 christos = bfd_get_32 (abfd, note->descdata + 24);
453 1.1 christos elf_tdata (abfd)->core->program
454 1.1.1.2 christos = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
455 1.1 christos elf_tdata (abfd)->core->command
456 1.1 christos = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
457 1.1 christos }
458 1.1 christos
459 1.1 christos /* Note that for some reason, a spurious space is tacked
460 1.1 christos onto the end of the args in some (at least one anyway)
461 1.1 christos implementations, so strip it off if it exists. */
462 1.1 christos
463 1.1.1.2 christos {
464 1.1 christos char *command = elf_tdata (abfd)->core->command;
465 1.1 christos int n = strlen (command);
466 1.1 christos
467 1.1 christos if (0 < n && command[n - 1] == ' ')
468 1.1 christos command[n - 1] = '\0';
469 1.1 christos }
470 1.1.1.6 christos
471 1.1 christos return true;
472 1.1 christos }
473 1.1 christos
474 1.1.1.4 christos #ifdef CORE_HEADER
475 1.1.1.4 christos # if GCC_VERSION >= 8000
476 1.1.1.4 christos # pragma GCC diagnostic push
477 1.1.1.4 christos # pragma GCC diagnostic ignored "-Wstringop-truncation"
478 1.1 christos # endif
479 1.1 christos static char *
480 1.1 christos elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
481 1.1 christos int note_type, ...)
482 1.1 christos {
483 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
484 1.1 christos va_list ap;
485 1.1 christos const char *fname, *psargs;
486 1.1 christos long pid;
487 1.1 christos int cursig;
488 1.1 christos const void *gregs;
489 1.1 christos
490 1.1 christos switch (note_type)
491 1.1 christos {
492 1.1 christos default:
493 1.1 christos return NULL;
494 1.1 christos
495 1.1 christos case NT_PRPSINFO:
496 1.1 christos va_start (ap, note_type);
497 1.1 christos fname = va_arg (ap, const char *);
498 1.1 christos psargs = va_arg (ap, const char *);
499 1.1 christos va_end (ap);
500 1.1 christos
501 1.1 christos if (bed->s->elfclass == ELFCLASS32)
502 1.1 christos {
503 1.1 christos prpsinfo32_t data;
504 1.1 christos memset (&data, 0, sizeof (data));
505 1.1 christos strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
506 1.1 christos strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
507 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
508 1.1 christos &data, sizeof (data));
509 1.1 christos }
510 1.1 christos else
511 1.1.1.2 christos {
512 1.1 christos prpsinfo64_t data;
513 1.1 christos memset (&data, 0, sizeof (data));
514 1.1 christos strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
515 1.1 christos strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
516 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
517 1.1 christos &data, sizeof (data));
518 1.1 christos }
519 1.1 christos /* NOTREACHED */
520 1.1 christos
521 1.1 christos case NT_PRSTATUS:
522 1.1 christos va_start (ap, note_type);
523 1.1 christos pid = va_arg (ap, long);
524 1.1 christos cursig = va_arg (ap, int);
525 1.1 christos gregs = va_arg (ap, const void *);
526 1.1 christos va_end (ap);
527 1.1 christos
528 1.1 christos if (bed->s->elfclass == ELFCLASS32)
529 1.1 christos {
530 1.1 christos if (bed->elf_machine_code == EM_X86_64)
531 1.1 christos {
532 1.1 christos prstatusx32_t prstat;
533 1.1 christos memset (&prstat, 0, sizeof (prstat));
534 1.1 christos prstat.pr_pid = pid;
535 1.1 christos prstat.pr_cursig = cursig;
536 1.1 christos memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
537 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
538 1.1 christos &prstat, sizeof (prstat));
539 1.1 christos }
540 1.1 christos else
541 1.1 christos {
542 1.1 christos prstatus32_t prstat;
543 1.1 christos memset (&prstat, 0, sizeof (prstat));
544 1.1 christos prstat.pr_pid = pid;
545 1.1 christos prstat.pr_cursig = cursig;
546 1.1 christos memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
547 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
548 1.1 christos &prstat, sizeof (prstat));
549 1.1 christos }
550 1.1 christos }
551 1.1 christos else
552 1.1.1.2 christos {
553 1.1 christos prstatus64_t prstat;
554 1.1 christos memset (&prstat, 0, sizeof (prstat));
555 1.1 christos prstat.pr_pid = pid;
556 1.1 christos prstat.pr_cursig = cursig;
557 1.1 christos memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
558 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
559 1.1 christos &prstat, sizeof (prstat));
560 1.1 christos }
561 1.1 christos }
562 1.1 christos /* NOTREACHED */
563 1.1.1.4 christos }
564 1.1.1.4 christos # if GCC_VERSION >= 8000
565 1.1.1.4 christos # pragma GCC diagnostic pop
566 1.1 christos # endif
567 1.1 christos #endif
568 1.1 christos
569 1.1 christos /* Functions for the x86-64 ELF linker. */
571 1.1 christos
572 1.1 christos /* The size in bytes of an entry in the global offset table. */
573 1.1 christos
574 1.1.1.4 christos #define GOT_ENTRY_SIZE 8
575 1.1.1.4 christos
576 1.1.1.4 christos /* The size in bytes of an entry in the lazy procedure linkage table. */
577 1.1 christos
578 1.1.1.4 christos #define LAZY_PLT_ENTRY_SIZE 16
579 1.1.1.4 christos
580 1.1 christos /* The size in bytes of an entry in the non-lazy procedure linkage
581 1.1.1.4 christos table. */
582 1.1 christos
583 1.1.1.4 christos #define NON_LAZY_PLT_ENTRY_SIZE 8
584 1.1.1.4 christos
585 1.1.1.4 christos /* The first entry in a lazy procedure linkage table looks like this.
586 1.1.1.4 christos See the SVR4 ABI i386 supplement and the x86-64 ABI to see how this
587 1.1.1.4 christos works. */
588 1.1 christos
589 1.1 christos static const bfd_byte elf_x86_64_lazy_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
590 1.1 christos {
591 1.1 christos 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
592 1.1 christos 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
593 1.1 christos 0x0f, 0x1f, 0x40, 0x00 /* nopl 0(%rax) */
594 1.1.1.4 christos };
595 1.1 christos
596 1.1.1.4 christos /* Subsequent entries in a lazy procedure linkage table look like this. */
597 1.1 christos
598 1.1 christos static const bfd_byte elf_x86_64_lazy_plt_entry[LAZY_PLT_ENTRY_SIZE] =
599 1.1 christos {
600 1.1 christos 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
601 1.1 christos 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
602 1.1 christos 0x68, /* pushq immediate */
603 1.1 christos 0, 0, 0, 0, /* replaced with index into relocation table. */
604 1.1 christos 0xe9, /* jmp relative */
605 1.1 christos 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
606 1.1.1.4 christos };
607 1.1.1.2 christos
608 1.1.1.2 christos /* The first entry in a lazy procedure linkage table with BND prefix
609 1.1.1.4 christos like this. */
610 1.1.1.2 christos
611 1.1.1.4 christos static const bfd_byte elf_x86_64_lazy_bnd_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
612 1.1.1.2 christos {
613 1.1.1.4 christos 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
614 1.1.1.2 christos 0xf2, 0xff, 0x25, 16, 0, 0, 0, /* bnd jmpq *GOT+16(%rip) */
615 1.1.1.2 christos 0x0f, 0x1f, 0 /* nopl (%rax) */
616 1.1.1.4 christos };
617 1.1.1.4 christos
618 1.1.1.2 christos /* Subsequent entries for branches with BND prefx in a lazy procedure
619 1.1.1.4 christos linkage table look like this. */
620 1.1.1.2 christos
621 1.1.1.4 christos static const bfd_byte elf_x86_64_lazy_bnd_plt_entry[LAZY_PLT_ENTRY_SIZE] =
622 1.1.1.4 christos {
623 1.1.1.4 christos 0x68, 0, 0, 0, 0, /* pushq immediate */
624 1.1.1.4 christos 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
625 1.1.1.4 christos 0x0f, 0x1f, 0x44, 0, 0 /* nopl 0(%rax,%rax,1) */
626 1.1.1.4 christos };
627 1.1.1.4 christos
628 1.1.1.4 christos /* The first entry in the IBT-enabled lazy procedure linkage table is the
629 1.1.1.4 christos the same as the lazy PLT with BND prefix so that bound registers are
630 1.1.1.4 christos preserved when control is passed to dynamic linker. Subsequent
631 1.1.1.4 christos entries for a IBT-enabled lazy procedure linkage table look like
632 1.1.1.8 christos this. */
633 1.1.1.4 christos
634 1.1.1.4 christos static const bfd_byte elf_x86_64_lazy_bnd_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
635 1.1.1.4 christos {
636 1.1.1.4 christos 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
637 1.1.1.4 christos 0x68, 0, 0, 0, 0, /* pushq immediate */
638 1.1.1.4 christos 0xf2, 0xe9, 0, 0, 0, 0, /* bnd jmpq relative */
639 1.1.1.4 christos 0x90 /* nop */
640 1.1.1.8 christos };
641 1.1.1.4 christos
642 1.1.1.8 christos /* The first entry in the IBT-enabled lazy procedure linkage table
643 1.1.1.4 christos is the same as the normal lazy PLT. Subsequent entries for an
644 1.1.1.8 christos IBT-enabled lazy procedure linkage table look like this. */
645 1.1.1.4 christos
646 1.1.1.4 christos static const bfd_byte elf_x86_64_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
647 1.1.1.4 christos {
648 1.1.1.4 christos 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
649 1.1.1.4 christos 0x68, 0, 0, 0, 0, /* pushq immediate */
650 1.1.1.2 christos 0xe9, 0, 0, 0, 0, /* jmpq relative */
651 1.1.1.2 christos 0x66, 0x90 /* xchg %ax,%ax */
652 1.1.1.4 christos };
653 1.1.1.2 christos
654 1.1.1.4 christos /* Entries in the non-lazey procedure linkage table look like this. */
655 1.1.1.2 christos
656 1.1.1.4 christos static const bfd_byte elf_x86_64_non_lazy_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
657 1.1.1.4 christos {
658 1.1.1.4 christos 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
659 1.1.1.2 christos 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
660 1.1.1.2 christos 0x66, 0x90 /* xchg %ax,%ax */
661 1.1.1.4 christos };
662 1.1.1.4 christos
663 1.1.1.2 christos /* Entries for branches with BND prefix in the non-lazey procedure
664 1.1.1.4 christos linkage table look like this. */
665 1.1.1.2 christos
666 1.1.1.4 christos static const bfd_byte elf_x86_64_non_lazy_bnd_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
667 1.1.1.4 christos {
668 1.1.1.4 christos 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
669 1.1.1.4 christos 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
670 1.1.1.4 christos 0x90 /* nop */
671 1.1.1.8 christos };
672 1.1.1.8 christos
673 1.1.1.8 christos /* Entries for IBT-enabled branches with BND prefix in the non-lazey
674 1.1.1.4 christos procedure linkage table look like this. They have the same size as
675 1.1.1.8 christos the lazy PLT entry. */
676 1.1.1.4 christos
677 1.1.1.4 christos static const bfd_byte elf_x86_64_non_lazy_bnd_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
678 1.1.1.4 christos {
679 1.1.1.4 christos 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
680 1.1.1.4 christos 0xf2, 0xff, 0x25, /* bnd jmpq *name@GOTPC(%rip) */
681 1.1.1.2 christos 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
682 1.1.1.2 christos 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopl 0x0(%rax,%rax,1) */
683 1.1.1.8 christos };
684 1.1.1.4 christos
685 1.1.1.4 christos /* Entries for branches with IBT-enabled in the non-lazey procedure
686 1.1.1.4 christos linkage table look like this. They have the same size as the lazy
687 1.1.1.8 christos PLT entry. */
688 1.1.1.4 christos
689 1.1.1.4 christos static const bfd_byte elf_x86_64_non_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
690 1.1.1.4 christos {
691 1.1.1.4 christos 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
692 1.1.1.4 christos 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
693 1.1.1.4 christos 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
694 1.1.1.2 christos 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopw 0x0(%rax,%rax,1) */
695 1.1.1.4 christos };
696 1.1.1.4 christos
697 1.1.1.2 christos /* The TLSDESC entry in a lazy procedure linkage table. */
698 1.1.1.4 christos static const bfd_byte elf_x86_64_tlsdesc_plt_entry[LAZY_PLT_ENTRY_SIZE] =
699 1.1.1.4 christos {
700 1.1.1.4 christos 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
701 1.1.1.2 christos 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
702 1.1.1.2 christos 0xff, 0x25, 16, 0, 0, 0 /* jmpq *GOT+TDG(%rip) */
703 1.1.1.4 christos };
704 1.1 christos
705 1.1.1.4 christos /* .eh_frame covering the lazy .plt section. */
706 1.1 christos
707 1.1 christos static const bfd_byte elf_x86_64_eh_frame_lazy_plt[] =
708 1.1 christos {
709 1.1 christos PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
710 1.1 christos 0, 0, 0, 0, /* CIE ID */
711 1.1 christos 1, /* CIE version */
712 1.1 christos 'z', 'R', 0, /* Augmentation string */
713 1.1 christos 1, /* Code alignment factor */
714 1.1 christos 0x78, /* Data alignment factor */
715 1.1 christos 16, /* Return address column */
716 1.1 christos 1, /* Augmentation size */
717 1.1 christos DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
718 1.1 christos DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
719 1.1 christos DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
720 1.1 christos DW_CFA_nop, DW_CFA_nop,
721 1.1 christos
722 1.1 christos PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
723 1.1 christos PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
724 1.1 christos 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
725 1.1 christos 0, 0, 0, 0, /* .plt size goes here */
726 1.1 christos 0, /* Augmentation size */
727 1.1 christos DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
728 1.1 christos DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
729 1.1 christos DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
730 1.1 christos DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
731 1.1 christos DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
732 1.1 christos 11, /* Block length */
733 1.1 christos DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
734 1.1 christos DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
735 1.1 christos DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
736 1.1 christos DW_OP_lit3, DW_OP_shl, DW_OP_plus,
737 1.1 christos DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
738 1.1.1.4 christos };
739 1.1 christos
740 1.1.1.4 christos /* .eh_frame covering the lazy BND .plt section. */
741 1.1 christos
742 1.1.1.4 christos static const bfd_byte elf_x86_64_eh_frame_lazy_bnd_plt[] =
743 1.1.1.4 christos {
744 1.1.1.4 christos PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
745 1.1.1.4 christos 0, 0, 0, 0, /* CIE ID */
746 1.1.1.4 christos 1, /* CIE version */
747 1.1.1.4 christos 'z', 'R', 0, /* Augmentation string */
748 1.1.1.4 christos 1, /* Code alignment factor */
749 1.1.1.4 christos 0x78, /* Data alignment factor */
750 1.1.1.4 christos 16, /* Return address column */
751 1.1.1.4 christos 1, /* Augmentation size */
752 1.1.1.4 christos DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
753 1.1.1.4 christos DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
754 1.1 christos DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
755 1.1.1.4 christos DW_CFA_nop, DW_CFA_nop,
756 1.1.1.4 christos
757 1.1.1.4 christos PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
758 1.1.1.4 christos PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
759 1.1.1.4 christos 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
760 1.1.1.4 christos 0, 0, 0, 0, /* .plt size goes here */
761 1.1.1.4 christos 0, /* Augmentation size */
762 1.1.1.4 christos DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
763 1.1.1.4 christos DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
764 1.1.1.4 christos DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
765 1.1.1.4 christos DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
766 1.1.1.4 christos DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
767 1.1.1.4 christos 11, /* Block length */
768 1.1.1.4 christos DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
769 1.1.1.4 christos DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
770 1.1.1.4 christos DW_OP_lit15, DW_OP_and, DW_OP_lit5, DW_OP_ge,
771 1.1.1.4 christos DW_OP_lit3, DW_OP_shl, DW_OP_plus,
772 1.1 christos DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
773 1.1.1.8 christos };
774 1.1.1.8 christos
775 1.1 christos /* .eh_frame covering the lazy .plt section with IBT-enabled and BND
776 1.1.1.8 christos prefix. */
777 1.1.1.4 christos
778 1.1.1.4 christos static const bfd_byte elf_x86_64_eh_frame_lazy_bnd_ibt_plt[] =
779 1.1.1.4 christos {
780 1.1.1.4 christos PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
781 1.1.1.4 christos 0, 0, 0, 0, /* CIE ID */
782 1.1.1.4 christos 1, /* CIE version */
783 1.1.1.4 christos 'z', 'R', 0, /* Augmentation string */
784 1.1.1.4 christos 1, /* Code alignment factor */
785 1.1.1.4 christos 0x78, /* Data alignment factor */
786 1.1.1.4 christos 16, /* Return address column */
787 1.1.1.4 christos 1, /* Augmentation size */
788 1.1.1.4 christos DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
789 1.1.1.4 christos DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
790 1.1 christos DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
791 1.1.1.4 christos DW_CFA_nop, DW_CFA_nop,
792 1.1.1.4 christos
793 1.1.1.4 christos PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
794 1.1.1.4 christos PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
795 1.1.1.4 christos 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
796 1.1.1.4 christos 0, 0, 0, 0, /* .plt size goes here */
797 1.1.1.4 christos 0, /* Augmentation size */
798 1.1.1.4 christos DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
799 1.1.1.4 christos DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
800 1.1.1.4 christos DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
801 1.1.1.4 christos DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
802 1.1.1.4 christos DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
803 1.1.1.4 christos 11, /* Block length */
804 1.1.1.4 christos DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
805 1.1.1.4 christos DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
806 1.1.1.4 christos DW_OP_lit15, DW_OP_and, DW_OP_lit10, DW_OP_ge,
807 1.1.1.4 christos DW_OP_lit3, DW_OP_shl, DW_OP_plus,
808 1.1 christos DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
809 1.1.1.8 christos };
810 1.1 christos
811 1.1.1.8 christos /* .eh_frame covering the lazy .plt section with IBT-enabled. */
812 1.1.1.4 christos
813 1.1.1.4 christos static const bfd_byte elf_x86_64_eh_frame_lazy_ibt_plt[] =
814 1.1.1.4 christos {
815 1.1.1.4 christos PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
816 1.1.1.4 christos 0, 0, 0, 0, /* CIE ID */
817 1.1.1.4 christos 1, /* CIE version */
818 1.1.1.4 christos 'z', 'R', 0, /* Augmentation string */
819 1.1.1.4 christos 1, /* Code alignment factor */
820 1.1.1.4 christos 0x78, /* Data alignment factor */
821 1.1.1.4 christos 16, /* Return address column */
822 1.1.1.4 christos 1, /* Augmentation size */
823 1.1.1.4 christos DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
824 1.1.1.4 christos DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
825 1.1 christos DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
826 1.1.1.4 christos DW_CFA_nop, DW_CFA_nop,
827 1.1.1.4 christos
828 1.1.1.4 christos PLT_FDE_LENGTH, 0, 0, 0, /* FDE length */
829 1.1.1.4 christos PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
830 1.1.1.4 christos 0, 0, 0, 0, /* R_X86_64_PC32 .plt goes here */
831 1.1.1.4 christos 0, 0, 0, 0, /* .plt size goes here */
832 1.1.1.4 christos 0, /* Augmentation size */
833 1.1.1.4 christos DW_CFA_def_cfa_offset, 16, /* DW_CFA_def_cfa_offset: 16 */
834 1.1.1.4 christos DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
835 1.1.1.4 christos DW_CFA_def_cfa_offset, 24, /* DW_CFA_def_cfa_offset: 24 */
836 1.1.1.4 christos DW_CFA_advance_loc + 10, /* DW_CFA_advance_loc: 10 to __PLT__+16 */
837 1.1.1.4 christos DW_CFA_def_cfa_expression, /* DW_CFA_def_cfa_expression */
838 1.1.1.4 christos 11, /* Block length */
839 1.1.1.4 christos DW_OP_breg7, 8, /* DW_OP_breg7 (rsp): 8 */
840 1.1.1.4 christos DW_OP_breg16, 0, /* DW_OP_breg16 (rip): 0 */
841 1.1.1.4 christos DW_OP_lit15, DW_OP_and, DW_OP_lit9, DW_OP_ge,
842 1.1 christos DW_OP_lit3, DW_OP_shl, DW_OP_plus,
843 1.1 christos DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
844 1.1.1.4 christos };
845 1.1.1.2 christos
846 1.1.1.4 christos /* .eh_frame covering the non-lazy .plt section. */
847 1.1.1.4 christos
848 1.1.1.4 christos static const bfd_byte elf_x86_64_eh_frame_non_lazy_plt[] =
849 1.1.1.4 christos {
850 1.1.1.4 christos #define PLT_GOT_FDE_LENGTH 20
851 1.1.1.4 christos PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
852 1.1.1.4 christos 0, 0, 0, 0, /* CIE ID */
853 1.1.1.4 christos 1, /* CIE version */
854 1.1.1.4 christos 'z', 'R', 0, /* Augmentation string */
855 1.1.1.4 christos 1, /* Code alignment factor */
856 1.1.1.4 christos 0x78, /* Data alignment factor */
857 1.1.1.4 christos 16, /* Return address column */
858 1.1.1.4 christos 1, /* Augmentation size */
859 1.1.1.4 christos DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
860 1.1.1.4 christos DW_CFA_def_cfa, 7, 8, /* DW_CFA_def_cfa: r7 (rsp) ofs 8 */
861 1.1 christos DW_CFA_offset + 16, 1, /* DW_CFA_offset: r16 (rip) at cfa-8 */
862 1.1.1.4 christos DW_CFA_nop, DW_CFA_nop,
863 1.1.1.4 christos
864 1.1.1.4 christos PLT_GOT_FDE_LENGTH, 0, 0, 0, /* FDE length */
865 1.1.1.4 christos PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
866 1.1.1.4 christos 0, 0, 0, 0, /* the start of non-lazy .plt goes here */
867 1.1.1.4 christos 0, 0, 0, 0, /* non-lazy .plt size goes here */
868 1.1.1.4 christos 0, /* Augmentation size */
869 1.1.1.4 christos DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop,
870 1.1 christos DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
871 1.1.1.7 christos };
872 1.1.1.7 christos
873 1.1.1.7 christos /* .sframe FRE covering the .plt section entry. */
874 1.1.1.7 christos static const sframe_frame_row_entry elf_x86_64_sframe_plt0_fre1 =
875 1.1.1.7 christos {
876 1.1.1.7 christos 0, /* SFrame FRE start address. */
877 1.1.1.7 christos {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
878 1.1.1.7 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
879 1.1.1.7 christos };
880 1.1.1.7 christos
881 1.1.1.7 christos /* .sframe FRE covering the .plt section entry. */
882 1.1.1.7 christos static const sframe_frame_row_entry elf_x86_64_sframe_plt0_fre2 =
883 1.1.1.7 christos {
884 1.1.1.7 christos 6, /* SFrame FRE start address. */
885 1.1.1.7 christos {24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
886 1.1.1.7 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
887 1.1.1.7 christos };
888 1.1.1.7 christos
889 1.1.1.7 christos /* .sframe FRE covering the .plt section entry. */
890 1.1.1.7 christos static const sframe_frame_row_entry elf_x86_64_sframe_pltn_fre1 =
891 1.1.1.7 christos {
892 1.1.1.7 christos 0, /* SFrame FRE start address. */
893 1.1.1.7 christos {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
894 1.1.1.7 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
895 1.1.1.7 christos };
896 1.1.1.7 christos
897 1.1.1.7 christos /* .sframe FRE covering the .plt section entry. */
898 1.1.1.7 christos static const sframe_frame_row_entry elf_x86_64_sframe_pltn_fre2 =
899 1.1.1.7 christos {
900 1.1.1.7 christos 11, /* SFrame FRE start address. */
901 1.1.1.7 christos {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
902 1.1.1.7 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
903 1.1.1.8 christos };
904 1.1.1.8 christos
905 1.1.1.8 christos /* .sframe FRE covering the .plt section entry for IBT. */
906 1.1.1.8 christos static const sframe_frame_row_entry elf_x86_64_sframe_ibt_pltn_fre2 =
907 1.1.1.8 christos {
908 1.1.1.8 christos 9, /* SFrame FRE start address. */
909 1.1.1.8 christos {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
910 1.1.1.8 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
911 1.1.1.7 christos };
912 1.1.1.7 christos
913 1.1.1.7 christos /* .sframe FRE covering the second .plt section entry. */
914 1.1.1.7 christos static const sframe_frame_row_entry elf_x86_64_sframe_sec_pltn_fre1 =
915 1.1.1.7 christos {
916 1.1.1.7 christos 0, /* SFrame FRE start address. */
917 1.1.1.7 christos {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
918 1.1.1.7 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
919 1.1.1.8 christos };
920 1.1.1.8 christos
921 1.1.1.8 christos /* .sframe FRE covering the .plt.got section entry. */
922 1.1.1.8 christos static const sframe_frame_row_entry elf_x86_64_sframe_pltgot_fre1 =
923 1.1.1.8 christos {
924 1.1.1.8 christos 0, /* SFrame FRE start address. */
925 1.1.1.8 christos {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 12 bytes. */
926 1.1.1.8 christos SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info. */
927 1.1.1.8 christos };
928 1.1.1.7 christos
929 1.1.1.7 christos /* SFrame helper object for non-lazy PLT. */
930 1.1.1.7 christos static const struct elf_x86_sframe_plt elf_x86_64_sframe_non_lazy_plt =
931 1.1.1.7 christos {
932 1.1.1.7 christos LAZY_PLT_ENTRY_SIZE,
933 1.1.1.7 christos 2, /* Number of FREs for PLT0. */
934 1.1.1.7 christos /* Array of SFrame FREs for plt0. */
935 1.1.1.7 christos { &elf_x86_64_sframe_plt0_fre1, &elf_x86_64_sframe_plt0_fre2 },
936 1.1.1.7 christos LAZY_PLT_ENTRY_SIZE,
937 1.1.1.8 christos 1, /* Number of FREs for PLTn. */
938 1.1.1.8 christos /* Array of SFrame FREs for plt. */
939 1.1.1.8 christos { &elf_x86_64_sframe_sec_pltn_fre1 },
940 1.1.1.8 christos 0,
941 1.1.1.8 christos 0, /* There is no second PLT necessary. */
942 1.1.1.8 christos { },
943 1.1.1.8 christos NON_LAZY_PLT_ENTRY_SIZE,
944 1.1.1.8 christos 1, /* Number of FREs for PLT GOT. */
945 1.1.1.8 christos /* Array of SFrame FREs for PLT GOT. */
946 1.1.1.8 christos { &elf_x86_64_sframe_pltgot_fre1 },
947 1.1.1.8 christos };
948 1.1.1.8 christos
949 1.1.1.8 christos /* SFrame helper object for non-lazy IBT enabled PLT. */
950 1.1.1.8 christos static const struct elf_x86_sframe_plt elf_x86_64_sframe_non_lazy_ibt_plt =
951 1.1.1.8 christos {
952 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
953 1.1.1.8 christos 2, /* Number of FREs for PLT0. */
954 1.1.1.8 christos /* Array of SFrame FREs for plt0. */
955 1.1.1.8 christos { &elf_x86_64_sframe_plt0_fre1, &elf_x86_64_sframe_plt0_fre2 },
956 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
957 1.1.1.8 christos 1, /* Number of FREs for PLTn. */
958 1.1.1.7 christos /* Array of SFrame FREs for plt. */
959 1.1.1.7 christos { &elf_x86_64_sframe_sec_pltn_fre1 },
960 1.1.1.8 christos 0,
961 1.1.1.8 christos 0, /* There is no second PLT necessary. */
962 1.1.1.8 christos { },
963 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
964 1.1.1.8 christos 1, /* Number of FREs for PLT GOT. */
965 1.1.1.7 christos /* Array of SFrame FREs for PLT GOT. */
966 1.1.1.7 christos { &elf_x86_64_sframe_pltgot_fre1 },
967 1.1.1.8 christos };
968 1.1.1.7 christos
969 1.1.1.7 christos /* SFrame helper object for lazy PLT. */
970 1.1.1.7 christos static const struct elf_x86_sframe_plt elf_x86_64_sframe_plt =
971 1.1.1.7 christos {
972 1.1.1.7 christos LAZY_PLT_ENTRY_SIZE,
973 1.1.1.7 christos 2, /* Number of FREs for PLT0. */
974 1.1.1.7 christos /* Array of SFrame FREs for plt0. */
975 1.1.1.7 christos { &elf_x86_64_sframe_plt0_fre1, &elf_x86_64_sframe_plt0_fre2 },
976 1.1.1.7 christos LAZY_PLT_ENTRY_SIZE,
977 1.1.1.7 christos 2, /* Number of FREs for PLTn. */
978 1.1.1.7 christos /* Array of SFrame FREs for plt. */
979 1.1.1.8 christos { &elf_x86_64_sframe_pltn_fre1, &elf_x86_64_sframe_pltn_fre2 },
980 1.1.1.8 christos NON_LAZY_PLT_ENTRY_SIZE,
981 1.1.1.8 christos 1, /* Number of FREs for second PLT. */
982 1.1.1.8 christos /* Array of SFrame FREs for second PLT. */
983 1.1.1.8 christos { &elf_x86_64_sframe_sec_pltn_fre1 },
984 1.1.1.8 christos NON_LAZY_PLT_ENTRY_SIZE,
985 1.1.1.8 christos 1, /* Number of FREs for PLT GOT. */
986 1.1.1.8 christos /* Array of SFrame FREs for PLT GOT. */
987 1.1.1.8 christos { &elf_x86_64_sframe_pltgot_fre1 },
988 1.1.1.8 christos };
989 1.1.1.8 christos
990 1.1.1.8 christos /* SFrame helper object for lazy PLT with IBT. */
991 1.1.1.8 christos static const struct elf_x86_sframe_plt elf_x86_64_sframe_ibt_plt =
992 1.1.1.8 christos {
993 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
994 1.1.1.8 christos 2, /* Number of FREs for PLT0. */
995 1.1.1.8 christos /* Array of SFrame FREs for plt0. */
996 1.1.1.8 christos { &elf_x86_64_sframe_plt0_fre1, &elf_x86_64_sframe_plt0_fre2 },
997 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
998 1.1.1.8 christos 2, /* Number of FREs for PLTn. */
999 1.1.1.8 christos /* Array of SFrame FREs for plt. */
1000 1.1.1.8 christos { &elf_x86_64_sframe_pltn_fre1, &elf_x86_64_sframe_ibt_pltn_fre2 },
1001 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
1002 1.1.1.8 christos 1, /* Number of FREs for second PLT. */
1003 1.1.1.8 christos /* Array of SFrame FREs for second plt. */
1004 1.1.1.8 christos { &elf_x86_64_sframe_sec_pltn_fre1 },
1005 1.1.1.8 christos LAZY_PLT_ENTRY_SIZE,
1006 1.1.1.8 christos 1, /* Number of FREs for PLT GOT. */
1007 1.1.1.7 christos /* Array of SFrame FREs for PLT GOT. */
1008 1.1.1.7 christos { &elf_x86_64_sframe_pltgot_fre1 },
1009 1.1 christos };
1010 1.1.1.4 christos
1011 1.1 christos /* These are the standard parameters. */
1012 1.1.1.4 christos static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_plt =
1013 1.1.1.4 christos {
1014 1.1.1.4 christos elf_x86_64_lazy_plt0_entry, /* plt0_entry */
1015 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt0_entry_size */
1016 1.1.1.4 christos elf_x86_64_lazy_plt_entry, /* plt_entry */
1017 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1018 1.1.1.4 christos elf_x86_64_tlsdesc_plt_entry, /* plt_tlsdesc_entry */
1019 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_tlsdesc_entry_size */
1020 1.1.1.4 christos 6, /* plt_tlsdesc_got1_offset */
1021 1.1.1.4 christos 12, /* plt_tlsdesc_got2_offset */
1022 1.1.1.4 christos 10, /* plt_tlsdesc_got1_insn_end */
1023 1.1.1.4 christos 16, /* plt_tlsdesc_got2_insn_end */
1024 1.1.1.4 christos 2, /* plt0_got1_offset */
1025 1.1.1.4 christos 8, /* plt0_got2_offset */
1026 1.1.1.4 christos 12, /* plt0_got2_insn_end */
1027 1.1.1.4 christos 2, /* plt_got_offset */
1028 1.1.1.4 christos 7, /* plt_reloc_offset */
1029 1.1.1.4 christos 12, /* plt_plt_offset */
1030 1.1.1.4 christos 6, /* plt_got_insn_size */
1031 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_plt_insn_end */
1032 1.1.1.4 christos 6, /* plt_lazy_offset */
1033 1.1.1.4 christos elf_x86_64_lazy_plt0_entry, /* pic_plt0_entry */
1034 1.1.1.4 christos elf_x86_64_lazy_plt_entry, /* pic_plt_entry */
1035 1.1 christos elf_x86_64_eh_frame_lazy_plt, /* eh_frame_plt */
1036 1.1 christos sizeof (elf_x86_64_eh_frame_lazy_plt) /* eh_frame_plt_size */
1037 1.1.1.4 christos };
1038 1.1.1.2 christos
1039 1.1.1.4 christos static const struct elf_x86_non_lazy_plt_layout elf_x86_64_non_lazy_plt =
1040 1.1.1.4 christos {
1041 1.1.1.4 christos elf_x86_64_non_lazy_plt_entry, /* plt_entry */
1042 1.1.1.4 christos elf_x86_64_non_lazy_plt_entry, /* pic_plt_entry */
1043 1.1.1.4 christos NON_LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1044 1.1.1.4 christos 2, /* plt_got_offset */
1045 1.1.1.4 christos 6, /* plt_got_insn_size */
1046 1.1.1.2 christos elf_x86_64_eh_frame_non_lazy_plt, /* eh_frame_plt */
1047 1.1.1.2 christos sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
1048 1.1.1.4 christos };
1049 1.1 christos
1050 1.1.1.4 christos static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_bnd_plt =
1051 1.1.1.4 christos {
1052 1.1.1.4 christos elf_x86_64_lazy_bnd_plt0_entry, /* plt0_entry */
1053 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt0_entry_size */
1054 1.1.1.4 christos elf_x86_64_lazy_bnd_plt_entry, /* plt_entry */
1055 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1056 1.1.1.4 christos elf_x86_64_tlsdesc_plt_entry, /* plt_tlsdesc_entry */
1057 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_tlsdesc_entry_size */
1058 1.1.1.4 christos 6, /* plt_tlsdesc_got1_offset */
1059 1.1.1.4 christos 12, /* plt_tlsdesc_got2_offset */
1060 1.1.1.4 christos 10, /* plt_tlsdesc_got1_insn_end */
1061 1.1.1.4 christos 16, /* plt_tlsdesc_got2_insn_end */
1062 1.1.1.4 christos 2, /* plt0_got1_offset */
1063 1.1.1.4 christos 1+8, /* plt0_got2_offset */
1064 1.1.1.4 christos 1+12, /* plt0_got2_insn_end */
1065 1.1.1.4 christos 1+2, /* plt_got_offset */
1066 1.1.1.4 christos 1, /* plt_reloc_offset */
1067 1.1.1.4 christos 7, /* plt_plt_offset */
1068 1.1.1.4 christos 1+6, /* plt_got_insn_size */
1069 1.1.1.4 christos 11, /* plt_plt_insn_end */
1070 1.1.1.4 christos 0, /* plt_lazy_offset */
1071 1.1.1.4 christos elf_x86_64_lazy_bnd_plt0_entry, /* pic_plt0_entry */
1072 1.1.1.4 christos elf_x86_64_lazy_bnd_plt_entry, /* pic_plt_entry */
1073 1.1.1.4 christos elf_x86_64_eh_frame_lazy_bnd_plt, /* eh_frame_plt */
1074 1.1 christos sizeof (elf_x86_64_eh_frame_lazy_bnd_plt) /* eh_frame_plt_size */
1075 1.1.1.4 christos };
1076 1.1.1.4 christos
1077 1.1.1.4 christos static const struct elf_x86_non_lazy_plt_layout elf_x86_64_non_lazy_bnd_plt =
1078 1.1.1.4 christos {
1079 1.1.1.4 christos elf_x86_64_non_lazy_bnd_plt_entry, /* plt_entry */
1080 1.1.1.4 christos elf_x86_64_non_lazy_bnd_plt_entry, /* pic_plt_entry */
1081 1.1.1.4 christos NON_LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1082 1.1.1.4 christos 1+2, /* plt_got_offset */
1083 1.1.1.4 christos 1+6, /* plt_got_insn_size */
1084 1.1.1.4 christos elf_x86_64_eh_frame_non_lazy_plt, /* eh_frame_plt */
1085 1.1 christos sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
1086 1.1.1.8 christos };
1087 1.1.1.4 christos
1088 1.1.1.4 christos static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_bnd_ibt_plt =
1089 1.1.1.4 christos {
1090 1.1.1.8 christos elf_x86_64_lazy_bnd_plt0_entry, /* plt0_entry */
1091 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt0_entry_size */
1092 1.1.1.4 christos elf_x86_64_lazy_bnd_ibt_plt_entry, /* plt_entry */
1093 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1094 1.1.1.4 christos elf_x86_64_tlsdesc_plt_entry, /* plt_tlsdesc_entry */
1095 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_tlsdesc_entry_size */
1096 1.1.1.4 christos 6, /* plt_tlsdesc_got1_offset */
1097 1.1.1.4 christos 12, /* plt_tlsdesc_got2_offset */
1098 1.1.1.4 christos 10, /* plt_tlsdesc_got1_insn_end */
1099 1.1.1.4 christos 16, /* plt_tlsdesc_got2_insn_end */
1100 1.1.1.4 christos 2, /* plt0_got1_offset */
1101 1.1.1.4 christos 1+8, /* plt0_got2_offset */
1102 1.1.1.4 christos 1+12, /* plt0_got2_insn_end */
1103 1.1.1.4 christos 4+1+2, /* plt_got_offset */
1104 1.1.1.4 christos 4+1, /* plt_reloc_offset */
1105 1.1.1.4 christos 4+1+6, /* plt_plt_offset */
1106 1.1.1.4 christos 4+1+6, /* plt_got_insn_size */
1107 1.1.1.4 christos 4+1+5+5, /* plt_plt_insn_end */
1108 1.1.1.8 christos 0, /* plt_lazy_offset */
1109 1.1.1.8 christos elf_x86_64_lazy_bnd_plt0_entry, /* pic_plt0_entry */
1110 1.1.1.8 christos elf_x86_64_lazy_bnd_ibt_plt_entry, /* pic_plt_entry */
1111 1.1.1.4 christos elf_x86_64_eh_frame_lazy_bnd_ibt_plt, /* eh_frame_plt */
1112 1.1 christos sizeof (elf_x86_64_eh_frame_lazy_bnd_ibt_plt) /* eh_frame_plt_size */
1113 1.1.1.8 christos };
1114 1.1.1.4 christos
1115 1.1.1.4 christos static const struct elf_x86_lazy_plt_layout elf_x86_64_lazy_ibt_plt =
1116 1.1.1.4 christos {
1117 1.1.1.8 christos elf_x86_64_lazy_plt0_entry, /* plt0_entry */
1118 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt0_entry_size */
1119 1.1.1.4 christos elf_x86_64_lazy_ibt_plt_entry, /* plt_entry */
1120 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1121 1.1.1.4 christos elf_x86_64_tlsdesc_plt_entry, /* plt_tlsdesc_entry */
1122 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_tlsdesc_entry_size */
1123 1.1.1.4 christos 6, /* plt_tlsdesc_got1_offset */
1124 1.1.1.4 christos 12, /* plt_tlsdesc_got2_offset */
1125 1.1.1.4 christos 10, /* plt_tlsdesc_got1_insn_end */
1126 1.1.1.4 christos 16, /* plt_tlsdesc_got2_insn_end */
1127 1.1.1.4 christos 2, /* plt0_got1_offset */
1128 1.1.1.4 christos 8, /* plt0_got2_offset */
1129 1.1.1.4 christos 12, /* plt0_got2_insn_end */
1130 1.1.1.4 christos 4+2, /* plt_got_offset */
1131 1.1.1.4 christos 4+1, /* plt_reloc_offset */
1132 1.1.1.4 christos 4+6, /* plt_plt_offset */
1133 1.1.1.4 christos 4+6, /* plt_got_insn_size */
1134 1.1.1.4 christos 4+5+5, /* plt_plt_insn_end */
1135 1.1.1.8 christos 0, /* plt_lazy_offset */
1136 1.1.1.8 christos elf_x86_64_lazy_plt0_entry, /* pic_plt0_entry */
1137 1.1.1.8 christos elf_x86_64_lazy_ibt_plt_entry, /* pic_plt_entry */
1138 1.1.1.4 christos elf_x86_64_eh_frame_lazy_ibt_plt, /* eh_frame_plt */
1139 1.1 christos sizeof (elf_x86_64_eh_frame_lazy_ibt_plt) /* eh_frame_plt_size */
1140 1.1.1.8 christos };
1141 1.1.1.4 christos
1142 1.1.1.8 christos static const struct elf_x86_non_lazy_plt_layout elf_x86_64_non_lazy_bnd_ibt_plt =
1143 1.1.1.8 christos {
1144 1.1.1.4 christos elf_x86_64_non_lazy_bnd_ibt_plt_entry, /* plt_entry */
1145 1.1.1.4 christos elf_x86_64_non_lazy_bnd_ibt_plt_entry, /* pic_plt_entry */
1146 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1147 1.1.1.4 christos 4+1+2, /* plt_got_offset */
1148 1.1.1.4 christos 4+1+6, /* plt_got_insn_size */
1149 1.1.1.4 christos elf_x86_64_eh_frame_non_lazy_plt, /* eh_frame_plt */
1150 1.1 christos sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
1151 1.1.1.8 christos };
1152 1.1.1.4 christos
1153 1.1.1.8 christos static const struct elf_x86_non_lazy_plt_layout elf_x86_64_non_lazy_ibt_plt =
1154 1.1.1.8 christos {
1155 1.1.1.4 christos elf_x86_64_non_lazy_ibt_plt_entry, /* plt_entry */
1156 1.1.1.4 christos elf_x86_64_non_lazy_ibt_plt_entry, /* pic_plt_entry */
1157 1.1.1.4 christos LAZY_PLT_ENTRY_SIZE, /* plt_entry_size */
1158 1.1.1.4 christos 4+2, /* plt_got_offset */
1159 1.1.1.4 christos 4+6, /* plt_got_insn_size */
1160 1.1.1.4 christos elf_x86_64_eh_frame_non_lazy_plt, /* eh_frame_plt */
1161 1.1 christos sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
1162 1.1.1.6 christos };
1163 1.1.1.4 christos
1164 1.1.1.2 christos static bool
1165 1.1.1.4 christos elf64_x86_64_elf_object_p (bfd *abfd)
1166 1.1.1.4 christos {
1167 1.1.1.6 christos /* Set the right machine number for an x86-64 elf64 file. */
1168 1.1.1.2 christos bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
1169 1.1.1.2 christos return true;
1170 1.1.1.6 christos }
1171 1.1.1.4 christos
1172 1.1 christos static bool
1173 1.1.1.4 christos elf32_x86_64_elf_object_p (bfd *abfd)
1174 1.1.1.4 christos {
1175 1.1.1.6 christos /* Set the right machine number for an x86-64 elf32 file. */
1176 1.1 christos bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x64_32);
1177 1.1 christos return true;
1178 1.1.1.4 christos }
1179 1.1.1.4 christos
1180 1.1 christos /* Return TRUE if the TLS access code sequence support transition
1181 1.1.1.8 christos from R_TYPE. */
1182 1.1.1.4 christos
1183 1.1.1.4 christos static enum elf_x86_tls_error_type
1184 1.1.1.4 christos elf_x86_64_check_tls_transition (bfd *abfd,
1185 1.1.1.4 christos struct bfd_link_info *info,
1186 1.1.1.4 christos asection *sec,
1187 1.1.1.4 christos bfd_byte *contents,
1188 1.1.1.4 christos Elf_Internal_Shdr *symtab_hdr,
1189 1.1.1.4 christos struct elf_link_hash_entry **sym_hashes,
1190 1.1.1.4 christos unsigned int r_type,
1191 1.1 christos const Elf_Internal_Rela *rel,
1192 1.1.1.4 christos const Elf_Internal_Rela *relend)
1193 1.1.1.4 christos {
1194 1.1.1.6 christos unsigned int val;
1195 1.1.1.4 christos unsigned long r_symndx;
1196 1.1.1.4 christos bool largepic = false;
1197 1.1.1.4 christos struct elf_link_hash_entry *h;
1198 1.1.1.4 christos bfd_vma offset;
1199 1.1.1.6 christos struct elf_x86_link_hash_table *htab;
1200 1.1 christos bfd_byte *call;
1201 1.1.1.4 christos bool indirect_call;
1202 1.1.1.4 christos
1203 1.1.1.4 christos htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
1204 1.1.1.2 christos offset = rel->r_offset;
1205 1.1.1.4 christos switch (r_type)
1206 1.1.1.4 christos {
1207 1.1.1.4 christos case R_X86_64_TLSGD:
1208 1.1.1.8 christos case R_X86_64_TLSLD:
1209 1.1 christos if ((rel + 1) >= relend)
1210 1.1.1.4 christos return elf_x86_tls_error_yes;
1211 1.1 christos
1212 1.1 christos if (r_type == R_X86_64_TLSGD)
1213 1.1 christos {
1214 1.1.1.3 christos /* Check transition from GD access model. For 64bit, only
1215 1.1.1.3 christos .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1216 1.1.1.3 christos .word 0x6666; rex64; call __tls_get_addr@PLT
1217 1.1.1.3 christos or
1218 1.1.1.3 christos .byte 0x66; leaq foo@tlsgd(%rip), %rdi
1219 1.1.1.3 christos .byte 0x66; rex64
1220 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
1221 1.1 christos which may be converted to
1222 1.1 christos addr32 call __tls_get_addr
1223 1.1.1.3 christos can transit to different access model. For 32bit, only
1224 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
1225 1.1.1.3 christos .word 0x6666; rex64; call __tls_get_addr@PLT
1226 1.1.1.3 christos or
1227 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
1228 1.1.1.3 christos .byte 0x66; rex64
1229 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
1230 1.1.1.3 christos which may be converted to
1231 1.1.1.2 christos addr32 call __tls_get_addr
1232 1.1.1.4 christos can transit to different access model. For largepic,
1233 1.1.1.4 christos we also support:
1234 1.1.1.4 christos leaq foo@tlsgd(%rip), %rdi
1235 1.1.1.4 christos movabsq $__tls_get_addr@pltoff, %rax
1236 1.1.1.3 christos addq $r15, %rax
1237 1.1.1.4 christos call *%rax
1238 1.1.1.4 christos or
1239 1.1.1.4 christos leaq foo@tlsgd(%rip), %rdi
1240 1.1.1.4 christos movabsq $__tls_get_addr@pltoff, %rax
1241 1.1 christos addq $rbx, %rax
1242 1.1 christos call *%rax */
1243 1.1 christos
1244 1.1.1.2 christos static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
1245 1.1.1.8 christos
1246 1.1 christos if ((offset + 12) > sec->size)
1247 1.1.1.3 christos return elf_x86_tls_error_yes;
1248 1.1.1.3 christos
1249 1.1.1.3 christos call = contents + offset + 4;
1250 1.1.1.3 christos if (call[0] != 0x66
1251 1.1.1.3 christos || !((call[1] == 0x48
1252 1.1.1.3 christos && call[2] == 0xff
1253 1.1.1.3 christos && call[3] == 0x15)
1254 1.1.1.3 christos || (call[1] == 0x48
1255 1.1.1.3 christos && call[2] == 0x67
1256 1.1.1.3 christos && call[3] == 0xe8)
1257 1.1.1.3 christos || (call[1] == 0x66
1258 1.1.1.2 christos && call[2] == 0x48
1259 1.1.1.2 christos && call[3] == 0xe8)))
1260 1.1.1.2 christos {
1261 1.1.1.2 christos if (!ABI_64_P (abfd)
1262 1.1.1.3 christos || (offset + 19) > sec->size
1263 1.1.1.3 christos || offset < 3
1264 1.1.1.3 christos || memcmp (call - 7, leaq + 1, 3) != 0
1265 1.1.1.3 christos || memcmp (call, "\x48\xb8", 2) != 0
1266 1.1.1.3 christos || call[11] != 0x01
1267 1.1.1.3 christos || call[13] != 0xff
1268 1.1.1.3 christos || call[14] != 0xd0
1269 1.1.1.8 christos || !((call[10] == 0x48 && call[12] == 0xd8)
1270 1.1.1.6 christos || (call[10] == 0x4c && call[12] == 0xf8)))
1271 1.1.1.2 christos return elf_x86_tls_error_yes;
1272 1.1.1.2 christos largepic = true;
1273 1.1 christos }
1274 1.1 christos else if (ABI_64_P (abfd))
1275 1.1 christos {
1276 1.1.1.8 christos if (offset < 4
1277 1.1 christos || memcmp (contents + offset - 4, leaq, 4) != 0)
1278 1.1 christos return elf_x86_tls_error_yes;
1279 1.1 christos }
1280 1.1 christos else
1281 1.1 christos {
1282 1.1.1.8 christos if (offset < 3
1283 1.1 christos || memcmp (contents + offset - 3, leaq + 1, 3) != 0)
1284 1.1.1.3 christos return elf_x86_tls_error_yes;
1285 1.1 christos }
1286 1.1 christos indirect_call = call[2] == 0xff;
1287 1.1 christos }
1288 1.1 christos else
1289 1.1 christos {
1290 1.1.1.3 christos /* Check transition from LD access model. Only
1291 1.1.1.4 christos leaq foo@tlsld(%rip), %rdi;
1292 1.1.1.3 christos call __tls_get_addr@PLT
1293 1.1.1.3 christos or
1294 1.1.1.3 christos leaq foo@tlsld(%rip), %rdi;
1295 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
1296 1.1.1.2 christos which may be converted to
1297 1.1.1.2 christos addr32 call __tls_get_addr
1298 1.1.1.4 christos can transit to different access model. For largepic
1299 1.1.1.4 christos we also support:
1300 1.1.1.4 christos leaq foo@tlsld(%rip), %rdi
1301 1.1.1.4 christos movabsq $__tls_get_addr@pltoff, %rax
1302 1.1.1.3 christos addq $r15, %rax
1303 1.1.1.4 christos call *%rax
1304 1.1.1.4 christos or
1305 1.1.1.4 christos leaq foo@tlsld(%rip), %rdi
1306 1.1.1.4 christos movabsq $__tls_get_addr@pltoff, %rax
1307 1.1 christos addq $rbx, %rax
1308 1.1 christos call *%rax */
1309 1.1 christos
1310 1.1 christos static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
1311 1.1.1.8 christos
1312 1.1 christos if (offset < 3 || (offset + 9) > sec->size)
1313 1.1.1.2 christos return elf_x86_tls_error_yes;
1314 1.1.1.8 christos
1315 1.1.1.2 christos if (memcmp (contents + offset - 3, lea, 3) != 0)
1316 1.1.1.3 christos return elf_x86_tls_error_yes;
1317 1.1.1.3 christos
1318 1.1.1.3 christos call = contents + offset + 4;
1319 1.1.1.3 christos if (!(call[0] == 0xe8
1320 1.1.1.2 christos || (call[0] == 0xff && call[1] == 0x15)
1321 1.1.1.2 christos || (call[0] == 0x67 && call[1] == 0xe8)))
1322 1.1.1.2 christos {
1323 1.1.1.3 christos if (!ABI_64_P (abfd)
1324 1.1.1.3 christos || (offset + 19) > sec->size
1325 1.1.1.3 christos || memcmp (call, "\x48\xb8", 2) != 0
1326 1.1.1.3 christos || call[11] != 0x01
1327 1.1.1.3 christos || call[13] != 0xff
1328 1.1.1.3 christos || call[14] != 0xd0
1329 1.1.1.8 christos || !((call[10] == 0x48 && call[12] == 0xd8)
1330 1.1.1.6 christos || (call[10] == 0x4c && call[12] == 0xf8)))
1331 1.1.1.2 christos return elf_x86_tls_error_yes;
1332 1.1.1.3 christos largepic = true;
1333 1.1 christos }
1334 1.1 christos indirect_call = call[0] == 0xff;
1335 1.1 christos }
1336 1.1 christos
1337 1.1.1.8 christos r_symndx = htab->r_sym (rel[1].r_info);
1338 1.1 christos if (r_symndx < symtab_hdr->sh_info)
1339 1.1 christos return elf_x86_tls_error_yes;
1340 1.1.1.4 christos
1341 1.1.1.4 christos h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1342 1.1.1.8 christos if (h == NULL
1343 1.1.1.3 christos || !((struct elf_x86_link_hash_entry *) h)->tls_get_addr)
1344 1.1.1.4 christos return elf_x86_tls_error_yes;
1345 1.1.1.4 christos else
1346 1.1.1.4 christos {
1347 1.1.1.4 christos r_type = (ELF32_R_TYPE (rel[1].r_info)
1348 1.1.1.8 christos & ~R_X86_64_converted_reloc_bit);
1349 1.1.1.8 christos if (largepic)
1350 1.1.1.8 christos return (r_type == R_X86_64_PLTOFF64
1351 1.1.1.4 christos ? elf_x86_tls_error_none
1352 1.1.1.8 christos : elf_x86_tls_error_yes);
1353 1.1.1.8 christos else if (indirect_call)
1354 1.1.1.8 christos return ((r_type == R_X86_64_GOTPCRELX
1355 1.1.1.8 christos || r_type == R_X86_64_GOTPCREL)
1356 1.1.1.4 christos ? elf_x86_tls_error_none
1357 1.1.1.8 christos : elf_x86_tls_error_yes);
1358 1.1.1.8 christos else
1359 1.1.1.8 christos return ((r_type == R_X86_64_PC32
1360 1.1.1.8 christos || r_type == R_X86_64_PLT32)
1361 1.1.1.4 christos ? elf_x86_tls_error_none
1362 1.1 christos : elf_x86_tls_error_yes);
1363 1.1.1.7 christos }
1364 1.1.1.7 christos
1365 1.1.1.7 christos case R_X86_64_CODE_4_GOTTPOFF:
1366 1.1.1.7 christos /* Check transition from IE access model:
1367 1.1.1.8 christos mov foo@gottpoff(%rip), %reg
1368 1.1.1.8 christos add foo@gottpoff(%rip), %reg
1369 1.1.1.8 christos where reg is one of r16 to r31.
1370 1.1.1.8 christos For x32 also:
1371 1.1.1.7 christos movrs foo@gottpoff(%rip), %reg
1372 1.1.1.7 christos where no REX prefix is present. */
1373 1.1.1.8 christos
1374 1.1.1.8 christos if (offset < 4
1375 1.1.1.8 christos || (offset + 4) > sec->size)
1376 1.1.1.8 christos return elf_x86_tls_error_yes;
1377 1.1.1.8 christos
1378 1.1.1.8 christos if (!ABI_64_P (abfd)
1379 1.1.1.8 christos && contents[offset - 4] == 0x0f
1380 1.1.1.8 christos && contents[offset - 3] == 0x38
1381 1.1.1.8 christos && contents[offset - 2] == 0x8b)
1382 1.1.1.8 christos goto check_gottpoff_modrm;
1383 1.1.1.8 christos
1384 1.1.1.7 christos if (contents[offset - 4] != 0xd5)
1385 1.1.1.7 christos return elf_x86_tls_error_yes;
1386 1.1.1.7 christos
1387 1.1.1.8 christos goto check_gottpoff;
1388 1.1.1.8 christos
1389 1.1.1.8 christos case R_X86_64_CODE_5_GOTTPOFF:
1390 1.1.1.8 christos /* Check transition from IE access model:
1391 1.1.1.8 christos movrs foo@gottpoff(%rip), %reg
1392 1.1.1.8 christos where reg isn't one of r16 to r31. */
1393 1.1.1.8 christos if (offset < 5
1394 1.1.1.8 christos || (offset + 4) > sec->size
1395 1.1.1.8 christos || (contents[offset - 5] | (ABI_64_P (abfd) ? 7 : 0xf)) != 0x4f
1396 1.1.1.8 christos || contents[offset - 4] != 0x0f
1397 1.1.1.8 christos || contents[offset - 3] != 0x38
1398 1.1.1.8 christos || contents[offset - 2] != 0x8b)
1399 1.1.1.8 christos return elf_x86_tls_error_yes;
1400 1.1.1.8 christos
1401 1.1.1.8 christos goto check_gottpoff_modrm;
1402 1.1.1.8 christos
1403 1.1.1.8 christos case R_X86_64_CODE_6_GOTTPOFF:
1404 1.1.1.8 christos /* Check transition from IE access model:
1405 1.1.1.8 christos add %reg1, foo@gottpoff(%rip), %reg2
1406 1.1.1.8 christos movrs foo@gottpoff(%rip), %reg
1407 1.1.1.8 christos where reg1/reg2/reg are one of r16 to r31. */
1408 1.1.1.8 christos
1409 1.1.1.8 christos if (offset < 6
1410 1.1.1.8 christos || (offset + 4) > sec->size
1411 1.1.1.8 christos || contents[offset - 6] != 0x62)
1412 1.1.1.8 christos return elf_x86_tls_error_yes;
1413 1.1.1.8 christos
1414 1.1.1.8 christos val = bfd_get_8 (abfd, contents + offset - 2);
1415 1.1.1.8 christos if (val != 0x01 && val != 0x03 && val != 0x8b)
1416 1.1.1.8 christos return elf_x86_tls_error_add_movrs;
1417 1.1.1.8 christos
1418 1.1 christos goto check_gottpoff_modrm;
1419 1.1 christos
1420 1.1 christos case R_X86_64_GOTTPOFF:
1421 1.1 christos /* Check transition from IE access model:
1422 1.1 christos mov foo@gottpoff(%rip), %reg
1423 1.1 christos add foo@gottpoff(%rip), %reg
1424 1.1 christos */
1425 1.1 christos
1426 1.1 christos /* Check REX prefix first. */
1427 1.1 christos if (offset >= 3 && (offset + 4) <= sec->size)
1428 1.1 christos {
1429 1.1 christos val = bfd_get_8 (abfd, contents + offset - 3);
1430 1.1 christos if (val != 0x48 && val != 0x4c)
1431 1.1 christos {
1432 1.1.1.8 christos /* X32 may have 0x44 REX prefix or no REX prefix. */
1433 1.1 christos if (ABI_64_P (abfd))
1434 1.1 christos return elf_x86_tls_error_yes;
1435 1.1 christos }
1436 1.1 christos }
1437 1.1 christos else
1438 1.1 christos {
1439 1.1.1.8 christos /* X32 may not have any REX prefix. */
1440 1.1 christos if (ABI_64_P (abfd))
1441 1.1.1.8 christos return elf_x86_tls_error_yes;
1442 1.1 christos if (offset < 2 || (offset + 3) > sec->size)
1443 1.1 christos return elf_x86_tls_error_yes;
1444 1.1.1.7 christos }
1445 1.1 christos
1446 1.1 christos check_gottpoff:
1447 1.1.1.8 christos val = bfd_get_8 (abfd, contents + offset - 2);
1448 1.1 christos if (val != 0x8b && val != 0x03)
1449 1.1.1.8 christos return elf_x86_tls_error_add_mov;
1450 1.1 christos
1451 1.1.1.8 christos check_gottpoff_modrm:
1452 1.1.1.8 christos val = bfd_get_8 (abfd, contents + offset - 1);
1453 1.1.1.8 christos return ((val & 0xc7) == 5
1454 1.1 christos ? elf_x86_tls_error_none
1455 1.1.1.7 christos : elf_x86_tls_error_yes);
1456 1.1.1.7 christos
1457 1.1.1.7 christos case R_X86_64_CODE_4_GOTPC32_TLSDESC:
1458 1.1.1.7 christos /* Check transition from GDesc access model:
1459 1.1.1.7 christos lea x@tlsdesc(%rip), %reg
1460 1.1.1.7 christos where reg is one of r16 to r31. */
1461 1.1.1.7 christos
1462 1.1.1.7 christos if (offset < 4
1463 1.1.1.8 christos || (offset + 4) > sec->size
1464 1.1.1.7 christos || contents[offset - 4] != 0xd5)
1465 1.1.1.7 christos return elf_x86_tls_error_yes;
1466 1.1.1.7 christos
1467 1.1 christos goto check_tlsdesc;
1468 1.1 christos
1469 1.1.1.6 christos case R_X86_64_GOTPC32_TLSDESC:
1470 1.1.1.6 christos /* Check transition from GDesc access model:
1471 1.1 christos leaq x@tlsdesc(%rip), %rax <--- LP64 mode.
1472 1.1 christos rex leal x@tlsdesc(%rip), %eax <--- X32 mode.
1473 1.1 christos
1474 1.1 christos Make sure it's a leaq adding rip to a 32-bit offset
1475 1.1 christos into any register, although it's probably almost always
1476 1.1 christos going to be rax. */
1477 1.1.1.8 christos
1478 1.1 christos if (offset < 3 || (offset + 4) > sec->size)
1479 1.1 christos return elf_x86_tls_error_yes;
1480 1.1.1.6 christos
1481 1.1.1.6 christos val = bfd_get_8 (abfd, contents + offset - 3);
1482 1.1.1.8 christos val &= 0xfb;
1483 1.1 christos if (val != 0x48 && (ABI_64_P (abfd) || val != 0x40))
1484 1.1.1.7 christos return elf_x86_tls_error_yes;
1485 1.1 christos
1486 1.1.1.8 christos check_tlsdesc:
1487 1.1 christos if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1488 1.1 christos return elf_x86_tls_error_lea;
1489 1.1.1.8 christos
1490 1.1.1.8 christos val = bfd_get_8 (abfd, contents + offset - 1);
1491 1.1.1.8 christos return ((val & 0xc7) == 0x05
1492 1.1 christos ? elf_x86_tls_error_none
1493 1.1 christos : elf_x86_tls_error_yes);
1494 1.1.1.8 christos
1495 1.1.1.8 christos case R_X86_64_TLSDESC_CALL:
1496 1.1 christos /* It has been checked in elf_x86_64_tls_transition. */
1497 1.1 christos return elf_x86_tls_error_none;
1498 1.1 christos
1499 1.1 christos default:
1500 1.1 christos abort ();
1501 1.1 christos }
1502 1.1 christos }
1503 1.1 christos
1504 1.1 christos /* Return TRUE if the TLS access transition is OK or no transition
1505 1.1.1.6 christos will be performed. Update R_TYPE if there is a transition. */
1506 1.1 christos
1507 1.1 christos static bool
1508 1.1 christos elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
1509 1.1 christos asection *sec, bfd_byte *contents,
1510 1.1 christos Elf_Internal_Shdr *symtab_hdr,
1511 1.1 christos struct elf_link_hash_entry **sym_hashes,
1512 1.1 christos unsigned int *r_type, int tls_type,
1513 1.1 christos const Elf_Internal_Rela *rel,
1514 1.1.1.8 christos const Elf_Internal_Rela *relend,
1515 1.1.1.6 christos struct elf_link_hash_entry *h,
1516 1.1 christos Elf_Internal_Sym *sym,
1517 1.1 christos bool from_relocate_section)
1518 1.1 christos {
1519 1.1.1.6 christos unsigned int from_type = *r_type;
1520 1.1.1.8 christos unsigned int to_type = from_type;
1521 1.1.1.8 christos bool check = true;
1522 1.1 christos bfd_vma offset;
1523 1.1 christos bfd_byte *call;
1524 1.1 christos
1525 1.1 christos /* Skip TLS transition for functions. */
1526 1.1 christos if (h != NULL
1527 1.1.1.6 christos && (h->type == STT_FUNC
1528 1.1 christos || h->type == STT_GNU_IFUNC))
1529 1.1 christos return true;
1530 1.1 christos
1531 1.1.1.8 christos switch (from_type)
1532 1.1.1.8 christos {
1533 1.1.1.8 christos case R_X86_64_TLSDESC_CALL:
1534 1.1.1.8 christos /* Check valid GDesc call:
1535 1.1.1.8 christos call *x@tlscall(%rax) <--- LP64 mode.
1536 1.1.1.8 christos call *x@tlscall(%eax) <--- X32 mode.
1537 1.1.1.8 christos */
1538 1.1.1.8 christos offset = rel->r_offset;
1539 1.1.1.8 christos call = NULL;
1540 1.1.1.8 christos if (offset + 2 <= sec->size)
1541 1.1.1.8 christos {
1542 1.1.1.8 christos unsigned int prefix;
1543 1.1.1.8 christos call = contents + offset;
1544 1.1.1.8 christos prefix = 0;
1545 1.1.1.8 christos if (!ABI_64_P (abfd))
1546 1.1.1.8 christos {
1547 1.1.1.8 christos /* Check for call *x@tlscall(%eax). */
1548 1.1.1.8 christos if (call[0] == 0x67)
1549 1.1.1.8 christos {
1550 1.1.1.8 christos prefix = 1;
1551 1.1.1.8 christos if (offset + 3 > sec->size)
1552 1.1.1.8 christos call = NULL;
1553 1.1.1.8 christos }
1554 1.1.1.8 christos }
1555 1.1.1.8 christos
1556 1.1.1.8 christos /* Make sure that it's a call *x@tlscall(%rax). */
1557 1.1.1.8 christos if (call != NULL
1558 1.1.1.8 christos && (call[prefix] != 0xff || call[1 + prefix] != 0x10))
1559 1.1.1.8 christos call = NULL;
1560 1.1.1.8 christos }
1561 1.1.1.8 christos
1562 1.1.1.8 christos if (call == NULL)
1563 1.1.1.8 christos {
1564 1.1.1.8 christos _bfd_x86_elf_link_report_tls_transition_error
1565 1.1.1.8 christos (info, abfd, sec, symtab_hdr, h, sym, rel,
1566 1.1.1.8 christos "R_X86_64_TLSDESC_CALL", NULL,
1567 1.1.1.8 christos elf_x86_tls_error_indirect_call);
1568 1.1.1.8 christos return false;
1569 1.1.1.8 christos }
1570 1.1.1.8 christos
1571 1.1 christos /* Fall through. */
1572 1.1 christos
1573 1.1.1.7 christos case R_X86_64_TLSGD:
1574 1.1 christos case R_X86_64_GOTPC32_TLSDESC:
1575 1.1.1.7 christos case R_X86_64_CODE_4_GOTPC32_TLSDESC:
1576 1.1.1.8 christos case R_X86_64_GOTTPOFF:
1577 1.1.1.8 christos case R_X86_64_CODE_4_GOTTPOFF:
1578 1.1.1.2 christos case R_X86_64_CODE_5_GOTTPOFF:
1579 1.1 christos case R_X86_64_CODE_6_GOTTPOFF:
1580 1.1 christos if (bfd_link_executable (info))
1581 1.1 christos {
1582 1.1 christos if (h == NULL)
1583 1.1 christos to_type = R_X86_64_TPOFF32;
1584 1.1 christos else
1585 1.1 christos to_type = R_X86_64_GOTTPOFF;
1586 1.1.1.3 christos }
1587 1.1.1.3 christos
1588 1.1.1.3 christos /* When we are called from elf_x86_64_relocate_section, there may
1589 1.1 christos be additional transitions based on TLS_TYPE. */
1590 1.1 christos if (from_relocate_section)
1591 1.1 christos {
1592 1.1.1.4 christos unsigned int new_to_type = to_type;
1593 1.1 christos
1594 1.1 christos if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type))
1595 1.1 christos new_to_type = R_X86_64_TPOFF32;
1596 1.1 christos
1597 1.1.1.7 christos if (to_type == R_X86_64_TLSGD
1598 1.1 christos || to_type == R_X86_64_GOTPC32_TLSDESC
1599 1.1 christos || to_type == R_X86_64_CODE_4_GOTPC32_TLSDESC
1600 1.1 christos || to_type == R_X86_64_TLSDESC_CALL)
1601 1.1 christos {
1602 1.1 christos if (tls_type == GOT_TLS_IE)
1603 1.1 christos new_to_type = R_X86_64_GOTTPOFF;
1604 1.1 christos }
1605 1.1.1.6 christos
1606 1.1 christos /* We checked the transition before when we were called from
1607 1.1.1.8 christos elf_x86_64_scan_relocs. We only want to check the new
1608 1.1.1.8 christos transition which hasn't been checked before. */
1609 1.1.1.8 christos check = (new_to_type != to_type
1610 1.1.1.8 christos && (from_type == to_type
1611 1.1.1.8 christos || (from_type == R_X86_64_CODE_4_GOTTPOFF
1612 1.1.1.8 christos && to_type == R_X86_64_GOTTPOFF)
1613 1.1.1.8 christos || (from_type == R_X86_64_CODE_5_GOTTPOFF
1614 1.1.1.8 christos && to_type == R_X86_64_GOTTPOFF)
1615 1.1 christos || (from_type == R_X86_64_CODE_6_GOTTPOFF
1616 1.1 christos && to_type == R_X86_64_GOTTPOFF)));
1617 1.1 christos to_type = new_to_type;
1618 1.1 christos }
1619 1.1 christos
1620 1.1 christos break;
1621 1.1.1.2 christos
1622 1.1 christos case R_X86_64_TLSLD:
1623 1.1 christos if (bfd_link_executable (info))
1624 1.1 christos to_type = R_X86_64_TPOFF32;
1625 1.1 christos break;
1626 1.1.1.6 christos
1627 1.1 christos default:
1628 1.1 christos return true;
1629 1.1 christos }
1630 1.1.1.7 christos
1631 1.1.1.7 christos /* Return TRUE if there is no transition. */
1632 1.1.1.8 christos if (from_type == to_type
1633 1.1.1.8 christos || (from_type == R_X86_64_CODE_4_GOTTPOFF
1634 1.1.1.8 christos && to_type == R_X86_64_GOTTPOFF)
1635 1.1.1.8 christos || (from_type == R_X86_64_CODE_5_GOTTPOFF
1636 1.1.1.7 christos && to_type == R_X86_64_GOTTPOFF)
1637 1.1.1.6 christos || (from_type == R_X86_64_CODE_6_GOTTPOFF
1638 1.1 christos && to_type == R_X86_64_GOTTPOFF))
1639 1.1 christos return true;
1640 1.1.1.8 christos
1641 1.1 christos /* Check if the transition can be performed. */
1642 1.1.1.8 christos enum elf_x86_tls_error_type tls_error;
1643 1.1.1.8 christos if (check
1644 1.1.1.8 christos && ((tls_error = elf_x86_64_check_tls_transition (abfd, info, sec,
1645 1.1.1.8 christos contents,
1646 1.1.1.8 christos symtab_hdr,
1647 1.1.1.8 christos sym_hashes,
1648 1.1.1.8 christos from_type, rel,
1649 1.1.1.8 christos relend))
1650 1.1 christos != elf_x86_tls_error_none))
1651 1.1 christos
1652 1.1 christos {
1653 1.1.1.8 christos reloc_howto_type *from, *to;
1654 1.1.1.8 christos
1655 1.1 christos from = &x86_64_elf_howto_table[from_type];
1656 1.1.1.4 christos to = &x86_64_elf_howto_table[to_type];
1657 1.1.1.6 christos
1658 1.1.1.4 christos if (from == NULL || to == NULL)
1659 1.1.1.8 christos return false;
1660 1.1.1.8 christos
1661 1.1.1.8 christos _bfd_x86_elf_link_report_tls_transition_error
1662 1.1 christos (info, abfd, sec, symtab_hdr, h, sym, rel, from->name,
1663 1.1.1.6 christos to->name, tls_error);
1664 1.1 christos
1665 1.1 christos return false;
1666 1.1 christos }
1667 1.1.1.6 christos
1668 1.1 christos *r_type = to_type;
1669 1.1 christos return true;
1670 1.1.1.6 christos }
1671 1.1.1.4 christos
1672 1.1.1.4 christos static bool
1673 1.1.1.3 christos elf_x86_64_need_pic (struct bfd_link_info *info,
1674 1.1.1.3 christos bfd *input_bfd, asection *sec,
1675 1.1.1.3 christos struct elf_link_hash_entry *h,
1676 1.1.1.3 christos Elf_Internal_Shdr *symtab_hdr,
1677 1.1.1.3 christos Elf_Internal_Sym *isym,
1678 1.1.1.3 christos reloc_howto_type *howto)
1679 1.1.1.3 christos {
1680 1.1.1.3 christos const char *v = "";
1681 1.1.1.4 christos const char *und = "";
1682 1.1.1.3 christos const char *pic = "";
1683 1.1.1.3 christos const char *object;
1684 1.1.1.3 christos
1685 1.1.1.3 christos const char *name;
1686 1.1.1.3 christos if (h)
1687 1.1.1.3 christos {
1688 1.1.1.3 christos name = h->root.root.string;
1689 1.1.1.3 christos switch (ELF_ST_VISIBILITY (h->other))
1690 1.1.1.3 christos {
1691 1.1.1.3 christos case STV_HIDDEN:
1692 1.1.1.3 christos v = _("hidden symbol ");
1693 1.1.1.3 christos break;
1694 1.1.1.3 christos case STV_INTERNAL:
1695 1.1.1.3 christos v = _("internal symbol ");
1696 1.1.1.3 christos break;
1697 1.1.1.3 christos case STV_PROTECTED:
1698 1.1.1.3 christos v = _("protected symbol ");
1699 1.1.1.4 christos break;
1700 1.1.1.4 christos default:
1701 1.1.1.4 christos if (((struct elf_x86_link_hash_entry *) h)->def_protected)
1702 1.1.1.4 christos v = _("protected symbol ");
1703 1.1.1.5 christos else
1704 1.1.1.3 christos v = _("symbol ");
1705 1.1.1.3 christos pic = NULL;
1706 1.1.1.3 christos break;
1707 1.1.1.5 christos }
1708 1.1.1.3 christos
1709 1.1.1.3 christos if (!SYMBOL_DEFINED_NON_SHARED_P (h) && !h->def_dynamic)
1710 1.1.1.3 christos und = _("undefined ");
1711 1.1.1.3 christos }
1712 1.1.1.3 christos else
1713 1.1.1.5 christos {
1714 1.1.1.3 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, isym, NULL);
1715 1.1.1.3 christos pic = NULL;
1716 1.1.1.4 christos }
1717 1.1.1.5 christos
1718 1.1.1.5 christos if (bfd_link_dll (info))
1719 1.1.1.5 christos {
1720 1.1.1.5 christos object = _("a shared object");
1721 1.1.1.5 christos if (!pic)
1722 1.1.1.4 christos pic = _("; recompile with -fPIC");
1723 1.1.1.5 christos }
1724 1.1.1.5 christos else
1725 1.1.1.5 christos {
1726 1.1.1.5 christos if (bfd_link_pie (info))
1727 1.1.1.5 christos object = _("a PIE object");
1728 1.1.1.5 christos else
1729 1.1.1.5 christos object = _("a PDE object");
1730 1.1.1.5 christos if (!pic)
1731 1.1.1.4 christos pic = _("; recompile with -fPIE");
1732 1.1.1.4 christos }
1733 1.1.1.4 christos
1734 1.1.1.4 christos /* xgettext:c-format */
1735 1.1.1.4 christos _bfd_error_handler (_("%pB: relocation %s against %s%s`%s' can "
1736 1.1.1.4 christos "not be used when making %s%s"),
1737 1.1.1.3 christos input_bfd, howto->name, und, v, name,
1738 1.1.1.3 christos object, pic);
1739 1.1.1.6 christos bfd_set_error (bfd_error_bad_value);
1740 1.1.1.3 christos sec->check_relocs_failed = 1;
1741 1.1.1.3 christos return false;
1742 1.1.1.8 christos }
1743 1.1.1.8 christos
1744 1.1.1.8 christos /* Move the R bits to the B bits in EVEX payload byte 1. */
1745 1.1.1.8 christos static unsigned int evex_move_r_to_b (unsigned int byte1, bool copy)
1746 1.1.1.8 christos {
1747 1.1.1.8 christos byte1 = (byte1 & ~(1 << 5)) | ((byte1 & (1 << 7)) >> 2); /* R3 -> B3 */
1748 1.1.1.8 christos byte1 = (byte1 & ~(1 << 3)) | ((~byte1 & (1 << 4)) >> 1); /* R4 -> B4 */
1749 1.1.1.8 christos
1750 1.1.1.8 christos /* Set both R bits, as they're inverted. */
1751 1.1.1.8 christos if (!copy)
1752 1.1.1.8 christos byte1 |= (1 << 4) | (1 << 7);
1753 1.1.1.8 christos
1754 1.1.1.8 christos return byte1;
1755 1.1.1.3 christos }
1756 1.1.1.3 christos
1757 1.1.1.8 christos /* With the local symbol, foo, we convert
1758 1.1.1.3 christos mov foo@GOTPCREL(%rip), %reg
1759 1.1.1.3 christos movrs foo@GOTPCREL(%rip), %reg
1760 1.1.1.3 christos to
1761 1.1.1.3 christos lea foo(%rip), %reg
1762 1.1.1.3 christos and convert
1763 1.1.1.3 christos call/jmp *foo@GOTPCREL(%rip)
1764 1.1.1.3 christos to
1765 1.1.1.3 christos nop call foo/jmp foo nop
1766 1.1.1.3 christos When PIC is false, convert
1767 1.1.1.3 christos test %reg, foo@GOTPCREL(%rip)
1768 1.1.1.3 christos to
1769 1.1.1.8 christos test $foo, %reg
1770 1.1.1.8 christos and convert
1771 1.1.1.8 christos push foo@GOTPCREL(%rip)
1772 1.1.1.8 christos to
1773 1.1.1.3 christos push $foo
1774 1.1.1.3 christos and convert
1775 1.1.1.3 christos binop foo@GOTPCREL(%rip), %reg
1776 1.1.1.8 christos to
1777 1.1.1.3 christos binop $foo, %reg
1778 1.1.1.3 christos where binop is one of adc, add, and, cmp, imul, or, sbb, sub, xor
1779 1.1.1.6 christos instructions. */
1780 1.1.1.4 christos
1781 1.1.1.8 christos static bool
1782 1.1.1.3 christos elf_x86_64_convert_load_reloc (bfd *abfd,
1783 1.1.1.4 christos asection *input_section,
1784 1.1.1.3 christos bfd_byte *contents,
1785 1.1.1.3 christos unsigned int *r_type_p,
1786 1.1.1.6 christos Elf_Internal_Rela *irel,
1787 1.1.1.3 christos struct elf_link_hash_entry *h,
1788 1.1.1.3 christos bool *converted,
1789 1.1.1.4 christos struct bfd_link_info *link_info)
1790 1.1.1.6 christos {
1791 1.1.1.6 christos struct elf_x86_link_hash_table *htab;
1792 1.1.1.6 christos bool is_pic;
1793 1.1.1.8 christos bool no_overflow;
1794 1.1.1.6 christos bool relocx;
1795 1.1.1.6 christos bool is_branch = false;
1796 1.1.1.6 christos bool to_reloc_pc32;
1797 1.1.1.8 christos bool abs_symbol;
1798 1.1.1.3 christos bool local_ref;
1799 1.1.1.3 christos asection *tsec = NULL;
1800 1.1.1.3 christos bfd_signed_vma raddend;
1801 1.1.1.8 christos unsigned int opcode;
1802 1.1.1.4 christos unsigned int modrm;
1803 1.1.1.3 christos unsigned char evex[3] = { 0, 0, 0 };
1804 1.1.1.3 christos unsigned int r_type = *r_type_p;
1805 1.1.1.6 christos unsigned int r_symndx;
1806 1.1.1.8 christos bfd_vma roff = irel->r_offset;
1807 1.1.1.8 christos bfd_vma abs_relocation;
1808 1.1.1.8 christos reloc_howto_type *howto;
1809 1.1.1.8 christos bfd_reloc_status_type r;
1810 1.1.1.3 christos Elf_Internal_Sym *isym;
1811 1.1.1.8 christos bfd_vma relocation;
1812 1.1.1.8 christos
1813 1.1.1.8 christos switch (r_type)
1814 1.1.1.8 christos {
1815 1.1.1.8 christos default:
1816 1.1.1.8 christos if (roff < 2)
1817 1.1.1.8 christos return true;
1818 1.1.1.3 christos relocx = (r_type == R_X86_64_GOTPCRELX);
1819 1.1.1.8 christos break;
1820 1.1.1.8 christos
1821 1.1.1.8 christos case R_X86_64_REX_GOTPCRELX:
1822 1.1.1.8 christos if (roff < 3)
1823 1.1.1.8 christos return true;
1824 1.1.1.3 christos relocx = true;
1825 1.1.1.8 christos break;
1826 1.1.1.8 christos
1827 1.1.1.8 christos case R_X86_64_CODE_4_GOTPCRELX:
1828 1.1.1.3 christos if (roff < 4)
1829 1.1.1.8 christos return true;
1830 1.1.1.7 christos
1831 1.1.1.8 christos /* Skip if this isn't a REX2 instruction, nor un-prefixed MOVRS. */
1832 1.1.1.8 christos opcode = bfd_get_8 (abfd, contents + roff - 4);
1833 1.1.1.8 christos if (opcode != 0xd5
1834 1.1.1.8 christos && (opcode != 0x0f
1835 1.1.1.8 christos || bfd_get_8 (abfd, contents + roff - 3) != 0x38
1836 1.1.1.8 christos || bfd_get_8 (abfd, contents + roff - 2) != 0x8b))
1837 1.1.1.8 christos return true;
1838 1.1.1.8 christos
1839 1.1.1.8 christos relocx = true;
1840 1.1.1.8 christos break;
1841 1.1.1.8 christos
1842 1.1.1.8 christos case R_X86_64_CODE_5_GOTPCRELX:
1843 1.1.1.8 christos if (roff < 5)
1844 1.1.1.8 christos return true;
1845 1.1.1.8 christos
1846 1.1.1.8 christos /* Skip if this isn't REX-prefixed MOVRS. */
1847 1.1.1.8 christos if ((bfd_get_8 (abfd, contents + roff - 5) | 0xf) != 0x4f
1848 1.1.1.8 christos || bfd_get_8 (abfd, contents + roff - 4) != 0x0f
1849 1.1.1.7 christos || bfd_get_8 (abfd, contents + roff - 3) != 0x38
1850 1.1.1.7 christos || bfd_get_8 (abfd, contents + roff - 2) != 0x8b)
1851 1.1.1.7 christos return true;
1852 1.1.1.8 christos
1853 1.1.1.8 christos relocx = true;
1854 1.1.1.8 christos break;
1855 1.1.1.8 christos
1856 1.1.1.8 christos case R_X86_64_CODE_6_GOTPCRELX:
1857 1.1.1.8 christos if (roff < 6)
1858 1.1.1.8 christos return true;
1859 1.1.1.8 christos
1860 1.1.1.8 christos /* Skip if this isn't an EVEX instruction. */
1861 1.1.1.8 christos if (bfd_get_8 (abfd, contents + roff - 6) != 0x62)
1862 1.1.1.8 christos return true;
1863 1.1.1.8 christos
1864 1.1.1.8 christos evex[0] = bfd_get_8 (abfd, contents + roff - 5);
1865 1.1.1.8 christos evex[1] = bfd_get_8 (abfd, contents + roff - 4);
1866 1.1.1.8 christos evex[2] = bfd_get_8 (abfd, contents + roff - 3);
1867 1.1.1.8 christos
1868 1.1.1.8 christos /* Skip if this isn't a Map 4 NP instruction. */
1869 1.1.1.8 christos if ((evex[0] & 7) != 4
1870 1.1.1.8 christos || (evex[1] & 3) != 0
1871 1.1.1.8 christos || (evex[2] & 0xe0) != 0)
1872 1.1.1.8 christos return true;
1873 1.1.1.8 christos
1874 1.1.1.7 christos relocx = true;
1875 1.1.1.8 christos break;
1876 1.1.1.8 christos }
1877 1.1.1.8 christos
1878 1.1.1.8 christos raddend = irel->r_addend;
1879 1.1.1.8 christos /* Addend for 32-bit PC-relative relocation must be -4. */
1880 1.1.1.8 christos if (raddend != -4)
1881 1.1.1.8 christos return true;
1882 1.1.1.8 christos
1883 1.1.1.3 christos htab = elf_x86_hash_table (link_info, X86_64_ELF_DATA);
1884 1.1.1.4 christos is_pic = bfd_link_pic (link_info);
1885 1.1.1.4 christos
1886 1.1.1.3 christos /* TRUE if --no-relax is used. */
1887 1.1.1.3 christos no_overflow = link_info->disable_target_specific_optimizations > 1;
1888 1.1.1.3 christos
1889 1.1.1.3 christos r_symndx = htab->r_sym (irel->r_info);
1890 1.1.1.8 christos
1891 1.1.1.8 christos opcode = bfd_get_8 (abfd, contents + roff - 2);
1892 1.1.1.8 christos modrm = bfd_get_8 (abfd, contents + roff - 1);
1893 1.1.1.8 christos if (opcode == 0xff)
1894 1.1.1.8 christos {
1895 1.1.1.8 christos switch (modrm & 0x38)
1896 1.1.1.8 christos {
1897 1.1.1.8 christos case 0x10: /* CALL */
1898 1.1.1.8 christos case 0x20: /* JMP */
1899 1.1.1.8 christos is_branch = true;
1900 1.1.1.8 christos break;
1901 1.1.1.8 christos
1902 1.1.1.8 christos case 0x30: /* PUSH */
1903 1.1.1.8 christos break;
1904 1.1.1.8 christos
1905 1.1.1.8 christos default:
1906 1.1.1.8 christos return true;
1907 1.1.1.3 christos }
1908 1.1.1.3 christos }
1909 1.1.1.3 christos
1910 1.1.1.3 christos /* Convert mov to lea since it has been done for a while. */
1911 1.1.1.7 christos if (opcode != 0x8b)
1912 1.1.1.8 christos {
1913 1.1.1.7 christos /* Only convert R_X86_64_GOTPCRELX, R_X86_64_REX_GOTPCRELX
1914 1.1.1.3 christos and R_X86_64_CODE_<n>_GOTPCRELX for call, jmp or one of adc,
1915 1.1.1.6 christos add, and, cmp, or, sbb, sub, test, xor instructions. */
1916 1.1.1.3 christos if (!relocx)
1917 1.1.1.3 christos return true;
1918 1.1.1.3 christos }
1919 1.1.1.3 christos
1920 1.1.1.3 christos /* We convert only to R_X86_64_PC32:
1921 1.1.1.4 christos 1. Branch.
1922 1.1.1.3 christos 2. R_X86_64_GOTPCREL since we can't modify REX byte.
1923 1.1.1.3 christos 3. no_overflow is true.
1924 1.1.1.8 christos 4. PIC.
1925 1.1.1.3 christos */
1926 1.1.1.4 christos to_reloc_pc32 = (is_branch
1927 1.1.1.3 christos || !relocx
1928 1.1.1.3 christos || no_overflow
1929 1.1.1.6 christos || is_pic);
1930 1.1.1.6 christos
1931 1.1.1.6 christos abs_symbol = false;
1932 1.1.1.3 christos abs_relocation = 0;
1933 1.1.1.3 christos
1934 1.1.1.3 christos /* Get the symbol referred to by the reloc. */
1935 1.1.1.8 christos if (h == NULL)
1936 1.1.1.8 christos {
1937 1.1.1.3 christos isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
1938 1.1.1.3 christos r_symndx);
1939 1.1.1.3 christos
1940 1.1.1.6 christos /* Skip relocation against undefined symbols. */
1941 1.1.1.3 christos if (isym->st_shndx == SHN_UNDEF)
1942 1.1.1.6 christos return true;
1943 1.1.1.3 christos
1944 1.1.1.6 christos local_ref = true;
1945 1.1.1.6 christos if (isym->st_shndx == SHN_ABS)
1946 1.1.1.6 christos {
1947 1.1.1.6 christos tsec = bfd_abs_section_ptr;
1948 1.1.1.6 christos abs_symbol = true;
1949 1.1.1.3 christos abs_relocation = isym->st_value;
1950 1.1.1.3 christos }
1951 1.1.1.3 christos else if (isym->st_shndx == SHN_COMMON)
1952 1.1.1.3 christos tsec = bfd_com_section_ptr;
1953 1.1.1.3 christos else if (isym->st_shndx == SHN_X86_64_LCOMMON)
1954 1.1.1.3 christos tsec = &_bfd_elf_large_com_section;
1955 1.1.1.3 christos else
1956 1.1.1.3 christos tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1957 1.1.1.3 christos }
1958 1.1.1.3 christos else
1959 1.1.1.3 christos {
1960 1.1.1.3 christos /* Undefined weak symbol is only bound locally in executable
1961 1.1.1.3 christos and its reference is resolved as 0 without relocation
1962 1.1.1.3 christos overflow. We can only perform this optimization for
1963 1.1.1.3 christos GOTPCRELX relocations since we need to modify REX byte.
1964 1.1.1.4 christos It is OK convert mov with R_X86_64_GOTPCREL to
1965 1.1.1.4 christos R_X86_64_PC32. */
1966 1.1.1.8 christos struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
1967 1.1.1.8 christos
1968 1.1.1.8 christos isym = NULL;
1969 1.1.1.6 christos tsec = NULL;
1970 1.1.1.6 christos
1971 1.1.1.6 christos abs_symbol = ABS_SYMBOL_P (h);
1972 1.1.1.4 christos abs_relocation = h->root.u.def.value;
1973 1.1.1.4 christos
1974 1.1.1.3 christos /* NB: Also set linker_def via SYMBOL_REFERENCES_LOCAL_P. */
1975 1.1.1.4 christos local_ref = SYMBOL_REFERENCES_LOCAL_P (link_info, h);
1976 1.1.1.4 christos if ((relocx || opcode == 0x8b)
1977 1.1.1.4 christos && (h->root.type == bfd_link_hash_undefweak
1978 1.1.1.3 christos && !eh->linker_def
1979 1.1.1.8 christos && local_ref))
1980 1.1.1.3 christos {
1981 1.1.1.3 christos if (is_branch)
1982 1.1.1.3 christos {
1983 1.1.1.4 christos /* Skip for branch instructions since R_X86_64_PC32
1984 1.1.1.6 christos may overflow. */
1985 1.1.1.3 christos if (no_overflow)
1986 1.1.1.3 christos return true;
1987 1.1.1.3 christos }
1988 1.1.1.3 christos else if (relocx)
1989 1.1.1.3 christos {
1990 1.1.1.3 christos /* For non-branch instructions, we can convert to
1991 1.1.1.6 christos R_X86_64_32/R_X86_64_32S since we know if there
1992 1.1.1.3 christos is a REX byte. */
1993 1.1.1.3 christos to_reloc_pc32 = false;
1994 1.1.1.3 christos }
1995 1.1.1.3 christos
1996 1.1.1.3 christos /* Since we don't know the current PC when PIC is true,
1997 1.1.1.6 christos we can't convert to R_X86_64_PC32. */
1998 1.1.1.3 christos if (to_reloc_pc32 && is_pic)
1999 1.1.1.3 christos return true;
2000 1.1.1.3 christos
2001 1.1.1.3 christos goto convert;
2002 1.1.1.3 christos }
2003 1.1.1.4 christos /* Avoid optimizing GOTPCREL relocations againt _DYNAMIC since
2004 1.1.1.4 christos ld.so may use its link-time address. */
2005 1.1.1.4 christos else if (h->start_stop
2006 1.1.1.4 christos || eh->linker_def
2007 1.1.1.4 christos || ((h->def_regular
2008 1.1.1.4 christos || h->root.type == bfd_link_hash_defined
2009 1.1.1.4 christos || h->root.type == bfd_link_hash_defweak)
2010 1.1.1.3 christos && h != htab->elf.hdynamic
2011 1.1.1.3 christos && local_ref))
2012 1.1.1.3 christos {
2013 1.1.1.4 christos /* bfd_link_hash_new or bfd_link_hash_undefined is
2014 1.1.1.4 christos set by an assignment in a linker script in
2015 1.1.1.4 christos bfd_elf_record_link_assignment. start_stop is set
2016 1.1.1.4 christos on __start_SECNAME/__stop_SECNAME which mark section
2017 1.1.1.4 christos SECNAME. */
2018 1.1.1.4 christos if (h->start_stop
2019 1.1.1.4 christos || eh->linker_def
2020 1.1.1.4 christos || (h->def_regular
2021 1.1.1.4 christos && (h->root.type == bfd_link_hash_new
2022 1.1.1.4 christos || h->root.type == bfd_link_hash_undefined
2023 1.1.1.4 christos || ((h->root.type == bfd_link_hash_defined
2024 1.1.1.3 christos || h->root.type == bfd_link_hash_defweak)
2025 1.1.1.3 christos && h->root.u.def.section == bfd_und_section_ptr))))
2026 1.1.1.4 christos {
2027 1.1.1.6 christos /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
2028 1.1.1.8 christos if (no_overflow)
2029 1.1.1.8 christos return true;
2030 1.1.1.8 christos if (h->start_stop)
2031 1.1.1.8 christos tsec = h->root.u.def.section;
2032 1.1.1.8 christos else if (h == htab->elf.hehdr_start)
2033 1.1.1.8 christos {
2034 1.1.1.8 christos /* Use the lowest-addressed section to estimate the
2035 1.1.1.8 christos __ehdr_start symbol value. */
2036 1.1.1.8 christos asection *sec;
2037 1.1.1.8 christos tsec = NULL;
2038 1.1.1.8 christos for (sec = link_info->output_bfd->sections;
2039 1.1.1.8 christos sec != NULL;
2040 1.1.1.8 christos sec = sec->next)
2041 1.1.1.8 christos if ((sec->flags & SEC_LOAD) != 0
2042 1.1.1.8 christos && (tsec == NULL || tsec->vma > sec->vma))
2043 1.1.1.8 christos tsec = sec;
2044 1.1.1.3 christos
2045 1.1.1.3 christos }
2046 1.1.1.3 christos goto convert;
2047 1.1.1.3 christos }
2048 1.1.1.3 christos tsec = h->root.u.def.section;
2049 1.1.1.6 christos }
2050 1.1.1.3 christos else
2051 1.1.1.3 christos return true;
2052 1.1.1.8 christos }
2053 1.1.1.8 christos
2054 1.1.1.8 christos if (tsec == NULL)
2055 1.1.1.3 christos return false;
2056 1.1.1.3 christos
2057 1.1.1.3 christos /* Don't convert GOTPCREL relocation against large section. */
2058 1.1.1.6 christos if (elf_section_data (tsec) != NULL
2059 1.1.1.3 christos && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
2060 1.1.1.4 christos return true;
2061 1.1.1.4 christos
2062 1.1.1.6 christos /* Skip since R_X86_64_PC32/R_X86_64_32/R_X86_64_32S may overflow. */
2063 1.1.1.3 christos if (no_overflow)
2064 1.1.1.6 christos return true;
2065 1.1.1.8 christos
2066 1.1.1.8 christos convert:
2067 1.1.1.8 christos /* Compute relocation value so that it can be used later to check for
2068 1.1.1.8 christos overflow against the converted relocation. */
2069 1.1.1.8 christos if (h == NULL)
2070 1.1.1.8 christos {
2071 1.1.1.8 christos /* Make a copy of IREL so that _bfd_elf_rela_local_sym won't
2072 1.1.1.8 christos change IREL. */
2073 1.1.1.8 christos Elf_Internal_Rela rel = *irel;
2074 1.1.1.8 christos relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, isym,
2075 1.1.1.8 christos &tsec, &rel);
2076 1.1.1.8 christos /* Use the updated r_addend. */
2077 1.1.1.8 christos raddend = rel.r_addend;
2078 1.1.1.8 christos }
2079 1.1.1.8 christos else if (tsec != NULL)
2080 1.1.1.8 christos relocation = (h->root.u.def.value
2081 1.1.1.8 christos + tsec->output_section->vma
2082 1.1.1.8 christos + tsec->output_offset);
2083 1.1.1.8 christos else
2084 1.1.1.8 christos relocation = 0;
2085 1.1.1.3 christos
2086 1.1.1.3 christos if (is_branch)
2087 1.1.1.3 christos {
2088 1.1.1.3 christos /* We have "call/jmp *foo@GOTPCREL(%rip)". */
2089 1.1.1.3 christos unsigned int nop;
2090 1.1.1.3 christos unsigned int disp;
2091 1.1.1.8 christos bfd_vma nop_offset;
2092 1.1.1.8 christos
2093 1.1.1.8 christos r_type = R_X86_64_PC32;
2094 1.1.1.8 christos
2095 1.1.1.8 christos /* Skip if the converted relocation will overflow. */
2096 1.1.1.8 christos howto = &x86_64_elf_howto_table[r_type];
2097 1.1.1.8 christos r = _bfd_final_link_relocate (howto, abfd, input_section,
2098 1.1.1.8 christos contents, irel->r_offset,
2099 1.1.1.8 christos relocation, raddend);
2100 1.1.1.8 christos if (r == bfd_reloc_overflow)
2101 1.1.1.3 christos return true;
2102 1.1.1.3 christos
2103 1.1.1.3 christos /* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
2104 1.1.1.3 christos R_X86_64_PC32. */
2105 1.1.1.3 christos if (modrm == 0x25)
2106 1.1.1.3 christos {
2107 1.1.1.3 christos /* Convert to "jmp foo nop". */
2108 1.1.1.3 christos modrm = 0xe9;
2109 1.1.1.3 christos nop = NOP_OPCODE;
2110 1.1.1.3 christos nop_offset = irel->r_offset + 3;
2111 1.1.1.3 christos disp = bfd_get_32 (abfd, contents + irel->r_offset);
2112 1.1.1.3 christos irel->r_offset -= 1;
2113 1.1.1.3 christos bfd_put_32 (abfd, disp, contents + irel->r_offset);
2114 1.1.1.3 christos }
2115 1.1.1.4 christos else
2116 1.1.1.4 christos {
2117 1.1.1.3 christos struct elf_x86_link_hash_entry *eh
2118 1.1.1.3 christos = (struct elf_x86_link_hash_entry *) h;
2119 1.1.1.3 christos
2120 1.1.1.3 christos /* Convert to "nop call foo". ADDR_PREFIX_OPCODE
2121 1.1.1.3 christos is a nop prefix. */
2122 1.1.1.3 christos modrm = 0xe8;
2123 1.1.1.4 christos /* To support TLS optimization, always use addr32 prefix for
2124 1.1.1.3 christos "call *__tls_get_addr@GOTPCREL(%rip)". */
2125 1.1.1.3 christos if (eh && eh->tls_get_addr)
2126 1.1.1.3 christos {
2127 1.1.1.3 christos nop = 0x67;
2128 1.1.1.3 christos nop_offset = irel->r_offset - 2;
2129 1.1.1.3 christos }
2130 1.1.1.5 christos else
2131 1.1.1.5 christos {
2132 1.1.1.3 christos nop = htab->params->call_nop_byte;
2133 1.1.1.3 christos if (htab->params->call_nop_as_suffix)
2134 1.1.1.3 christos {
2135 1.1.1.3 christos nop_offset = irel->r_offset + 3;
2136 1.1.1.3 christos disp = bfd_get_32 (abfd, contents + irel->r_offset);
2137 1.1.1.3 christos irel->r_offset -= 1;
2138 1.1.1.3 christos bfd_put_32 (abfd, disp, contents + irel->r_offset);
2139 1.1.1.3 christos }
2140 1.1.1.3 christos else
2141 1.1.1.3 christos nop_offset = irel->r_offset - 2;
2142 1.1.1.3 christos }
2143 1.1.1.3 christos }
2144 1.1.1.8 christos bfd_put_8 (abfd, nop, contents + nop_offset);
2145 1.1.1.8 christos bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
2146 1.1.1.8 christos }
2147 1.1.1.8 christos else if (r_type == R_X86_64_CODE_6_GOTPCRELX && opcode != 0x8b)
2148 1.1.1.8 christos {
2149 1.1.1.8 christos bool move_v_r = false;
2150 1.1.1.8 christos
2151 1.1.1.8 christos /* R_X86_64_PC32 isn't supported. */
2152 1.1.1.8 christos if (to_reloc_pc32)
2153 1.1.1.8 christos return true;
2154 1.1.1.8 christos
2155 1.1.1.8 christos if (opcode == 0x85)
2156 1.1.1.8 christos {
2157 1.1.1.8 christos /* Convert "ctest<cc> %reg, foo@GOTPCREL(%rip)" to
2158 1.1.1.8 christos "ctest<cc> $foo, %reg". */
2159 1.1.1.8 christos modrm = 0xc0 | (modrm & 0x38) >> 3;
2160 1.1.1.8 christos opcode = 0xf7;
2161 1.1.1.8 christos }
2162 1.1.1.8 christos else if ((opcode | 0x3a) == 0x3b)
2163 1.1.1.8 christos {
2164 1.1.1.8 christos /* Don't convert (non-NDD) forms with memory destination. */
2165 1.1.1.8 christos if (!(evex[2] & 0x10) && (opcode | 0x38) != 0x3b)
2166 1.1.1.8 christos return true;
2167 1.1.1.8 christos
2168 1.1.1.8 christos /* Don't convert non-commutative insns with the memory operand
2169 1.1.1.8 christos 2nd. */
2170 1.1.1.8 christos if ((evex[2] & 0x10) && (opcode | 0x38) != 0x3b
2171 1.1.1.8 christos && (opcode == 0x19 /* SBB */
2172 1.1.1.8 christos || opcode == 0x29 /* SUB */))
2173 1.1.1.8 christos return true;
2174 1.1.1.8 christos
2175 1.1.1.8 christos /* Convert "binop foo@GOTPCREL(%rip), %reg" to
2176 1.1.1.8 christos "binop $foo, %reg", or alike for 3-operand forms. */
2177 1.1.1.8 christos modrm = 0xc0 | ((modrm & 0x38) >> 3) | (opcode & 0x38);
2178 1.1.1.8 christos opcode = 0x81;
2179 1.1.1.8 christos }
2180 1.1.1.8 christos else if (opcode == 0xaf)
2181 1.1.1.8 christos {
2182 1.1.1.8 christos if (!(evex[2] & 0x10))
2183 1.1.1.8 christos {
2184 1.1.1.8 christos /* Convert "imul foo@GOTPCREL(%rip), %reg" to
2185 1.1.1.8 christos "imul $foo, %reg, %reg". */
2186 1.1.1.8 christos modrm = 0xc0 | ((modrm & 0x38) >> 3) | (modrm & 0x38);
2187 1.1.1.8 christos }
2188 1.1.1.8 christos else
2189 1.1.1.8 christos {
2190 1.1.1.8 christos /* Convert "imul foo@GOTPCREL(%rip), %reg1, %reg2" to
2191 1.1.1.8 christos "imul $foo, %reg1, %reg2". */
2192 1.1.1.8 christos modrm = 0xc0 | ((modrm & 0x38) >> 3) | (~evex[1] & 0x38);
2193 1.1.1.8 christos move_v_r = true;
2194 1.1.1.8 christos }
2195 1.1.1.8 christos opcode = 0x69;
2196 1.1.1.8 christos }
2197 1.1.1.8 christos else
2198 1.1.1.8 christos return true;
2199 1.1.1.8 christos
2200 1.1.1.8 christos /* Use R_X86_64_32 with 32-bit operand to avoid relocation
2201 1.1.1.8 christos overflow when sign-extending imm32 to 64 bits. */
2202 1.1.1.8 christos r_type = evex[1] & 0x80 ? R_X86_64_32S : R_X86_64_32;
2203 1.1.1.8 christos
2204 1.1.1.8 christos /* Skip if the converted relocation will overflow. */
2205 1.1.1.8 christos howto = elf_x86_64_rtype_to_howto (abfd, r_type);
2206 1.1.1.8 christos r = _bfd_final_link_relocate (howto, abfd, input_section,
2207 1.1.1.8 christos contents, irel->r_offset,
2208 1.1.1.8 christos relocation, 0);
2209 1.1.1.8 christos if (r == bfd_reloc_overflow)
2210 1.1.1.8 christos return true;
2211 1.1.1.8 christos
2212 1.1.1.8 christos if (abs_relocation) /* Bogus; should be abs_symbol. */
2213 1.1.1.8 christos {
2214 1.1.1.8 christos /* Check if R_X86_64_32S/R_X86_64_32 fits. */
2215 1.1.1.8 christos if (r_type == R_X86_64_32S)
2216 1.1.1.8 christos {
2217 1.1.1.8 christos if ((abs_relocation + 0x80000000) > 0xffffffff)
2218 1.1.1.8 christos return true;
2219 1.1.1.8 christos }
2220 1.1.1.8 christos else
2221 1.1.1.8 christos {
2222 1.1.1.8 christos if (abs_relocation > 0xffffffff)
2223 1.1.1.8 christos return true;
2224 1.1.1.8 christos }
2225 1.1.1.8 christos }
2226 1.1.1.8 christos
2227 1.1.1.8 christos bfd_put_8 (abfd, opcode, contents + roff - 2);
2228 1.1.1.8 christos bfd_put_8 (abfd, modrm, contents + roff - 1);
2229 1.1.1.8 christos
2230 1.1.1.8 christos evex[0] = evex_move_r_to_b (evex[0], opcode == 0x69 && !move_v_r);
2231 1.1.1.8 christos if (move_v_r)
2232 1.1.1.8 christos {
2233 1.1.1.8 christos /* Move the top two V bits to the R bits in EVEX payload byte 1.
2234 1.1.1.8 christos Note that evex_move_r_to_b() set both R bits. */
2235 1.1.1.8 christos if (!(evex[1] & (1 << 6)))
2236 1.1.1.8 christos evex[0] &= ~(1 << 7); /* V3 -> R3 */
2237 1.1.1.8 christos if (!(evex[2] & (1 << 3)))
2238 1.1.1.8 christos evex[0] &= ~(1 << 4); /* V4 -> R4 */
2239 1.1.1.8 christos /* Set all V bits, as they're inverted. */
2240 1.1.1.8 christos evex[1] |= 0xf << 3;
2241 1.1.1.8 christos evex[2] |= 1 << 3;
2242 1.1.1.8 christos /* Clear the ND (ZU) bit (it ought to be ignored anyway). */
2243 1.1.1.8 christos evex[2] &= ~(1 << 4);
2244 1.1.1.8 christos bfd_put_8 (abfd, evex[2], contents + roff - 3);
2245 1.1.1.8 christos bfd_put_8 (abfd, evex[1], contents + roff - 4);
2246 1.1.1.8 christos }
2247 1.1.1.8 christos bfd_put_8 (abfd, evex[0], contents + roff - 5);
2248 1.1.1.8 christos
2249 1.1.1.3 christos /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
2250 1.1.1.3 christos irel->r_addend = 0;
2251 1.1.1.3 christos }
2252 1.1.1.7 christos else
2253 1.1.1.3 christos {
2254 1.1.1.7 christos unsigned int rex = 0;
2255 1.1.1.7 christos unsigned int rex_mask = REX_R;
2256 1.1.1.8 christos unsigned int rex2 = 0;
2257 1.1.1.7 christos unsigned int rex2_mask = REX_R | REX_R << 4;
2258 1.1.1.3 christos unsigned int movrs = 0;
2259 1.1.1.8 christos bool rex_w = false;
2260 1.1.1.8 christos
2261 1.1.1.8 christos if (r_type == R_X86_64_CODE_6_GOTPCRELX)
2262 1.1.1.8 christos {
2263 1.1.1.8 christos /* Synthesize a REX2 prefix from EVEX, just enough for the LEA
2264 1.1.1.8 christos and MOV case below. */
2265 1.1.1.8 christos unsigned int p;
2266 1.1.1.8 christos
2267 1.1.1.8 christos p = bfd_get_8 (abfd, contents + roff - 5);
2268 1.1.1.8 christos if (!(p & 0x80))
2269 1.1.1.8 christos rex2 |= REX_R;
2270 1.1.1.8 christos if (!(p & 0x10))
2271 1.1.1.8 christos rex2 |= REX_R << 4;
2272 1.1.1.8 christos if (bfd_get_8 (abfd, contents + roff - 4) & 0x80)
2273 1.1.1.8 christos {
2274 1.1.1.8 christos rex2 |= REX_W;
2275 1.1.1.8 christos rex_w = true;
2276 1.1.1.8 christos }
2277 1.1.1.8 christos movrs = 6;
2278 1.1.1.7 christos }
2279 1.1.1.8 christos else if (r_type == R_X86_64_CODE_5_GOTPCRELX)
2280 1.1.1.8 christos {
2281 1.1.1.8 christos rex = bfd_get_8 (abfd, contents + roff - 5);
2282 1.1.1.8 christos rex_w = (rex & REX_W) != 0;
2283 1.1.1.8 christos movrs = 5;
2284 1.1.1.8 christos }
2285 1.1.1.8 christos else if (r_type == R_X86_64_CODE_4_GOTPCRELX)
2286 1.1.1.8 christos {
2287 1.1.1.8 christos if (bfd_get_8 (abfd, contents + roff - 4) == 0xd5)
2288 1.1.1.8 christos {
2289 1.1.1.8 christos /* Make sure even an all-zero payload leaves a non-zero value
2290 1.1.1.8 christos in the variable. */
2291 1.1.1.8 christos rex2 = bfd_get_8 (abfd, contents + roff - 3) | 0x100;
2292 1.1.1.8 christos rex2_mask |= 0x100;
2293 1.1.1.8 christos rex_w = (rex2 & REX_W) != 0;
2294 1.1.1.8 christos }
2295 1.1.1.7 christos else if (bfd_get_8 (abfd, contents + roff - 4) == 0x0f)
2296 1.1.1.7 christos movrs = 4;
2297 1.1.1.7 christos }
2298 1.1.1.7 christos else if (r_type == R_X86_64_REX_GOTPCRELX)
2299 1.1.1.7 christos {
2300 1.1.1.7 christos rex = bfd_get_8 (abfd, contents + roff - 3);
2301 1.1.1.3 christos rex_w = (rex & REX_W) != 0;
2302 1.1.1.3 christos }
2303 1.1.1.3 christos
2304 1.1.1.6 christos if (opcode == 0x8b)
2305 1.1.1.6 christos {
2306 1.1.1.6 christos if (abs_symbol && local_ref && relocx)
2307 1.1.1.3 christos to_reloc_pc32 = false;
2308 1.1.1.3 christos
2309 1.1.1.3 christos if (to_reloc_pc32)
2310 1.1.1.3 christos {
2311 1.1.1.3 christos /* Convert "mov foo@GOTPCREL(%rip), %reg" to
2312 1.1.1.3 christos "lea foo(%rip), %reg". */
2313 1.1.1.8 christos opcode = 0x8d;
2314 1.1.1.8 christos r_type = R_X86_64_PC32;
2315 1.1.1.8 christos
2316 1.1.1.8 christos /* Skip if the converted relocation will overflow. */
2317 1.1.1.8 christos howto = &x86_64_elf_howto_table[r_type];
2318 1.1.1.8 christos r = _bfd_final_link_relocate (howto, abfd, input_section,
2319 1.1.1.8 christos contents, irel->r_offset,
2320 1.1.1.8 christos relocation,
2321 1.1.1.8 christos raddend);
2322 1.1.1.8 christos if (r == bfd_reloc_overflow)
2323 1.1.1.8 christos return true;
2324 1.1.1.8 christos
2325 1.1.1.8 christos /* For MOVRS move a possible REX prefix as necessary. */
2326 1.1.1.3 christos if (movrs == 5)
2327 1.1.1.3 christos bfd_put_8 (abfd, rex, contents + roff - 3);
2328 1.1.1.3 christos }
2329 1.1.1.3 christos else
2330 1.1.1.3 christos {
2331 1.1.1.3 christos /* Convert "mov foo@GOTPCREL(%rip), %reg" to
2332 1.1.1.3 christos "mov $foo, %reg". */
2333 1.1.1.7 christos opcode = 0xc7;
2334 1.1.1.3 christos modrm = 0xc0 | (modrm & 0x38) >> 3;
2335 1.1.1.3 christos if (rex_w && ABI_64_P (link_info->output_bfd))
2336 1.1.1.3 christos {
2337 1.1.1.3 christos /* Keep the REX_W bit in REX byte for LP64. */
2338 1.1.1.3 christos r_type = R_X86_64_32S;
2339 1.1.1.3 christos goto rewrite_modrm_rex;
2340 1.1.1.3 christos }
2341 1.1.1.3 christos else
2342 1.1.1.3 christos {
2343 1.1.1.3 christos /* If the REX_W bit in REX byte isn't needed,
2344 1.1.1.3 christos use R_X86_64_32 and clear the W bit to avoid
2345 1.1.1.7 christos sign-extend imm32 to imm64. */
2346 1.1.1.3 christos r_type = R_X86_64_32;
2347 1.1.1.7 christos /* Clear the W bit in REX byte and REX2 payload. */
2348 1.1.1.3 christos rex_mask |= REX_W;
2349 1.1.1.3 christos rex2_mask |= REX_W;
2350 1.1.1.3 christos goto rewrite_modrm_rex;
2351 1.1.1.3 christos }
2352 1.1.1.3 christos }
2353 1.1.1.3 christos }
2354 1.1.1.3 christos else
2355 1.1.1.3 christos {
2356 1.1.1.6 christos /* R_X86_64_PC32 isn't supported. */
2357 1.1.1.3 christos if (to_reloc_pc32)
2358 1.1.1.8 christos return true;
2359 1.1.1.3 christos
2360 1.1.1.3 christos if (opcode == 0x85 && !(rex2 & (REX2_M << 4)))
2361 1.1.1.3 christos {
2362 1.1.1.3 christos /* Convert "test %reg, foo@GOTPCREL(%rip)" to
2363 1.1.1.3 christos "test $foo, %reg". */
2364 1.1.1.3 christos modrm = 0xc0 | (modrm & 0x38) >> 3;
2365 1.1.1.8 christos opcode = 0xf7;
2366 1.1.1.3 christos }
2367 1.1.1.3 christos else if ((opcode | 0x38) == 0x3b && !(rex2 & (REX2_M << 4)))
2368 1.1.1.3 christos {
2369 1.1.1.8 christos /* Convert "binop foo@GOTPCREL(%rip), %reg" to
2370 1.1.1.3 christos "binop $foo, %reg". */
2371 1.1.1.3 christos modrm = 0xc0 | ((modrm & 0x38) >> 3) | (opcode & 0x38);
2372 1.1.1.8 christos opcode = 0x81;
2373 1.1.1.8 christos }
2374 1.1.1.8 christos else if (opcode == 0xaf && (rex2 & (REX2_M << 4)))
2375 1.1.1.8 christos {
2376 1.1.1.8 christos /* Convert "imul foo@GOTPCREL(%rip), %reg" to
2377 1.1.1.8 christos "imul $foo, %reg, %reg". */
2378 1.1.1.8 christos modrm = 0xc0 | ((modrm & 0x38) >> 3) | (modrm & 0x38);
2379 1.1.1.8 christos rex_mask = 0;
2380 1.1.1.8 christos rex2_mask = REX2_M << 4;
2381 1.1.1.8 christos opcode = 0x69;
2382 1.1.1.8 christos }
2383 1.1.1.8 christos else if (opcode == 0xff && !(rex2 & (REX2_M << 4)))
2384 1.1.1.8 christos {
2385 1.1.1.8 christos /* Convert "push foo@GOTPCREL(%rip)" to
2386 1.1.1.8 christos "push $foo". */
2387 1.1.1.8 christos bfd_put_8 (abfd, 0x68, contents + roff - 1);
2388 1.1.1.8 christos if (rex)
2389 1.1.1.8 christos {
2390 1.1.1.8 christos bfd_put_8 (abfd, 0x2e, contents + roff - 3);
2391 1.1.1.8 christos bfd_put_8 (abfd, rex, contents + roff - 2);
2392 1.1.1.8 christos }
2393 1.1.1.8 christos else if (rex2)
2394 1.1.1.8 christos {
2395 1.1.1.8 christos bfd_put_8 (abfd, 0x2e, contents + roff - 4);
2396 1.1.1.8 christos bfd_put_8 (abfd, 0xd5, contents + roff - 3);
2397 1.1.1.8 christos bfd_put_8 (abfd, rex2, contents + roff - 2);
2398 1.1.1.8 christos }
2399 1.1.1.8 christos else
2400 1.1.1.8 christos bfd_put_8 (abfd, 0x2e, contents + roff - 2);
2401 1.1.1.8 christos
2402 1.1.1.8 christos r_type = R_X86_64_32S;
2403 1.1.1.8 christos /* No addend for R_X86_64_32S relocations. */
2404 1.1.1.8 christos irel->r_addend = 0;
2405 1.1.1.8 christos goto finish;
2406 1.1.1.8 christos }
2407 1.1.1.3 christos else
2408 1.1.1.3 christos return true;
2409 1.1.1.3 christos
2410 1.1.1.7 christos /* Use R_X86_64_32 with 32-bit operand to avoid relocation
2411 1.1.1.3 christos overflow when sign-extending imm32 to imm64. */
2412 1.1.1.6 christos r_type = rex_w ? R_X86_64_32S : R_X86_64_32;
2413 1.1.1.8 christos
2414 1.1.1.8 christos rewrite_modrm_rex:
2415 1.1.1.8 christos /* Skip if the converted relocation will overflow. */
2416 1.1.1.8 christos howto = elf_x86_64_rtype_to_howto (abfd, r_type);
2417 1.1.1.8 christos r = _bfd_final_link_relocate (howto, abfd, input_section,
2418 1.1.1.8 christos contents, irel->r_offset,
2419 1.1.1.8 christos relocation, 0);
2420 1.1.1.8 christos if (r == bfd_reloc_overflow)
2421 1.1.1.6 christos return true;
2422 1.1.1.6 christos
2423 1.1.1.6 christos if (abs_relocation)
2424 1.1.1.6 christos {
2425 1.1.1.6 christos /* Check if R_X86_64_32S/R_X86_64_32 fits. */
2426 1.1.1.6 christos if (r_type == R_X86_64_32S)
2427 1.1.1.6 christos {
2428 1.1.1.6 christos if ((abs_relocation + 0x80000000) > 0xffffffff)
2429 1.1.1.6 christos return true;
2430 1.1.1.6 christos }
2431 1.1.1.6 christos else
2432 1.1.1.6 christos {
2433 1.1.1.6 christos if (abs_relocation > 0xffffffff)
2434 1.1.1.6 christos return true;
2435 1.1.1.6 christos }
2436 1.1.1.3 christos }
2437 1.1.1.3 christos
2438 1.1.1.3 christos bfd_put_8 (abfd, modrm, contents + roff - 1);
2439 1.1.1.3 christos
2440 1.1.1.3 christos if (rex)
2441 1.1.1.3 christos {
2442 1.1.1.3 christos /* Move the R bit to the B bit in REX byte. */
2443 1.1.1.3 christos rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
2444 1.1.1.7 christos bfd_put_8 (abfd, rex, contents + roff - 3);
2445 1.1.1.7 christos }
2446 1.1.1.7 christos else if (rex2)
2447 1.1.1.7 christos {
2448 1.1.1.7 christos /* Move the R bits to the B bits in REX2 payload byte. */
2449 1.1.1.7 christos rex2 = ((rex2 & ~rex2_mask)
2450 1.1.1.7 christos | (rex2 & (REX_R | REX_R << 4)) >> 2);
2451 1.1.1.3 christos bfd_put_8 (abfd, rex2, contents + roff - 3);
2452 1.1.1.3 christos }
2453 1.1.1.3 christos
2454 1.1.1.3 christos /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
2455 1.1.1.3 christos irel->r_addend = 0;
2456 1.1.1.3 christos }
2457 1.1.1.8 christos
2458 1.1.1.8 christos bfd_put_8 (abfd, opcode, contents + roff - 2);
2459 1.1.1.8 christos
2460 1.1.1.8 christos /* For MOVRS zap the 0f38 or EVEX prefix, applying meaningless CS
2461 1.1.1.8 christos segment overrides instead. When necessary also install the REX2
2462 1.1.1.8 christos prefix and payload (which may not have been written yet). */
2463 1.1.1.8 christos if (movrs)
2464 1.1.1.8 christos {
2465 1.1.1.8 christos bfd_put_8 (abfd, 0x2e, contents + roff - movrs);
2466 1.1.1.8 christos bfd_put_8 (abfd, 0x2e, contents + roff - movrs + 1);
2467 1.1.1.8 christos if (movrs == 6)
2468 1.1.1.8 christos {
2469 1.1.1.8 christos bfd_put_8 (abfd, 0xd5, contents + roff - 4);
2470 1.1.1.8 christos bfd_put_8 (abfd, rex2, contents + roff - 3);
2471 1.1.1.3 christos }
2472 1.1.1.3 christos }
2473 1.1.1.8 christos }
2474 1.1.1.4 christos
2475 1.1.1.4 christos finish:
2476 1.1.1.4 christos *r_type_p = r_type;
2477 1.1.1.3 christos irel->r_info = htab->r_info (r_symndx,
2478 1.1.1.6 christos r_type | R_X86_64_converted_reloc_bit);
2479 1.1.1.3 christos
2480 1.1.1.6 christos *converted = true;
2481 1.1.1.3 christos
2482 1.1.1.2 christos return true;
2483 1.1 christos }
2484 1.1.1.6 christos
2485 1.1.1.6 christos /* Look through the relocs for a section during the first phase, and
2486 1.1 christos calculate needed space in the global offset table, and procedure
2487 1.1.1.6 christos linkage table. */
2488 1.1.1.6 christos
2489 1.1.1.6 christos static bool
2490 1.1.1.6 christos elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
2491 1.1 christos asection *sec,
2492 1.1.1.4 christos const Elf_Internal_Rela *relocs)
2493 1.1 christos {
2494 1.1 christos struct elf_x86_link_hash_table *htab;
2495 1.1 christos Elf_Internal_Shdr *symtab_hdr;
2496 1.1 christos struct elf_link_hash_entry **sym_hashes;
2497 1.1.1.3 christos const Elf_Internal_Rela *rel;
2498 1.1.1.6 christos const Elf_Internal_Rela *rel_end;
2499 1.1 christos bfd_byte *contents;
2500 1.1.1.2 christos bool converted;
2501 1.1.1.6 christos
2502 1.1.1.3 christos if (bfd_link_relocatable (info))
2503 1.1.1.4 christos return true;
2504 1.1 christos
2505 1.1.1.3 christos htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
2506 1.1.1.3 christos if (htab == NULL)
2507 1.1.1.6 christos {
2508 1.1.1.3 christos sec->check_relocs_failed = 1;
2509 1.1.1.3 christos return false;
2510 1.1.1.4 christos }
2511 1.1.1.4 christos
2512 1.1.1.3 christos BFD_ASSERT (is_x86_elf (abfd, htab));
2513 1.1.1.3 christos
2514 1.1.1.3 christos /* Get the section contents. */
2515 1.1.1.8 christos if (elf_section_data (sec)->this_hdr.contents != NULL)
2516 1.1.1.3 christos contents = elf_section_data (sec)->this_hdr.contents;
2517 1.1.1.3 christos else if (!_bfd_elf_mmap_section_contents (abfd, sec, &contents))
2518 1.1.1.6 christos {
2519 1.1.1.3 christos sec->check_relocs_failed = 1;
2520 1.1 christos return false;
2521 1.1 christos }
2522 1.1 christos
2523 1.1 christos symtab_hdr = &elf_symtab_hdr (abfd);
2524 1.1.1.6 christos sym_hashes = elf_sym_hashes (abfd);
2525 1.1 christos
2526 1.1 christos converted = false;
2527 1.1 christos
2528 1.1 christos rel_end = relocs + sec->reloc_count;
2529 1.1 christos for (rel = relocs; rel < rel_end; rel++)
2530 1.1.1.4 christos {
2531 1.1 christos unsigned int r_type;
2532 1.1.1.4 christos unsigned int r_symndx;
2533 1.1 christos struct elf_link_hash_entry *h;
2534 1.1 christos struct elf_x86_link_hash_entry *eh;
2535 1.1.1.6 christos Elf_Internal_Sym *isym;
2536 1.1.1.6 christos const char *name;
2537 1.1.1.6 christos bool size_reloc;
2538 1.1.1.8 christos bool converted_reloc;
2539 1.1 christos bool no_dynreloc;
2540 1.1 christos reloc_howto_type *howto;
2541 1.1 christos
2542 1.1 christos r_symndx = htab->r_sym (rel->r_info);
2543 1.1.1.7 christos r_type = ELF32_R_TYPE (rel->r_info);
2544 1.1.1.7 christos
2545 1.1.1.7 christos /* Don't check R_X86_64_NONE. */
2546 1.1.1.7 christos if (r_type == R_X86_64_NONE)
2547 1.1 christos continue;
2548 1.1 christos
2549 1.1.1.4 christos if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
2550 1.1.1.4 christos {
2551 1.1.1.4 christos /* xgettext:c-format */
2552 1.1.1.3 christos _bfd_error_handler (_("%pB: bad symbol index: %d"),
2553 1.1 christos abfd, r_symndx);
2554 1.1 christos goto error_return;
2555 1.1.1.8 christos }
2556 1.1.1.8 christos
2557 1.1.1.8 christos howto = elf_x86_64_rtype_to_howto (abfd, r_type);
2558 1.1.1.8 christos if (howto == NULL)
2559 1.1.1.8 christos {
2560 1.1.1.8 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
2561 1.1.1.8 christos abfd, r_type);
2562 1.1.1.8 christos goto error_return;
2563 1.1.1.8 christos }
2564 1.1.1.8 christos if (!bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
2565 1.1.1.8 christos {
2566 1.1.1.8 christos /* xgettext:c-format */
2567 1.1.1.8 christos _bfd_error_handler
2568 1.1.1.8 christos (_("%pB: bad reloc offset (%#" PRIx64 " > %#" PRIx64 ") for"
2569 1.1.1.8 christos " section `%pA'"), abfd, (uint64_t) rel->r_offset,
2570 1.1.1.8 christos (uint64_t) sec->size, sec);
2571 1.1.1.8 christos goto error_return;
2572 1.1 christos }
2573 1.1 christos
2574 1.1 christos if (r_symndx < symtab_hdr->sh_info)
2575 1.1.1.6 christos {
2576 1.1 christos /* A local symbol. */
2577 1.1 christos isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
2578 1.1.1.3 christos abfd, r_symndx);
2579 1.1 christos if (isym == NULL)
2580 1.1 christos goto error_return;
2581 1.1 christos
2582 1.1 christos /* Check relocation against local STT_GNU_IFUNC symbol. */
2583 1.1.1.4 christos if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2584 1.1.1.6 christos {
2585 1.1 christos h = _bfd_elf_x86_get_local_sym_hash (htab, abfd, rel,
2586 1.1.1.3 christos true);
2587 1.1 christos if (h == NULL)
2588 1.1 christos goto error_return;
2589 1.1.1.4 christos
2590 1.1.1.4 christos /* Fake a STT_GNU_IFUNC symbol. */
2591 1.1 christos h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
2592 1.1 christos isym, NULL);
2593 1.1 christos h->type = STT_GNU_IFUNC;
2594 1.1 christos h->def_regular = 1;
2595 1.1 christos h->ref_regular = 1;
2596 1.1 christos h->forced_local = 1;
2597 1.1 christos h->root.type = bfd_link_hash_defined;
2598 1.1 christos }
2599 1.1 christos else
2600 1.1 christos h = NULL;
2601 1.1 christos }
2602 1.1 christos else
2603 1.1.1.8 christos {
2604 1.1 christos isym = NULL;
2605 1.1 christos h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
2606 1.1 christos }
2607 1.1 christos
2608 1.1 christos /* Check invalid x32 relocations. */
2609 1.1 christos if (!ABI_64_P (abfd))
2610 1.1 christos switch (r_type)
2611 1.1 christos {
2612 1.1 christos default:
2613 1.1 christos break;
2614 1.1 christos
2615 1.1 christos case R_X86_64_DTPOFF64:
2616 1.1 christos case R_X86_64_TPOFF64:
2617 1.1 christos case R_X86_64_PC64:
2618 1.1 christos case R_X86_64_GOTOFF64:
2619 1.1 christos case R_X86_64_GOT64:
2620 1.1 christos case R_X86_64_GOTPCREL64:
2621 1.1 christos case R_X86_64_GOTPC64:
2622 1.1 christos case R_X86_64_GOTPLT64:
2623 1.1 christos case R_X86_64_PLTOFF64:
2624 1.1 christos {
2625 1.1 christos if (h)
2626 1.1 christos name = h->root.root.string;
2627 1.1 christos else
2628 1.1.1.4 christos name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
2629 1.1.1.4 christos NULL);
2630 1.1.1.4 christos _bfd_error_handler
2631 1.1 christos /* xgettext:c-format */
2632 1.1 christos (_("%pB: relocation %s against symbol `%s' isn't "
2633 1.1 christos "supported in x32 mode"), abfd,
2634 1.1.1.3 christos x86_64_elf_howto_table[r_type].name, name);
2635 1.1 christos bfd_set_error (bfd_error_bad_value);
2636 1.1 christos goto error_return;
2637 1.1 christos }
2638 1.1 christos break;
2639 1.1.1.6 christos }
2640 1.1.1.6 christos
2641 1.1 christos eh = (struct elf_x86_link_hash_entry *) h;
2642 1.1 christos
2643 1.1.1.2 christos if (h != NULL)
2644 1.1.1.2 christos {
2645 1.1 christos /* It is referenced by a non-shared object. */
2646 1.1 christos h->ref_regular = 1;
2647 1.1.1.6 christos }
2648 1.1.1.4 christos
2649 1.1.1.4 christos converted_reloc = false;
2650 1.1.1.7 christos if ((r_type == R_X86_64_GOTPCREL
2651 1.1.1.8 christos || r_type == R_X86_64_GOTPCRELX
2652 1.1.1.8 christos || r_type == R_X86_64_REX_GOTPCRELX
2653 1.1.1.8 christos || r_type == R_X86_64_CODE_4_GOTPCRELX
2654 1.1.1.4 christos || r_type == R_X86_64_CODE_5_GOTPCRELX
2655 1.1.1.4 christos || r_type == R_X86_64_CODE_6_GOTPCRELX)
2656 1.1.1.4 christos && (h == NULL || h->type != STT_GNU_IFUNC))
2657 1.1.1.8 christos {
2658 1.1.1.8 christos Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
2659 1.1.1.8 christos if (!elf_x86_64_convert_load_reloc (abfd, sec, contents,
2660 1.1.1.4 christos &r_type, irel, h,
2661 1.1.1.4 christos &converted_reloc, info))
2662 1.1.1.4 christos goto error_return;
2663 1.1.1.6 christos
2664 1.1.1.4 christos if (converted_reloc)
2665 1.1.1.4 christos converted = true;
2666 1.1.1.6 christos }
2667 1.1.1.6 christos
2668 1.1.1.8 christos if (!_bfd_elf_x86_valid_reloc_p (sec, info, htab, rel, h, isym,
2669 1.1.1.6 christos symtab_hdr, &no_dynreloc))
2670 1.1.1.3 christos goto error_return;
2671 1.1 christos
2672 1.1 christos if (! elf_x86_64_tls_transition (info, abfd, sec, contents,
2673 1.1.1.8 christos symtab_hdr, sym_hashes,
2674 1.1.1.3 christos &r_type, GOT_UNKNOWN,
2675 1.1 christos rel, rel_end, h, isym, false))
2676 1.1.1.4 christos goto error_return;
2677 1.1.1.4 christos
2678 1.1.1.6 christos /* Check if _GLOBAL_OFFSET_TABLE_ is referenced. */
2679 1.1.1.4 christos if (h == htab->elf.hgot)
2680 1.1 christos htab->got_referenced = true;
2681 1.1 christos
2682 1.1 christos switch (r_type)
2683 1.1.1.4 christos {
2684 1.1 christos case R_X86_64_TLSLD:
2685 1.1 christos htab->tls_ld_or_ldm_got.refcount = 1;
2686 1.1 christos goto create_got;
2687 1.1.1.2 christos
2688 1.1.1.8 christos case R_X86_64_TPOFF32:
2689 1.1.1.8 christos if (!bfd_link_executable (info) && ABI_64_P (abfd))
2690 1.1.1.8 christos {
2691 1.1.1.8 christos elf_x86_64_need_pic (info, abfd, sec, h, symtab_hdr, isym,
2692 1.1.1.8 christos &x86_64_elf_howto_table[r_type]);
2693 1.1.1.3 christos goto error_return;
2694 1.1.1.4 christos }
2695 1.1 christos if (eh != NULL)
2696 1.1 christos eh->zero_undefweak &= 0x2;
2697 1.1 christos break;
2698 1.1.1.7 christos
2699 1.1.1.8 christos case R_X86_64_GOTTPOFF:
2700 1.1.1.8 christos case R_X86_64_CODE_4_GOTTPOFF:
2701 1.1.1.2 christos case R_X86_64_CODE_5_GOTTPOFF:
2702 1.1 christos case R_X86_64_CODE_6_GOTTPOFF:
2703 1.1 christos if (!bfd_link_executable (info))
2704 1.1 christos info->flags |= DF_STATIC_TLS;
2705 1.1 christos /* Fall through */
2706 1.1 christos
2707 1.1.1.2 christos case R_X86_64_GOT32:
2708 1.1.1.2 christos case R_X86_64_GOTPCREL:
2709 1.1.1.7 christos case R_X86_64_GOTPCRELX:
2710 1.1.1.8 christos case R_X86_64_REX_GOTPCRELX:
2711 1.1.1.8 christos case R_X86_64_CODE_4_GOTPCRELX:
2712 1.1 christos case R_X86_64_CODE_5_GOTPCRELX:
2713 1.1 christos case R_X86_64_CODE_6_GOTPCRELX:
2714 1.1 christos case R_X86_64_TLSGD:
2715 1.1 christos case R_X86_64_GOT64:
2716 1.1 christos case R_X86_64_GOTPCREL64:
2717 1.1.1.7 christos case R_X86_64_GOTPLT64:
2718 1.1 christos case R_X86_64_GOTPC32_TLSDESC:
2719 1.1 christos case R_X86_64_CODE_4_GOTPC32_TLSDESC:
2720 1.1 christos case R_X86_64_TLSDESC_CALL:
2721 1.1 christos /* This symbol requires a global offset table entry. */
2722 1.1 christos {
2723 1.1 christos int tls_type, old_tls_type;
2724 1.1 christos
2725 1.1.1.6 christos switch (r_type)
2726 1.1.1.6 christos {
2727 1.1.1.6 christos default:
2728 1.1.1.6 christos tls_type = GOT_NORMAL;
2729 1.1.1.6 christos if (h)
2730 1.1.1.6 christos {
2731 1.1.1.6 christos if (ABS_SYMBOL_P (h))
2732 1.1.1.6 christos tls_type = GOT_ABS;
2733 1.1.1.6 christos }
2734 1.1.1.6 christos else if (isym->st_shndx == SHN_ABS)
2735 1.1.1.6 christos tls_type = GOT_ABS;
2736 1.1.1.6 christos break;
2737 1.1.1.6 christos case R_X86_64_TLSGD:
2738 1.1.1.6 christos tls_type = GOT_TLS_GD;
2739 1.1.1.7 christos break;
2740 1.1.1.8 christos case R_X86_64_GOTTPOFF:
2741 1.1.1.8 christos case R_X86_64_CODE_4_GOTTPOFF:
2742 1.1.1.6 christos case R_X86_64_CODE_5_GOTTPOFF:
2743 1.1.1.6 christos case R_X86_64_CODE_6_GOTTPOFF:
2744 1.1 christos tls_type = GOT_TLS_IE;
2745 1.1.1.7 christos break;
2746 1.1 christos case R_X86_64_GOTPC32_TLSDESC:
2747 1.1.1.6 christos case R_X86_64_CODE_4_GOTPC32_TLSDESC:
2748 1.1.1.6 christos case R_X86_64_TLSDESC_CALL:
2749 1.1 christos tls_type = GOT_TLS_GDESC;
2750 1.1 christos break;
2751 1.1 christos }
2752 1.1 christos
2753 1.1.1.4 christos if (h != NULL)
2754 1.1.1.3 christos {
2755 1.1 christos h->got.refcount = 1;
2756 1.1 christos old_tls_type = eh->tls_type;
2757 1.1 christos }
2758 1.1 christos else
2759 1.1 christos {
2760 1.1.1.6 christos bfd_signed_vma *local_got_refcounts;
2761 1.1.1.6 christos
2762 1.1.1.8 christos if (!elf_x86_allocate_local_got_info (abfd,
2763 1.1.1.6 christos symtab_hdr->sh_info))
2764 1.1 christos goto error_return;
2765 1.1 christos
2766 1.1.1.4 christos /* This is a global offset table entry for a local symbol. */
2767 1.1 christos local_got_refcounts = elf_local_got_refcounts (abfd);
2768 1.1.1.4 christos local_got_refcounts[r_symndx] = 1;
2769 1.1 christos old_tls_type
2770 1.1 christos = elf_x86_local_got_tls_type (abfd) [r_symndx];
2771 1.1 christos }
2772 1.1 christos
2773 1.1 christos /* If a TLS symbol is accessed using IE at least once,
2774 1.1 christos there is no point to use dynamic model for it. */
2775 1.1 christos if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
2776 1.1 christos && (! GOT_TLS_GD_ANY_P (old_tls_type)
2777 1.1 christos || tls_type != GOT_TLS_IE))
2778 1.1 christos {
2779 1.1 christos if (old_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (tls_type))
2780 1.1 christos tls_type = old_tls_type;
2781 1.1 christos else if (GOT_TLS_GD_ANY_P (old_tls_type)
2782 1.1 christos && GOT_TLS_GD_ANY_P (tls_type))
2783 1.1 christos tls_type |= old_tls_type;
2784 1.1 christos else
2785 1.1 christos {
2786 1.1 christos if (h)
2787 1.1 christos name = h->root.root.string;
2788 1.1 christos else
2789 1.1.1.4 christos name = bfd_elf_sym_name (abfd, symtab_hdr,
2790 1.1.1.4 christos isym, NULL);
2791 1.1.1.4 christos _bfd_error_handler
2792 1.1.1.4 christos /* xgettext:c-format */
2793 1.1 christos (_("%pB: '%s' accessed both as normal and"
2794 1.1.1.2 christos " thread local symbol"),
2795 1.1.1.3 christos abfd, name);
2796 1.1 christos bfd_set_error (bfd_error_bad_value);
2797 1.1 christos goto error_return;
2798 1.1 christos }
2799 1.1 christos }
2800 1.1 christos
2801 1.1.1.3 christos if (old_tls_type != tls_type)
2802 1.1.1.3 christos {
2803 1.1 christos if (eh != NULL)
2804 1.1.1.4 christos eh->tls_type = tls_type;
2805 1.1 christos else
2806 1.1 christos elf_x86_local_got_tls_type (abfd) [r_symndx] = tls_type;
2807 1.1 christos }
2808 1.1 christos }
2809 1.1 christos /* Fall through */
2810 1.1 christos
2811 1.1 christos case R_X86_64_GOTOFF64:
2812 1.1 christos case R_X86_64_GOTPC32:
2813 1.1.1.3 christos case R_X86_64_GOTPC64:
2814 1.1.1.4 christos create_got:
2815 1.1 christos if (eh != NULL)
2816 1.1 christos eh->zero_undefweak &= 0x2;
2817 1.1 christos break;
2818 1.1 christos
2819 1.1 christos case R_X86_64_PLT32:
2820 1.1 christos /* This symbol requires a procedure linkage table entry. We
2821 1.1 christos actually build the entry in adjust_dynamic_symbol,
2822 1.1 christos because this might be a case of linking PIC code which is
2823 1.1 christos never referenced by a dynamic object, in which case we
2824 1.1 christos don't need to generate a procedure linkage table entry
2825 1.1 christos after all. */
2826 1.1 christos
2827 1.1 christos /* If this is a local symbol, we resolve it directly without
2828 1.1 christos creating a procedure linkage table entry. */
2829 1.1 christos if (h == NULL)
2830 1.1.1.4 christos continue;
2831 1.1 christos
2832 1.1.1.4 christos eh->zero_undefweak &= 0x2;
2833 1.1 christos h->needs_plt = 1;
2834 1.1 christos h->plt.refcount = 1;
2835 1.1 christos break;
2836 1.1 christos
2837 1.1 christos case R_X86_64_PLTOFF64:
2838 1.1 christos /* This tries to form the 'address' of a function relative
2839 1.1 christos to GOT. For global symbols we need a PLT entry. */
2840 1.1 christos if (h != NULL)
2841 1.1.1.4 christos {
2842 1.1 christos h->needs_plt = 1;
2843 1.1 christos h->plt.refcount = 1;
2844 1.1 christos }
2845 1.1.1.2 christos goto create_got;
2846 1.1.1.2 christos
2847 1.1.1.6 christos case R_X86_64_SIZE32:
2848 1.1.1.2 christos case R_X86_64_SIZE64:
2849 1.1.1.2 christos size_reloc = true;
2850 1.1 christos goto do_size;
2851 1.1 christos
2852 1.1 christos case R_X86_64_32:
2853 1.1.1.4 christos if (!ABI_64_P (abfd))
2854 1.1 christos goto pointer;
2855 1.1 christos /* Fall through. */
2856 1.1 christos case R_X86_64_8:
2857 1.1.1.3 christos case R_X86_64_16:
2858 1.1.1.3 christos case R_X86_64_32S:
2859 1.1 christos /* Check relocation overflow as these relocs may lead to
2860 1.1.1.3 christos run-time relocation overflow. Don't error out for
2861 1.1.1.5 christos sections we don't care about, such as debug sections or
2862 1.1.1.4 christos when relocation overflow check is disabled. */
2863 1.1.1.3 christos if (!htab->params->no_reloc_overflow_check
2864 1.1.1.3 christos && !converted_reloc
2865 1.1.1.3 christos && (bfd_link_pic (info)
2866 1.1.1.3 christos || (bfd_link_executable (info)
2867 1.1.1.3 christos && h != NULL
2868 1.1.1.3 christos && !h->def_regular
2869 1.1.1.8 christos && h->def_dynamic
2870 1.1.1.8 christos && (sec->flags & SEC_READONLY) == 0)))
2871 1.1.1.8 christos {
2872 1.1.1.8 christos elf_x86_64_need_pic (info, abfd, sec, h, symtab_hdr, isym,
2873 1.1.1.8 christos &x86_64_elf_howto_table[r_type]);
2874 1.1 christos goto error_return;
2875 1.1 christos }
2876 1.1 christos /* Fall through. */
2877 1.1 christos
2878 1.1 christos case R_X86_64_PC8:
2879 1.1 christos case R_X86_64_PC16:
2880 1.1 christos case R_X86_64_PC32:
2881 1.1.1.6 christos case R_X86_64_PC64:
2882 1.1.1.3 christos case R_X86_64_64:
2883 1.1.1.4 christos pointer:
2884 1.1.1.3 christos if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2885 1.1.1.3 christos eh->zero_undefweak |= 0x2;
2886 1.1.1.3 christos /* We are called after all symbols have been resolved. Only
2887 1.1.1.3 christos relocation against STT_GNU_IFUNC symbol must go through
2888 1.1.1.3 christos PLT. */
2889 1.1.1.3 christos if (h != NULL
2890 1.1 christos && (bfd_link_executable (info)
2891 1.1.1.6 christos || h->type == STT_GNU_IFUNC))
2892 1.1.1.3 christos {
2893 1.1.1.2 christos bool func_pointer_ref = false;
2894 1.1.1.2 christos
2895 1.1.1.2 christos if (r_type == R_X86_64_PC32)
2896 1.1.1.2 christos {
2897 1.1.1.2 christos /* Since something like ".long foo - ." may be used
2898 1.1.1.2 christos as pointer, make sure that PLT is used if foo is
2899 1.1.1.4 christos a function defined in a shared library. */
2900 1.1.1.4 christos if ((sec->flags & SEC_CODE) == 0)
2901 1.1.1.4 christos {
2902 1.1.1.4 christos h->pointer_equality_needed = 1;
2903 1.1.1.4 christos if (bfd_link_pie (info)
2904 1.1.1.4 christos && h->type == STT_FUNC
2905 1.1.1.4 christos && !h->def_regular
2906 1.1.1.4 christos && h->def_dynamic)
2907 1.1.1.4 christos {
2908 1.1.1.4 christos h->needs_plt = 1;
2909 1.1.1.4 christos h->plt.refcount = 1;
2910 1.1.1.2 christos }
2911 1.1.1.7 christos }
2912 1.1.1.2 christos }
2913 1.1.1.2 christos else if (r_type != R_X86_64_PC64)
2914 1.1.1.2 christos {
2915 1.1.1.6 christos /* At run-time, R_X86_64_64 can be resolved for both
2916 1.1.1.6 christos x86-64 and x32. But R_X86_64_32 and R_X86_64_32S
2917 1.1.1.2 christos can only be resolved for x32. Function pointer
2918 1.1.1.2 christos reference doesn't need PLT for pointer equality. */
2919 1.1.1.2 christos if ((sec->flags & SEC_READONLY) == 0
2920 1.1.1.2 christos && (r_type == R_X86_64_64
2921 1.1.1.2 christos || (!ABI_64_P (abfd)
2922 1.1.1.6 christos && (r_type == R_X86_64_32
2923 1.1.1.6 christos || r_type == R_X86_64_32S))))
2924 1.1.1.6 christos func_pointer_ref = true;
2925 1.1.1.6 christos
2926 1.1.1.6 christos /* IFUNC symbol needs pointer equality in PDE so that
2927 1.1.1.6 christos function pointer reference will be resolved to its
2928 1.1.1.6 christos PLT entry directly. */
2929 1.1.1.6 christos if (!func_pointer_ref
2930 1.1.1.6 christos || (bfd_link_pde (info)
2931 1.1.1.4 christos && h->type == STT_GNU_IFUNC))
2932 1.1.1.4 christos h->pointer_equality_needed = 1;
2933 1.1.1.4 christos }
2934 1.1.1.4 christos
2935 1.1.1.4 christos if (!func_pointer_ref)
2936 1.1.1.4 christos {
2937 1.1.1.4 christos /* If this reloc is in a read-only section, we might
2938 1.1.1.4 christos need a copy reloc. We can't check reliably at this
2939 1.1.1.4 christos stage whether the section is read-only, as input
2940 1.1.1.4 christos sections have not yet been mapped to output sections.
2941 1.1.1.4 christos Tentatively set the flag for now, and correct in
2942 1.1.1.4 christos adjust_dynamic_symbol. */
2943 1.1.1.6 christos h->non_got_ref = 1;
2944 1.1.1.6 christos
2945 1.1.1.6 christos if (!elf_has_indirect_extern_access (sec->owner))
2946 1.1.1.4 christos eh->non_got_ref_without_indirect_extern_access = 1;
2947 1.1.1.4 christos
2948 1.1.1.4 christos /* We may need a .plt entry if the symbol is a function
2949 1.1.1.4 christos defined in a shared lib or is a function referenced
2950 1.1.1.4 christos from the code or read-only section. */
2951 1.1.1.4 christos if (!h->def_regular
2952 1.1.1.6 christos || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
2953 1.1.1.7 christos h->plt.refcount = 1;
2954 1.1.1.7 christos
2955 1.1.1.6 christos if (htab->elf.target_os != is_solaris
2956 1.1.1.6 christos && h->pointer_equality_needed
2957 1.1.1.6 christos && h->type == STT_FUNC
2958 1.1.1.6 christos && eh->def_protected
2959 1.1.1.6 christos && !SYMBOL_DEFINED_NON_SHARED_P (h)
2960 1.1.1.6 christos && h->def_dynamic)
2961 1.1.1.6 christos {
2962 1.1.1.6 christos /* Disallow non-canonical reference to canonical
2963 1.1.1.6 christos protected function. */
2964 1.1.1.6 christos _bfd_error_handler
2965 1.1.1.6 christos /* xgettext:c-format */
2966 1.1.1.6 christos (_("%pB: non-canonical reference to canonical "
2967 1.1.1.6 christos "protected function `%s' in %pB"),
2968 1.1.1.6 christos abfd, h->root.root.string,
2969 1.1.1.6 christos h->root.u.def.section->owner);
2970 1.1.1.6 christos bfd_set_error (bfd_error_bad_value);
2971 1.1.1.2 christos goto error_return;
2972 1.1 christos }
2973 1.1 christos }
2974 1.1.1.6 christos }
2975 1.1.1.6 christos
2976 1.1.1.6 christos size_reloc = false;
2977 1.1.1.6 christos do_size:
2978 1.1.1.6 christos if (!no_dynreloc
2979 1.1.1.6 christos && NEED_DYNAMIC_RELOCATION_P (true, info, true, h, sec,
2980 1.1 christos r_type,
2981 1.1 christos htab->pointer_r_type))
2982 1.1 christos {
2983 1.1 christos struct elf_dyn_relocs *p;
2984 1.1 christos struct elf_dyn_relocs **head;
2985 1.1 christos
2986 1.1 christos /* If this is a global symbol, we count the number of
2987 1.1.1.6 christos relocations we need for this symbol. */
2988 1.1 christos if (h != NULL)
2989 1.1 christos head = &h->dyn_relocs;
2990 1.1 christos else
2991 1.1 christos {
2992 1.1 christos /* Track dynamic relocs needed for local syms too.
2993 1.1 christos We really need local syms available to do this
2994 1.1 christos easily. Oh well. */
2995 1.1 christos asection *s;
2996 1.1.1.6 christos void **vpp;
2997 1.1 christos
2998 1.1 christos isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
2999 1.1.1.3 christos abfd, r_symndx);
3000 1.1 christos if (isym == NULL)
3001 1.1 christos goto error_return;
3002 1.1 christos
3003 1.1 christos s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3004 1.1 christos if (s == NULL)
3005 1.1 christos s = sec;
3006 1.1 christos
3007 1.1 christos /* Beware of type punned pointers vs strict aliasing
3008 1.1 christos rules. */
3009 1.1 christos vpp = &(elf_section_data (s)->local_dynrel);
3010 1.1 christos head = (struct elf_dyn_relocs **)vpp;
3011 1.1 christos }
3012 1.1 christos
3013 1.1 christos p = *head;
3014 1.1.1.6 christos if (p == NULL || p->sec != sec)
3015 1.1 christos {
3016 1.1 christos size_t amt = sizeof *p;
3017 1.1 christos
3018 1.1 christos p = ((struct elf_dyn_relocs *)
3019 1.1.1.3 christos bfd_alloc (htab->elf.dynobj, amt));
3020 1.1 christos if (p == NULL)
3021 1.1 christos goto error_return;
3022 1.1 christos p->next = *head;
3023 1.1 christos *head = p;
3024 1.1 christos p->sec = sec;
3025 1.1 christos p->count = 0;
3026 1.1 christos p->pc_count = 0;
3027 1.1 christos }
3028 1.1.1.2 christos
3029 1.1.1.6 christos p->count += 1;
3030 1.1 christos /* Count size relocation as PC-relative relocation. */
3031 1.1 christos if (X86_PCREL_TYPE_P (true, r_type) || size_reloc)
3032 1.1 christos p->pc_count += 1;
3033 1.1 christos }
3034 1.1.1.8 christos break;
3035 1.1.1.8 christos
3036 1.1.1.8 christos case R_X86_64_CODE_5_GOTPC32_TLSDESC:
3037 1.1.1.8 christos case R_X86_64_CODE_6_GOTPC32_TLSDESC:
3038 1.1.1.8 christos {
3039 1.1.1.8 christos /* These relocations are added only for completeness and
3040 1.1.1.8 christos aren't be used. */
3041 1.1.1.8 christos if (h)
3042 1.1.1.8 christos name = h->root.root.string;
3043 1.1.1.8 christos else
3044 1.1.1.8 christos name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
3045 1.1.1.8 christos NULL);
3046 1.1.1.8 christos _bfd_error_handler
3047 1.1.1.8 christos /* xgettext:c-format */
3048 1.1.1.8 christos (_("%pB: unsupported relocation %s against symbol `%s'"),
3049 1.1.1.8 christos abfd, x86_64_elf_howto_table[r_type].name, name);
3050 1.1.1.8 christos }
3051 1.1 christos break;
3052 1.1 christos
3053 1.1 christos /* This relocation describes the C++ object vtable hierarchy.
3054 1.1 christos Reconstruct it for later use during GC. */
3055 1.1.1.3 christos case R_X86_64_GNU_VTINHERIT:
3056 1.1 christos if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3057 1.1 christos goto error_return;
3058 1.1 christos break;
3059 1.1 christos
3060 1.1 christos /* This relocation describes which C++ vtable entries are actually
3061 1.1.1.5 christos used. Record for later use during GC. */
3062 1.1.1.3 christos case R_X86_64_GNU_VTENTRY:
3063 1.1 christos if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3064 1.1 christos goto error_return;
3065 1.1 christos break;
3066 1.1 christos
3067 1.1 christos default:
3068 1.1 christos break;
3069 1.1 christos }
3070 1.1.1.3 christos }
3071 1.1.1.3 christos
3072 1.1.1.8 christos if (elf_section_data (sec)->this_hdr.contents != contents)
3073 1.1.1.8 christos {
3074 1.1.1.3 christos if (!converted)
3075 1.1.1.3 christos _bfd_elf_munmap_section_contents (sec, contents);
3076 1.1.1.4 christos else
3077 1.1.1.4 christos {
3078 1.1.1.3 christos /* Cache the section contents for elf_link_input_bfd if any
3079 1.1.1.6 christos load is converted or --no-keep-memory isn't used. */
3080 1.1.1.3 christos elf_section_data (sec)->this_hdr.contents = contents;
3081 1.1.1.3 christos info->cache_size += sec->size;
3082 1.1.1.3 christos }
3083 1.1.1.4 christos }
3084 1.1.1.4 christos
3085 1.1.1.4 christos /* Cache relocations if any load is converted. */
3086 1.1.1.4 christos if (elf_section_data (sec)->relocs != relocs && converted)
3087 1.1.1.6 christos elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
3088 1.1.1.3 christos
3089 1.1.1.6 christos return true;
3090 1.1.1.3 christos
3091 1.1.1.8 christos error_return:
3092 1.1.1.3 christos if (elf_section_data (sec)->this_hdr.contents != contents)
3093 1.1.1.6 christos _bfd_elf_munmap_section_contents (sec, contents);
3094 1.1.1.6 christos sec->check_relocs_failed = 1;
3095 1.1.1.6 christos return false;
3096 1.1.1.6 christos }
3097 1.1.1.8 christos
3098 1.1.1.6 christos static bool
3099 1.1.1.6 christos elf_x86_64_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
3100 1.1.1.6 christos {
3101 1.1.1.6 christos bfd *abfd;
3102 1.1.1.6 christos
3103 1.1.1.6 christos /* Scan relocations after rel_from_abs has been set on __ehdr_start. */
3104 1.1.1.6 christos for (abfd = info->input_bfds;
3105 1.1.1.6 christos abfd != (bfd *) NULL;
3106 1.1.1.6 christos abfd = abfd->link.next)
3107 1.1.1.6 christos if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
3108 1.1.1.6 christos && !_bfd_elf_link_iterate_on_relocs (abfd, info,
3109 1.1.1.6 christos elf_x86_64_scan_relocs))
3110 1.1.1.8 christos return false;
3111 1.1 christos
3112 1.1 christos return _bfd_x86_elf_early_size_sections (output_bfd, info);
3113 1.1.1.4 christos }
3114 1.1.1.4 christos
3115 1.1 christos /* Return the relocation value for @tpoff relocation
3116 1.1.1.4 christos if STT_TLS virtual address is ADDRESS. */
3117 1.1.1.4 christos
3118 1.1.1.4 christos static bfd_vma
3119 1.1.1.4 christos elf_x86_64_tpoff (struct bfd_link_info *info, bfd_vma address)
3120 1.1.1.4 christos {
3121 1.1.1.4 christos struct elf_link_hash_table *htab = elf_hash_table (info);
3122 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3123 1.1.1.4 christos bfd_vma static_tls_size;
3124 1.1.1.4 christos
3125 1.1.1.4 christos /* If tls_segment is NULL, we should have signalled an error already. */
3126 1.1 christos if (htab->tls_sec == NULL)
3127 1.1.1.4 christos return 0;
3128 1.1.1.4 christos
3129 1.1.1.4 christos /* Consider special static TLS alignment requirements. */
3130 1.1 christos static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3131 1.1 christos return address - static_tls_size - htab->tls_sec->vma;
3132 1.1.1.4 christos }
3133 1.1 christos
3134 1.1.1.6 christos /* Relocate an x86_64 ELF section. */
3135 1.1.1.4 christos
3136 1.1.1.4 christos static int
3137 1.1.1.4 christos elf_x86_64_relocate_section (bfd *output_bfd,
3138 1.1.1.4 christos struct bfd_link_info *info,
3139 1.1.1.4 christos bfd *input_bfd,
3140 1.1.1.4 christos asection *input_section,
3141 1.1.1.4 christos bfd_byte *contents,
3142 1.1.1.4 christos Elf_Internal_Rela *relocs,
3143 1.1 christos Elf_Internal_Sym *local_syms,
3144 1.1.1.4 christos asection **local_sections)
3145 1.1.1.4 christos {
3146 1.1.1.4 christos struct elf_x86_link_hash_table *htab;
3147 1.1.1.4 christos Elf_Internal_Shdr *symtab_hdr;
3148 1.1.1.4 christos struct elf_link_hash_entry **sym_hashes;
3149 1.1.1.4 christos bfd_vma *local_got_offsets;
3150 1.1.1.4 christos bfd_vma *local_tlsdesc_gotents;
3151 1.1.1.4 christos Elf_Internal_Rela *rel;
3152 1.1.1.4 christos Elf_Internal_Rela *wrel;
3153 1.1.1.6 christos Elf_Internal_Rela *relend;
3154 1.1 christos unsigned int plt_entry_size;
3155 1.1.1.6 christos bool status;
3156 1.1.1.4 christos
3157 1.1.1.6 christos /* Skip if check_relocs or scan_relocs failed. */
3158 1.1 christos if (input_section->check_relocs_failed)
3159 1.1.1.4 christos return false;
3160 1.1.1.4 christos
3161 1.1.1.6 christos htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
3162 1.1 christos if (htab == NULL)
3163 1.1.1.5 christos return false;
3164 1.1.1.5 christos
3165 1.1.1.5 christos if (!is_x86_elf (input_bfd, htab))
3166 1.1.1.6 christos {
3167 1.1.1.5 christos bfd_set_error (bfd_error_wrong_format);
3168 1.1 christos return false;
3169 1.1.1.4 christos }
3170 1.1.1.4 christos
3171 1.1.1.4 christos plt_entry_size = htab->plt.plt_entry_size;
3172 1.1.1.4 christos symtab_hdr = &elf_symtab_hdr (input_bfd);
3173 1.1.1.4 christos sym_hashes = elf_sym_hashes (input_bfd);
3174 1.1 christos local_got_offsets = elf_local_got_offsets (input_bfd);
3175 1.1.1.4 christos local_tlsdesc_gotents = elf_x86_local_tlsdesc_gotent (input_bfd);
3176 1.1 christos
3177 1.1.1.6 christos _bfd_x86_elf_set_tls_module_base (info);
3178 1.1.1.4 christos
3179 1.1.1.4 christos status = true;
3180 1.1.1.4 christos rel = wrel = relocs;
3181 1.1 christos relend = relocs + input_section->reloc_count;
3182 1.1.1.4 christos for (; rel < relend; wrel++, rel++)
3183 1.1 christos {
3184 1.1 christos unsigned int r_type, r_type_tls;
3185 1.1 christos reloc_howto_type *howto;
3186 1.1.1.4 christos unsigned long r_symndx;
3187 1.1 christos struct elf_link_hash_entry *h;
3188 1.1 christos struct elf_x86_link_hash_entry *eh;
3189 1.1.1.2 christos Elf_Internal_Sym *sym;
3190 1.1 christos asection *sec;
3191 1.1.1.6 christos bfd_vma off, offplt, plt_offset;
3192 1.1 christos bfd_vma relocation;
3193 1.1 christos bool unresolved_reloc;
3194 1.1.1.2 christos bfd_reloc_status_type r;
3195 1.1.1.2 christos int tls_type;
3196 1.1.1.6 christos asection *base_got, *resolved_plt;
3197 1.1.1.6 christos bfd_vma st_size;
3198 1.1.1.6 christos bool resolved_to_zero;
3199 1.1.1.6 christos bool relative_reloc;
3200 1.1.1.6 christos bool converted_reloc;
3201 1.1 christos bool need_copy_reloc_in_pie;
3202 1.1 christos bool no_copyreloc_p;
3203 1.1 christos
3204 1.1 christos r_type = ELF32_R_TYPE (rel->r_info);
3205 1.1.1.2 christos if (r_type == (int) R_X86_64_GNU_VTINHERIT
3206 1.1.1.2 christos || r_type == (int) R_X86_64_GNU_VTENTRY)
3207 1.1.1.2 christos {
3208 1.1.1.2 christos if (wrel != rel)
3209 1.1.1.2 christos *wrel = *rel;
3210 1.1 christos continue;
3211 1.1.1.4 christos }
3212 1.1.1.4 christos
3213 1.1.1.4 christos r_symndx = htab->r_sym (rel->r_info);
3214 1.1 christos converted_reloc = (r_type & R_X86_64_converted_reloc_bit) != 0;
3215 1.1.1.4 christos if (converted_reloc)
3216 1.1.1.4 christos {
3217 1.1 christos r_type &= ~R_X86_64_converted_reloc_bit;
3218 1.1 christos rel->r_info = htab->r_info (r_symndx, r_type);
3219 1.1.1.5 christos }
3220 1.1.1.5 christos
3221 1.1.1.4 christos howto = elf_x86_64_rtype_to_howto (input_bfd, r_type);
3222 1.1.1.4 christos if (howto == NULL)
3223 1.1 christos return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
3224 1.1 christos
3225 1.1 christos h = NULL;
3226 1.1.1.6 christos sym = NULL;
3227 1.1 christos sec = NULL;
3228 1.1 christos unresolved_reloc = false;
3229 1.1 christos if (r_symndx < symtab_hdr->sh_info)
3230 1.1 christos {
3231 1.1 christos sym = local_syms + r_symndx;
3232 1.1 christos sec = local_sections[r_symndx];
3233 1.1 christos
3234 1.1.1.2 christos relocation = _bfd_elf_rela_local_sym (output_bfd, sym,
3235 1.1 christos &sec, rel);
3236 1.1 christos st_size = sym->st_size;
3237 1.1.1.2 christos
3238 1.1 christos /* Relocate against local STT_GNU_IFUNC symbol. */
3239 1.1 christos if (!bfd_link_relocatable (info)
3240 1.1.1.4 christos && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3241 1.1.1.6 christos {
3242 1.1 christos h = _bfd_elf_x86_get_local_sym_hash (htab, input_bfd,
3243 1.1 christos rel, false);
3244 1.1 christos if (h == NULL)
3245 1.1 christos abort ();
3246 1.1 christos
3247 1.1 christos /* Set STT_GNU_IFUNC symbol value. */
3248 1.1 christos h->root.u.def.value = sym->st_value;
3249 1.1 christos h->root.u.def.section = sec;
3250 1.1 christos }
3251 1.1 christos }
3252 1.1.1.6 christos else
3253 1.1.1.6 christos {
3254 1.1 christos bool warned ATTRIBUTE_UNUSED;
3255 1.1 christos bool ignored ATTRIBUTE_UNUSED;
3256 1.1 christos
3257 1.1 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3258 1.1.1.2 christos r_symndx, symtab_hdr, sym_hashes,
3259 1.1.1.2 christos h, sec, relocation,
3260 1.1 christos unresolved_reloc, warned, ignored);
3261 1.1 christos st_size = h->size;
3262 1.1 christos }
3263 1.1.1.2 christos
3264 1.1.1.2 christos if (sec != NULL && discarded_section (sec))
3265 1.1.1.5 christos {
3266 1.1.1.2 christos _bfd_clear_contents (howto, input_bfd, input_section,
3267 1.1.1.2 christos contents, rel->r_offset);
3268 1.1.1.2 christos wrel->r_offset = rel->r_offset;
3269 1.1.1.2 christos wrel->r_info = 0;
3270 1.1.1.2 christos wrel->r_addend = 0;
3271 1.1.1.8 christos
3272 1.1.1.8 christos /* For ld -r, remove relocations in debug sections against
3273 1.1.1.8 christos sections defined in discarded sections, including sframe
3274 1.1.1.8 christos sections. Not done for eh_frame editing code expects to
3275 1.1.1.8 christos be present. NB: Since sframe code keeps R_X86_64_NONE
3276 1.1.1.2 christos reloc as is, its r_offset is wrong, we must not generate
3277 1.1.1.8 christos R_X86_64_NONE reloc in sframe section. */
3278 1.1.1.8 christos if (bfd_link_relocatable (info)
3279 1.1.1.2 christos && ((input_section->flags & SEC_DEBUGGING) != 0
3280 1.1 christos || elf_section_type (input_section) == SHT_GNU_SFRAME))
3281 1.1.1.2 christos wrel--;
3282 1.1.1.2 christos
3283 1.1.1.2 christos continue;
3284 1.1.1.2 christos }
3285 1.1.1.2 christos
3286 1.1.1.2 christos if (bfd_link_relocatable (info))
3287 1.1.1.2 christos {
3288 1.1.1.2 christos if (wrel != rel)
3289 1.1.1.2 christos *wrel = *rel;
3290 1.1 christos continue;
3291 1.1.1.2 christos }
3292 1.1.1.2 christos
3293 1.1.1.2 christos if (rel->r_addend == 0 && !ABI_64_P (output_bfd))
3294 1.1.1.2 christos {
3295 1.1.1.2 christos if (r_type == R_X86_64_64)
3296 1.1.1.2 christos {
3297 1.1.1.2 christos /* For x32, treat R_X86_64_64 like R_X86_64_32 and
3298 1.1.1.2 christos zero-extend it to 64bit if addend is zero. */
3299 1.1.1.2 christos r_type = R_X86_64_32;
3300 1.1.1.2 christos memset (contents + rel->r_offset + 4, 0, 4);
3301 1.1.1.2 christos }
3302 1.1.1.2 christos else if (r_type == R_X86_64_SIZE64)
3303 1.1.1.2 christos {
3304 1.1.1.2 christos /* For x32, treat R_X86_64_SIZE64 like R_X86_64_SIZE32 and
3305 1.1.1.2 christos zero-extend it to 64bit if addend is zero. */
3306 1.1.1.2 christos r_type = R_X86_64_SIZE32;
3307 1.1 christos memset (contents + rel->r_offset + 4, 0, 4);
3308 1.1 christos }
3309 1.1.1.4 christos }
3310 1.1.1.2 christos
3311 1.1 christos eh = (struct elf_x86_link_hash_entry *) h;
3312 1.1 christos
3313 1.1 christos /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3314 1.1 christos it here if it is defined in a non-shared object. */
3315 1.1 christos if (h != NULL
3316 1.1 christos && h->type == STT_GNU_IFUNC
3317 1.1 christos && h->def_regular)
3318 1.1 christos {
3319 1.1 christos bfd_vma plt_index;
3320 1.1.1.2 christos const char *name;
3321 1.1.1.2 christos
3322 1.1.1.4 christos if ((input_section->flags & SEC_ALLOC) == 0)
3323 1.1.1.4 christos {
3324 1.1.1.4 christos /* If this is a SHT_NOTE section without SHF_ALLOC, treat
3325 1.1.1.4 christos STT_GNU_IFUNC symbol as STT_FUNC. */
3326 1.1.1.2 christos if (elf_section_type (input_section) == SHT_NOTE)
3327 1.1.1.2 christos goto skip_ifunc;
3328 1.1.1.2 christos /* Dynamic relocs are not propagated for SEC_DEBUGGING
3329 1.1.1.2 christos sections because such sections are not SEC_ALLOC and
3330 1.1.1.2 christos thus ld.so will not process them. */
3331 1.1.1.2 christos if ((input_section->flags & SEC_DEBUGGING) != 0)
3332 1.1.1.2 christos continue;
3333 1.1.1.3 christos abort ();
3334 1.1.1.3 christos }
3335 1.1.1.3 christos
3336 1.1.1.3 christos switch (r_type)
3337 1.1.1.3 christos {
3338 1.1.1.3 christos default:
3339 1.1.1.3 christos break;
3340 1.1.1.3 christos
3341 1.1.1.3 christos case R_X86_64_GOTPCREL:
3342 1.1.1.7 christos case R_X86_64_GOTPCRELX:
3343 1.1.1.8 christos case R_X86_64_REX_GOTPCRELX:
3344 1.1.1.8 christos case R_X86_64_CODE_4_GOTPCRELX:
3345 1.1.1.3 christos case R_X86_64_CODE_5_GOTPCRELX:
3346 1.1.1.3 christos case R_X86_64_CODE_6_GOTPCRELX:
3347 1.1.1.3 christos case R_X86_64_GOTPCREL64:
3348 1.1.1.3 christos base_got = htab->elf.sgot;
3349 1.1.1.3 christos off = h->got.offset;
3350 1.1.1.3 christos
3351 1.1.1.3 christos if (base_got == NULL)
3352 1.1.1.3 christos abort ();
3353 1.1.1.3 christos
3354 1.1.1.3 christos if (off == (bfd_vma) -1)
3355 1.1.1.3 christos {
3356 1.1.1.3 christos /* We can't use h->got.offset here to save state, or
3357 1.1.1.3 christos even just remember the offset, as finish_dynamic_symbol
3358 1.1.1.3 christos would use that as offset into .got. */
3359 1.1.1.3 christos
3360 1.1.1.3 christos if (h->plt.offset == (bfd_vma) -1)
3361 1.1.1.3 christos abort ();
3362 1.1.1.3 christos
3363 1.1.1.4 christos if (htab->elf.splt != NULL)
3364 1.1.1.4 christos {
3365 1.1.1.3 christos plt_index = (h->plt.offset / plt_entry_size
3366 1.1.1.3 christos - htab->plt.has_plt0);
3367 1.1.1.3 christos off = (plt_index + 3) * GOT_ENTRY_SIZE;
3368 1.1.1.3 christos base_got = htab->elf.sgotplt;
3369 1.1.1.3 christos }
3370 1.1.1.3 christos else
3371 1.1.1.3 christos {
3372 1.1.1.3 christos plt_index = h->plt.offset / plt_entry_size;
3373 1.1.1.3 christos off = plt_index * GOT_ENTRY_SIZE;
3374 1.1.1.3 christos base_got = htab->elf.igotplt;
3375 1.1.1.3 christos }
3376 1.1.1.3 christos
3377 1.1.1.3 christos if (h->dynindx == -1
3378 1.1.1.3 christos || h->forced_local
3379 1.1.1.3 christos || info->symbolic)
3380 1.1.1.3 christos {
3381 1.1.1.3 christos /* This references the local defitionion. We must
3382 1.1.1.3 christos initialize this entry in the global offset table.
3383 1.1.1.3 christos Since the offset must always be a multiple of 8,
3384 1.1.1.3 christos we use the least significant bit to record
3385 1.1.1.3 christos whether we have initialized it already.
3386 1.1.1.3 christos
3387 1.1.1.3 christos When doing a dynamic link, we create a .rela.got
3388 1.1.1.3 christos relocation entry to initialize the value. This
3389 1.1.1.3 christos is done in the finish_dynamic_symbol routine. */
3390 1.1.1.3 christos if ((off & 1) != 0)
3391 1.1.1.3 christos off &= ~1;
3392 1.1.1.3 christos else
3393 1.1.1.3 christos {
3394 1.1.1.3 christos bfd_put_64 (output_bfd, relocation,
3395 1.1.1.3 christos base_got->contents + off);
3396 1.1.1.3 christos /* Note that this is harmless for the GOTPLT64
3397 1.1.1.3 christos case, as -1 | 1 still is -1. */
3398 1.1.1.3 christos h->got.offset |= 1;
3399 1.1.1.3 christos }
3400 1.1.1.3 christos }
3401 1.1.1.3 christos }
3402 1.1.1.3 christos
3403 1.1.1.3 christos relocation = (base_got->output_section->vma
3404 1.1.1.3 christos + base_got->output_offset + off);
3405 1.1.1.3 christos
3406 1.1.1.3 christos goto do_relocation;
3407 1.1.1.3 christos }
3408 1.1.1.3 christos
3409 1.1.1.3 christos if (h->plt.offset == (bfd_vma) -1)
3410 1.1.1.3 christos {
3411 1.1.1.3 christos /* Handle static pointers of STT_GNU_IFUNC symbols. */
3412 1.1.1.3 christos if (r_type == htab->pointer_r_type
3413 1.1.1.3 christos && (input_section->flags & SEC_CODE) == 0)
3414 1.1.1.3 christos goto do_ifunc_pointer;
3415 1.1 christos goto bad_ifunc_reloc;
3416 1.1 christos }
3417 1.1.1.2 christos
3418 1.1.1.2 christos /* STT_GNU_IFUNC symbol must go through PLT. */
3419 1.1.1.4 christos if (htab->elf.splt != NULL)
3420 1.1.1.2 christos {
3421 1.1.1.4 christos if (htab->plt_second != NULL)
3422 1.1.1.4 christos {
3423 1.1.1.2 christos resolved_plt = htab->plt_second;
3424 1.1.1.2 christos plt_offset = eh->plt_second.offset;
3425 1.1.1.2 christos }
3426 1.1.1.2 christos else
3427 1.1.1.2 christos {
3428 1.1.1.2 christos resolved_plt = htab->elf.splt;
3429 1.1.1.2 christos plt_offset = h->plt.offset;
3430 1.1.1.2 christos }
3431 1.1.1.2 christos }
3432 1.1.1.2 christos else
3433 1.1.1.2 christos {
3434 1.1.1.2 christos resolved_plt = htab->elf.iplt;
3435 1.1.1.2 christos plt_offset = h->plt.offset;
3436 1.1.1.2 christos }
3437 1.1.1.2 christos
3438 1.1 christos relocation = (resolved_plt->output_section->vma
3439 1.1 christos + resolved_plt->output_offset + plt_offset);
3440 1.1 christos
3441 1.1 christos switch (r_type)
3442 1.1.1.6 christos {
3443 1.1 christos default:
3444 1.1 christos bad_ifunc_reloc:
3445 1.1 christos if (h->root.root.string)
3446 1.1 christos name = h->root.root.string;
3447 1.1 christos else
3448 1.1.1.4 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3449 1.1.1.4 christos NULL);
3450 1.1.1.4 christos _bfd_error_handler
3451 1.1.1.3 christos /* xgettext:c-format */
3452 1.1.1.3 christos (_("%pB: relocation %s against STT_GNU_IFUNC "
3453 1.1 christos "symbol `%s' isn't supported"), input_bfd,
3454 1.1.1.6 christos howto->name, name);
3455 1.1 christos bfd_set_error (bfd_error_bad_value);
3456 1.1 christos return false;
3457 1.1.1.2 christos
3458 1.1 christos case R_X86_64_32S:
3459 1.1 christos if (bfd_link_pic (info))
3460 1.1 christos abort ();
3461 1.1 christos goto do_relocation;
3462 1.1 christos
3463 1.1 christos case R_X86_64_32:
3464 1.1 christos if (ABI_64_P (output_bfd))
3465 1.1 christos goto do_relocation;
3466 1.1.1.6 christos /* FALLTHROUGH */
3467 1.1 christos case R_X86_64_64:
3468 1.1 christos do_ifunc_pointer:
3469 1.1 christos if (rel->r_addend != 0)
3470 1.1 christos {
3471 1.1 christos if (h->root.root.string)
3472 1.1 christos name = h->root.root.string;
3473 1.1 christos else
3474 1.1.1.4 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr,
3475 1.1.1.4 christos sym, NULL);
3476 1.1.1.4 christos _bfd_error_handler
3477 1.1.1.4 christos /* xgettext:c-format */
3478 1.1.1.4 christos (_("%pB: relocation %s against STT_GNU_IFUNC "
3479 1.1 christos "symbol `%s' has non-zero addend: %" PRId64),
3480 1.1.1.6 christos input_bfd, howto->name, name, (int64_t) rel->r_addend);
3481 1.1 christos bfd_set_error (bfd_error_bad_value);
3482 1.1 christos return false;
3483 1.1 christos }
3484 1.1.1.3 christos
3485 1.1.1.3 christos /* Generate dynamic relcoation only when there is a
3486 1.1.1.3 christos non-GOT reference in a shared object or there is no
3487 1.1.1.3 christos PLT. */
3488 1.1 christos if ((bfd_link_pic (info) && h->non_got_ref)
3489 1.1 christos || h->plt.offset == (bfd_vma) -1)
3490 1.1 christos {
3491 1.1 christos Elf_Internal_Rela outrel;
3492 1.1 christos asection *sreloc;
3493 1.1 christos
3494 1.1 christos /* Need a dynamic relocation to get the real function
3495 1.1 christos address. */
3496 1.1 christos outrel.r_offset = _bfd_elf_section_offset (output_bfd,
3497 1.1 christos info,
3498 1.1 christos input_section,
3499 1.1 christos rel->r_offset);
3500 1.1 christos if (outrel.r_offset == (bfd_vma) -1
3501 1.1 christos || outrel.r_offset == (bfd_vma) -2)
3502 1.1 christos abort ();
3503 1.1 christos
3504 1.1 christos outrel.r_offset += (input_section->output_section->vma
3505 1.1.1.4 christos + input_section->output_offset);
3506 1.1 christos
3507 1.1.1.4 christos if (POINTER_LOCAL_IFUNC_P (info, h))
3508 1.1.1.4 christos {
3509 1.1.1.4 christos info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
3510 1.1.1.4 christos h->root.root.string,
3511 1.1 christos h->root.u.def.section->owner);
3512 1.1 christos
3513 1.1 christos /* This symbol is resolved locally. */
3514 1.1 christos outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
3515 1.1 christos outrel.r_addend = (h->root.u.def.value
3516 1.1.1.6 christos + h->root.u.def.section->output_section->vma
3517 1.1.1.6 christos + h->root.u.def.section->output_offset);
3518 1.1.1.6 christos
3519 1.1.1.6 christos if (htab->params->report_relative_reloc)
3520 1.1.1.6 christos _bfd_x86_elf_link_report_relative_reloc
3521 1.1 christos (info, input_section, h, sym,
3522 1.1 christos "R_X86_64_IRELATIVE", &outrel);
3523 1.1 christos }
3524 1.1 christos else
3525 1.1 christos {
3526 1.1 christos outrel.r_info = htab->r_info (h->dynindx, r_type);
3527 1.1 christos outrel.r_addend = 0;
3528 1.1.1.3 christos }
3529 1.1.1.3 christos
3530 1.1.1.3 christos /* Dynamic relocations are stored in
3531 1.1.1.3 christos 1. .rela.ifunc section in PIC object.
3532 1.1.1.3 christos 2. .rela.got section in dynamic executable.
3533 1.1.1.3 christos 3. .rela.iplt section in static executable. */
3534 1.1.1.3 christos if (bfd_link_pic (info))
3535 1.1.1.3 christos sreloc = htab->elf.irelifunc;
3536 1.1.1.3 christos else if (htab->elf.splt != NULL)
3537 1.1.1.3 christos sreloc = htab->elf.srelgot;
3538 1.1 christos else
3539 1.1 christos sreloc = htab->elf.irelplt;
3540 1.1 christos elf_append_rela (output_bfd, sreloc, &outrel);
3541 1.1 christos
3542 1.1 christos /* If this reloc is against an external symbol, we
3543 1.1 christos do not want to fiddle with the addend. Otherwise,
3544 1.1 christos we need to include the symbol value so that it
3545 1.1 christos becomes an addend for the dynamic reloc. For an
3546 1.1 christos internal symbol, we have updated addend. */
3547 1.1 christos continue;
3548 1.1 christos }
3549 1.1 christos /* FALLTHROUGH */
3550 1.1 christos case R_X86_64_PC32:
3551 1.1 christos case R_X86_64_PC64:
3552 1.1 christos case R_X86_64_PLT32:
3553 1.1 christos goto do_relocation;
3554 1.1 christos }
3555 1.1.1.6 christos }
3556 1.1.1.3 christos
3557 1.1.1.4 christos skip_ifunc:
3558 1.1.1.3 christos resolved_to_zero = (eh != NULL
3559 1.1 christos && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
3560 1.1 christos
3561 1.1 christos /* When generating a shared object, the relocations handled here are
3562 1.1 christos copied into the output file to be resolved at run time. */
3563 1.1 christos switch (r_type)
3564 1.1 christos {
3565 1.1 christos case R_X86_64_GOT32:
3566 1.1 christos case R_X86_64_GOT64:
3567 1.1 christos /* Relocation is to the entry for this symbol in the global
3568 1.1.1.2 christos offset table. */
3569 1.1.1.2 christos case R_X86_64_GOTPCREL:
3570 1.1.1.7 christos case R_X86_64_GOTPCRELX:
3571 1.1.1.8 christos case R_X86_64_REX_GOTPCRELX:
3572 1.1.1.8 christos case R_X86_64_CODE_4_GOTPCRELX:
3573 1.1 christos case R_X86_64_CODE_5_GOTPCRELX:
3574 1.1 christos case R_X86_64_CODE_6_GOTPCRELX:
3575 1.1 christos case R_X86_64_GOTPCREL64:
3576 1.1.1.4 christos /* Use global offset table entry as symbol value. */
3577 1.1 christos case R_X86_64_GOTPLT64:
3578 1.1 christos /* This is obsolete and treated the same as GOT64. */
3579 1.1 christos base_got = htab->elf.sgot;
3580 1.1 christos
3581 1.1 christos if (htab->elf.sgot == NULL)
3582 1.1.1.6 christos abort ();
3583 1.1 christos
3584 1.1 christos relative_reloc = false;
3585 1.1 christos if (h != NULL)
3586 1.1 christos {
3587 1.1 christos off = h->got.offset;
3588 1.1 christos if (h->needs_plt
3589 1.1 christos && h->plt.offset != (bfd_vma)-1
3590 1.1 christos && off == (bfd_vma)-1)
3591 1.1 christos {
3592 1.1 christos /* We can't use h->got.offset here to save
3593 1.1 christos state, or even just remember the offset, as
3594 1.1.1.4 christos finish_dynamic_symbol would use that as offset into
3595 1.1.1.4 christos .got. */
3596 1.1 christos bfd_vma plt_index = (h->plt.offset / plt_entry_size
3597 1.1 christos - htab->plt.has_plt0);
3598 1.1 christos off = (plt_index + 3) * GOT_ENTRY_SIZE;
3599 1.1 christos base_got = htab->elf.sgotplt;
3600 1.1.1.4 christos }
3601 1.1.1.4 christos
3602 1.1.1.4 christos if (RESOLVED_LOCALLY_P (info, h, htab))
3603 1.1.1.4 christos {
3604 1.1.1.4 christos /* We must initialize this entry in the global offset
3605 1.1.1.4 christos table. Since the offset must always be a multiple
3606 1.1 christos of 8, we use the least significant bit to record
3607 1.1 christos whether we have initialized it already.
3608 1.1 christos
3609 1.1 christos When doing a dynamic link, we create a .rela.got
3610 1.1 christos relocation entry to initialize the value. This is
3611 1.1 christos done in the finish_dynamic_symbol routine. */
3612 1.1 christos if ((off & 1) != 0)
3613 1.1 christos off &= ~1;
3614 1.1 christos else
3615 1.1 christos {
3616 1.1 christos bfd_put_64 (output_bfd, relocation,
3617 1.1 christos base_got->contents + off);
3618 1.1 christos /* Note that this is harmless for the GOTPLT64 case,
3619 1.1.1.4 christos as -1 | 1 still is -1. */
3620 1.1.1.6 christos h->got.offset |= 1;
3621 1.1.1.6 christos
3622 1.1.1.6 christos /* NB: Don't generate relative relocation here if
3623 1.1.1.6 christos it has been generated by DT_RELR. */
3624 1.1.1.4 christos if (!info->enable_dt_relr
3625 1.1.1.4 christos && GENERATE_RELATIVE_RELOC_P (info, h))
3626 1.1.1.4 christos {
3627 1.1.1.4 christos /* If this symbol isn't dynamic in PIC,
3628 1.1.1.6 christos generate R_X86_64_RELATIVE here. */
3629 1.1.1.4 christos eh->no_finish_dynamic_symbol = 1;
3630 1.1 christos relative_reloc = true;
3631 1.1 christos }
3632 1.1 christos }
3633 1.1.1.6 christos }
3634 1.1 christos else
3635 1.1 christos unresolved_reloc = false;
3636 1.1 christos }
3637 1.1 christos else
3638 1.1 christos {
3639 1.1 christos if (local_got_offsets == NULL)
3640 1.1 christos abort ();
3641 1.1 christos
3642 1.1 christos off = local_got_offsets[r_symndx];
3643 1.1 christos
3644 1.1 christos /* The offset must always be a multiple of 8. We use
3645 1.1 christos the least significant bit to record whether we have
3646 1.1 christos already generated the necessary reloc. */
3647 1.1 christos if ((off & 1) != 0)
3648 1.1 christos off &= ~1;
3649 1.1 christos else
3650 1.1 christos {
3651 1.1.1.4 christos bfd_put_64 (output_bfd, relocation,
3652 1.1 christos base_got->contents + off);
3653 1.1.1.6 christos local_got_offsets[r_symndx] |= 1;
3654 1.1.1.6 christos
3655 1.1.1.6 christos /* NB: GOTPCREL relocations against local absolute
3656 1.1.1.6 christos symbol store relocation value in the GOT slot
3657 1.1.1.6 christos without relative relocation. Don't generate
3658 1.1.1.6 christos relative relocation here if it has been generated
3659 1.1.1.6 christos by DT_RELR. */
3660 1.1.1.6 christos if (!info->enable_dt_relr
3661 1.1.1.6 christos && bfd_link_pic (info)
3662 1.1.1.6 christos && !(sym->st_shndx == SHN_ABS
3663 1.1.1.7 christos && (r_type == R_X86_64_GOTPCREL
3664 1.1.1.8 christos || r_type == R_X86_64_GOTPCRELX
3665 1.1.1.8 christos || r_type == R_X86_64_REX_GOTPCRELX
3666 1.1.1.8 christos || r_type == R_X86_64_CODE_4_GOTPCRELX
3667 1.1.1.6 christos || r_type == R_X86_64_CODE_5_GOTPCRELX
3668 1.1.1.4 christos || r_type == R_X86_64_CODE_6_GOTPCRELX)))
3669 1.1.1.4 christos relative_reloc = true;
3670 1.1 christos }
3671 1.1.1.4 christos }
3672 1.1.1.4 christos
3673 1.1.1.4 christos if (relative_reloc)
3674 1.1.1.4 christos {
3675 1.1 christos asection *s;
3676 1.1.1.4 christos Elf_Internal_Rela outrel;
3677 1.1.1.4 christos
3678 1.1.1.4 christos /* We need to generate a R_X86_64_RELATIVE reloc
3679 1.1.1.4 christos for the dynamic linker. */
3680 1.1.1.4 christos s = htab->elf.srelgot;
3681 1.1.1.4 christos if (s == NULL)
3682 1.1.1.4 christos abort ();
3683 1.1.1.4 christos
3684 1.1.1.4 christos outrel.r_offset = (base_got->output_section->vma
3685 1.1.1.4 christos + base_got->output_offset
3686 1.1.1.4 christos + off);
3687 1.1.1.6 christos outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
3688 1.1.1.6 christos outrel.r_addend = relocation;
3689 1.1.1.6 christos
3690 1.1.1.6 christos if (htab->params->report_relative_reloc)
3691 1.1.1.6 christos _bfd_x86_elf_link_report_relative_reloc
3692 1.1.1.6 christos (info, input_section, h, sym, "R_X86_64_RELATIVE",
3693 1.1.1.4 christos &outrel);
3694 1.1 christos
3695 1.1 christos elf_append_rela (output_bfd, s, &outrel);
3696 1.1 christos }
3697 1.1 christos
3698 1.1 christos if (off >= (bfd_vma) -2)
3699 1.1 christos abort ();
3700 1.1 christos
3701 1.1.1.2 christos relocation = base_got->output_section->vma
3702 1.1.1.2 christos + base_got->output_offset + off;
3703 1.1.1.2 christos if (r_type != R_X86_64_GOTPCREL
3704 1.1.1.7 christos && r_type != R_X86_64_GOTPCRELX
3705 1.1.1.8 christos && r_type != R_X86_64_REX_GOTPCRELX
3706 1.1.1.8 christos && r_type != R_X86_64_CODE_4_GOTPCRELX
3707 1.1.1.2 christos && r_type != R_X86_64_CODE_5_GOTPCRELX
3708 1.1 christos && r_type != R_X86_64_CODE_6_GOTPCRELX
3709 1.1 christos && r_type != R_X86_64_GOTPCREL64)
3710 1.1 christos relocation -= htab->elf.sgotplt->output_section->vma
3711 1.1 christos - htab->elf.sgotplt->output_offset;
3712 1.1 christos
3713 1.1 christos break;
3714 1.1 christos
3715 1.1 christos case R_X86_64_GOTOFF64:
3716 1.1 christos /* Relocation is relative to the start of the global offset
3717 1.1.1.2 christos table. */
3718 1.1.1.2 christos
3719 1.1.1.2 christos /* Check to make sure it isn't a protected function or data
3720 1.1.1.2 christos symbol for shared library since it may not be local when
3721 1.1.1.2 christos used as function address or with copy relocation. We also
3722 1.1 christos need to make sure that a symbol is referenced locally. */
3723 1.1.1.2 christos if (bfd_link_pic (info) && h)
3724 1.1.1.2 christos {
3725 1.1.1.2 christos if (!h->def_regular)
3726 1.1.1.2 christos {
3727 1.1.1.2 christos const char *v;
3728 1.1.1.2 christos
3729 1.1.1.2 christos switch (ELF_ST_VISIBILITY (h->other))
3730 1.1.1.2 christos {
3731 1.1.1.2 christos case STV_HIDDEN:
3732 1.1.1.2 christos v = _("hidden symbol");
3733 1.1.1.2 christos break;
3734 1.1.1.2 christos case STV_INTERNAL:
3735 1.1.1.2 christos v = _("internal symbol");
3736 1.1.1.2 christos break;
3737 1.1.1.2 christos case STV_PROTECTED:
3738 1.1.1.2 christos v = _("protected symbol");
3739 1.1.1.2 christos break;
3740 1.1.1.2 christos default:
3741 1.1.1.2 christos v = _("symbol");
3742 1.1.1.2 christos break;
3743 1.1.1.4 christos }
3744 1.1.1.4 christos
3745 1.1.1.4 christos _bfd_error_handler
3746 1.1.1.4 christos /* xgettext:c-format */
3747 1.1.1.2 christos (_("%pB: relocation R_X86_64_GOTOFF64 against undefined %s"
3748 1.1.1.2 christos " `%s' can not be used when making a shared object"),
3749 1.1.1.6 christos input_bfd, v, h->root.root.string);
3750 1.1.1.2 christos bfd_set_error (bfd_error_bad_value);
3751 1.1.1.2 christos return false;
3752 1.1.1.4 christos }
3753 1.1.1.2 christos else if (!bfd_link_executable (info)
3754 1.1.1.2 christos && !SYMBOL_REFERENCES_LOCAL_P (info, h)
3755 1.1.1.2 christos && (h->type == STT_FUNC
3756 1.1.1.2 christos || h->type == STT_OBJECT)
3757 1.1.1.4 christos && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3758 1.1.1.5 christos {
3759 1.1.1.4 christos _bfd_error_handler
3760 1.1.1.4 christos /* xgettext:c-format */
3761 1.1.1.2 christos (_("%pB: relocation R_X86_64_GOTOFF64 against protected %s"
3762 1.1.1.2 christos " `%s' can not be used when making a shared object"),
3763 1.1.1.2 christos input_bfd,
3764 1.1.1.2 christos h->type == STT_FUNC ? "function" : "data",
3765 1.1.1.6 christos h->root.root.string);
3766 1.1.1.2 christos bfd_set_error (bfd_error_bad_value);
3767 1.1 christos return false;
3768 1.1 christos }
3769 1.1 christos }
3770 1.1 christos
3771 1.1 christos /* Note that sgot is not involved in this
3772 1.1 christos calculation. We always want the start of .got.plt. If we
3773 1.1 christos defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3774 1.1 christos permitted by the ABI, we might have to change this
3775 1.1 christos calculation. */
3776 1.1 christos relocation -= htab->elf.sgotplt->output_section->vma
3777 1.1 christos + htab->elf.sgotplt->output_offset;
3778 1.1 christos break;
3779 1.1 christos
3780 1.1 christos case R_X86_64_GOTPC32:
3781 1.1 christos case R_X86_64_GOTPC64:
3782 1.1 christos /* Use global offset table as symbol value. */
3783 1.1.1.6 christos relocation = htab->elf.sgotplt->output_section->vma
3784 1.1 christos + htab->elf.sgotplt->output_offset;
3785 1.1 christos unresolved_reloc = false;
3786 1.1 christos break;
3787 1.1 christos
3788 1.1 christos case R_X86_64_PLTOFF64:
3789 1.1 christos /* Relocation is PLT entry relative to GOT. For local
3790 1.1 christos symbols it's the symbol itself relative to GOT. */
3791 1.1.1.4 christos if (h != NULL
3792 1.1.1.4 christos /* See PLT32 handling. */
3793 1.1 christos && (h->plt.offset != (bfd_vma) -1
3794 1.1 christos || eh->plt_got.offset != (bfd_vma) -1)
3795 1.1.1.4 christos && htab->elf.splt != NULL)
3796 1.1.1.4 christos {
3797 1.1.1.4 christos if (eh->plt_got.offset != (bfd_vma) -1)
3798 1.1.1.4 christos {
3799 1.1.1.4 christos /* Use the GOT PLT. */
3800 1.1.1.4 christos resolved_plt = htab->plt_got;
3801 1.1.1.4 christos plt_offset = eh->plt_got.offset;
3802 1.1.1.2 christos }
3803 1.1.1.4 christos else if (htab->plt_second != NULL)
3804 1.1.1.4 christos {
3805 1.1.1.2 christos resolved_plt = htab->plt_second;
3806 1.1.1.2 christos plt_offset = eh->plt_second.offset;
3807 1.1.1.2 christos }
3808 1.1.1.2 christos else
3809 1.1.1.2 christos {
3810 1.1.1.2 christos resolved_plt = htab->elf.splt;
3811 1.1.1.2 christos plt_offset = h->plt.offset;
3812 1.1.1.2 christos }
3813 1.1.1.2 christos
3814 1.1.1.2 christos relocation = (resolved_plt->output_section->vma
3815 1.1.1.6 christos + resolved_plt->output_offset
3816 1.1 christos + plt_offset);
3817 1.1 christos unresolved_reloc = false;
3818 1.1 christos }
3819 1.1 christos
3820 1.1 christos relocation -= htab->elf.sgotplt->output_section->vma
3821 1.1 christos + htab->elf.sgotplt->output_offset;
3822 1.1 christos break;
3823 1.1 christos
3824 1.1 christos case R_X86_64_PLT32:
3825 1.1 christos /* Relocation is to the entry for this symbol in the
3826 1.1 christos procedure linkage table. */
3827 1.1 christos
3828 1.1 christos /* Resolve a PLT32 reloc against a local symbol directly,
3829 1.1 christos without using the procedure linkage table. */
3830 1.1 christos if (h == NULL)
3831 1.1.1.2 christos break;
3832 1.1.1.2 christos
3833 1.1 christos if ((h->plt.offset == (bfd_vma) -1
3834 1.1 christos && eh->plt_got.offset == (bfd_vma) -1)
3835 1.1 christos || htab->elf.splt == NULL)
3836 1.1 christos {
3837 1.1 christos /* We didn't make a PLT entry for this symbol. This
3838 1.1 christos happens when statically linking PIC code, or when
3839 1.1 christos using -Bsymbolic. */
3840 1.1 christos break;
3841 1.1.1.6 christos }
3842 1.1.1.2 christos
3843 1.1.1.2 christos use_plt:
3844 1.1.1.4 christos if (h->plt.offset != (bfd_vma) -1)
3845 1.1.1.2 christos {
3846 1.1.1.4 christos if (htab->plt_second != NULL)
3847 1.1.1.4 christos {
3848 1.1.1.2 christos resolved_plt = htab->plt_second;
3849 1.1.1.2 christos plt_offset = eh->plt_second.offset;
3850 1.1.1.2 christos }
3851 1.1.1.2 christos else
3852 1.1.1.2 christos {
3853 1.1.1.2 christos resolved_plt = htab->elf.splt;
3854 1.1.1.2 christos plt_offset = h->plt.offset;
3855 1.1.1.2 christos }
3856 1.1.1.2 christos }
3857 1.1.1.2 christos else
3858 1.1.1.2 christos {
3859 1.1.1.2 christos /* Use the GOT PLT. */
3860 1.1.1.2 christos resolved_plt = htab->plt_got;
3861 1.1.1.2 christos plt_offset = eh->plt_got.offset;
3862 1.1.1.2 christos }
3863 1.1.1.2 christos
3864 1.1.1.2 christos relocation = (resolved_plt->output_section->vma
3865 1.1.1.6 christos + resolved_plt->output_offset
3866 1.1 christos + plt_offset);
3867 1.1 christos unresolved_reloc = false;
3868 1.1.1.2 christos break;
3869 1.1.1.2 christos
3870 1.1.1.2 christos case R_X86_64_SIZE32:
3871 1.1.1.2 christos case R_X86_64_SIZE64:
3872 1.1.1.2 christos /* Set to symbol size. */
3873 1.1.1.2 christos relocation = st_size;
3874 1.1 christos goto direct;
3875 1.1 christos
3876 1.1 christos case R_X86_64_PC8:
3877 1.1.1.2 christos case R_X86_64_PC16:
3878 1.1.1.4 christos case R_X86_64_PC32:
3879 1.1.1.4 christos /* Don't complain about -fPIC if the symbol is undefined when
3880 1.1.1.4 christos building executable unless it is unresolved weak symbol,
3881 1.1.1.5 christos references a dynamic definition in PIE or -z nocopyreloc
3882 1.1.1.5 christos is used. */
3883 1.1.1.5 christos no_copyreloc_p
3884 1.1.1.5 christos = (info->nocopyreloc
3885 1.1.1.5 christos || (h != NULL
3886 1.1.1.6 christos && !h->root.linker_def
3887 1.1.1.5 christos && !h->root.ldscript_def
3888 1.1.1.4 christos && eh->def_protected));
3889 1.1 christos
3890 1.1.1.2 christos if ((input_section->flags & SEC_ALLOC) != 0
3891 1.1.1.3 christos && (input_section->flags & SEC_READONLY) != 0
3892 1.1.1.4 christos && h != NULL
3893 1.1.1.5 christos && ((bfd_link_executable (info)
3894 1.1.1.5 christos && ((h->root.type == bfd_link_hash_undefweak
3895 1.1.1.5 christos && (eh == NULL
3896 1.1.1.4 christos || !UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
3897 1.1.1.5 christos eh)))
3898 1.1.1.4 christos || (bfd_link_pie (info)
3899 1.1.1.5 christos && !SYMBOL_DEFINED_NON_SHARED_P (h)
3900 1.1.1.4 christos && h->def_dynamic)
3901 1.1.1.4 christos || (no_copyreloc_p
3902 1.1.1.6 christos && h->def_dynamic
3903 1.1.1.6 christos && !(h->root.u.def.section->flags & SEC_CODE))))
3904 1.1.1.4 christos || (bfd_link_pie (info)
3905 1.1 christos && h->root.type == bfd_link_hash_undefweak)
3906 1.1.1.6 christos || bfd_link_dll (info)))
3907 1.1.1.4 christos {
3908 1.1 christos bool fail = false;
3909 1.1 christos if (SYMBOL_REFERENCES_LOCAL_P (info, h))
3910 1.1.1.4 christos {
3911 1.1.1.5 christos /* Symbol is referenced locally. Make sure it is
3912 1.1 christos defined locally. */
3913 1.1.1.5 christos fail = !SYMBOL_DEFINED_NON_SHARED_P (h);
3914 1.1 christos }
3915 1.1.1.5 christos else if (bfd_link_pie (info))
3916 1.1.1.5 christos {
3917 1.1.1.6 christos /* We can only use PC-relative relocations in PIE
3918 1.1.1.6 christos from non-code sections. */
3919 1.1.1.6 christos if (h->root.type == bfd_link_hash_undefweak
3920 1.1.1.6 christos || (h->type == STT_FUNC
3921 1.1.1.5 christos && (sec->flags & SEC_CODE) != 0))
3922 1.1.1.5 christos fail = true;
3923 1.1.1.5 christos }
3924 1.1.1.5 christos else if (no_copyreloc_p || bfd_link_dll (info))
3925 1.1.1.5 christos {
3926 1.1.1.5 christos /* Symbol doesn't need copy reloc and isn't
3927 1.1.1.5 christos referenced locally. Don't allow PC-relative
3928 1.1.1.5 christos relocations against default and protected
3929 1.1.1.5 christos symbols since address of protected function
3930 1.1.1.4 christos and location of protected data may not be in
3931 1.1.1.5 christos the shared object. */
3932 1.1 christos fail = (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3933 1.1 christos || ELF_ST_VISIBILITY (h->other) == STV_PROTECTED);
3934 1.1 christos }
3935 1.1.1.4 christos
3936 1.1.1.3 christos if (fail)
3937 1.1 christos return elf_x86_64_need_pic (info, input_bfd, input_section,
3938 1.1.1.4 christos h, NULL, NULL, howto);
3939 1.1.1.4 christos }
3940 1.1.1.4 christos /* Since x86-64 has PC-relative PLT, we can use PLT in PIE
3941 1.1.1.4 christos as function address. */
3942 1.1.1.4 christos else if (h != NULL
3943 1.1.1.4 christos && (input_section->flags & SEC_CODE) == 0
3944 1.1.1.4 christos && bfd_link_pie (info)
3945 1.1.1.4 christos && h->type == STT_FUNC
3946 1.1.1.4 christos && !h->def_regular
3947 1.1 christos && h->def_dynamic)
3948 1.1 christos goto use_plt;
3949 1.1 christos /* Fall through. */
3950 1.1 christos
3951 1.1 christos case R_X86_64_8:
3952 1.1 christos case R_X86_64_16:
3953 1.1 christos case R_X86_64_32:
3954 1.1 christos case R_X86_64_PC64:
3955 1.1 christos case R_X86_64_64:
3956 1.1 christos /* FIXME: The ABI says the linker should make sure the value is
3957 1.1.1.6 christos the same when it's zeroextended to 64 bit. */
3958 1.1 christos
3959 1.1 christos direct:
3960 1.1 christos if ((input_section->flags & SEC_ALLOC) == 0)
3961 1.1.1.4 christos break;
3962 1.1.1.4 christos
3963 1.1.1.4 christos need_copy_reloc_in_pie = (bfd_link_pie (info)
3964 1.1.1.4 christos && h != NULL
3965 1.1.1.4 christos && (h->needs_copy
3966 1.1.1.4 christos || eh->needs_copy
3967 1.1.1.6 christos || (h->root.type
3968 1.1.1.6 christos == bfd_link_hash_undefined))
3969 1.1.1.6 christos && (X86_PCREL_TYPE_P (true, r_type)
3970 1.1.1.4 christos || X86_SIZE_TYPE_P (true,
3971 1.1.1.6 christos r_type)));
3972 1.1.1.4 christos
3973 1.1.1.6 christos if (GENERATE_DYNAMIC_RELOCATION_P (true, info, eh, r_type, sec,
3974 1.1 christos need_copy_reloc_in_pie,
3975 1.1 christos resolved_to_zero, false))
3976 1.1.1.6 christos {
3977 1.1.1.6 christos Elf_Internal_Rela outrel;
3978 1.1 christos bool skip, relocate;
3979 1.1.1.6 christos bool generate_dynamic_reloc = true;
3980 1.1 christos asection *sreloc;
3981 1.1 christos const char *relative_reloc_name = NULL;
3982 1.1 christos
3983 1.1 christos /* When generating a shared object, these relocations
3984 1.1.1.6 christos are copied into the output file to be resolved at run
3985 1.1.1.6 christos time. */
3986 1.1 christos skip = false;
3987 1.1 christos relocate = false;
3988 1.1 christos
3989 1.1 christos outrel.r_offset =
3990 1.1 christos _bfd_elf_section_offset (output_bfd, info, input_section,
3991 1.1.1.6 christos rel->r_offset);
3992 1.1 christos if (outrel.r_offset == (bfd_vma) -1)
3993 1.1.1.6 christos skip = true;
3994 1.1 christos else if (outrel.r_offset == (bfd_vma) -2)
3995 1.1 christos skip = true, relocate = true;
3996 1.1 christos
3997 1.1 christos outrel.r_offset += (input_section->output_section->vma
3998 1.1 christos + input_section->output_offset);
3999 1.1 christos
4000 1.1 christos if (skip)
4001 1.1.1.6 christos memset (&outrel, 0, sizeof outrel);
4002 1.1 christos
4003 1.1 christos else if (COPY_INPUT_RELOC_P (true, info, h, r_type))
4004 1.1 christos {
4005 1.1 christos outrel.r_info = htab->r_info (h->dynindx, r_type);
4006 1.1 christos outrel.r_addend = rel->r_addend;
4007 1.1 christos }
4008 1.1.1.3 christos else
4009 1.1.1.3 christos {
4010 1.1.1.3 christos /* This symbol is local, or marked to become local.
4011 1.1.1.3 christos When relocation overflow check is disabled, we
4012 1.1.1.3 christos convert R_X86_64_32 to dynamic R_X86_64_RELATIVE. */
4013 1.1.1.5 christos if (r_type == htab->pointer_r_type
4014 1.1 christos || (r_type == R_X86_64_32
4015 1.1.1.6 christos && htab->params->no_reloc_overflow_check))
4016 1.1.1.6 christos {
4017 1.1.1.6 christos relocate = true;
4018 1.1.1.6 christos /* NB: Don't generate relative relocation here if
4019 1.1.1.6 christos it has been generated by DT_RELR. */
4020 1.1.1.6 christos if (info->enable_dt_relr)
4021 1.1.1.6 christos generate_dynamic_reloc = false;
4022 1.1.1.6 christos else
4023 1.1.1.6 christos {
4024 1.1.1.6 christos outrel.r_info =
4025 1.1.1.6 christos htab->r_info (0, R_X86_64_RELATIVE);
4026 1.1.1.6 christos outrel.r_addend = relocation + rel->r_addend;
4027 1.1 christos relative_reloc_name = "R_X86_64_RELATIVE";
4028 1.1 christos }
4029 1.1 christos }
4030 1.1 christos else if (r_type == R_X86_64_64
4031 1.1.1.6 christos && !ABI_64_P (output_bfd))
4032 1.1 christos {
4033 1.1 christos relocate = true;
4034 1.1 christos outrel.r_info = htab->r_info (0,
4035 1.1.1.6 christos R_X86_64_RELATIVE64);
4036 1.1 christos outrel.r_addend = relocation + rel->r_addend;
4037 1.1 christos relative_reloc_name = "R_X86_64_RELATIVE64";
4038 1.1 christos /* Check addend overflow. */
4039 1.1 christos if ((outrel.r_addend & 0x80000000)
4040 1.1 christos != (rel->r_addend & 0x80000000))
4041 1.1 christos {
4042 1.1 christos const char *name;
4043 1.1 christos int addend = rel->r_addend;
4044 1.1 christos if (h && h->root.root.string)
4045 1.1 christos name = h->root.root.string;
4046 1.1 christos else
4047 1.1.1.4 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr,
4048 1.1.1.4 christos sym, NULL);
4049 1.1.1.4 christos _bfd_error_handler
4050 1.1.1.4 christos /* xgettext:c-format */
4051 1.1.1.4 christos (_("%pB: addend %s%#x in relocation %s against "
4052 1.1.1.4 christos "symbol `%s' at %#" PRIx64
4053 1.1.1.4 christos " in section `%pA' is out of range"),
4054 1.1.1.4 christos input_bfd, addend < 0 ? "-" : "", addend,
4055 1.1 christos howto->name, name, (uint64_t) rel->r_offset,
4056 1.1.1.6 christos input_section);
4057 1.1 christos bfd_set_error (bfd_error_bad_value);
4058 1.1 christos return false;
4059 1.1 christos }
4060 1.1 christos }
4061 1.1 christos else
4062 1.1 christos {
4063 1.1 christos long sindx;
4064 1.1 christos
4065 1.1 christos if (bfd_is_abs_section (sec))
4066 1.1 christos sindx = 0;
4067 1.1 christos else if (sec == NULL || sec->owner == NULL)
4068 1.1.1.6 christos {
4069 1.1 christos bfd_set_error (bfd_error_bad_value);
4070 1.1 christos return false;
4071 1.1 christos }
4072 1.1 christos else
4073 1.1 christos {
4074 1.1 christos asection *osec;
4075 1.1 christos
4076 1.1 christos /* We are turning this relocation into one
4077 1.1 christos against a section symbol. It would be
4078 1.1 christos proper to subtract the symbol's value,
4079 1.1 christos osec->vma, from the emitted reloc addend,
4080 1.1 christos but ld.so expects buggy relocs. */
4081 1.1 christos osec = sec->output_section;
4082 1.1 christos sindx = elf_section_data (osec)->dynindx;
4083 1.1 christos if (sindx == 0)
4084 1.1 christos {
4085 1.1 christos asection *oi = htab->elf.text_index_section;
4086 1.1 christos sindx = elf_section_data (oi)->dynindx;
4087 1.1 christos }
4088 1.1 christos BFD_ASSERT (sindx != 0);
4089 1.1 christos }
4090 1.1 christos
4091 1.1 christos outrel.r_info = htab->r_info (sindx, r_type);
4092 1.1 christos outrel.r_addend = relocation + rel->r_addend;
4093 1.1 christos }
4094 1.1.1.6 christos }
4095 1.1 christos
4096 1.1.1.6 christos if (generate_dynamic_reloc)
4097 1.1 christos {
4098 1.1.1.6 christos sreloc = elf_section_data (input_section)->sreloc;
4099 1.1.1.6 christos
4100 1.1.1.6 christos if (sreloc == NULL || sreloc->contents == NULL)
4101 1.1.1.6 christos {
4102 1.1.1.6 christos r = bfd_reloc_notsupported;
4103 1.1.1.6 christos goto check_relocation_error;
4104 1.1.1.6 christos }
4105 1.1.1.6 christos
4106 1.1.1.6 christos if (relative_reloc_name
4107 1.1.1.6 christos && htab->params->report_relative_reloc)
4108 1.1.1.6 christos _bfd_x86_elf_link_report_relative_reloc
4109 1.1.1.6 christos (info, input_section, h, sym,
4110 1.1.1.6 christos relative_reloc_name, &outrel);
4111 1.1.1.6 christos
4112 1.1 christos elf_append_rela (output_bfd, sreloc, &outrel);
4113 1.1 christos }
4114 1.1 christos
4115 1.1 christos /* If this reloc is against an external symbol, we do
4116 1.1 christos not want to fiddle with the addend. Otherwise, we
4117 1.1 christos need to include the symbol value so that it becomes
4118 1.1 christos an addend for the dynamic reloc. */
4119 1.1 christos if (! relocate)
4120 1.1 christos continue;
4121 1.1 christos }
4122 1.1 christos
4123 1.1 christos break;
4124 1.1 christos
4125 1.1.1.7 christos case R_X86_64_TLSGD:
4126 1.1 christos case R_X86_64_GOTPC32_TLSDESC:
4127 1.1 christos case R_X86_64_CODE_4_GOTPC32_TLSDESC:
4128 1.1.1.7 christos case R_X86_64_TLSDESC_CALL:
4129 1.1.1.8 christos case R_X86_64_GOTTPOFF:
4130 1.1.1.8 christos case R_X86_64_CODE_4_GOTTPOFF:
4131 1.1 christos case R_X86_64_CODE_5_GOTTPOFF:
4132 1.1 christos case R_X86_64_CODE_6_GOTTPOFF:
4133 1.1.1.4 christos tls_type = GOT_UNKNOWN;
4134 1.1 christos if (h == NULL && local_got_offsets)
4135 1.1.1.4 christos tls_type = elf_x86_local_got_tls_type (input_bfd) [r_symndx];
4136 1.1 christos else if (h != NULL)
4137 1.1.1.4 christos tls_type = elf_x86_hash_entry (h)->tls_type;
4138 1.1 christos
4139 1.1 christos r_type_tls = r_type;
4140 1.1 christos if (! elf_x86_64_tls_transition (info, input_bfd,
4141 1.1.1.4 christos input_section, contents,
4142 1.1.1.8 christos symtab_hdr, sym_hashes,
4143 1.1.1.6 christos &r_type_tls, tls_type, rel,
4144 1.1 christos relend, h, sym, true))
4145 1.1.1.4 christos return false;
4146 1.1 christos
4147 1.1 christos if (r_type_tls == R_X86_64_TPOFF32)
4148 1.1 christos {
4149 1.1.1.7 christos bfd_vma roff = rel->r_offset;
4150 1.1.1.7 christos
4151 1.1.1.7 christos if (roff >= input_section->size)
4152 1.1 christos goto corrupt_input;
4153 1.1 christos
4154 1.1.1.4 christos BFD_ASSERT (! unresolved_reloc);
4155 1.1 christos
4156 1.1 christos if (r_type == R_X86_64_TLSGD)
4157 1.1.1.3 christos {
4158 1.1.1.3 christos /* GD->LE transition. For 64bit, change
4159 1.1.1.3 christos .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4160 1.1.1.3 christos .word 0x6666; rex64; call __tls_get_addr@PLT
4161 1.1.1.3 christos or
4162 1.1.1.3 christos .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4163 1.1.1.3 christos .byte 0x66; rex64
4164 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
4165 1.1 christos which may be converted to
4166 1.1.1.3 christos addr32 call __tls_get_addr
4167 1.1.1.3 christos into:
4168 1.1 christos movq %fs:0, %rax
4169 1.1.1.3 christos leaq foo@tpoff(%rax), %rax
4170 1.1.1.3 christos For 32bit, change
4171 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4172 1.1.1.3 christos .word 0x6666; rex64; call __tls_get_addr@PLT
4173 1.1.1.3 christos or
4174 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4175 1.1.1.3 christos .byte 0x66; rex64
4176 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
4177 1.1 christos which may be converted to
4178 1.1.1.3 christos addr32 call __tls_get_addr
4179 1.1.1.3 christos into:
4180 1.1.1.2 christos movl %fs:0, %eax
4181 1.1.1.3 christos leaq foo@tpoff(%rax), %rax
4182 1.1.1.3 christos For largepic, change:
4183 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4184 1.1.1.3 christos movabsq $__tls_get_addr@pltoff, %rax
4185 1.1.1.2 christos addq %r15, %rax
4186 1.1.1.3 christos call *%rax
4187 1.1.1.3 christos into:
4188 1.1.1.3 christos movq %fs:0, %rax
4189 1.1.1.2 christos leaq foo@tpoff(%rax), %rax
4190 1.1.1.3 christos nopw 0x0(%rax,%rax,1) */
4191 1.1.1.2 christos int largepic = 0;
4192 1.1.1.7 christos if (ABI_64_P (output_bfd))
4193 1.1.1.7 christos {
4194 1.1.1.3 christos if (roff + 5 >= input_section->size)
4195 1.1.1.3 christos goto corrupt_input;
4196 1.1.1.5 christos if (contents[roff + 5] == 0xb8)
4197 1.1.1.5 christos {
4198 1.1.1.5 christos if (roff < 3
4199 1.1.1.6 christos || (roff - 3 + 22) > input_section->size)
4200 1.1.1.8 christos {
4201 1.1.1.8 christos corrupt_input:
4202 1.1.1.5 christos info->callbacks->fatal
4203 1.1.1.6 christos (_("%P: corrupt input: %pB\n"),
4204 1.1.1.5 christos input_bfd);
4205 1.1.1.3 christos return false;
4206 1.1.1.3 christos }
4207 1.1.1.3 christos memcpy (contents + roff - 3,
4208 1.1.1.3 christos "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
4209 1.1.1.3 christos "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4210 1.1.1.3 christos largepic = 1;
4211 1.1.1.5 christos }
4212 1.1.1.5 christos else
4213 1.1.1.5 christos {
4214 1.1.1.5 christos if (roff < 4
4215 1.1.1.5 christos || (roff - 4 + 16) > input_section->size)
4216 1.1.1.5 christos goto corrupt_input;
4217 1.1.1.5 christos memcpy (contents + roff - 4,
4218 1.1.1.5 christos "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4219 1.1.1.2 christos 16);
4220 1.1 christos }
4221 1.1.1.5 christos }
4222 1.1.1.5 christos else
4223 1.1.1.5 christos {
4224 1.1.1.5 christos if (roff < 3
4225 1.1.1.5 christos || (roff - 3 + 15) > input_section->size)
4226 1.1.1.5 christos goto corrupt_input;
4227 1.1.1.5 christos memcpy (contents + roff - 3,
4228 1.1.1.5 christos "\x64\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
4229 1.1.1.7 christos 15);
4230 1.1.1.7 christos }
4231 1.1.1.7 christos
4232 1.1.1.7 christos if (roff + 8 + largepic >= input_section->size)
4233 1.1 christos goto corrupt_input;
4234 1.1 christos
4235 1.1.1.2 christos bfd_put_32 (output_bfd,
4236 1.1.1.3 christos elf_x86_64_tpoff (info, relocation),
4237 1.1.1.3 christos contents + roff + 8 + largepic);
4238 1.1 christos /* Skip R_X86_64_PC32, R_X86_64_PLT32,
4239 1.1.1.2 christos R_X86_64_GOTPCRELX and R_X86_64_PLTOFF64. */
4240 1.1 christos rel++;
4241 1.1 christos wrel++;
4242 1.1.1.4 christos continue;
4243 1.1 christos }
4244 1.1 christos else if (r_type == R_X86_64_GOTPC32_TLSDESC)
4245 1.1 christos {
4246 1.1.1.6 christos /* GDesc -> LE transition.
4247 1.1.1.6 christos It's originally something like:
4248 1.1 christos leaq x@tlsdesc(%rip), %rax <--- LP64 mode.
4249 1.1 christos rex leal x@tlsdesc(%rip), %eax <--- X32 mode.
4250 1.1.1.6 christos
4251 1.1.1.6 christos Change it to:
4252 1.1.1.6 christos movq $x@tpoff, %rax <--- LP64 mode.
4253 1.1 christos rex movl $x@tpoff, %eax <--- X32 mode.
4254 1.1 christos */
4255 1.1 christos
4256 1.1.1.5 christos unsigned int val, type;
4257 1.1.1.5 christos
4258 1.1 christos if (roff < 3)
4259 1.1 christos goto corrupt_input;
4260 1.1.1.6 christos type = bfd_get_8 (input_bfd, contents + roff - 3);
4261 1.1.1.6 christos val = bfd_get_8 (input_bfd, contents + roff - 1);
4262 1.1 christos bfd_put_8 (output_bfd,
4263 1.1 christos (type & 0x48) | ((type >> 2) & 1),
4264 1.1 christos contents + roff - 3);
4265 1.1 christos bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4266 1.1 christos bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4267 1.1 christos contents + roff - 1);
4268 1.1 christos bfd_put_32 (output_bfd,
4269 1.1 christos elf_x86_64_tpoff (info, relocation),
4270 1.1 christos contents + roff);
4271 1.1.1.7 christos continue;
4272 1.1.1.7 christos }
4273 1.1.1.7 christos else if (r_type == R_X86_64_CODE_4_GOTPC32_TLSDESC)
4274 1.1.1.7 christos {
4275 1.1.1.7 christos /* GDesc -> LE transition.
4276 1.1.1.7 christos It's originally something like:
4277 1.1.1.7 christos lea x@tlsdesc(%rip), %reg
4278 1.1.1.7 christos
4279 1.1.1.7 christos Change it to:
4280 1.1.1.7 christos mov $x@tpoff, %reg
4281 1.1.1.7 christos where reg is one of r16 to r31. */
4282 1.1.1.7 christos
4283 1.1.1.7 christos unsigned int val, rex2;
4284 1.1.1.7 christos unsigned int rex2_mask = REX_R | REX_R << 4;
4285 1.1.1.7 christos
4286 1.1.1.7 christos if (roff < 4)
4287 1.1.1.7 christos goto corrupt_input;
4288 1.1.1.7 christos rex2 = bfd_get_8 (input_bfd, contents + roff - 3);
4289 1.1.1.7 christos val = bfd_get_8 (input_bfd, contents + roff - 1);
4290 1.1.1.7 christos /* Move the R bits to the B bits in REX2 payload
4291 1.1.1.7 christos byte. */
4292 1.1.1.7 christos bfd_put_8 (output_bfd,
4293 1.1.1.7 christos ((rex2 & ~rex2_mask)
4294 1.1.1.7 christos | (rex2 & rex2_mask) >> 2),
4295 1.1.1.7 christos contents + roff - 3);
4296 1.1.1.7 christos bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4297 1.1.1.7 christos bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4298 1.1.1.7 christos contents + roff - 1);
4299 1.1.1.7 christos bfd_put_32 (output_bfd,
4300 1.1.1.7 christos elf_x86_64_tpoff (info, relocation),
4301 1.1.1.7 christos contents + roff);
4302 1.1.1.4 christos continue;
4303 1.1 christos }
4304 1.1 christos else if (r_type == R_X86_64_TLSDESC_CALL)
4305 1.1 christos {
4306 1.1.1.6 christos /* GDesc -> LE transition.
4307 1.1.1.6 christos It's originally:
4308 1.1 christos call *(%rax) <--- LP64 mode.
4309 1.1.1.6 christos call *(%eax) <--- X32 mode.
4310 1.1.1.6 christos Turn it into:
4311 1.1.1.6 christos xchg %ax,%ax <-- LP64 mode.
4312 1.1.1.6 christos nopl (%rax) <-- X32 mode.
4313 1.1.1.6 christos */
4314 1.1.1.6 christos unsigned int prefix = 0;
4315 1.1.1.8 christos if (!ABI_64_P (input_bfd))
4316 1.1.1.6 christos {
4317 1.1.1.6 christos /* Check for call *x@tlscall(%eax). */
4318 1.1.1.6 christos if (contents[roff] == 0x67)
4319 1.1.1.6 christos prefix = 1;
4320 1.1.1.6 christos }
4321 1.1.1.7 christos if (prefix)
4322 1.1.1.7 christos {
4323 1.1.1.7 christos if (roff + 2 >= input_section->size)
4324 1.1.1.6 christos goto corrupt_input;
4325 1.1.1.6 christos
4326 1.1.1.6 christos bfd_put_8 (output_bfd, 0x0f, contents + roff);
4327 1.1.1.6 christos bfd_put_8 (output_bfd, 0x1f, contents + roff + 1);
4328 1.1.1.6 christos bfd_put_8 (output_bfd, 0x00, contents + roff + 2);
4329 1.1.1.6 christos }
4330 1.1.1.7 christos else
4331 1.1.1.7 christos {
4332 1.1.1.7 christos if (roff + 1 >= input_section->size)
4333 1.1.1.6 christos goto corrupt_input;
4334 1.1.1.6 christos
4335 1.1.1.6 christos bfd_put_8 (output_bfd, 0x66, contents + roff);
4336 1.1 christos bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4337 1.1 christos }
4338 1.1.1.4 christos continue;
4339 1.1 christos }
4340 1.1 christos else if (r_type == R_X86_64_GOTTPOFF)
4341 1.1.1.2 christos {
4342 1.1 christos /* IE->LE transition:
4343 1.1 christos For 64bit, originally it can be one of:
4344 1.1 christos movq foo@gottpoff(%rip), %reg
4345 1.1 christos addq foo@gottpoff(%rip), %reg
4346 1.1 christos We change it into:
4347 1.1.1.2 christos movq $foo, %reg
4348 1.1.1.2 christos leaq foo(%reg), %reg
4349 1.1.1.2 christos addq $foo, %reg.
4350 1.1.1.2 christos For 32bit, originally it can be one of:
4351 1.1.1.2 christos movq foo@gottpoff(%rip), %reg
4352 1.1.1.2 christos addl foo@gottpoff(%rip), %reg
4353 1.1.1.2 christos We change it into:
4354 1.1.1.2 christos movq $foo, %reg
4355 1.1 christos leal foo(%reg), %reg
4356 1.1 christos addl $foo, %reg. */
4357 1.1 christos
4358 1.1.1.2 christos unsigned int val, type, reg;
4359 1.1.1.2 christos
4360 1.1.1.2 christos if (roff >= 3)
4361 1.1.1.5 christos val = bfd_get_8 (input_bfd, contents + roff - 3);
4362 1.1.1.5 christos else
4363 1.1.1.5 christos {
4364 1.1.1.5 christos if (roff < 2)
4365 1.1.1.5 christos goto corrupt_input;
4366 1.1 christos val = 0;
4367 1.1 christos }
4368 1.1 christos type = bfd_get_8 (input_bfd, contents + roff - 2);
4369 1.1 christos reg = bfd_get_8 (input_bfd, contents + roff - 1);
4370 1.1 christos reg >>= 3;
4371 1.1 christos if (type == 0x8b)
4372 1.1 christos {
4373 1.1.1.5 christos /* movq */
4374 1.1.1.5 christos if (val == 0x4c)
4375 1.1.1.5 christos {
4376 1.1.1.5 christos if (roff < 3)
4377 1.1.1.5 christos goto corrupt_input;
4378 1.1.1.5 christos bfd_put_8 (output_bfd, 0x49,
4379 1.1 christos contents + roff - 3);
4380 1.1.1.5 christos }
4381 1.1.1.5 christos else if (!ABI_64_P (output_bfd) && val == 0x44)
4382 1.1.1.5 christos {
4383 1.1.1.5 christos if (roff < 3)
4384 1.1.1.5 christos goto corrupt_input;
4385 1.1.1.5 christos bfd_put_8 (output_bfd, 0x41,
4386 1.1 christos contents + roff - 3);
4387 1.1 christos }
4388 1.1 christos bfd_put_8 (output_bfd, 0xc7,
4389 1.1 christos contents + roff - 2);
4390 1.1 christos bfd_put_8 (output_bfd, 0xc0 | reg,
4391 1.1 christos contents + roff - 1);
4392 1.1 christos }
4393 1.1.1.2 christos else if (reg == 4)
4394 1.1.1.2 christos {
4395 1.1 christos /* addq/addl -> addq/addl - addressing with %rsp/%r12
4396 1.1.1.5 christos is special */
4397 1.1.1.5 christos if (val == 0x4c)
4398 1.1.1.5 christos {
4399 1.1.1.5 christos if (roff < 3)
4400 1.1.1.5 christos goto corrupt_input;
4401 1.1.1.5 christos bfd_put_8 (output_bfd, 0x49,
4402 1.1 christos contents + roff - 3);
4403 1.1.1.5 christos }
4404 1.1.1.5 christos else if (!ABI_64_P (output_bfd) && val == 0x44)
4405 1.1.1.5 christos {
4406 1.1.1.5 christos if (roff < 3)
4407 1.1.1.5 christos goto corrupt_input;
4408 1.1.1.5 christos bfd_put_8 (output_bfd, 0x41,
4409 1.1 christos contents + roff - 3);
4410 1.1 christos }
4411 1.1 christos bfd_put_8 (output_bfd, 0x81,
4412 1.1 christos contents + roff - 2);
4413 1.1 christos bfd_put_8 (output_bfd, 0xc0 | reg,
4414 1.1 christos contents + roff - 1);
4415 1.1 christos }
4416 1.1.1.2 christos else
4417 1.1 christos {
4418 1.1.1.5 christos /* addq/addl -> leaq/leal */
4419 1.1.1.5 christos if (val == 0x4c)
4420 1.1.1.5 christos {
4421 1.1.1.5 christos if (roff < 3)
4422 1.1.1.5 christos goto corrupt_input;
4423 1.1.1.5 christos bfd_put_8 (output_bfd, 0x4d,
4424 1.1 christos contents + roff - 3);
4425 1.1.1.5 christos }
4426 1.1.1.5 christos else if (!ABI_64_P (output_bfd) && val == 0x44)
4427 1.1.1.5 christos {
4428 1.1.1.5 christos if (roff < 3)
4429 1.1.1.5 christos goto corrupt_input;
4430 1.1.1.5 christos bfd_put_8 (output_bfd, 0x45,
4431 1.1 christos contents + roff - 3);
4432 1.1 christos }
4433 1.1 christos bfd_put_8 (output_bfd, 0x8d,
4434 1.1 christos contents + roff - 2);
4435 1.1 christos bfd_put_8 (output_bfd, 0x80 | reg | (reg << 3),
4436 1.1 christos contents + roff - 1);
4437 1.1 christos }
4438 1.1 christos bfd_put_32 (output_bfd,
4439 1.1 christos elf_x86_64_tpoff (info, relocation),
4440 1.1 christos contents + roff);
4441 1.1.1.7 christos continue;
4442 1.1.1.7 christos }
4443 1.1.1.7 christos else if (r_type == R_X86_64_CODE_4_GOTTPOFF)
4444 1.1.1.7 christos {
4445 1.1.1.7 christos /* IE->LE transition:
4446 1.1.1.7 christos Originally it can be one of:
4447 1.1.1.8 christos mov foo@gottpoff(%rip), %reg
4448 1.1.1.7 christos add foo@gottpoff(%rip), %reg
4449 1.1.1.7 christos movrs foo@gottpoff(%rip), %reg
4450 1.1.1.7 christos We change it into:
4451 1.1.1.8 christos mov $foo@tpoff, %reg
4452 1.1.1.8 christos add $foo@tpoff, %reg
4453 1.1.1.7 christos where reg is one of r16 to r31, except for MOVRS, where
4454 1.1.1.7 christos it's not one of r8 to r31 and no REX byte is present. */
4455 1.1.1.7 christos
4456 1.1.1.7 christos unsigned int rex2, type, reg;
4457 1.1.1.7 christos unsigned int rex2_mask = REX_R | REX_R << 4;
4458 1.1.1.7 christos
4459 1.1.1.7 christos if (roff < 4)
4460 1.1.1.7 christos goto corrupt_input;
4461 1.1.1.7 christos
4462 1.1.1.7 christos rex2 = bfd_get_8 (input_bfd, contents + roff - 3);
4463 1.1.1.7 christos type = bfd_get_8 (input_bfd, contents + roff - 2);
4464 1.1.1.7 christos reg = bfd_get_8 (input_bfd, contents + roff - 1);
4465 1.1.1.7 christos reg >>= 3;
4466 1.1.1.7 christos /* Move the R bits to the B bits in REX2 payload
4467 1.1.1.8 christos byte. */
4468 1.1.1.8 christos if (type == 0x8b)
4469 1.1.1.8 christos {
4470 1.1.1.8 christos /* For MOVRS emit meaningless CS prefixes. */
4471 1.1.1.8 christos if (bfd_get_8 (input_bfd, contents + roff - 4) == 0x0f)
4472 1.1.1.8 christos {
4473 1.1.1.8 christos bfd_put_8 (output_bfd, 0x2e, contents + roff - 4);
4474 1.1.1.8 christos rex2 = 0x2e;
4475 1.1.1.8 christos rex2_mask = 0;
4476 1.1.1.8 christos }
4477 1.1.1.7 christos type = 0xc7;
4478 1.1.1.7 christos }
4479 1.1.1.7 christos else
4480 1.1.1.7 christos type = 0x81;
4481 1.1.1.7 christos bfd_put_8 (output_bfd,
4482 1.1.1.7 christos ((rex2 & ~rex2_mask)
4483 1.1.1.7 christos | (rex2 & rex2_mask) >> 2),
4484 1.1.1.7 christos contents + roff - 3);
4485 1.1.1.7 christos bfd_put_8 (output_bfd, type,
4486 1.1.1.7 christos contents + roff - 2);
4487 1.1.1.7 christos bfd_put_8 (output_bfd, 0xc0 | reg,
4488 1.1.1.7 christos contents + roff - 1);
4489 1.1.1.7 christos bfd_put_32 (output_bfd,
4490 1.1.1.7 christos elf_x86_64_tpoff (info, relocation),
4491 1.1.1.7 christos contents + roff);
4492 1.1.1.8 christos continue;
4493 1.1.1.8 christos }
4494 1.1.1.8 christos else if (r_type == R_X86_64_CODE_5_GOTTPOFF)
4495 1.1.1.8 christos {
4496 1.1.1.8 christos /* IE->LE transition:
4497 1.1.1.8 christos Originally it is
4498 1.1.1.8 christos movrs foo@gottpoff(%rip), %reg
4499 1.1.1.8 christos We change it into:
4500 1.1.1.8 christos mov $foo@tpoff, %reg
4501 1.1.1.8 christos where reg isn't one of r16 to r31, but a REX
4502 1.1.1.8 christos byte is present. */
4503 1.1.1.8 christos unsigned int rex = bfd_get_8 (input_bfd, contents + roff - 5);
4504 1.1.1.8 christos
4505 1.1.1.8 christos /* Move REX.R to REX.B. */
4506 1.1.1.8 christos rex = (rex & ~(REX_R | REX_B))
4507 1.1.1.8 christos | ((rex & REX_R) / (REX_R / REX_B));
4508 1.1.1.8 christos
4509 1.1.1.8 christos unsigned int reg = bfd_get_8 (input_bfd, contents + roff - 1);
4510 1.1.1.8 christos reg >>= 3;
4511 1.1.1.8 christos
4512 1.1.1.8 christos /* Replace 0f38 by meaningless CS prefixes, shifting the REX
4513 1.1.1.8 christos prefix forward. */
4514 1.1.1.8 christos bfd_put_8 (output_bfd, 0x2e, contents + roff - 5);
4515 1.1.1.8 christos bfd_put_8 (output_bfd, 0x2e, contents + roff - 4);
4516 1.1.1.8 christos bfd_put_8 (output_bfd, rex, contents + roff - 3);
4517 1.1.1.8 christos bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4518 1.1.1.8 christos bfd_put_8 (output_bfd, 0xc0 | reg, contents + roff - 1);
4519 1.1.1.8 christos
4520 1.1.1.8 christos bfd_put_32 (output_bfd,
4521 1.1.1.8 christos elf_x86_64_tpoff (info, relocation),
4522 1.1.1.8 christos contents + roff);
4523 1.1.1.8 christos continue;
4524 1.1.1.8 christos }
4525 1.1.1.8 christos else if (r_type == R_X86_64_CODE_6_GOTTPOFF)
4526 1.1.1.8 christos {
4527 1.1.1.8 christos /* IE->LE transition:
4528 1.1.1.8 christos Originally it is
4529 1.1.1.8 christos add %reg1, foo@gottpoff(%rip), %reg2
4530 1.1.1.8 christos or
4531 1.1.1.8 christos add foo@gottpoff(%rip), %reg1, %reg2
4532 1.1.1.8 christos or
4533 1.1.1.8 christos movrs foo@gottpoff(%rip), %reg
4534 1.1.1.8 christos We change it into:
4535 1.1.1.8 christos add $foo@tpoff, %reg1, %reg2
4536 1.1.1.8 christos mov $foo@tpoff, %reg
4537 1.1.1.8 christos where reg is one of r16 to r31. */
4538 1.1.1.8 christos unsigned int type, reg, byte1;
4539 1.1.1.8 christos
4540 1.1.1.8 christos if (roff < 6)
4541 1.1.1.8 christos goto corrupt_input;
4542 1.1.1.8 christos
4543 1.1.1.8 christos byte1 = bfd_get_8 (input_bfd, contents + roff - 5);
4544 1.1.1.8 christos type = bfd_get_8 (input_bfd, contents + roff - 2);
4545 1.1.1.8 christos reg = bfd_get_8 (input_bfd, contents + roff - 1);
4546 1.1.1.8 christos reg >>= 3;
4547 1.1.1.8 christos
4548 1.1.1.8 christos if (type == 0x8b)
4549 1.1.1.8 christos {
4550 1.1.1.8 christos /* Convert MOVRS to REX2-encoded MOV. */
4551 1.1.1.8 christos unsigned int rex2 = 0;
4552 1.1.1.8 christos
4553 1.1.1.8 christos /* Move the EVEX R bits to the REX2 B ones. */
4554 1.1.1.8 christos if (!(byte1 & (1 << 7)))
4555 1.1.1.8 christos rex2 |= REX_B;
4556 1.1.1.8 christos if (!(byte1 & (1 << 4)))
4557 1.1.1.8 christos rex2 |= REX_B << 4;
4558 1.1.1.8 christos /* Propagate the EVEX W bit to the REX2 one. */
4559 1.1.1.8 christos type = bfd_get_8 (input_bfd, contents + roff - 4);
4560 1.1.1.8 christos if (type & (1 << 7))
4561 1.1.1.8 christos rex2 |= REX_W;
4562 1.1.1.8 christos
4563 1.1.1.8 christos
4564 1.1.1.8 christos bfd_put_8 (output_bfd, 0x2e, contents + roff - 6);
4565 1.1.1.8 christos bfd_put_8 (output_bfd, 0x2e, contents + roff - 5);
4566 1.1.1.8 christos bfd_put_8 (output_bfd, 0xd5, contents + roff - 4);
4567 1.1.1.8 christos bfd_put_8 (output_bfd, rex2, contents + roff - 3);
4568 1.1.1.8 christos bfd_put_8 (output_bfd, 0xc7, contents + roff - 2);
4569 1.1.1.8 christos bfd_put_8 (output_bfd, 0xc0 | reg, contents + roff - 1);
4570 1.1.1.8 christos bfd_put_32 (output_bfd,
4571 1.1.1.8 christos elf_x86_64_tpoff (info, relocation),
4572 1.1.1.8 christos contents + roff);
4573 1.1.1.8 christos continue;
4574 1.1.1.8 christos }
4575 1.1.1.8 christos
4576 1.1.1.8 christos byte1 = evex_move_r_to_b (byte1, false);
4577 1.1.1.8 christos bfd_put_8 (output_bfd, byte1, contents + roff - 5);
4578 1.1.1.8 christos bfd_put_8 (output_bfd, 0x81, contents + roff - 2);
4579 1.1.1.8 christos bfd_put_8 (output_bfd, 0xc0 | reg, contents + roff - 1);
4580 1.1.1.8 christos bfd_put_32 (output_bfd,
4581 1.1.1.8 christos elf_x86_64_tpoff (info, relocation),
4582 1.1.1.8 christos contents + roff);
4583 1.1 christos continue;
4584 1.1.1.6 christos }
4585 1.1 christos else
4586 1.1 christos BFD_ASSERT (false);
4587 1.1 christos }
4588 1.1 christos
4589 1.1 christos if (htab->elf.sgot == NULL)
4590 1.1 christos abort ();
4591 1.1 christos
4592 1.1 christos if (h != NULL)
4593 1.1.1.4 christos {
4594 1.1 christos off = h->got.offset;
4595 1.1 christos offplt = elf_x86_hash_entry (h)->tlsdesc_got;
4596 1.1 christos }
4597 1.1 christos else
4598 1.1 christos {
4599 1.1 christos if (local_got_offsets == NULL)
4600 1.1 christos abort ();
4601 1.1 christos
4602 1.1 christos off = local_got_offsets[r_symndx];
4603 1.1 christos offplt = local_tlsdesc_gotents[r_symndx];
4604 1.1 christos }
4605 1.1 christos
4606 1.1 christos if ((off & 1) != 0)
4607 1.1 christos off &= ~1;
4608 1.1 christos else
4609 1.1 christos {
4610 1.1 christos Elf_Internal_Rela outrel;
4611 1.1 christos int dr_type, indx;
4612 1.1 christos asection *sreloc;
4613 1.1 christos
4614 1.1 christos if (htab->elf.srelgot == NULL)
4615 1.1 christos abort ();
4616 1.1 christos
4617 1.1 christos indx = h && h->dynindx != -1 ? h->dynindx : 0;
4618 1.1 christos
4619 1.1 christos if (GOT_TLS_GDESC_P (tls_type))
4620 1.1 christos {
4621 1.1 christos outrel.r_info = htab->r_info (indx, R_X86_64_TLSDESC);
4622 1.1 christos BFD_ASSERT (htab->sgotplt_jump_table_size + offplt
4623 1.1 christos + 2 * GOT_ENTRY_SIZE <= htab->elf.sgotplt->size);
4624 1.1 christos outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4625 1.1 christos + htab->elf.sgotplt->output_offset
4626 1.1 christos + offplt
4627 1.1 christos + htab->sgotplt_jump_table_size);
4628 1.1.1.4 christos sreloc = htab->elf.srelplt;
4629 1.1 christos if (indx == 0)
4630 1.1 christos outrel.r_addend = relocation - _bfd_x86_elf_dtpoff_base (info);
4631 1.1 christos else
4632 1.1 christos outrel.r_addend = 0;
4633 1.1 christos elf_append_rela (output_bfd, sreloc, &outrel);
4634 1.1 christos }
4635 1.1 christos
4636 1.1 christos sreloc = htab->elf.srelgot;
4637 1.1 christos
4638 1.1 christos outrel.r_offset = (htab->elf.sgot->output_section->vma
4639 1.1 christos + htab->elf.sgot->output_offset + off);
4640 1.1 christos
4641 1.1 christos if (GOT_TLS_GD_P (tls_type))
4642 1.1 christos dr_type = R_X86_64_DTPMOD64;
4643 1.1 christos else if (GOT_TLS_GDESC_P (tls_type))
4644 1.1 christos goto dr_done;
4645 1.1 christos else
4646 1.1 christos dr_type = R_X86_64_TPOFF64;
4647 1.1 christos
4648 1.1 christos bfd_put_64 (output_bfd, 0, htab->elf.sgot->contents + off);
4649 1.1 christos outrel.r_addend = 0;
4650 1.1.1.4 christos if ((dr_type == R_X86_64_TPOFF64
4651 1.1 christos || dr_type == R_X86_64_TLSDESC) && indx == 0)
4652 1.1 christos outrel.r_addend = relocation - _bfd_x86_elf_dtpoff_base (info);
4653 1.1 christos outrel.r_info = htab->r_info (indx, dr_type);
4654 1.1 christos
4655 1.1 christos elf_append_rela (output_bfd, sreloc, &outrel);
4656 1.1 christos
4657 1.1 christos if (GOT_TLS_GD_P (tls_type))
4658 1.1 christos {
4659 1.1 christos if (indx == 0)
4660 1.1 christos {
4661 1.1.1.4 christos BFD_ASSERT (! unresolved_reloc);
4662 1.1 christos bfd_put_64 (output_bfd,
4663 1.1 christos relocation - _bfd_x86_elf_dtpoff_base (info),
4664 1.1 christos htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4665 1.1 christos }
4666 1.1 christos else
4667 1.1 christos {
4668 1.1 christos bfd_put_64 (output_bfd, 0,
4669 1.1 christos htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4670 1.1 christos outrel.r_info = htab->r_info (indx,
4671 1.1 christos R_X86_64_DTPOFF64);
4672 1.1 christos outrel.r_offset += GOT_ENTRY_SIZE;
4673 1.1 christos elf_append_rela (output_bfd, sreloc,
4674 1.1 christos &outrel);
4675 1.1 christos }
4676 1.1 christos }
4677 1.1 christos
4678 1.1 christos dr_done:
4679 1.1 christos if (h != NULL)
4680 1.1 christos h->got.offset |= 1;
4681 1.1 christos else
4682 1.1 christos local_got_offsets[r_symndx] |= 1;
4683 1.1 christos }
4684 1.1 christos
4685 1.1 christos if (off >= (bfd_vma) -2
4686 1.1.1.4 christos && ! GOT_TLS_GDESC_P (tls_type))
4687 1.1 christos abort ();
4688 1.1 christos if (r_type_tls == r_type)
4689 1.1.1.7 christos {
4690 1.1 christos if (r_type == R_X86_64_GOTPC32_TLSDESC
4691 1.1 christos || r_type == R_X86_64_CODE_4_GOTPC32_TLSDESC
4692 1.1 christos || r_type == R_X86_64_TLSDESC_CALL)
4693 1.1 christos relocation = htab->elf.sgotplt->output_section->vma
4694 1.1 christos + htab->elf.sgotplt->output_offset
4695 1.1 christos + offplt + htab->sgotplt_jump_table_size;
4696 1.1 christos else
4697 1.1.1.6 christos relocation = htab->elf.sgot->output_section->vma
4698 1.1 christos + htab->elf.sgot->output_offset + off;
4699 1.1 christos unresolved_reloc = false;
4700 1.1 christos }
4701 1.1 christos else
4702 1.1 christos {
4703 1.1.1.4 christos bfd_vma roff = rel->r_offset;
4704 1.1 christos
4705 1.1 christos if (r_type == R_X86_64_TLSGD)
4706 1.1.1.3 christos {
4707 1.1.1.3 christos /* GD->IE transition. For 64bit, change
4708 1.1.1.3 christos .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4709 1.1.1.3 christos .word 0x6666; rex64; call __tls_get_addr@PLT
4710 1.1.1.3 christos or
4711 1.1.1.3 christos .byte 0x66; leaq foo@tlsgd(%rip), %rdi
4712 1.1.1.3 christos .byte 0x66; rex64
4713 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip
4714 1.1 christos which may be converted to
4715 1.1.1.3 christos addr32 call __tls_get_addr
4716 1.1.1.3 christos into:
4717 1.1 christos movq %fs:0, %rax
4718 1.1.1.3 christos addq foo@gottpoff(%rip), %rax
4719 1.1.1.3 christos For 32bit, change
4720 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4721 1.1.1.3 christos .word 0x6666; rex64; call __tls_get_addr@PLT
4722 1.1.1.3 christos or
4723 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4724 1.1.1.3 christos .byte 0x66; rex64;
4725 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
4726 1.1 christos which may be converted to
4727 1.1.1.3 christos addr32 call __tls_get_addr
4728 1.1.1.3 christos into:
4729 1.1.1.2 christos movl %fs:0, %eax
4730 1.1.1.3 christos addq foo@gottpoff(%rip), %rax
4731 1.1.1.3 christos For largepic, change:
4732 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4733 1.1.1.3 christos movabsq $__tls_get_addr@pltoff, %rax
4734 1.1.1.2 christos addq %r15, %rax
4735 1.1.1.3 christos call *%rax
4736 1.1.1.3 christos into:
4737 1.1.1.3 christos movq %fs:0, %rax
4738 1.1.1.2 christos addq foo@gottpoff(%rax), %rax
4739 1.1.1.3 christos nopw 0x0(%rax,%rax,1) */
4740 1.1.1.2 christos int largepic = 0;
4741 1.1.1.3 christos if (ABI_64_P (output_bfd))
4742 1.1.1.3 christos {
4743 1.1.1.5 christos if (contents[roff + 5] == 0xb8)
4744 1.1.1.5 christos {
4745 1.1.1.5 christos if (roff < 3
4746 1.1.1.3 christos || (roff - 3 + 22) > input_section->size)
4747 1.1.1.3 christos goto corrupt_input;
4748 1.1.1.3 christos memcpy (contents + roff - 3,
4749 1.1.1.3 christos "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
4750 1.1.1.3 christos "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
4751 1.1.1.3 christos largepic = 1;
4752 1.1.1.5 christos }
4753 1.1.1.5 christos else
4754 1.1.1.5 christos {
4755 1.1.1.5 christos if (roff < 4
4756 1.1.1.5 christos || (roff - 4 + 16) > input_section->size)
4757 1.1.1.5 christos goto corrupt_input;
4758 1.1.1.5 christos memcpy (contents + roff - 4,
4759 1.1.1.5 christos "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4760 1.1.1.2 christos 16);
4761 1.1 christos }
4762 1.1.1.5 christos }
4763 1.1.1.5 christos else
4764 1.1.1.5 christos {
4765 1.1.1.5 christos if (roff < 3
4766 1.1.1.5 christos || (roff - 3 + 15) > input_section->size)
4767 1.1.1.5 christos goto corrupt_input;
4768 1.1.1.5 christos memcpy (contents + roff - 3,
4769 1.1.1.5 christos "\x64\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
4770 1.1 christos 15);
4771 1.1 christos }
4772 1.1 christos
4773 1.1 christos relocation = (htab->elf.sgot->output_section->vma
4774 1.1.1.2 christos + htab->elf.sgot->output_offset + off
4775 1.1 christos - roff
4776 1.1 christos - largepic
4777 1.1 christos - input_section->output_section->vma
4778 1.1 christos - input_section->output_offset
4779 1.1.1.2 christos - 12);
4780 1.1.1.2 christos bfd_put_32 (output_bfd, relocation,
4781 1.1 christos contents + roff + 8 + largepic);
4782 1.1.1.2 christos /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64. */
4783 1.1 christos rel++;
4784 1.1 christos wrel++;
4785 1.1.1.7 christos continue;
4786 1.1.1.7 christos }
4787 1.1 christos else if (r_type == R_X86_64_GOTPC32_TLSDESC
4788 1.1 christos || r_type == R_X86_64_CODE_4_GOTPC32_TLSDESC)
4789 1.1 christos {
4790 1.1.1.6 christos /* GDesc -> IE transition.
4791 1.1.1.6 christos It's originally something like:
4792 1.1 christos leaq x@tlsdesc(%rip), %rax <--- LP64 mode.
4793 1.1 christos rex leal x@tlsdesc(%rip), %eax <--- X32 mode.
4794 1.1.1.6 christos
4795 1.1.1.6 christos Change it to:
4796 1.1.1.6 christos # before xchg %ax,%ax in LP64 mode.
4797 1.1.1.6 christos movq x@gottpoff(%rip), %rax
4798 1.1.1.6 christos # before nopl (%rax) in X32 mode.
4799 1.1 christos rex movl x@gottpoff(%rip), %eax
4800 1.1 christos */
4801 1.1.1.6 christos
4802 1.1 christos /* Now modify the instruction as appropriate. To
4803 1.1 christos turn a lea into a mov in the form we use it, it
4804 1.1.1.5 christos suffices to change the second byte from 0x8d to
4805 1.1.1.5 christos 0x8b. */
4806 1.1 christos if (roff < 2)
4807 1.1 christos goto corrupt_input;
4808 1.1 christos bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4809 1.1 christos
4810 1.1 christos bfd_put_32 (output_bfd,
4811 1.1 christos htab->elf.sgot->output_section->vma
4812 1.1 christos + htab->elf.sgot->output_offset + off
4813 1.1 christos - rel->r_offset
4814 1.1 christos - input_section->output_section->vma
4815 1.1 christos - input_section->output_offset
4816 1.1 christos - 4,
4817 1.1 christos contents + roff);
4818 1.1.1.4 christos continue;
4819 1.1 christos }
4820 1.1 christos else if (r_type == R_X86_64_TLSDESC_CALL)
4821 1.1 christos {
4822 1.1.1.6 christos /* GDesc -> IE transition.
4823 1.1.1.6 christos It's originally:
4824 1.1 christos call *(%rax) <--- LP64 mode.
4825 1.1 christos call *(%eax) <--- X32 mode.
4826 1.1.1.6 christos
4827 1.1.1.6 christos Change it to:
4828 1.1.1.6 christos xchg %ax, %ax <-- LP64 mode.
4829 1.1 christos nopl (%rax) <-- X32 mode.
4830 1.1.1.6 christos */
4831 1.1.1.6 christos
4832 1.1.1.6 christos unsigned int prefix = 0;
4833 1.1.1.8 christos if (!ABI_64_P (input_bfd))
4834 1.1.1.6 christos {
4835 1.1.1.6 christos /* Check for call *x@tlscall(%eax). */
4836 1.1.1.6 christos if (contents[roff] == 0x67)
4837 1.1.1.6 christos prefix = 1;
4838 1.1.1.6 christos }
4839 1.1.1.6 christos if (prefix)
4840 1.1.1.6 christos {
4841 1.1.1.6 christos bfd_put_8 (output_bfd, 0x0f, contents + roff);
4842 1.1.1.6 christos bfd_put_8 (output_bfd, 0x1f, contents + roff + 1);
4843 1.1.1.6 christos bfd_put_8 (output_bfd, 0x00, contents + roff + 2);
4844 1.1.1.6 christos }
4845 1.1.1.6 christos else
4846 1.1.1.6 christos {
4847 1.1.1.6 christos bfd_put_8 (output_bfd, 0x66, contents + roff);
4848 1.1 christos bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4849 1.1 christos }
4850 1.1 christos continue;
4851 1.1.1.6 christos }
4852 1.1 christos else
4853 1.1 christos BFD_ASSERT (false);
4854 1.1 christos }
4855 1.1 christos break;
4856 1.1 christos
4857 1.1 christos case R_X86_64_TLSLD:
4858 1.1 christos if (! elf_x86_64_tls_transition (info, input_bfd,
4859 1.1.1.3 christos input_section, contents,
4860 1.1.1.8 christos symtab_hdr, sym_hashes,
4861 1.1.1.6 christos &r_type, GOT_UNKNOWN, rel,
4862 1.1 christos relend, h, sym, true))
4863 1.1 christos return false;
4864 1.1 christos
4865 1.1 christos if (r_type != R_X86_64_TLSLD)
4866 1.1.1.3 christos {
4867 1.1.1.3 christos /* LD->LE transition:
4868 1.1.1.3 christos leaq foo@tlsld(%rip), %rdi
4869 1.1.1.3 christos call __tls_get_addr@PLT
4870 1.1.1.3 christos For 64bit, we change it into:
4871 1.1.1.3 christos .word 0x6666; .byte 0x66; movq %fs:0, %rax
4872 1.1.1.3 christos For 32bit, we change it into:
4873 1.1.1.3 christos nopl 0x0(%rax); movl %fs:0, %eax
4874 1.1.1.3 christos Or
4875 1.1.1.3 christos leaq foo@tlsld(%rip), %rdi;
4876 1.1.1.3 christos call *__tls_get_addr@GOTPCREL(%rip)
4877 1.1 christos which may be converted to
4878 1.1.1.3 christos addr32 call __tls_get_addr
4879 1.1 christos For 64bit, we change it into:
4880 1.1.1.3 christos .word 0x6666; .word 0x6666; movq %fs:0, %rax
4881 1.1.1.2 christos For 32bit, we change it into:
4882 1.1.1.3 christos nopw 0x0(%rax); movl %fs:0, %eax
4883 1.1.1.3 christos For largepic, change:
4884 1.1.1.3 christos leaq foo@tlsgd(%rip), %rdi
4885 1.1.1.3 christos movabsq $__tls_get_addr@pltoff, %rax
4886 1.1.1.3 christos addq %rbx, %rax
4887 1.1.1.3 christos call *%rax
4888 1.1.1.3 christos into
4889 1.1 christos data16 data16 data16 nopw %cs:0x0(%rax,%rax,1)
4890 1.1 christos movq %fs:0, %eax */
4891 1.1.1.3 christos
4892 1.1.1.3 christos BFD_ASSERT (r_type == R_X86_64_TPOFF32);
4893 1.1.1.5 christos if (ABI_64_P (output_bfd))
4894 1.1.1.5 christos {
4895 1.1.1.3 christos if ((rel->r_offset + 5) >= input_section->size)
4896 1.1.1.5 christos goto corrupt_input;
4897 1.1.1.5 christos if (contents[rel->r_offset + 5] == 0xb8)
4898 1.1.1.5 christos {
4899 1.1.1.5 christos if (rel->r_offset < 3
4900 1.1.1.5 christos || (rel->r_offset - 3 + 22) > input_section->size)
4901 1.1.1.5 christos goto corrupt_input;
4902 1.1.1.5 christos memcpy (contents + rel->r_offset - 3,
4903 1.1.1.5 christos "\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
4904 1.1.1.3 christos "\x64\x48\x8b\x04\x25\0\0\0", 22);
4905 1.1.1.3 christos }
4906 1.1.1.5 christos else if (contents[rel->r_offset + 4] == 0xff
4907 1.1.1.5 christos || contents[rel->r_offset + 4] == 0x67)
4908 1.1.1.5 christos {
4909 1.1.1.5 christos if (rel->r_offset < 3
4910 1.1.1.5 christos || (rel->r_offset - 3 + 13) > input_section->size)
4911 1.1.1.5 christos goto corrupt_input;
4912 1.1.1.5 christos memcpy (contents + rel->r_offset - 3,
4913 1.1.1.5 christos "\x66\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0",
4914 1.1.1.5 christos 13);
4915 1.1.1.3 christos
4916 1.1.1.5 christos }
4917 1.1.1.5 christos else
4918 1.1.1.5 christos {
4919 1.1.1.5 christos if (rel->r_offset < 3
4920 1.1.1.5 christos || (rel->r_offset - 3 + 12) > input_section->size)
4921 1.1.1.5 christos goto corrupt_input;
4922 1.1.1.5 christos memcpy (contents + rel->r_offset - 3,
4923 1.1.1.3 christos "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
4924 1.1 christos }
4925 1.1.1.3 christos }
4926 1.1.1.5 christos else
4927 1.1.1.5 christos {
4928 1.1.1.3 christos if ((rel->r_offset + 4) >= input_section->size)
4929 1.1.1.5 christos goto corrupt_input;
4930 1.1.1.5 christos if (contents[rel->r_offset + 4] == 0xff)
4931 1.1.1.5 christos {
4932 1.1.1.5 christos if (rel->r_offset < 3
4933 1.1.1.5 christos || (rel->r_offset - 3 + 13) > input_section->size)
4934 1.1.1.5 christos goto corrupt_input;
4935 1.1.1.5 christos memcpy (contents + rel->r_offset - 3,
4936 1.1.1.5 christos "\x66\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0",
4937 1.1.1.3 christos 13);
4938 1.1.1.5 christos }
4939 1.1.1.5 christos else
4940 1.1.1.5 christos {
4941 1.1.1.5 christos if (rel->r_offset < 3
4942 1.1.1.5 christos || (rel->r_offset - 3 + 12) > input_section->size)
4943 1.1.1.5 christos goto corrupt_input;
4944 1.1.1.5 christos memcpy (contents + rel->r_offset - 3,
4945 1.1.1.3 christos "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
4946 1.1.1.3 christos }
4947 1.1.1.3 christos }
4948 1.1 christos /* Skip R_X86_64_PC32, R_X86_64_PLT32, R_X86_64_GOTPCRELX
4949 1.1.1.2 christos and R_X86_64_PLTOFF64. */
4950 1.1 christos rel++;
4951 1.1 christos wrel++;
4952 1.1 christos continue;
4953 1.1 christos }
4954 1.1 christos
4955 1.1 christos if (htab->elf.sgot == NULL)
4956 1.1.1.4 christos abort ();
4957 1.1 christos
4958 1.1 christos off = htab->tls_ld_or_ldm_got.offset;
4959 1.1 christos if (off & 1)
4960 1.1 christos off &= ~1;
4961 1.1 christos else
4962 1.1 christos {
4963 1.1 christos Elf_Internal_Rela outrel;
4964 1.1 christos
4965 1.1 christos if (htab->elf.srelgot == NULL)
4966 1.1 christos abort ();
4967 1.1 christos
4968 1.1 christos outrel.r_offset = (htab->elf.sgot->output_section->vma
4969 1.1 christos + htab->elf.sgot->output_offset + off);
4970 1.1 christos
4971 1.1 christos bfd_put_64 (output_bfd, 0,
4972 1.1 christos htab->elf.sgot->contents + off);
4973 1.1 christos bfd_put_64 (output_bfd, 0,
4974 1.1 christos htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
4975 1.1 christos outrel.r_info = htab->r_info (0, R_X86_64_DTPMOD64);
4976 1.1 christos outrel.r_addend = 0;
4977 1.1.1.4 christos elf_append_rela (output_bfd, htab->elf.srelgot,
4978 1.1 christos &outrel);
4979 1.1 christos htab->tls_ld_or_ldm_got.offset |= 1;
4980 1.1 christos }
4981 1.1.1.6 christos relocation = htab->elf.sgot->output_section->vma
4982 1.1 christos + htab->elf.sgot->output_offset + off;
4983 1.1 christos unresolved_reloc = false;
4984 1.1 christos break;
4985 1.1.1.2 christos
4986 1.1.1.2 christos case R_X86_64_DTPOFF32:
4987 1.1.1.4 christos if (!bfd_link_executable (info)
4988 1.1 christos || (input_section->flags & SEC_CODE) == 0)
4989 1.1 christos relocation -= _bfd_x86_elf_dtpoff_base (info);
4990 1.1 christos else
4991 1.1 christos relocation = elf_x86_64_tpoff (info, relocation);
4992 1.1 christos break;
4993 1.1 christos
4994 1.1.1.2 christos case R_X86_64_TPOFF32:
4995 1.1 christos case R_X86_64_TPOFF64:
4996 1.1 christos BFD_ASSERT (bfd_link_executable (info));
4997 1.1 christos relocation = elf_x86_64_tpoff (info, relocation);
4998 1.1.1.2 christos break;
4999 1.1.1.2 christos
5000 1.1.1.4 christos case R_X86_64_DTPOFF64:
5001 1.1.1.2 christos BFD_ASSERT ((input_section->flags & SEC_CODE) == 0);
5002 1.1.1.2 christos relocation -= _bfd_x86_elf_dtpoff_base (info);
5003 1.1 christos break;
5004 1.1 christos
5005 1.1 christos default:
5006 1.1 christos break;
5007 1.1 christos }
5008 1.1 christos
5009 1.1 christos /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5010 1.1 christos because such sections are not SEC_ALLOC and thus ld.so will
5011 1.1 christos not process them. */
5012 1.1 christos if (unresolved_reloc
5013 1.1 christos && !((input_section->flags & SEC_DEBUGGING) != 0
5014 1.1 christos && h->def_dynamic)
5015 1.1 christos && _bfd_elf_section_offset (output_bfd, info, input_section,
5016 1.1.1.4 christos rel->r_offset) != (bfd_vma) -1)
5017 1.1.1.4 christos {
5018 1.1.1.4 christos switch (r_type)
5019 1.1.1.4 christos {
5020 1.1.1.6 christos case R_X86_64_32S:
5021 1.1.1.4 christos sec = h->root.u.def.section;
5022 1.1.1.4 christos if ((info->nocopyreloc || eh->def_protected)
5023 1.1.1.4 christos && !(h->root.u.def.section->flags & SEC_CODE))
5024 1.1.1.4 christos return elf_x86_64_need_pic (info, input_bfd, input_section,
5025 1.1.1.4 christos h, NULL, NULL, howto);
5026 1.1.1.4 christos /* Fall through. */
5027 1.1.1.4 christos
5028 1.1.1.4 christos default:
5029 1.1.1.4 christos _bfd_error_handler
5030 1.1.1.4 christos /* xgettext:c-format */
5031 1.1.1.4 christos (_("%pB(%pA+%#" PRIx64 "): "
5032 1.1.1.4 christos "unresolvable %s relocation against symbol `%s'"),
5033 1.1.1.4 christos input_bfd,
5034 1.1.1.4 christos input_section,
5035 1.1.1.4 christos (uint64_t) rel->r_offset,
5036 1.1.1.6 christos howto->name,
5037 1.1.1.4 christos h->root.root.string);
5038 1.1 christos return false;
5039 1.1 christos }
5040 1.1.1.6 christos }
5041 1.1 christos
5042 1.1 christos do_relocation:
5043 1.1 christos r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5044 1.1 christos contents, rel->r_offset,
5045 1.1.1.6 christos relocation, rel->r_addend);
5046 1.1 christos
5047 1.1 christos check_relocation_error:
5048 1.1 christos if (r != bfd_reloc_ok)
5049 1.1 christos {
5050 1.1 christos const char *name;
5051 1.1 christos
5052 1.1 christos if (h != NULL)
5053 1.1 christos name = h->root.root.string;
5054 1.1 christos else
5055 1.1 christos {
5056 1.1 christos name = bfd_elf_string_from_elf_section (input_bfd,
5057 1.1 christos symtab_hdr->sh_link,
5058 1.1.1.6 christos sym->st_name);
5059 1.1 christos if (name == NULL)
5060 1.1.1.5 christos return false;
5061 1.1 christos if (*name == '\0')
5062 1.1 christos name = bfd_section_name (sec);
5063 1.1 christos }
5064 1.1.1.4 christos
5065 1.1.1.4 christos if (r == bfd_reloc_overflow)
5066 1.1.1.4 christos {
5067 1.1.1.4 christos if (converted_reloc)
5068 1.1.1.6 christos {
5069 1.1.1.6 christos info->callbacks->einfo
5070 1.1.1.6 christos ("%X%H:", input_bfd, input_section, rel->r_offset);
5071 1.1.1.6 christos info->callbacks->einfo
5072 1.1.1.6 christos (_(" failed to convert GOTPCREL relocation against "
5073 1.1.1.6 christos "'%s'; relink with --no-relax\n"),
5074 1.1.1.6 christos name);
5075 1.1.1.4 christos status = false;
5076 1.1.1.4 christos continue;
5077 1.1.1.4 christos }
5078 1.1.1.4 christos (*info->callbacks->reloc_overflow)
5079 1.1.1.4 christos (info, (h ? &h->root : NULL), name, howto->name,
5080 1.1 christos (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
5081 1.1 christos }
5082 1.1.1.4 christos else
5083 1.1.1.4 christos {
5084 1.1.1.4 christos _bfd_error_handler
5085 1.1 christos /* xgettext:c-format */
5086 1.1.1.4 christos (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
5087 1.1.1.6 christos input_bfd, input_section,
5088 1.1 christos (uint64_t) rel->r_offset, name, (int) r);
5089 1.1 christos return false;
5090 1.1.1.2 christos }
5091 1.1.1.2 christos }
5092 1.1.1.2 christos
5093 1.1.1.2 christos if (wrel != rel)
5094 1.1.1.2 christos *wrel = *rel;
5095 1.1.1.2 christos }
5096 1.1.1.2 christos
5097 1.1.1.2 christos if (wrel != rel)
5098 1.1.1.2 christos {
5099 1.1.1.2 christos Elf_Internal_Shdr *rel_hdr;
5100 1.1.1.2 christos size_t deleted = rel - wrel;
5101 1.1.1.2 christos
5102 1.1.1.2 christos rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5103 1.1.1.2 christos rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5104 1.1.1.2 christos if (rel_hdr->sh_size == 0)
5105 1.1.1.2 christos {
5106 1.1.1.2 christos /* It is too late to remove an empty reloc section. Leave
5107 1.1.1.2 christos one NONE reloc.
5108 1.1.1.2 christos ??? What is wrong with an empty section??? */
5109 1.1.1.2 christos rel_hdr->sh_size = rel_hdr->sh_entsize;
5110 1.1.1.2 christos deleted -= 1;
5111 1.1.1.2 christos }
5112 1.1.1.2 christos rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5113 1.1 christos rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5114 1.1 christos input_section->reloc_count -= deleted;
5115 1.1.1.6 christos }
5116 1.1 christos
5117 1.1 christos return status;
5118 1.1 christos }
5119 1.1 christos
5120 1.1 christos /* Finish up dynamic symbol handling. We set the contents of various
5121 1.1.1.6 christos dynamic sections here. */
5122 1.1 christos
5123 1.1 christos static bool
5124 1.1 christos elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
5125 1.1.1.3 christos struct bfd_link_info *info,
5126 1.1 christos struct elf_link_hash_entry *h,
5127 1.1.1.4 christos Elf_Internal_Sym *sym)
5128 1.1.1.6 christos {
5129 1.1.1.4 christos struct elf_x86_link_hash_table *htab;
5130 1.1.1.6 christos bool use_plt_second;
5131 1.1 christos struct elf_x86_link_hash_entry *eh;
5132 1.1.1.4 christos bool local_undefweak;
5133 1.1 christos
5134 1.1.1.4 christos htab = elf_x86_hash_table (info, X86_64_ELF_DATA);
5135 1.1.1.4 christos
5136 1.1.1.2 christos /* Use the second PLT section only if there is .plt section. */
5137 1.1.1.4 christos use_plt_second = htab->elf.splt != NULL && htab->plt_second != NULL;
5138 1.1.1.4 christos
5139 1.1.1.4 christos eh = (struct elf_x86_link_hash_entry *) h;
5140 1.1.1.2 christos if (eh->no_finish_dynamic_symbol)
5141 1.1.1.3 christos abort ();
5142 1.1.1.3 christos
5143 1.1.1.3 christos /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5144 1.1.1.4 christos resolved undefined weak symbols in executable so that their
5145 1.1.1.3 christos references have value 0 at run-time. */
5146 1.1 christos local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
5147 1.1 christos
5148 1.1 christos if (h->plt.offset != (bfd_vma) -1)
5149 1.1.1.4 christos {
5150 1.1 christos bfd_vma plt_index;
5151 1.1 christos bfd_vma got_offset, plt_offset;
5152 1.1.1.2 christos Elf_Internal_Rela rela;
5153 1.1 christos bfd_byte *loc;
5154 1.1.1.2 christos asection *plt, *gotplt, *relplt, *resolved_plt;
5155 1.1 christos const struct elf_backend_data *bed;
5156 1.1 christos bfd_vma plt_got_pcrel_offset;
5157 1.1 christos
5158 1.1 christos /* When building a static executable, use .iplt, .igot.plt and
5159 1.1 christos .rela.iplt sections for STT_GNU_IFUNC symbols. */
5160 1.1 christos if (htab->elf.splt != NULL)
5161 1.1 christos {
5162 1.1 christos plt = htab->elf.splt;
5163 1.1 christos gotplt = htab->elf.sgotplt;
5164 1.1 christos relplt = htab->elf.srelplt;
5165 1.1 christos }
5166 1.1 christos else
5167 1.1 christos {
5168 1.1 christos plt = htab->elf.iplt;
5169 1.1 christos gotplt = htab->elf.igotplt;
5170 1.1 christos relplt = htab->elf.irelplt;
5171 1.1.1.4 christos }
5172 1.1 christos
5173 1.1 christos VERIFY_PLT_ENTRY (info, h, plt, gotplt, relplt, local_undefweak)
5174 1.1 christos
5175 1.1 christos /* Get the index in the procedure linkage table which
5176 1.1 christos corresponds to this symbol. This is the index of this symbol
5177 1.1 christos in all the symbols for which we are making plt entries. The
5178 1.1 christos first entry in the procedure linkage table is reserved.
5179 1.1 christos
5180 1.1 christos Get the offset into the .got table of the entry that
5181 1.1 christos corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
5182 1.1 christos bytes. The first three are reserved for the dynamic linker.
5183 1.1 christos
5184 1.1 christos For static executables, we don't reserve anything. */
5185 1.1 christos
5186 1.1.1.4 christos if (plt == htab->elf.splt)
5187 1.1.1.4 christos {
5188 1.1 christos got_offset = (h->plt.offset / htab->plt.plt_entry_size
5189 1.1 christos - htab->plt.has_plt0);
5190 1.1 christos got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
5191 1.1 christos }
5192 1.1.1.4 christos else
5193 1.1 christos {
5194 1.1 christos got_offset = h->plt.offset / htab->plt.plt_entry_size;
5195 1.1 christos got_offset = got_offset * GOT_ENTRY_SIZE;
5196 1.1.1.4 christos }
5197 1.1.1.4 christos
5198 1.1.1.4 christos /* Fill in the entry in the procedure linkage table. */
5199 1.1.1.4 christos memcpy (plt->contents + h->plt.offset, htab->plt.plt_entry,
5200 1.1.1.4 christos htab->plt.plt_entry_size);
5201 1.1.1.4 christos if (use_plt_second)
5202 1.1.1.4 christos {
5203 1.1.1.4 christos memcpy (htab->plt_second->contents + eh->plt_second.offset,
5204 1.1.1.2 christos htab->non_lazy_plt->plt_entry,
5205 1.1.1.4 christos htab->non_lazy_plt->plt_entry_size);
5206 1.1.1.4 christos
5207 1.1.1.2 christos resolved_plt = htab->plt_second;
5208 1.1.1.2 christos plt_offset = eh->plt_second.offset;
5209 1.1.1.2 christos }
5210 1.1.1.2 christos else
5211 1.1.1.2 christos {
5212 1.1.1.2 christos resolved_plt = plt;
5213 1.1 christos plt_offset = h->plt.offset;
5214 1.1 christos }
5215 1.1 christos
5216 1.1 christos /* Insert the relocation positions of the plt section. */
5217 1.1 christos
5218 1.1.1.2 christos /* Put offset the PC-relative instruction referring to the GOT entry,
5219 1.1.1.2 christos subtracting the size of that instruction. */
5220 1.1.1.2 christos plt_got_pcrel_offset = (gotplt->output_section->vma
5221 1.1.1.2 christos + gotplt->output_offset
5222 1.1.1.2 christos + got_offset
5223 1.1.1.2 christos - resolved_plt->output_section->vma
5224 1.1.1.4 christos - resolved_plt->output_offset
5225 1.1.1.2 christos - plt_offset
5226 1.1.1.2 christos - htab->plt.plt_got_insn_size);
5227 1.1.1.2 christos
5228 1.1.1.4 christos /* Check PC-relative offset overflow in PLT entry. */
5229 1.1.1.8 christos if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff)
5230 1.1.1.2 christos /* xgettext:c-format */
5231 1.1.1.2 christos info->callbacks->fatal (_("%pB: PC-relative offset overflow in PLT entry for `%s'\n"),
5232 1.1.1.2 christos output_bfd, h->root.root.string);
5233 1.1.1.4 christos
5234 1.1.1.4 christos bfd_put_32 (output_bfd, plt_got_pcrel_offset,
5235 1.1 christos (resolved_plt->contents + plt_offset
5236 1.1 christos + htab->plt.plt_got_offset));
5237 1.1.1.3 christos
5238 1.1.1.3 christos /* Fill in the entry in the global offset table, initially this
5239 1.1.1.3 christos points to the second part of the PLT entry. Leave the entry
5240 1.1.1.3 christos as zero for undefined weak symbol in PIE. No PLT relocation
5241 1.1.1.3 christos against undefined weak symbol in PIE. */
5242 1.1.1.4 christos if (!local_undefweak)
5243 1.1.1.4 christos {
5244 1.1.1.4 christos if (htab->plt.has_plt0)
5245 1.1.1.4 christos bfd_put_64 (output_bfd, (plt->output_section->vma
5246 1.1.1.4 christos + plt->output_offset
5247 1.1.1.4 christos + h->plt.offset
5248 1.1.1.3 christos + htab->lazy_plt->plt_lazy_offset),
5249 1.1.1.3 christos gotplt->contents + got_offset);
5250 1.1.1.3 christos
5251 1.1.1.3 christos /* Fill in the entry in the .rela.plt section. */
5252 1.1.1.3 christos rela.r_offset = (gotplt->output_section->vma
5253 1.1.1.4 christos + gotplt->output_offset
5254 1.1.1.3 christos + got_offset);
5255 1.1.1.8 christos if (PLT_LOCAL_IFUNC_P (info, h))
5256 1.1.1.8 christos {
5257 1.1.1.8 christos if (h->root.u.def.section == NULL)
5258 1.1.1.4 christos return false;
5259 1.1.1.4 christos
5260 1.1.1.4 christos info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
5261 1.1.1.4 christos h->root.root.string,
5262 1.1.1.3 christos h->root.u.def.section->owner);
5263 1.1.1.3 christos
5264 1.1.1.3 christos /* If an STT_GNU_IFUNC symbol is locally defined, generate
5265 1.1.1.3 christos R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT. */
5266 1.1.1.3 christos rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
5267 1.1.1.3 christos rela.r_addend = (h->root.u.def.value
5268 1.1.1.6 christos + h->root.u.def.section->output_section->vma
5269 1.1.1.6 christos + h->root.u.def.section->output_offset);
5270 1.1.1.6 christos
5271 1.1.1.6 christos if (htab->params->report_relative_reloc)
5272 1.1.1.6 christos _bfd_x86_elf_link_report_relative_reloc
5273 1.1.1.3 christos (info, relplt, h, sym, "R_X86_64_IRELATIVE", &rela);
5274 1.1.1.3 christos
5275 1.1.1.3 christos /* R_X86_64_IRELATIVE comes last. */
5276 1.1.1.3 christos plt_index = htab->next_irelative_index--;
5277 1.1.1.3 christos }
5278 1.1.1.3 christos else
5279 1.1.1.7 christos {
5280 1.1.1.7 christos rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
5281 1.1.1.7 christos if (htab->params->mark_plt)
5282 1.1.1.7 christos rela.r_addend = (resolved_plt->output_section->vma
5283 1.1.1.7 christos + plt_offset
5284 1.1.1.7 christos + htab->plt.plt_indirect_branch_offset);
5285 1.1.1.3 christos else
5286 1.1.1.3 christos rela.r_addend = 0;
5287 1.1.1.3 christos plt_index = htab->next_jump_slot_index++;
5288 1.1.1.4 christos }
5289 1.1.1.4 christos
5290 1.1.1.4 christos /* Don't fill the second and third slots in PLT entry for
5291 1.1.1.3 christos static executables nor without PLT0. */
5292 1.1.1.4 christos if (plt == htab->elf.splt && htab->plt.has_plt0)
5293 1.1.1.4 christos {
5294 1.1.1.3 christos bfd_vma plt0_offset
5295 1.1.1.3 christos = h->plt.offset + htab->lazy_plt->plt_plt_insn_end;
5296 1.1.1.3 christos
5297 1.1.1.3 christos /* Put relocation index. */
5298 1.1.1.4 christos bfd_put_32 (output_bfd, plt_index,
5299 1.1.1.3 christos (plt->contents + h->plt.offset
5300 1.1.1.3 christos + htab->lazy_plt->plt_reloc_offset));
5301 1.1.1.3 christos
5302 1.1.1.3 christos /* Put offset for jmp .PLT0 and check for overflow. We don't
5303 1.1.1.3 christos check relocation index for overflow since branch displacement
5304 1.1.1.4 christos will overflow first. */
5305 1.1.1.8 christos if (plt0_offset > 0x80000000)
5306 1.1.1.3 christos /* xgettext:c-format */
5307 1.1.1.3 christos info->callbacks->fatal (_("%pB: branch displacement overflow in PLT entry for `%s'\n"),
5308 1.1.1.4 christos output_bfd, h->root.root.string);
5309 1.1.1.4 christos bfd_put_32 (output_bfd, - plt0_offset,
5310 1.1.1.3 christos (plt->contents + h->plt.offset
5311 1.1.1.3 christos + htab->lazy_plt->plt_plt_offset));
5312 1.1.1.3 christos }
5313 1.1.1.3 christos
5314 1.1.1.3 christos bed = get_elf_backend_data (output_bfd);
5315 1.1 christos loc = relplt->contents + plt_index * bed->s->sizeof_rela;
5316 1.1.1.2 christos bed->s->swap_reloca_out (output_bfd, &rela, loc);
5317 1.1.1.2 christos }
5318 1.1.1.2 christos }
5319 1.1.1.4 christos else if (eh->plt_got.offset != (bfd_vma) -1)
5320 1.1.1.2 christos {
5321 1.1.1.6 christos bfd_vma got_offset, plt_offset;
5322 1.1.1.2 christos asection *plt, *got;
5323 1.1.1.2 christos bool got_after_plt;
5324 1.1.1.2 christos int32_t got_pcrel_offset;
5325 1.1.1.2 christos
5326 1.1.1.2 christos /* Set the entry in the GOT procedure linkage table. */
5327 1.1.1.2 christos plt = htab->plt_got;
5328 1.1 christos got = htab->elf.sgot;
5329 1.1.1.2 christos got_offset = h->got.offset;
5330 1.1.1.4 christos
5331 1.1.1.2 christos if (got_offset == (bfd_vma) -1
5332 1.1.1.2 christos || (h->type == STT_GNU_IFUNC && h->def_regular)
5333 1.1.1.2 christos || plt == NULL
5334 1.1.1.2 christos || got == NULL)
5335 1.1.1.4 christos abort ();
5336 1.1.1.2 christos
5337 1.1.1.2 christos /* Use the non-lazy PLT entry template for the GOT PLT since they
5338 1.1.1.2 christos are the identical. */
5339 1.1.1.2 christos /* Fill in the entry in the GOT procedure linkage table. */
5340 1.1.1.4 christos plt_offset = eh->plt_got.offset;
5341 1.1.1.4 christos memcpy (plt->contents + plt_offset,
5342 1.1.1.2 christos htab->non_lazy_plt->plt_entry,
5343 1.1.1.2 christos htab->non_lazy_plt->plt_entry_size);
5344 1.1.1.2 christos
5345 1.1.1.2 christos /* Put offset the PC-relative instruction referring to the GOT
5346 1.1.1.2 christos entry, subtracting the size of that instruction. */
5347 1.1.1.2 christos got_pcrel_offset = (got->output_section->vma
5348 1.1.1.2 christos + got->output_offset
5349 1.1.1.2 christos + got_offset
5350 1.1.1.2 christos - plt->output_section->vma
5351 1.1.1.4 christos - plt->output_offset
5352 1.1.1.2 christos - plt_offset
5353 1.1.1.2 christos - htab->non_lazy_plt->plt_got_insn_size);
5354 1.1.1.2 christos
5355 1.1.1.2 christos /* Check PC-relative offset overflow in GOT PLT entry. */
5356 1.1.1.2 christos got_after_plt = got->output_section->vma > plt->output_section->vma;
5357 1.1.1.4 christos if ((got_after_plt && got_pcrel_offset < 0)
5358 1.1.1.8 christos || (!got_after_plt && got_pcrel_offset > 0))
5359 1.1.1.2 christos /* xgettext:c-format */
5360 1.1.1.2 christos info->callbacks->fatal (_("%pB: PC-relative offset overflow in GOT PLT entry for `%s'\n"),
5361 1.1.1.2 christos output_bfd, h->root.root.string);
5362 1.1.1.4 christos
5363 1.1.1.4 christos bfd_put_32 (output_bfd, got_pcrel_offset,
5364 1.1.1.2 christos (plt->contents + plt_offset
5365 1.1.1.2 christos + htab->non_lazy_plt->plt_got_offset));
5366 1.1.1.3 christos }
5367 1.1.1.3 christos
5368 1.1.1.2 christos if (!local_undefweak
5369 1.1.1.2 christos && !h->def_regular
5370 1.1.1.2 christos && (h->plt.offset != (bfd_vma) -1
5371 1.1.1.2 christos || eh->plt_got.offset != (bfd_vma) -1))
5372 1.1.1.2 christos {
5373 1.1.1.2 christos /* Mark the symbol as undefined, rather than as defined in
5374 1.1.1.2 christos the .plt section. Leave the value if there were any
5375 1.1.1.2 christos relocations where pointer equality matters (this is a clue
5376 1.1.1.2 christos for the dynamic linker, to make function pointer
5377 1.1.1.2 christos comparisons work between an application and shared
5378 1.1.1.2 christos library), otherwise set it to zero. If a function is only
5379 1.1.1.2 christos called from a binary, there is no need to slow down
5380 1.1.1.2 christos shared libraries because of that. */
5381 1.1.1.2 christos sym->st_shndx = SHN_UNDEF;
5382 1.1 christos if (!h->pointer_equality_needed)
5383 1.1 christos sym->st_value = 0;
5384 1.1.1.4 christos }
5385 1.1.1.4 christos
5386 1.1.1.3 christos _bfd_x86_elf_link_fixup_ifunc_symbol (info, htab, h, sym);
5387 1.1.1.3 christos
5388 1.1 christos /* Don't generate dynamic GOT relocation against undefined weak
5389 1.1.1.4 christos symbol in executable. */
5390 1.1.1.4 christos if (h->got.offset != (bfd_vma) -1
5391 1.1.1.3 christos && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry (h)->tls_type)
5392 1.1 christos && elf_x86_hash_entry (h)->tls_type != GOT_TLS_IE
5393 1.1 christos && !local_undefweak)
5394 1.1.1.3 christos {
5395 1.1.1.6 christos Elf_Internal_Rela rela;
5396 1.1.1.6 christos asection *relgot = htab->elf.srelgot;
5397 1.1 christos const char *relative_reloc_name = NULL;
5398 1.1 christos bool generate_dynamic_reloc = true;
5399 1.1 christos
5400 1.1 christos /* This symbol has an entry in the global offset table. Set it
5401 1.1 christos up. */
5402 1.1 christos if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5403 1.1 christos abort ();
5404 1.1 christos
5405 1.1 christos rela.r_offset = (htab->elf.sgot->output_section->vma
5406 1.1 christos + htab->elf.sgot->output_offset
5407 1.1 christos + (h->got.offset &~ (bfd_vma) 1));
5408 1.1 christos
5409 1.1 christos /* If this is a static link, or it is a -Bsymbolic link and the
5410 1.1 christos symbol is defined locally or was forced to be local because
5411 1.1 christos of a version file, we just want to emit a RELATIVE reloc.
5412 1.1 christos The entry in the global offset table will already have been
5413 1.1 christos initialized in the relocate_section function. */
5414 1.1 christos if (h->def_regular
5415 1.1.1.3 christos && h->type == STT_GNU_IFUNC)
5416 1.1.1.3 christos {
5417 1.1.1.3 christos if (h->plt.offset == (bfd_vma) -1)
5418 1.1.1.3 christos {
5419 1.1.1.3 christos /* STT_GNU_IFUNC is referenced without PLT. */
5420 1.1.1.3 christos if (htab->elf.splt == NULL)
5421 1.1.1.3 christos {
5422 1.1.1.3 christos /* use .rel[a].iplt section to store .got relocations
5423 1.1.1.3 christos in static executable. */
5424 1.1.1.4 christos relgot = htab->elf.irelplt;
5425 1.1.1.3 christos }
5426 1.1.1.8 christos if (SYMBOL_REFERENCES_LOCAL_P (info, h))
5427 1.1.1.8 christos {
5428 1.1.1.8 christos if (h->root.u.def.section == NULL)
5429 1.1.1.4 christos return false;
5430 1.1.1.4 christos
5431 1.1.1.4 christos info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
5432 1.1.1.4 christos h->root.root.string,
5433 1.1.1.3 christos h->root.u.def.section->owner);
5434 1.1.1.3 christos
5435 1.1.1.3 christos rela.r_info = htab->r_info (0,
5436 1.1.1.3 christos R_X86_64_IRELATIVE);
5437 1.1.1.3 christos rela.r_addend = (h->root.u.def.value
5438 1.1.1.6 christos + h->root.u.def.section->output_section->vma
5439 1.1.1.3 christos + h->root.u.def.section->output_offset);
5440 1.1.1.3 christos relative_reloc_name = "R_X86_64_IRELATIVE";
5441 1.1.1.3 christos }
5442 1.1.1.3 christos else
5443 1.1.1.3 christos goto do_glob_dat;
5444 1.1 christos }
5445 1.1 christos else if (bfd_link_pic (info))
5446 1.1 christos {
5447 1.1 christos /* Generate R_X86_64_GLOB_DAT. */
5448 1.1 christos goto do_glob_dat;
5449 1.1 christos }
5450 1.1 christos else
5451 1.1.1.4 christos {
5452 1.1 christos asection *plt;
5453 1.1 christos bfd_vma plt_offset;
5454 1.1 christos
5455 1.1 christos if (!h->pointer_equality_needed)
5456 1.1 christos abort ();
5457 1.1 christos
5458 1.1 christos /* For non-shared object, we can't use .got.plt, which
5459 1.1.1.4 christos contains the real function addres if we need pointer
5460 1.1.1.4 christos equality. We load the GOT entry with the PLT entry. */
5461 1.1.1.4 christos if (htab->plt_second != NULL)
5462 1.1.1.4 christos {
5463 1.1.1.4 christos plt = htab->plt_second;
5464 1.1.1.4 christos plt_offset = eh->plt_second.offset;
5465 1.1.1.4 christos }
5466 1.1.1.4 christos else
5467 1.1.1.4 christos {
5468 1.1.1.4 christos plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5469 1.1 christos plt_offset = h->plt.offset;
5470 1.1 christos }
5471 1.1.1.4 christos bfd_put_64 (output_bfd, (plt->output_section->vma
5472 1.1 christos + plt->output_offset
5473 1.1.1.6 christos + plt_offset),
5474 1.1 christos htab->elf.sgot->contents + h->got.offset);
5475 1.1 christos return true;
5476 1.1.1.2 christos }
5477 1.1.1.4 christos }
5478 1.1 christos else if (bfd_link_pic (info)
5479 1.1.1.5 christos && SYMBOL_REFERENCES_LOCAL_P (info, h))
5480 1.1.1.6 christos {
5481 1.1 christos if (!SYMBOL_DEFINED_NON_SHARED_P (h))
5482 1.1.1.6 christos return false;
5483 1.1.1.6 christos BFD_ASSERT((h->got.offset & 1) != 0);
5484 1.1.1.6 christos if (info->enable_dt_relr)
5485 1.1.1.6 christos generate_dynamic_reloc = false;
5486 1.1.1.6 christos else
5487 1.1.1.6 christos {
5488 1.1.1.6 christos rela.r_info = htab->r_info (0, R_X86_64_RELATIVE);
5489 1.1.1.6 christos rela.r_addend = (h->root.u.def.value
5490 1.1.1.6 christos + h->root.u.def.section->output_section->vma
5491 1.1.1.6 christos + h->root.u.def.section->output_offset);
5492 1.1 christos relative_reloc_name = "R_X86_64_RELATIVE";
5493 1.1 christos }
5494 1.1 christos }
5495 1.1 christos else
5496 1.1.1.6 christos {
5497 1.1 christos BFD_ASSERT((h->got.offset & 1) == 0);
5498 1.1 christos do_glob_dat:
5499 1.1 christos bfd_put_64 (output_bfd, (bfd_vma) 0,
5500 1.1 christos htab->elf.sgot->contents + h->got.offset);
5501 1.1 christos rela.r_info = htab->r_info (h->dynindx, R_X86_64_GLOB_DAT);
5502 1.1 christos rela.r_addend = 0;
5503 1.1.1.6 christos }
5504 1.1.1.6 christos
5505 1.1.1.8 christos if (generate_dynamic_reloc)
5506 1.1.1.8 christos {
5507 1.1.1.8 christos /* If the relgot section has not been created, then
5508 1.1.1.8 christos generate an error instead of a reloc. cf PR 32638. */
5509 1.1.1.8 christos if (relgot == NULL || relgot->size == 0)
5510 1.1.1.8 christos {
5511 1.1.1.8 christos info->callbacks->fatal (_("%pB: Unable to generate dynamic relocs because a suitable section does not exist\n"),
5512 1.1.1.8 christos output_bfd);
5513 1.1.1.8 christos return false;
5514 1.1.1.6 christos }
5515 1.1.1.6 christos
5516 1.1.1.6 christos if (relative_reloc_name != NULL
5517 1.1.1.6 christos && htab->params->report_relative_reloc)
5518 1.1.1.6 christos _bfd_x86_elf_link_report_relative_reloc
5519 1.1.1.6 christos (info, relgot, h, sym, relative_reloc_name, &rela);
5520 1.1.1.6 christos
5521 1.1 christos elf_append_rela (output_bfd, relgot, &rela);
5522 1.1 christos }
5523 1.1 christos }
5524 1.1 christos
5525 1.1 christos if (h->needs_copy)
5526 1.1.1.4 christos {
5527 1.1 christos Elf_Internal_Rela rela;
5528 1.1 christos asection *s;
5529 1.1.1.4 christos
5530 1.1 christos /* This symbol needs a copy reloc. Set it up. */
5531 1.1 christos VERIFY_COPY_RELOC (h, htab)
5532 1.1 christos
5533 1.1 christos rela.r_offset = (h->root.u.def.value
5534 1.1 christos + h->root.u.def.section->output_section->vma
5535 1.1 christos + h->root.u.def.section->output_offset);
5536 1.1.1.4 christos rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
5537 1.1.1.4 christos rela.r_addend = 0;
5538 1.1.1.4 christos if (h->root.u.def.section == htab->elf.sdynrelro)
5539 1.1.1.4 christos s = htab->elf.sreldynrelro;
5540 1.1.1.4 christos else
5541 1.1 christos s = htab->elf.srelbss;
5542 1.1 christos elf_append_rela (output_bfd, s, &rela);
5543 1.1.1.6 christos }
5544 1.1 christos
5545 1.1 christos return true;
5546 1.1 christos }
5547 1.1 christos
5548 1.1 christos /* Finish up local dynamic symbol handling. We set the contents of
5549 1.1.1.6 christos various dynamic sections here. */
5550 1.1 christos
5551 1.1 christos static int
5552 1.1 christos elf_x86_64_finish_local_dynamic_symbol (void **slot, void *inf)
5553 1.1 christos {
5554 1.1 christos struct elf_link_hash_entry *h
5555 1.1 christos = (struct elf_link_hash_entry *) *slot;
5556 1.1 christos struct bfd_link_info *info
5557 1.1 christos = (struct bfd_link_info *) inf;
5558 1.1.1.4 christos
5559 1.1 christos return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5560 1.1 christos info, h, NULL);
5561 1.1.1.3 christos }
5562 1.1.1.3 christos
5563 1.1.1.3 christos /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry
5564 1.1.1.3 christos here since undefined weak symbol may not be dynamic and may not be
5565 1.1.1.6 christos called for elf_x86_64_finish_dynamic_symbol. */
5566 1.1.1.3 christos
5567 1.1.1.3 christos static bool
5568 1.1.1.3 christos elf_x86_64_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5569 1.1.1.3 christos void *inf)
5570 1.1.1.3 christos {
5571 1.1.1.3 christos struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5572 1.1.1.3 christos struct bfd_link_info *info = (struct bfd_link_info *) inf;
5573 1.1.1.3 christos
5574 1.1.1.6 christos if (h->root.type != bfd_link_hash_undefweak
5575 1.1.1.3 christos || h->dynindx != -1)
5576 1.1.1.3 christos return true;
5577 1.1.1.4 christos
5578 1.1.1.3 christos return elf_x86_64_finish_dynamic_symbol (info->output_bfd,
5579 1.1.1.3 christos info, h, NULL);
5580 1.1 christos }
5581 1.1 christos
5582 1.1 christos /* Used to decide how to sort relocs in an optimal manner for the
5583 1.1 christos dynamic linker, before writing them out. */
5584 1.1.1.2 christos
5585 1.1.1.2 christos static enum elf_reloc_type_class
5586 1.1.1.2 christos elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
5587 1.1 christos const asection *rel_sec ATTRIBUTE_UNUSED,
5588 1.1.1.2 christos const Elf_Internal_Rela *rela)
5589 1.1.1.2 christos {
5590 1.1.1.4 christos bfd *abfd = info->output_bfd;
5591 1.1.1.4 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5592 1.1.1.2 christos struct elf_x86_link_hash_table *htab
5593 1.1.1.2 christos = elf_x86_hash_table (info, X86_64_ELF_DATA);
5594 1.1.1.2 christos
5595 1.1.1.2 christos if (htab->elf.dynsym != NULL
5596 1.1.1.2 christos && htab->elf.dynsym->contents != NULL)
5597 1.1.1.4 christos {
5598 1.1.1.2 christos /* Check relocation against STT_GNU_IFUNC symbol if there are
5599 1.1.1.3 christos dynamic symbols. */
5600 1.1.1.3 christos unsigned long r_symndx = htab->r_sym (rela->r_info);
5601 1.1.1.3 christos if (r_symndx != STN_UNDEF)
5602 1.1.1.3 christos {
5603 1.1.1.3 christos Elf_Internal_Sym sym;
5604 1.1.1.3 christos if (!bed->s->swap_symbol_in (abfd,
5605 1.1.1.3 christos (htab->elf.dynsym->contents
5606 1.1.1.3 christos + r_symndx * bed->s->sizeof_sym),
5607 1.1.1.2 christos 0, &sym))
5608 1.1.1.3 christos abort ();
5609 1.1.1.3 christos
5610 1.1.1.3 christos if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5611 1.1.1.2 christos return reloc_class_ifunc;
5612 1.1.1.2 christos }
5613 1.1 christos }
5614 1.1 christos
5615 1.1.1.3 christos switch ((int) ELF32_R_TYPE (rela->r_info))
5616 1.1.1.3 christos {
5617 1.1 christos case R_X86_64_IRELATIVE:
5618 1.1 christos return reloc_class_ifunc;
5619 1.1 christos case R_X86_64_RELATIVE:
5620 1.1 christos case R_X86_64_RELATIVE64:
5621 1.1 christos return reloc_class_relative;
5622 1.1 christos case R_X86_64_JUMP_SLOT:
5623 1.1 christos return reloc_class_plt;
5624 1.1 christos case R_X86_64_COPY:
5625 1.1 christos return reloc_class_copy;
5626 1.1 christos default:
5627 1.1 christos return reloc_class_normal;
5628 1.1 christos }
5629 1.1 christos }
5630 1.1 christos
5631 1.1.1.6 christos /* Finish up the dynamic sections. */
5632 1.1 christos
5633 1.1 christos static bool
5634 1.1 christos elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
5635 1.1.1.4 christos struct bfd_link_info *info)
5636 1.1 christos {
5637 1.1.1.4 christos struct elf_x86_link_hash_table *htab;
5638 1.1 christos
5639 1.1.1.6 christos htab = _bfd_x86_elf_finish_dynamic_sections (output_bfd, info);
5640 1.1 christos if (htab == NULL)
5641 1.1.1.4 christos return false;
5642 1.1.1.6 christos
5643 1.1 christos if (! htab->elf.dynamic_sections_created)
5644 1.1.1.4 christos return true;
5645 1.1 christos
5646 1.1.1.6 christos if (htab->elf.splt && htab->elf.splt->size > 0)
5647 1.1.1.6 christos {
5648 1.1.1.8 christos if (bfd_is_abs_section (htab->elf.splt->output_section))
5649 1.1.1.8 christos {
5650 1.1.1.6 christos info->callbacks->fatal
5651 1.1.1.6 christos (_("%P: discarded output section: `%pA'\n"),
5652 1.1.1.6 christos htab->elf.splt);
5653 1.1.1.6 christos return false;
5654 1.1.1.4 christos }
5655 1.1.1.4 christos
5656 1.1 christos elf_section_data (htab->elf.splt->output_section)
5657 1.1.1.4 christos ->this_hdr.sh_entsize = htab->plt.plt_entry_size;
5658 1.1 christos
5659 1.1.1.4 christos if (htab->plt.has_plt0)
5660 1.1.1.4 christos {
5661 1.1 christos /* Fill in the special first entry in the procedure linkage
5662 1.1.1.4 christos table. */
5663 1.1.1.4 christos memcpy (htab->elf.splt->contents,
5664 1.1 christos htab->lazy_plt->plt0_entry,
5665 1.1 christos htab->lazy_plt->plt0_entry_size);
5666 1.1 christos /* Add offset for pushq GOT+8(%rip), since the instruction
5667 1.1 christos uses 6 bytes subtract this value. */
5668 1.1 christos bfd_put_32 (output_bfd,
5669 1.1 christos (htab->elf.sgotplt->output_section->vma
5670 1.1 christos + htab->elf.sgotplt->output_offset
5671 1.1 christos + 8
5672 1.1 christos - htab->elf.splt->output_section->vma
5673 1.1.1.4 christos - htab->elf.splt->output_offset
5674 1.1.1.4 christos - 6),
5675 1.1.1.4 christos (htab->elf.splt->contents
5676 1.1.1.4 christos + htab->lazy_plt->plt0_got1_offset));
5677 1.1.1.4 christos /* Add offset for the PC-relative instruction accessing
5678 1.1 christos GOT+16, subtracting the offset to the end of that
5679 1.1 christos instruction. */
5680 1.1 christos bfd_put_32 (output_bfd,
5681 1.1 christos (htab->elf.sgotplt->output_section->vma
5682 1.1 christos + htab->elf.sgotplt->output_offset
5683 1.1 christos + 16
5684 1.1.1.4 christos - htab->elf.splt->output_section->vma
5685 1.1.1.4 christos - htab->elf.splt->output_offset
5686 1.1.1.4 christos - htab->lazy_plt->plt0_got2_insn_end),
5687 1.1 christos (htab->elf.splt->contents
5688 1.1 christos + htab->lazy_plt->plt0_got2_offset));
5689 1.1.1.6 christos }
5690 1.1 christos
5691 1.1.1.4 christos if (htab->elf.tlsdesc_plt)
5692 1.1.1.6 christos {
5693 1.1 christos bfd_put_64 (output_bfd, (bfd_vma) 0,
5694 1.1.1.6 christos htab->elf.sgot->contents + htab->elf.tlsdesc_got);
5695 1.1.1.4 christos
5696 1.1.1.4 christos memcpy (htab->elf.splt->contents + htab->elf.tlsdesc_plt,
5697 1.1.1.4 christos htab->lazy_plt->plt_tlsdesc_entry,
5698 1.1.1.4 christos htab->lazy_plt->plt_tlsdesc_entry_size);
5699 1.1.1.4 christos
5700 1.1.1.4 christos /* Add offset for pushq GOT+8(%rip), since ENDBR64 uses 4
5701 1.1.1.4 christos bytes and the instruction uses 6 bytes, subtract these
5702 1.1.1.4 christos values. */
5703 1.1.1.4 christos bfd_put_32 (output_bfd,
5704 1.1.1.4 christos (htab->elf.sgotplt->output_section->vma
5705 1.1.1.4 christos + htab->elf.sgotplt->output_offset
5706 1.1.1.4 christos + 8
5707 1.1.1.6 christos - htab->elf.splt->output_section->vma
5708 1.1.1.4 christos - htab->elf.splt->output_offset
5709 1.1.1.4 christos - htab->elf.tlsdesc_plt
5710 1.1.1.6 christos - htab->lazy_plt->plt_tlsdesc_got1_insn_end),
5711 1.1.1.4 christos (htab->elf.splt->contents
5712 1.1.1.4 christos + htab->elf.tlsdesc_plt
5713 1.1.1.4 christos + htab->lazy_plt->plt_tlsdesc_got1_offset));
5714 1.1.1.4 christos /* Add offset for indirect branch via GOT+TDG, where TDG
5715 1.1.1.4 christos stands for htab->tlsdesc_got, subtracting the offset
5716 1.1.1.4 christos to the end of that instruction. */
5717 1.1.1.4 christos bfd_put_32 (output_bfd,
5718 1.1.1.6 christos (htab->elf.sgot->output_section->vma
5719 1.1.1.4 christos + htab->elf.sgot->output_offset
5720 1.1.1.4 christos + htab->elf.tlsdesc_got
5721 1.1.1.6 christos - htab->elf.splt->output_section->vma
5722 1.1.1.4 christos - htab->elf.splt->output_offset
5723 1.1.1.4 christos - htab->elf.tlsdesc_plt
5724 1.1.1.6 christos - htab->lazy_plt->plt_tlsdesc_got2_insn_end),
5725 1.1.1.4 christos (htab->elf.splt->contents
5726 1.1 christos + htab->elf.tlsdesc_plt
5727 1.1 christos + htab->lazy_plt->plt_tlsdesc_got2_offset));
5728 1.1 christos }
5729 1.1.1.3 christos }
5730 1.1.1.3 christos
5731 1.1.1.3 christos /* Fill PLT entries for undefined weak symbols in PIE. */
5732 1.1.1.3 christos if (bfd_link_pie (info))
5733 1.1.1.3 christos bfd_hash_traverse (&info->hash->table,
5734 1.1.1.3 christos elf_x86_64_pie_finish_undefweak_symbol,
5735 1.1.1.6 christos info);
5736 1.1.1.3 christos
5737 1.1.1.3 christos return true;
5738 1.1.1.3 christos }
5739 1.1.1.3 christos
5740 1.1.1.3 christos /* Fill PLT/GOT entries and allocate dynamic relocations for local
5741 1.1.1.3 christos STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
5742 1.1.1.3 christos It has to be done before elf_link_sort_relocs is called so that
5743 1.1.1.6 christos dynamic relocations are properly sorted. */
5744 1.1.1.3 christos
5745 1.1.1.3 christos static bool
5746 1.1.1.3 christos elf_x86_64_output_arch_local_syms
5747 1.1.1.3 christos (bfd *output_bfd ATTRIBUTE_UNUSED,
5748 1.1.1.3 christos struct bfd_link_info *info,
5749 1.1.1.3 christos void *flaginfo ATTRIBUTE_UNUSED,
5750 1.1.1.3 christos int (*func) (void *, const char *,
5751 1.1.1.3 christos Elf_Internal_Sym *,
5752 1.1.1.3 christos asection *,
5753 1.1.1.4 christos struct elf_link_hash_entry *) ATTRIBUTE_UNUSED)
5754 1.1.1.4 christos {
5755 1.1.1.3 christos struct elf_x86_link_hash_table *htab
5756 1.1.1.6 christos = elf_x86_hash_table (info, X86_64_ELF_DATA);
5757 1.1.1.3 christos if (htab == NULL)
5758 1.1 christos return false;
5759 1.1 christos
5760 1.1 christos /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
5761 1.1 christos htab_traverse (htab->loc_hash_table,
5762 1.1 christos elf_x86_64_finish_local_dynamic_symbol,
5763 1.1.1.6 christos info);
5764 1.1 christos
5765 1.1 christos return true;
5766 1.1.1.4 christos }
5767 1.1.1.4 christos
5768 1.1.1.2 christos /* Similar to _bfd_elf_get_synthetic_symtab. Support PLTs with all
5769 1.1.1.4 christos dynamic relocations. */
5770 1.1.1.4 christos
5771 1.1.1.4 christos static long
5772 1.1.1.4 christos elf_x86_64_get_synthetic_symtab (bfd *abfd,
5773 1.1.1.4 christos long symcount ATTRIBUTE_UNUSED,
5774 1.1.1.4 christos asymbol **syms ATTRIBUTE_UNUSED,
5775 1.1.1.4 christos long dynsymcount,
5776 1.1.1.4 christos asymbol **dynsyms,
5777 1.1.1.4 christos asymbol **ret)
5778 1.1.1.4 christos {
5779 1.1.1.4 christos long count, i, n;
5780 1.1.1.4 christos int j;
5781 1.1.1.4 christos bfd_byte *plt_contents;
5782 1.1.1.4 christos long relsize;
5783 1.1.1.4 christos const struct elf_x86_lazy_plt_layout *lazy_plt;
5784 1.1.1.4 christos const struct elf_x86_non_lazy_plt_layout *non_lazy_plt;
5785 1.1.1.8 christos const struct elf_x86_lazy_plt_layout *lazy_bnd_plt;
5786 1.1.1.8 christos const struct elf_x86_non_lazy_plt_layout *non_lazy_bnd_plt;
5787 1.1.1.4 christos const struct elf_x86_lazy_plt_layout *lazy_bnd_ibt_plt;
5788 1.1.1.4 christos const struct elf_x86_non_lazy_plt_layout *non_lazy_bnd_ibt_plt;
5789 1.1.1.4 christos const struct elf_x86_lazy_plt_layout *lazy_ibt_plt;
5790 1.1.1.4 christos const struct elf_x86_non_lazy_plt_layout *non_lazy_ibt_plt;
5791 1.1.1.4 christos asection *plt;
5792 1.1.1.4 christos enum elf_x86_plt_type plt_type;
5793 1.1.1.4 christos struct elf_x86_plt plts[] =
5794 1.1.1.4 christos {
5795 1.1.1.4 christos { ".plt", NULL, NULL, plt_unknown, 0, 0, 0, 0 },
5796 1.1.1.4 christos { ".plt.got", NULL, NULL, plt_non_lazy, 0, 0, 0, 0 },
5797 1.1.1.4 christos { ".plt.sec", NULL, NULL, plt_second, 0, 0, 0, 0 },
5798 1.1.1.4 christos { ".plt.bnd", NULL, NULL, plt_second, 0, 0, 0, 0 },
5799 1.1.1.2 christos { NULL, NULL, NULL, plt_non_lazy, 0, 0, 0, 0 }
5800 1.1.1.4 christos };
5801 1.1.1.2 christos
5802 1.1.1.4 christos *ret = NULL;
5803 1.1.1.4 christos
5804 1.1.1.2 christos if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
5805 1.1.1.4 christos return 0;
5806 1.1.1.4 christos
5807 1.1.1.2 christos if (dynsymcount <= 0)
5808 1.1.1.4 christos return 0;
5809 1.1.1.4 christos
5810 1.1.1.4 christos relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
5811 1.1.1.4 christos if (relsize <= 0)
5812 1.1.1.6 christos return -1;
5813 1.1.1.6 christos
5814 1.1.1.8 christos lazy_plt = &elf_x86_64_lazy_plt;
5815 1.1.1.8 christos non_lazy_plt = &elf_x86_64_non_lazy_plt;
5816 1.1.1.6 christos lazy_ibt_plt = &elf_x86_64_lazy_ibt_plt;
5817 1.1.1.4 christos non_lazy_ibt_plt = &elf_x86_64_non_lazy_ibt_plt;
5818 1.1.1.8 christos if (ABI_64_P (abfd))
5819 1.1.1.8 christos {
5820 1.1.1.8 christos lazy_bnd_ibt_plt = &elf_x86_64_lazy_bnd_ibt_plt;
5821 1.1.1.8 christos non_lazy_bnd_ibt_plt = &elf_x86_64_non_lazy_bnd_ibt_plt;
5822 1.1.1.4 christos lazy_bnd_plt = &elf_x86_64_lazy_bnd_plt;
5823 1.1.1.4 christos non_lazy_bnd_plt = &elf_x86_64_non_lazy_bnd_plt;
5824 1.1.1.2 christos }
5825 1.1.1.8 christos else
5826 1.1.1.8 christos {
5827 1.1.1.8 christos lazy_bnd_ibt_plt = NULL;
5828 1.1.1.8 christos non_lazy_bnd_ibt_plt = NULL;
5829 1.1.1.4 christos lazy_bnd_plt = NULL;
5830 1.1.1.2 christos non_lazy_bnd_plt = NULL;
5831 1.1.1.4 christos }
5832 1.1.1.4 christos
5833 1.1.1.4 christos count = 0;
5834 1.1.1.4 christos for (j = 0; plts[j].name != NULL; j++)
5835 1.1.1.7 christos {
5836 1.1.1.7 christos plt = bfd_get_section_by_name (abfd, plts[j].name);
5837 1.1.1.7 christos if (plt == NULL
5838 1.1.1.2 christos || plt->size == 0
5839 1.1.1.2 christos || (plt->flags & SEC_HAS_CONTENTS) == 0)
5840 1.1.1.4 christos continue;
5841 1.1.1.8 christos
5842 1.1.1.4 christos /* Get the PLT section contents. */
5843 1.1.1.2 christos if (!_bfd_elf_mmap_section_contents (abfd, plt, &plt_contents))
5844 1.1.1.4 christos break;
5845 1.1.1.4 christos
5846 1.1.1.4 christos /* Check what kind of PLT it is. */
5847 1.1.1.4 christos plt_type = plt_unknown;
5848 1.1.1.4 christos if (plts[j].type == plt_unknown
5849 1.1.1.4 christos && (plt->size >= (lazy_plt->plt_entry_size
5850 1.1.1.4 christos + lazy_plt->plt_entry_size)))
5851 1.1.1.4 christos {
5852 1.1.1.4 christos /* Match lazy PLT first. Need to check the first two
5853 1.1.1.4 christos instructions. */
5854 1.1.1.4 christos if ((memcmp (plt_contents, lazy_plt->plt0_entry,
5855 1.1.1.4 christos lazy_plt->plt0_got1_offset) == 0)
5856 1.1.1.7 christos && (memcmp (plt_contents + 6, lazy_plt->plt0_entry + 6,
5857 1.1.1.8 christos 2) == 0))
5858 1.1.1.8 christos {
5859 1.1.1.8 christos if (memcmp (plt_contents + lazy_ibt_plt->plt_entry_size,
5860 1.1.1.7 christos lazy_ibt_plt->plt_entry,
5861 1.1.1.8 christos lazy_ibt_plt->plt_got_offset) == 0)
5862 1.1.1.8 christos {
5863 1.1.1.7 christos /* The fist entry in the lazy IBT PLT is the same as
5864 1.1.1.8 christos the lazy PLT. */
5865 1.1.1.7 christos plt_type = plt_lazy | plt_second;
5866 1.1.1.7 christos lazy_plt = lazy_ibt_plt;
5867 1.1.1.7 christos }
5868 1.1.1.7 christos else
5869 1.1.1.4 christos plt_type = plt_lazy;
5870 1.1.1.4 christos }
5871 1.1.1.4 christos else if (lazy_bnd_plt != NULL
5872 1.1.1.4 christos && (memcmp (plt_contents, lazy_bnd_plt->plt0_entry,
5873 1.1.1.4 christos lazy_bnd_plt->plt0_got1_offset) == 0)
5874 1.1.1.4 christos && (memcmp (plt_contents + 6,
5875 1.1.1.4 christos lazy_bnd_plt->plt0_entry + 6, 3) == 0))
5876 1.1.1.8 christos {
5877 1.1.1.8 christos plt_type = plt_lazy | plt_second;
5878 1.1.1.8 christos /* The fist entry in the lazy BND IBT PLT is the same as
5879 1.1.1.8 christos the lazy BND PLT. */
5880 1.1.1.8 christos if (memcmp (plt_contents
5881 1.1.1.8 christos + lazy_bnd_ibt_plt->plt_entry_size,
5882 1.1.1.8 christos lazy_bnd_ibt_plt->plt_entry,
5883 1.1.1.4 christos lazy_bnd_ibt_plt->plt_got_offset) == 0)
5884 1.1.1.4 christos lazy_plt = lazy_bnd_ibt_plt;
5885 1.1.1.3 christos else
5886 1.1.1.2 christos lazy_plt = lazy_bnd_plt;
5887 1.1.1.2 christos }
5888 1.1.1.4 christos }
5889 1.1.1.4 christos
5890 1.1.1.4 christos if (non_lazy_plt != NULL
5891 1.1.1.4 christos && (plt_type == plt_unknown || plt_type == plt_non_lazy)
5892 1.1.1.4 christos && plt->size >= non_lazy_plt->plt_entry_size)
5893 1.1.1.4 christos {
5894 1.1.1.4 christos /* Match non-lazy PLT. */
5895 1.1.1.4 christos if (memcmp (plt_contents, non_lazy_plt->plt_entry,
5896 1.1.1.4 christos non_lazy_plt->plt_got_offset) == 0)
5897 1.1.1.4 christos plt_type = plt_non_lazy;
5898 1.1.1.4 christos }
5899 1.1.1.4 christos
5900 1.1.1.8 christos if (plt_type == plt_unknown || plt_type == plt_second)
5901 1.1.1.8 christos {
5902 1.1.1.8 christos if (plt->size >= non_lazy_ibt_plt->plt_entry_size
5903 1.1.1.8 christos && (memcmp (plt_contents,
5904 1.1.1.4 christos non_lazy_ibt_plt->plt_entry,
5905 1.1.1.4 christos non_lazy_ibt_plt->plt_got_offset) == 0))
5906 1.1.1.4 christos {
5907 1.1.1.4 christos /* Match IBT PLT. */
5908 1.1.1.4 christos plt_type = plt_second;
5909 1.1.1.8 christos non_lazy_plt = non_lazy_ibt_plt;
5910 1.1.1.7 christos }
5911 1.1.1.8 christos else if (non_lazy_bnd_plt != NULL)
5912 1.1.1.8 christos {
5913 1.1.1.8 christos if (plt->size >= non_lazy_bnd_plt->plt_entry_size
5914 1.1.1.8 christos && (memcmp (plt_contents, non_lazy_bnd_plt->plt_entry,
5915 1.1.1.8 christos non_lazy_bnd_plt->plt_got_offset) == 0))
5916 1.1.1.8 christos {
5917 1.1.1.8 christos /* Match BND PLT. */
5918 1.1.1.8 christos plt_type = plt_second;
5919 1.1.1.8 christos non_lazy_plt = non_lazy_bnd_plt;
5920 1.1.1.8 christos }
5921 1.1.1.8 christos else if (plt->size >= non_lazy_bnd_ibt_plt->plt_entry_size
5922 1.1.1.8 christos && (memcmp (plt_contents,
5923 1.1.1.8 christos non_lazy_bnd_ibt_plt->plt_entry,
5924 1.1.1.8 christos non_lazy_bnd_ibt_plt->plt_got_offset)
5925 1.1.1.8 christos == 0))
5926 1.1.1.8 christos {
5927 1.1.1.8 christos /* Match BND IBT PLT. */
5928 1.1.1.8 christos plt_type = plt_second;
5929 1.1.1.7 christos non_lazy_plt = non_lazy_bnd_ibt_plt;
5930 1.1.1.4 christos }
5931 1.1.1.2 christos }
5932 1.1.1.4 christos }
5933 1.1.1.4 christos
5934 1.1.1.8 christos if (plt_type == plt_unknown)
5935 1.1.1.4 christos {
5936 1.1.1.4 christos _bfd_elf_munmap_section_contents (plt, plt_contents);
5937 1.1.1.2 christos continue;
5938 1.1.1.4 christos }
5939 1.1.1.4 christos
5940 1.1.1.2 christos plts[j].sec = plt;
5941 1.1.1.4 christos plts[j].type = plt_type;
5942 1.1.1.4 christos
5943 1.1.1.4 christos if ((plt_type & plt_lazy))
5944 1.1.1.4 christos {
5945 1.1.1.4 christos plts[j].plt_got_offset = lazy_plt->plt_got_offset;
5946 1.1.1.4 christos plts[j].plt_got_insn_size = lazy_plt->plt_got_insn_size;
5947 1.1.1.4 christos plts[j].plt_entry_size = lazy_plt->plt_entry_size;
5948 1.1.1.4 christos /* Skip PLT0 in lazy PLT. */
5949 1.1.1.4 christos i = 1;
5950 1.1.1.4 christos }
5951 1.1.1.4 christos else
5952 1.1.1.4 christos {
5953 1.1.1.4 christos plts[j].plt_got_offset = non_lazy_plt->plt_got_offset;
5954 1.1.1.4 christos plts[j].plt_got_insn_size = non_lazy_plt->plt_got_insn_size;
5955 1.1.1.4 christos plts[j].plt_entry_size = non_lazy_plt->plt_entry_size;
5956 1.1.1.2 christos i = 0;
5957 1.1.1.4 christos }
5958 1.1.1.4 christos
5959 1.1.1.4 christos /* Skip lazy PLT when the second PLT is used. */
5960 1.1.1.4 christos if (plt_type == (plt_lazy | plt_second))
5961 1.1.1.4 christos plts[j].count = 0;
5962 1.1.1.4 christos else
5963 1.1.1.4 christos {
5964 1.1.1.4 christos n = plt->size / plts[j].plt_entry_size;
5965 1.1.1.4 christos plts[j].count = n;
5966 1.1.1.4 christos count += n - i;
5967 1.1.1.4 christos }
5968 1.1.1.4 christos
5969 1.1.1.4 christos plts[j].contents = plt_contents;
5970 1.1.1.4 christos }
5971 1.1.1.4 christos
5972 1.1.1.4 christos return _bfd_x86_elf_get_synthetic_symtab (abfd, count, relsize,
5973 1.1 christos (bfd_vma) 0, plts, dynsyms,
5974 1.1 christos ret);
5975 1.1 christos }
5976 1.1 christos
5977 1.1 christos /* Handle an x86-64 specific section when reading an object file. This
5978 1.1.1.6 christos is called when elfcode.h finds a section with an unknown type. */
5979 1.1.1.2 christos
5980 1.1.1.2 christos static bool
5981 1.1 christos elf_x86_64_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr,
5982 1.1 christos const char *name, int shindex)
5983 1.1.1.6 christos {
5984 1.1 christos if (hdr->sh_type != SHT_X86_64_UNWIND)
5985 1.1 christos return false;
5986 1.1.1.6 christos
5987 1.1 christos if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
5988 1.1.1.6 christos return false;
5989 1.1 christos
5990 1.1 christos return true;
5991 1.1 christos }
5992 1.1 christos
5993 1.1 christos /* Hook called by the linker routine which adds symbols from an object
5994 1.1 christos file. We use it to put SHN_X86_64_LCOMMON items in .lbss, instead
5995 1.1.1.6 christos of .bss. */
5996 1.1 christos
5997 1.1.1.3 christos static bool
5998 1.1 christos elf_x86_64_add_symbol_hook (bfd *abfd,
5999 1.1 christos struct bfd_link_info *info ATTRIBUTE_UNUSED,
6000 1.1 christos Elf_Internal_Sym *sym,
6001 1.1 christos const char **namep ATTRIBUTE_UNUSED,
6002 1.1 christos flagword *flagsp ATTRIBUTE_UNUSED,
6003 1.1 christos asection **secp,
6004 1.1 christos bfd_vma *valp)
6005 1.1 christos {
6006 1.1 christos asection *lcomm;
6007 1.1 christos
6008 1.1 christos switch (sym->st_shndx)
6009 1.1 christos {
6010 1.1 christos case SHN_X86_64_LCOMMON:
6011 1.1 christos lcomm = bfd_get_section_by_name (abfd, "LARGE_COMMON");
6012 1.1 christos if (lcomm == NULL)
6013 1.1 christos {
6014 1.1 christos lcomm = bfd_make_section_with_flags (abfd,
6015 1.1 christos "LARGE_COMMON",
6016 1.1 christos (SEC_ALLOC
6017 1.1 christos | SEC_IS_COMMON
6018 1.1.1.6 christos | SEC_LINKER_CREATED));
6019 1.1 christos if (lcomm == NULL)
6020 1.1 christos return false;
6021 1.1 christos elf_section_flags (lcomm) |= SHF_X86_64_LARGE;
6022 1.1 christos }
6023 1.1.1.6 christos *secp = lcomm;
6024 1.1 christos *valp = sym->st_size;
6025 1.1 christos return true;
6026 1.1.1.6 christos }
6027 1.1 christos
6028 1.1 christos return true;
6029 1.1 christos }
6030 1.1 christos
6031 1.1 christos
6032 1.1 christos /* Given a BFD section, try to locate the corresponding ELF section
6033 1.1.1.6 christos index. */
6034 1.1 christos
6035 1.1 christos static bool
6036 1.1 christos elf_x86_64_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
6037 1.1 christos asection *sec, int *index_return)
6038 1.1 christos {
6039 1.1 christos if (sec == &_bfd_elf_large_com_section)
6040 1.1.1.6 christos {
6041 1.1 christos *index_return = SHN_X86_64_LCOMMON;
6042 1.1.1.6 christos return true;
6043 1.1 christos }
6044 1.1 christos return false;
6045 1.1 christos }
6046 1.1 christos
6047 1.1 christos /* Process a symbol. */
6048 1.1 christos
6049 1.1 christos static void
6050 1.1 christos elf_x86_64_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
6051 1.1 christos asymbol *asym)
6052 1.1 christos {
6053 1.1 christos elf_symbol_type *elfsym = (elf_symbol_type *) asym;
6054 1.1 christos
6055 1.1 christos switch (elfsym->internal_elf_sym.st_shndx)
6056 1.1 christos {
6057 1.1 christos case SHN_X86_64_LCOMMON:
6058 1.1 christos asym->section = &_bfd_elf_large_com_section;
6059 1.1 christos asym->value = elfsym->internal_elf_sym.st_size;
6060 1.1 christos /* Common symbol doesn't set BSF_GLOBAL. */
6061 1.1 christos asym->flags &= ~BSF_GLOBAL;
6062 1.1 christos break;
6063 1.1 christos }
6064 1.1.1.6 christos }
6065 1.1 christos
6066 1.1 christos static bool
6067 1.1 christos elf_x86_64_common_definition (Elf_Internal_Sym *sym)
6068 1.1 christos {
6069 1.1 christos return (sym->st_shndx == SHN_COMMON
6070 1.1 christos || sym->st_shndx == SHN_X86_64_LCOMMON);
6071 1.1 christos }
6072 1.1 christos
6073 1.1 christos static unsigned int
6074 1.1 christos elf_x86_64_common_section_index (asection *sec)
6075 1.1 christos {
6076 1.1 christos if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6077 1.1 christos return SHN_COMMON;
6078 1.1 christos else
6079 1.1 christos return SHN_X86_64_LCOMMON;
6080 1.1 christos }
6081 1.1 christos
6082 1.1 christos static asection *
6083 1.1 christos elf_x86_64_common_section (asection *sec)
6084 1.1 christos {
6085 1.1 christos if ((elf_section_flags (sec) & SHF_X86_64_LARGE) == 0)
6086 1.1 christos return bfd_com_section_ptr;
6087 1.1 christos else
6088 1.1 christos return &_bfd_elf_large_com_section;
6089 1.1.1.6 christos }
6090 1.1.1.2 christos
6091 1.1.1.2 christos static bool
6092 1.1 christos elf_x86_64_merge_symbol (struct elf_link_hash_entry *h,
6093 1.1.1.6 christos const Elf_Internal_Sym *sym,
6094 1.1.1.6 christos asection **psec,
6095 1.1 christos bool newdef,
6096 1.1.1.2 christos bool olddef,
6097 1.1 christos bfd *oldbfd,
6098 1.1 christos const asection *oldsec)
6099 1.1 christos {
6100 1.1 christos /* A normal common symbol and a large common symbol result in a
6101 1.1.1.2 christos normal common symbol. We turn the large common symbol into a
6102 1.1 christos normal one. */
6103 1.1.1.2 christos if (!olddef
6104 1.1.1.2 christos && h->root.type == bfd_link_hash_common
6105 1.1.1.2 christos && !newdef
6106 1.1 christos && bfd_is_com_section (*psec)
6107 1.1 christos && oldsec != *psec)
6108 1.1.1.2 christos {
6109 1.1 christos if (sym->st_shndx == SHN_COMMON
6110 1.1 christos && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) != 0)
6111 1.1 christos {
6112 1.1 christos h->root.u.c.p->section
6113 1.1 christos = bfd_make_section_old_way (oldbfd, "COMMON");
6114 1.1 christos h->root.u.c.p->section->flags = SEC_ALLOC;
6115 1.1.1.2 christos }
6116 1.1.1.2 christos else if (sym->st_shndx == SHN_X86_64_LCOMMON
6117 1.1 christos && (elf_section_flags (oldsec) & SHF_X86_64_LARGE) == 0)
6118 1.1 christos *psec = bfd_com_section_ptr;
6119 1.1.1.6 christos }
6120 1.1 christos
6121 1.1 christos return true;
6122 1.1.1.7 christos }
6123 1.1.1.7 christos
6124 1.1.1.7 christos static bool
6125 1.1.1.7 christos elf_x86_64_section_flags (const Elf_Internal_Shdr *hdr)
6126 1.1.1.7 christos {
6127 1.1.1.7 christos if ((hdr->sh_flags & SHF_X86_64_LARGE) != 0)
6128 1.1.1.7 christos hdr->bfd_section->flags |= SEC_ELF_LARGE;
6129 1.1.1.7 christos
6130 1.1.1.7 christos return true;
6131 1.1.1.7 christos }
6132 1.1.1.7 christos
6133 1.1.1.7 christos static bool
6134 1.1.1.7 christos elf_x86_64_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
6135 1.1.1.7 christos Elf_Internal_Shdr *hdr, asection *sec)
6136 1.1.1.7 christos {
6137 1.1.1.7 christos if (sec->flags & SEC_ELF_LARGE)
6138 1.1.1.7 christos hdr->sh_flags |= SHF_X86_64_LARGE;
6139 1.1.1.7 christos
6140 1.1.1.7 christos return true;
6141 1.1.1.7 christos }
6142 1.1.1.7 christos
6143 1.1.1.8 christos static bool
6144 1.1.1.8 christos elf_x86_64_copy_private_section_data (bfd *ibfd, asection *isec,
6145 1.1.1.7 christos bfd *obfd, asection *osec,
6146 1.1.1.8 christos struct bfd_link_info *link_info)
6147 1.1.1.7 christos {
6148 1.1.1.7 christos if (!_bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec, link_info))
6149 1.1.1.7 christos return false;
6150 1.1.1.8 christos
6151 1.1.1.7 christos /* objcopy --set-section-flags without "large" drops SHF_X86_64_LARGE. */
6152 1.1.1.7 christos if (link_info == NULL && ibfd != obfd)
6153 1.1.1.7 christos elf_section_flags (osec) &= ~SHF_X86_64_LARGE;
6154 1.1.1.7 christos
6155 1.1.1.7 christos return true;
6156 1.1 christos }
6157 1.1 christos
6158 1.1 christos static int
6159 1.1 christos elf_x86_64_additional_program_headers (bfd *abfd,
6160 1.1 christos struct bfd_link_info *info ATTRIBUTE_UNUSED)
6161 1.1 christos {
6162 1.1 christos asection *s;
6163 1.1 christos int count = 0;
6164 1.1 christos
6165 1.1 christos /* Check to see if we need a large readonly segment. */
6166 1.1 christos s = bfd_get_section_by_name (abfd, ".lrodata");
6167 1.1 christos if (s && (s->flags & SEC_LOAD))
6168 1.1 christos count++;
6169 1.1 christos
6170 1.1 christos /* Check to see if we need a large data segment. Since .lbss sections
6171 1.1 christos is placed right after the .bss section, there should be no need for
6172 1.1 christos a large data segment just because of .lbss. */
6173 1.1 christos s = bfd_get_section_by_name (abfd, ".ldata");
6174 1.1 christos if (s && (s->flags & SEC_LOAD))
6175 1.1 christos count++;
6176 1.1 christos
6177 1.1 christos return count;
6178 1.1 christos }
6179 1.1 christos
6180 1.1.1.6 christos /* Return TRUE iff relocations for INPUT are compatible with OUTPUT. */
6181 1.1 christos
6182 1.1 christos static bool
6183 1.1 christos elf_x86_64_relocs_compatible (const bfd_target *input,
6184 1.1 christos const bfd_target *output)
6185 1.1 christos {
6186 1.1 christos return ((xvec_get_elf_backend_data (input)->s->elfclass
6187 1.1 christos == xvec_get_elf_backend_data (output)->s->elfclass)
6188 1.1 christos && _bfd_elf_relocs_compatible (input, output));
6189 1.1.1.4 christos }
6190 1.1.1.4 christos
6191 1.1.1.4 christos /* Set up x86-64 GNU properties. Return the first relocatable ELF input
6192 1.1.1.4 christos with GNU properties if found. Otherwise, return NULL. */
6193 1.1.1.4 christos
6194 1.1.1.4 christos static bfd *
6195 1.1.1.4 christos elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
6196 1.1.1.6 christos {
6197 1.1.1.6 christos struct elf_x86_init_table init_table;
6198 1.1.1.4 christos const struct elf_backend_data *bed;
6199 1.1.1.4 christos struct elf_x86_link_hash_table *htab;
6200 1.1.1.4 christos
6201 1.1.1.4 christos if ((int) R_X86_64_standard >= (int) R_X86_64_converted_reloc_bit
6202 1.1.1.4 christos || (int) R_X86_64_max <= (int) R_X86_64_converted_reloc_bit
6203 1.1.1.4 christos || ((int) (R_X86_64_GNU_VTINHERIT | R_X86_64_converted_reloc_bit)
6204 1.1.1.4 christos != (int) R_X86_64_GNU_VTINHERIT)
6205 1.1.1.4 christos || ((int) (R_X86_64_GNU_VTENTRY | R_X86_64_converted_reloc_bit)
6206 1.1.1.4 christos != (int) R_X86_64_GNU_VTENTRY))
6207 1.1.1.4 christos abort ();
6208 1.1.1.4 christos
6209 1.1.1.4 christos /* This is unused for x86-64. */
6210 1.1.1.6 christos init_table.plt0_pad_byte = 0x90;
6211 1.1.1.6 christos
6212 1.1.1.6 christos bed = get_elf_backend_data (info->output_bfd);
6213 1.1.1.6 christos htab = elf_x86_hash_table (info, bed->target_id);
6214 1.1.1.7 christos if (!htab)
6215 1.1.1.7 christos abort ();
6216 1.1.1.7 christos
6217 1.1.1.7 christos init_table.lazy_plt = &elf_x86_64_lazy_plt;
6218 1.1.1.8 christos init_table.non_lazy_plt = &elf_x86_64_non_lazy_plt;
6219 1.1.1.8 christos
6220 1.1.1.4 christos init_table.lazy_ibt_plt = &elf_x86_64_lazy_ibt_plt;
6221 1.1.1.6 christos init_table.non_lazy_ibt_plt = &elf_x86_64_non_lazy_ibt_plt;
6222 1.1.1.6 christos
6223 1.1.1.7 christos if (ABI_64_P (info->output_bfd))
6224 1.1.1.7 christos {
6225 1.1.1.8 christos init_table.sframe_lazy_plt = &elf_x86_64_sframe_plt;
6226 1.1.1.8 christos init_table.sframe_non_lazy_plt = &elf_x86_64_sframe_non_lazy_plt;
6227 1.1.1.4 christos init_table.sframe_lazy_ibt_plt = &elf_x86_64_sframe_ibt_plt;
6228 1.1.1.4 christos init_table.sframe_non_lazy_ibt_plt = &elf_x86_64_sframe_non_lazy_ibt_plt;
6229 1.1.1.4 christos }
6230 1.1.1.7 christos else
6231 1.1.1.7 christos {
6232 1.1.1.7 christos /* SFrame is not supported for non AMD64. */
6233 1.1.1.4 christos init_table.sframe_lazy_plt = NULL;
6234 1.1.1.4 christos init_table.sframe_non_lazy_plt = NULL;
6235 1.1.1.4 christos }
6236 1.1.1.4 christos
6237 1.1.1.4 christos if (ABI_64_P (info->output_bfd))
6238 1.1.1.4 christos {
6239 1.1.1.4 christos init_table.r_info = elf64_r_info;
6240 1.1.1.4 christos init_table.r_sym = elf64_r_sym;
6241 1.1.1.4 christos }
6242 1.1.1.4 christos else
6243 1.1.1.4 christos {
6244 1.1.1.4 christos init_table.r_info = elf32_r_info;
6245 1.1.1.4 christos init_table.r_sym = elf32_r_sym;
6246 1.1.1.4 christos }
6247 1.1.1.4 christos
6248 1.1.1.4 christos return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table);
6249 1.1.1.7 christos }
6250 1.1.1.7 christos
6251 1.1.1.7 christos static void
6252 1.1.1.7 christos elf_x86_64_add_glibc_version_dependency
6253 1.1.1.7 christos (struct elf_find_verdep_info *rinfo)
6254 1.1.1.7 christos {
6255 1.1.1.7 christos unsigned int i = 0;
6256 1.1.1.7 christos const char *version[3] = { NULL, NULL, NULL };
6257 1.1.1.7 christos struct elf_x86_link_hash_table *htab;
6258 1.1.1.7 christos
6259 1.1.1.7 christos if (rinfo->info->enable_dt_relr)
6260 1.1.1.7 christos {
6261 1.1.1.7 christos version[i] = "GLIBC_ABI_DT_RELR";
6262 1.1.1.7 christos i++;
6263 1.1.1.7 christos }
6264 1.1.1.7 christos
6265 1.1.1.7 christos htab = elf_x86_hash_table (rinfo->info, X86_64_ELF_DATA);
6266 1.1.1.7 christos if (htab != NULL && htab->params->mark_plt)
6267 1.1.1.7 christos {
6268 1.1.1.7 christos version[i] = "GLIBC_2.36";
6269 1.1.1.7 christos i++;
6270 1.1.1.7 christos }
6271 1.1.1.7 christos
6272 1.1.1.7 christos if (i != 0)
6273 1.1.1.7 christos _bfd_elf_link_add_glibc_version_dependency (rinfo, version);
6274 1.1 christos }
6275 1.1.1.4 christos
6276 1.1 christos static const struct bfd_elf_special_section
6277 1.1 christos elf_x86_64_special_sections[]=
6278 1.1 christos {
6279 1.1 christos { STRING_COMMA_LEN (".gnu.linkonce.lb"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6280 1.1.1.4 christos { STRING_COMMA_LEN (".gnu.linkonce.lr"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6281 1.1 christos { STRING_COMMA_LEN (".gnu.linkonce.lt"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR + SHF_X86_64_LARGE},
6282 1.1 christos { STRING_COMMA_LEN (".lbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6283 1.1.1.4 christos { STRING_COMMA_LEN (".ldata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_X86_64_LARGE},
6284 1.1 christos { STRING_COMMA_LEN (".lrodata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_X86_64_LARGE},
6285 1.1 christos { NULL, 0, 0, 0, 0 }
6286 1.1.1.2 christos };
6287 1.1 christos
6288 1.1 christos #define TARGET_LITTLE_SYM x86_64_elf64_vec
6289 1.1 christos #define TARGET_LITTLE_NAME "elf64-x86-64"
6290 1.1 christos #define ELF_ARCH bfd_arch_i386
6291 1.1.1.7 christos #define ELF_TARGET_ID X86_64_ELF_DATA
6292 1.1 christos #define ELF_MACHINE_CODE EM_X86_64
6293 1.1 christos #define ELF_MAXPAGESIZE 0x1000
6294 1.1 christos #define ELF_COMMONPAGESIZE 0x1000
6295 1.1 christos
6296 1.1 christos #define elf_backend_can_gc_sections 1
6297 1.1 christos #define elf_backend_can_refcount 1
6298 1.1 christos #define elf_backend_want_got_plt 1
6299 1.1 christos #define elf_backend_plt_readonly 1
6300 1.1 christos #define elf_backend_want_plt_sym 0
6301 1.1.1.4 christos #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
6302 1.1.1.3 christos #define elf_backend_rela_normal 1
6303 1.1.1.4 christos #define elf_backend_plt_alignment 4
6304 1.1.1.4 christos #define elf_backend_caches_rawsize 1
6305 1.1 christos #define elf_backend_dtrel_excludes_plt 1
6306 1.1 christos #define elf_backend_want_dynrelro 1
6307 1.1 christos
6308 1.1.1.7 christos #define elf_info_to_howto elf_x86_64_info_to_howto
6309 1.1.1.7 christos
6310 1.1 christos #define bfd_elf64_bfd_copy_private_section_data \
6311 1.1 christos elf_x86_64_copy_private_section_data
6312 1.1 christos #define bfd_elf64_bfd_reloc_type_lookup elf_x86_64_reloc_type_lookup
6313 1.1 christos #define bfd_elf64_bfd_reloc_name_lookup \
6314 1.1 christos elf_x86_64_reloc_name_lookup
6315 1.1.1.8 christos
6316 1.1.1.4 christos #define elf_backend_relocs_compatible elf_x86_64_relocs_compatible
6317 1.1 christos #define elf_backend_early_size_sections elf_x86_64_early_size_sections
6318 1.1 christos #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
6319 1.1.1.3 christos #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
6320 1.1 christos #define elf_backend_finish_dynamic_symbol elf_x86_64_finish_dynamic_symbol
6321 1.1 christos #define elf_backend_output_arch_local_syms elf_x86_64_output_arch_local_syms
6322 1.1 christos #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus
6323 1.1 christos #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo
6324 1.1 christos #ifdef CORE_HEADER
6325 1.1 christos #define elf_backend_write_core_note elf_x86_64_write_core_note
6326 1.1 christos #endif
6327 1.1 christos #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class
6328 1.1 christos #define elf_backend_relocate_section elf_x86_64_relocate_section
6329 1.1.1.2 christos #define elf_backend_init_index_section _bfd_elf_init_1_index_section
6330 1.1 christos #define elf_backend_object_p elf64_x86_64_elf_object_p
6331 1.1 christos #define bfd_elf64_get_synthetic_symtab elf_x86_64_get_synthetic_symtab
6332 1.1 christos
6333 1.1 christos #define elf_backend_section_from_shdr \
6334 1.1 christos elf_x86_64_section_from_shdr
6335 1.1 christos
6336 1.1 christos #define elf_backend_section_from_bfd_section \
6337 1.1 christos elf_x86_64_elf_section_from_bfd_section
6338 1.1 christos #define elf_backend_add_symbol_hook \
6339 1.1 christos elf_x86_64_add_symbol_hook
6340 1.1 christos #define elf_backend_symbol_processing \
6341 1.1 christos elf_x86_64_symbol_processing
6342 1.1 christos #define elf_backend_common_section_index \
6343 1.1 christos elf_x86_64_common_section_index
6344 1.1 christos #define elf_backend_common_section \
6345 1.1 christos elf_x86_64_common_section
6346 1.1 christos #define elf_backend_common_definition \
6347 1.1 christos elf_x86_64_common_definition
6348 1.1 christos #define elf_backend_merge_symbol \
6349 1.1 christos elf_x86_64_merge_symbol
6350 1.1.1.7 christos #define elf_backend_special_sections \
6351 1.1.1.7 christos elf_x86_64_special_sections
6352 1.1 christos #define elf_backend_section_flags elf_x86_64_section_flags
6353 1.1 christos #define elf_backend_fake_sections elf_x86_64_fake_sections
6354 1.1.1.4 christos #define elf_backend_additional_program_headers \
6355 1.1.1.4 christos elf_x86_64_additional_program_headers
6356 1.1.1.4 christos #define elf_backend_setup_gnu_properties \
6357 1.1.1.4 christos elf_x86_64_link_setup_gnu_properties
6358 1.1.1.7 christos #define elf_backend_hide_symbol \
6359 1.1.1.7 christos _bfd_x86_elf_hide_symbol
6360 1.1.1.4 christos #define elf_backend_add_glibc_version_dependency \
6361 1.1.1.4 christos elf_x86_64_add_glibc_version_dependency
6362 1.1.1.4 christos
6363 1.1 christos #undef elf64_bed
6364 1.1.1.2 christos #define elf64_bed elf64_x86_64_bed
6365 1.1.1.2 christos
6366 1.1.1.2 christos #include "elf64-target.h"
6367 1.1.1.2 christos
6368 1.1.1.4 christos /* CloudABI support. */
6369 1.1.1.2 christos
6370 1.1.1.4 christos #undef TARGET_LITTLE_SYM
6371 1.1.1.2 christos #define TARGET_LITTLE_SYM x86_64_elf64_cloudabi_vec
6372 1.1.1.2 christos #undef TARGET_LITTLE_NAME
6373 1.1.1.2 christos #define TARGET_LITTLE_NAME "elf64-x86-64-cloudabi"
6374 1.1.1.2 christos
6375 1.1.1.2 christos #undef ELF_OSABI
6376 1.1.1.4 christos #define ELF_OSABI ELFOSABI_CLOUDABI
6377 1.1.1.2 christos
6378 1.1 christos #undef elf64_bed
6379 1.1 christos #define elf64_bed elf64_x86_64_cloudabi_bed
6380 1.1 christos
6381 1.1 christos #include "elf64-target.h"
6382 1.1 christos
6383 1.1.1.4 christos /* FreeBSD support. */
6384 1.1.1.2 christos
6385 1.1.1.4 christos #undef TARGET_LITTLE_SYM
6386 1.1 christos #define TARGET_LITTLE_SYM x86_64_elf64_fbsd_vec
6387 1.1 christos #undef TARGET_LITTLE_NAME
6388 1.1 christos #define TARGET_LITTLE_NAME "elf64-x86-64-freebsd"
6389 1.1 christos
6390 1.1 christos #undef ELF_OSABI
6391 1.1.1.4 christos #define ELF_OSABI ELFOSABI_FREEBSD
6392 1.1 christos
6393 1.1 christos #undef elf64_bed
6394 1.1 christos #define elf64_bed elf64_x86_64_fbsd_bed
6395 1.1 christos
6396 1.1 christos #include "elf64-target.h"
6397 1.1 christos
6398 1.1 christos /* Solaris 2 support. */
6399 1.1.1.2 christos
6400 1.1 christos #undef TARGET_LITTLE_SYM
6401 1.1 christos #define TARGET_LITTLE_SYM x86_64_elf64_sol2_vec
6402 1.1 christos #undef TARGET_LITTLE_NAME
6403 1.1.1.6 christos #define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
6404 1.1.1.6 christos
6405 1.1.1.4 christos #undef ELF_TARGET_OS
6406 1.1 christos #define ELF_TARGET_OS is_solaris
6407 1.1 christos
6408 1.1 christos /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6409 1.1 christos objects won't be recognized. */
6410 1.1 christos #undef ELF_OSABI
6411 1.1 christos
6412 1.1 christos #undef elf64_bed
6413 1.1 christos #define elf64_bed elf64_x86_64_sol2_bed
6414 1.1 christos
6415 1.1.1.3 christos /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
6416 1.1 christos boundary. */
6417 1.1 christos #undef elf_backend_static_tls_alignment
6418 1.1 christos #define elf_backend_static_tls_alignment 16
6419 1.1 christos
6420 1.1 christos /* The Solaris 2 ABI requires a plt symbol on all platforms.
6421 1.1 christos
6422 1.1.1.3 christos Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6423 1.1 christos File, p.63. */
6424 1.1 christos #undef elf_backend_want_plt_sym
6425 1.1.1.3 christos #define elf_backend_want_plt_sym 1
6426 1.1.1.3 christos
6427 1.1.1.3 christos #undef elf_backend_strtab_flags
6428 1.1.1.6 christos #define elf_backend_strtab_flags SHF_STRINGS
6429 1.1.1.3 christos
6430 1.1.1.3 christos static bool
6431 1.1.1.3 christos elf64_x86_64_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
6432 1.1.1.3 christos bfd *obfd ATTRIBUTE_UNUSED,
6433 1.1.1.3 christos const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
6434 1.1.1.3 christos Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
6435 1.1.1.3 christos {
6436 1.1.1.6 christos /* PR 19938: FIXME: Need to add code for setting the sh_info
6437 1.1.1.3 christos and sh_link fields of Solaris specific section types. */
6438 1.1.1.3 christos return false;
6439 1.1.1.3 christos }
6440 1.1.1.3 christos
6441 1.1.1.3 christos #undef elf_backend_copy_special_section_fields
6442 1.1 christos #define elf_backend_copy_special_section_fields elf64_x86_64_copy_solaris_special_section_fields
6443 1.1 christos
6444 1.1 christos #include "elf64-target.h"
6445 1.1 christos
6446 1.1 christos /* Restore defaults. */
6447 1.1 christos #undef ELF_OSABI
6448 1.1 christos #undef elf_backend_static_tls_alignment
6449 1.1.1.3 christos #undef elf_backend_want_plt_sym
6450 1.1.1.3 christos #define elf_backend_want_plt_sym 0
6451 1.1 christos #undef elf_backend_strtab_flags
6452 1.1 christos #undef elf_backend_copy_special_section_fields
6453 1.1 christos
6454 1.1 christos /* 32bit x86-64 support. */
6455 1.1.1.2 christos
6456 1.1 christos #undef TARGET_LITTLE_SYM
6457 1.1 christos #define TARGET_LITTLE_SYM x86_64_elf32_vec
6458 1.1 christos #undef TARGET_LITTLE_NAME
6459 1.1.1.6 christos #define TARGET_LITTLE_NAME "elf32-x86-64"
6460 1.1 christos #undef elf32_bed
6461 1.1 christos #define elf32_bed elf32_x86_64_bed
6462 1.1 christos
6463 1.1 christos #undef ELF_ARCH
6464 1.1 christos #define ELF_ARCH bfd_arch_i386
6465 1.1 christos
6466 1.1 christos #undef ELF_MACHINE_CODE
6467 1.1.1.6 christos #define ELF_MACHINE_CODE EM_X86_64
6468 1.1 christos
6469 1.1 christos #undef ELF_TARGET_OS
6470 1.1.1.7 christos #undef ELF_OSABI
6471 1.1.1.7 christos
6472 1.1.1.6 christos #define bfd_elf32_bfd_copy_private_section_data \
6473 1.1.1.6 christos elf_x86_64_copy_private_section_data
6474 1.1.1.6 christos #define bfd_elf32_bfd_reloc_type_lookup \
6475 1.1.1.6 christos elf_x86_64_reloc_type_lookup
6476 1.1.1.6 christos #define bfd_elf32_bfd_reloc_name_lookup \
6477 1.1.1.6 christos elf_x86_64_reloc_name_lookup
6478 1.1.1.6 christos #define bfd_elf32_get_synthetic_symtab \
6479 1.1 christos elf_x86_64_get_synthetic_symtab
6480 1.1 christos
6481 1.1 christos #undef elf_backend_object_p
6482 1.1 christos #define elf_backend_object_p \
6483 1.1 christos elf32_x86_64_elf_object_p
6484 1.1 christos
6485 1.1 christos #undef elf_backend_bfd_from_remote_memory
6486 1.1 christos #define elf_backend_bfd_from_remote_memory \
6487 1.1 christos _bfd_elf32_bfd_from_remote_memory
6488 1.1 christos
6489 1.1 christos #undef elf_backend_size_info
6490 1.1 christos #define elf_backend_size_info \
6491 1.1 christos _bfd_elf32_size_info
6492
6493 #include "elf32-target.h"
6494