pe-dll.c revision 1.1.1.12 1 1.1 skrll /* Routines to help build PEI-format DLLs (Win32 etc)
2 1.1.1.12 christos Copyright (C) 1998-2026 Free Software Foundation, Inc.
3 1.1 skrll Written by DJ Delorie <dj (at) cygnus.com>
4 1.1 skrll
5 1.1 skrll This file is part of the GNU Binutils.
6 1.1 skrll
7 1.1 skrll This program is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3 of the License, or
10 1.1 skrll (at your option) any later version.
11 1.1 skrll
12 1.1 skrll This program is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with this program; if not, write to the Free Software
19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1 skrll MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll #include "sysdep.h"
23 1.1 skrll #include "bfd.h"
24 1.1 skrll #include "bfdlink.h"
25 1.1 skrll #include "libiberty.h"
26 1.1.1.3 christos #include "filenames.h"
27 1.1 skrll #include "safe-ctype.h"
28 1.1.1.8 christos #include "ctf-api.h"
29 1.1 skrll
30 1.1 skrll #include <time.h>
31 1.1 skrll
32 1.1 skrll #include "ld.h"
33 1.1 skrll #include "ldexp.h"
34 1.1 skrll #include "ldlang.h"
35 1.1 skrll #include "ldwrite.h"
36 1.1 skrll #include "ldmisc.h"
37 1.1 skrll #include <ldgram.h>
38 1.1 skrll #include "ldmain.h"
39 1.1 skrll #include "ldfile.h"
40 1.1 skrll #include "ldemul.h"
41 1.1 skrll #include "coff/internal.h"
42 1.1 skrll #include "../bfd/libcoff.h"
43 1.1 skrll #include "deffile.h"
44 1.1 skrll
45 1.1.1.10 christos #ifdef pe_use_plus
46 1.1 skrll
47 1.1 skrll #define PE_IDATA4_SIZE 8
48 1.1 skrll #define PE_IDATA5_SIZE 8
49 1.1 skrll #include "pep-dll.h"
50 1.1 skrll #undef AOUTSZ
51 1.1 skrll #define AOUTSZ PEPAOUTSZ
52 1.1 skrll #define PEAOUTHDR PEPAOUTHDR
53 1.1 skrll
54 1.1 skrll #else
55 1.1 skrll
56 1.1 skrll #include "pe-dll.h"
57 1.1 skrll
58 1.1 skrll #endif
59 1.1 skrll
60 1.1 skrll #ifndef PE_IDATA4_SIZE
61 1.1 skrll #define PE_IDATA4_SIZE 4
62 1.1 skrll #endif
63 1.1 skrll
64 1.1 skrll #ifndef PE_IDATA5_SIZE
65 1.1 skrll #define PE_IDATA5_SIZE 4
66 1.1 skrll #endif
67 1.1 skrll
68 1.1 skrll /* This file turns a regular Windows PE image into a DLL. Because of
69 1.1 skrll the complexity of this operation, it has been broken down into a
70 1.1 skrll number of separate modules which are all called by the main function
71 1.1 skrll at the end of this file. This function is not re-entrant and is
72 1.1 skrll normally only called once, so static variables are used to reduce
73 1.1 skrll the number of parameters and return values required.
74 1.1 skrll
75 1.1 skrll See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
76 1.1 skrll
77 1.1 skrll /* Auto-import feature by Paul Sokolovsky
78 1.1 skrll
79 1.1 skrll Quick facts:
80 1.1 skrll
81 1.1 skrll 1. With this feature on, DLL clients can import variables from DLL
82 1.1 skrll without any concern from their side (for example, without any source
83 1.1 skrll code modifications).
84 1.1 skrll
85 1.1 skrll 2. This is done completely in bounds of the PE specification (to be fair,
86 1.1 skrll there's a place where it pokes nose out of, but in practice it works).
87 1.1 skrll So, resulting module can be used with any other PE compiler/linker.
88 1.1 skrll
89 1.1 skrll 3. Auto-import is fully compatible with standard import method and they
90 1.1 skrll can be mixed together.
91 1.1 skrll
92 1.1 skrll 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
93 1.1 skrll reference to it; load time: negligible; virtual/physical memory: should be
94 1.1 skrll less than effect of DLL relocation, and I sincerely hope it doesn't affect
95 1.1 skrll DLL sharability (too much).
96 1.1 skrll
97 1.1 skrll Idea
98 1.1 skrll
99 1.1 skrll The obvious and only way to get rid of dllimport insanity is to make client
100 1.1 skrll access variable directly in the DLL, bypassing extra dereference. I.e.,
101 1.1 skrll whenever client contains something like
102 1.1 skrll
103 1.1 skrll mov dll_var,%eax,
104 1.1 skrll
105 1.1 skrll address of dll_var in the command should be relocated to point into loaded
106 1.1 skrll DLL. The aim is to make OS loader do so, and than make ld help with that.
107 1.1 skrll Import section of PE made following way: there's a vector of structures
108 1.1 skrll each describing imports from particular DLL. Each such structure points
109 1.1 skrll to two other parallel vectors: one holding imported names, and one which
110 1.1 skrll will hold address of corresponding imported name. So, the solution is
111 1.1 skrll de-vectorize these structures, making import locations be sparse and
112 1.1 skrll pointing directly into code. Before continuing, it is worth a note that,
113 1.1 skrll while authors strives to make PE act ELF-like, there're some other people
114 1.1 skrll make ELF act PE-like: elfvector, ;-) .
115 1.1 skrll
116 1.1 skrll Implementation
117 1.1 skrll
118 1.1 skrll For each reference of data symbol to be imported from DLL (to set of which
119 1.1 skrll belong symbols with name <sym>, if __imp_<sym> is found in implib), the
120 1.1 skrll import fixup entry is generated. That entry is of type
121 1.1 skrll IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
122 1.1 skrll fixup entry contains pointer to symbol's address within .text section
123 1.1 skrll (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
124 1.1 skrll (so, DLL name is referenced by multiple entries), and pointer to symbol
125 1.1 skrll name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
126 1.1 skrll pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
127 1.1 skrll containing imported name. Here comes that "on the edge" problem mentioned
128 1.1 skrll above: PE specification rambles that name vector (OriginalFirstThunk)
129 1.1 skrll should run in parallel with addresses vector (FirstThunk), i.e. that they
130 1.1 skrll should have same number of elements and terminated with zero. We violate
131 1.1 skrll this, since FirstThunk points directly into machine code. But in practice,
132 1.1.1.6 christos OS loader implemented the sane way: it goes through OriginalFirstThunk and
133 1.1 skrll puts addresses to FirstThunk, not something else. It once again should be
134 1.1 skrll noted that dll and symbol name structures are reused across fixup entries
135 1.1 skrll and should be there anyway to support standard import stuff, so sustained
136 1.1 skrll overhead is 20 bytes per reference. Other question is whether having several
137 1.1 skrll IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
138 1.1 skrll done even by native compiler/linker (libth32's functions are in fact reside
139 1.1 skrll in windows9x kernel32.dll, so if you use it, you have two
140 1.1 skrll IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
141 1.1 skrll referencing the same PE structures several times is valid. The answer is why
142 1.1 skrll not, prohibiting that (detecting violation) would require more work on
143 1.1 skrll behalf of loader than not doing it.
144 1.1 skrll
145 1.1 skrll See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
146 1.1 skrll
147 1.1 skrll static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
148 1.1 skrll
149 1.1 skrll /* For emultempl/pe.em. */
150 1.1 skrll
151 1.1 skrll def_file * pe_def_file = 0;
152 1.1 skrll int pe_dll_export_everything = 0;
153 1.1.1.2 christos int pe_dll_exclude_all_symbols = 0;
154 1.1 skrll int pe_dll_do_default_excludes = 1;
155 1.1 skrll int pe_dll_kill_ats = 0;
156 1.1 skrll int pe_dll_stdcall_aliases = 0;
157 1.1 skrll int pe_dll_warn_dup_exports = 0;
158 1.1 skrll int pe_dll_compat_implib = 0;
159 1.1 skrll int pe_dll_extra_pe_debug = 0;
160 1.1.1.2 christos int pe_use_nul_prefixed_import_tables = 0;
161 1.1.1.2 christos int pe_use_coff_long_section_names = -1;
162 1.1.1.2 christos int pe_leading_underscore = -1;
163 1.1.1.9 christos int pe_dll_enable_reloc_section = 1;
164 1.1 skrll
165 1.1 skrll /* Static variables and types. */
166 1.1 skrll
167 1.1 skrll static bfd_vma image_base;
168 1.1 skrll static bfd *filler_bfd;
169 1.1 skrll static struct bfd_section *edata_s, *reloc_s;
170 1.1 skrll static unsigned char *edata_d, *reloc_d;
171 1.1.1.10 christos static unsigned char *reloc_d = NULL;
172 1.1.1.10 christos static size_t edata_sz, reloc_sz = 0;
173 1.1 skrll static int runtime_pseudo_relocs_created = 0;
174 1.1.1.9 christos static bool runtime_pseudp_reloc_v2_init = false;
175 1.1 skrll
176 1.1 skrll typedef struct
177 1.1 skrll {
178 1.1 skrll const char *name;
179 1.1 skrll int len;
180 1.1 skrll }
181 1.1 skrll autofilter_entry_type;
182 1.1 skrll
183 1.1 skrll typedef struct
184 1.1 skrll {
185 1.1 skrll const char *target_name;
186 1.1 skrll const char *object_target;
187 1.1 skrll unsigned int imagebase_reloc;
188 1.1.1.11 christos unsigned int secrel_reloc_lo;
189 1.1.1.11 christos unsigned int secrel_reloc_hi;
190 1.1.1.11 christos unsigned int section_reloc;
191 1.1 skrll int pe_arch;
192 1.1 skrll int bfd_arch;
193 1.1.1.9 christos bool underscored;
194 1.1.1.2 christos const autofilter_entry_type* autofilter_symbollist;
195 1.1 skrll }
196 1.1 skrll pe_details_type;
197 1.1 skrll
198 1.1 skrll static const autofilter_entry_type autofilter_symbollist_generic[] =
199 1.1 skrll {
200 1.1 skrll { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
201 1.1 skrll /* Entry point symbols. */
202 1.1 skrll { STRING_COMMA_LEN ("DllMain") },
203 1.1 skrll { STRING_COMMA_LEN ("DllMainCRTStartup") },
204 1.1 skrll { STRING_COMMA_LEN ("_DllMainCRTStartup") },
205 1.1 skrll /* Runtime pseudo-reloc. */
206 1.1 skrll { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
207 1.1 skrll { STRING_COMMA_LEN ("do_pseudo_reloc") },
208 1.1 skrll { NULL, 0 }
209 1.1 skrll };
210 1.1 skrll
211 1.1 skrll static const autofilter_entry_type autofilter_symbollist_i386[] =
212 1.1 skrll {
213 1.1 skrll { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
214 1.1 skrll /* Entry point symbols, and entry hooks. */
215 1.1 skrll { STRING_COMMA_LEN ("cygwin_crt0") },
216 1.1.1.10 christos #ifdef pe_use_plus
217 1.1 skrll { STRING_COMMA_LEN ("DllMain") },
218 1.1 skrll { STRING_COMMA_LEN ("DllEntryPoint") },
219 1.1 skrll { STRING_COMMA_LEN ("DllMainCRTStartup") },
220 1.1 skrll { STRING_COMMA_LEN ("_cygwin_dll_entry") },
221 1.1 skrll { STRING_COMMA_LEN ("_cygwin_crt0_common") },
222 1.1 skrll { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
223 1.1 skrll #else
224 1.1 skrll { STRING_COMMA_LEN ("DllMain@12") },
225 1.1 skrll { STRING_COMMA_LEN ("DllEntryPoint@0") },
226 1.1 skrll { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
227 1.1 skrll { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
228 1.1 skrll { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
229 1.1 skrll { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
230 1.1 skrll { STRING_COMMA_LEN ("cygwin_attach_dll") },
231 1.1.1.2 christos #endif
232 1.1 skrll { STRING_COMMA_LEN ("cygwin_premain0") },
233 1.1 skrll { STRING_COMMA_LEN ("cygwin_premain1") },
234 1.1 skrll { STRING_COMMA_LEN ("cygwin_premain2") },
235 1.1 skrll { STRING_COMMA_LEN ("cygwin_premain3") },
236 1.1 skrll /* Runtime pseudo-reloc. */
237 1.1 skrll { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
238 1.1 skrll { STRING_COMMA_LEN ("do_pseudo_reloc") },
239 1.1 skrll /* Global vars that should not be exported. */
240 1.1 skrll { STRING_COMMA_LEN ("impure_ptr") },
241 1.1 skrll { STRING_COMMA_LEN ("_impure_ptr") },
242 1.1 skrll { STRING_COMMA_LEN ("_fmode") },
243 1.1 skrll { STRING_COMMA_LEN ("environ") },
244 1.1.1.4 christos { STRING_COMMA_LEN ("__dso_handle") },
245 1.1 skrll { NULL, 0 }
246 1.1 skrll };
247 1.1 skrll
248 1.1.1.12 christos /* Internal identification of PE architectures. */
249 1.1.1.12 christos enum
250 1.1.1.12 christos {
251 1.1.1.12 christos PE_ARCH_none,
252 1.1.1.12 christos PE_ARCH_i386,
253 1.1.1.12 christos PE_ARCH_sh,
254 1.1.1.12 christos PE_ARCH_arm,
255 1.1.1.12 christos PE_ARCH_arm_wince,
256 1.1.1.12 christos PE_ARCH_aarch64,
257 1.1.1.12 christos PE_ARCH_mcore,
258 1.1.1.12 christos };
259 1.1 skrll
260 1.1.1.2 christos /* Don't make it constant as underscore mode gets possibly overriden
261 1.1.1.2 christos by target or -(no-)leading-underscore option. */
262 1.1.1.2 christos static pe_details_type pe_detail_list[] =
263 1.1 skrll {
264 1.1 skrll {
265 1.1.1.10 christos #ifdef pe_use_plus
266 1.1 skrll "pei-x86-64",
267 1.1 skrll "pe-x86-64",
268 1.1.1.11 christos 3 /* R_AMD64_IMAGEBASE */,
269 1.1.1.11 christos 11 /* R_AMD64_SECREL32 */,
270 1.1.1.11 christos 12 /* R_AMD64_SECREL7 */,
271 1.1.1.11 christos 10 /* R_AMD64_SECTION */,
272 1.1 skrll #else
273 1.1 skrll "pei-i386",
274 1.1 skrll "pe-i386",
275 1.1 skrll 7 /* R_IMAGEBASE */,
276 1.1.1.11 christos 11, 11 /* R_SECREL32 */,
277 1.1.1.11 christos 10 /* R_SECTION */,
278 1.1 skrll #endif
279 1.1 skrll PE_ARCH_i386,
280 1.1 skrll bfd_arch_i386,
281 1.1.1.10 christos #ifdef pe_use_plus
282 1.1.1.9 christos false,
283 1.1.1.2 christos #else
284 1.1.1.9 christos true,
285 1.1.1.2 christos #endif
286 1.1 skrll autofilter_symbollist_i386
287 1.1 skrll },
288 1.1.1.10 christos #ifdef pe_use_plus
289 1.1.1.6 christos {
290 1.1.1.6 christos "pei-x86-64",
291 1.1.1.6 christos "pe-bigobj-x86-64",
292 1.1.1.11 christos 3 /* R_AMD64_IMAGEBASE */,
293 1.1.1.11 christos 11 /* R_AMD64_SECREL32 */,
294 1.1.1.11 christos 12 /* R_AMD64_SECREL7 */,
295 1.1.1.11 christos 10 /* R_AMD64_SECTION */,
296 1.1.1.6 christos PE_ARCH_i386,
297 1.1.1.6 christos bfd_arch_i386,
298 1.1.1.9 christos false,
299 1.1.1.9 christos autofilter_symbollist_i386
300 1.1.1.9 christos },
301 1.1.1.9 christos #else
302 1.1.1.9 christos {
303 1.1.1.9 christos "pei-i386",
304 1.1.1.9 christos "pe-bigobj-i386",
305 1.1.1.9 christos 7 /* R_IMAGEBASE */,
306 1.1.1.11 christos 11, 11 /* R_SECREL32 */,
307 1.1.1.11 christos 10 /* R_SECTION */,
308 1.1.1.9 christos PE_ARCH_i386,
309 1.1.1.9 christos bfd_arch_i386,
310 1.1.1.9 christos true,
311 1.1.1.6 christos autofilter_symbollist_i386
312 1.1.1.6 christos },
313 1.1 skrll {
314 1.1 skrll "pei-shl",
315 1.1 skrll "pe-shl",
316 1.1 skrll 16 /* R_SH_IMAGEBASE */,
317 1.1.1.11 christos ~0, 0, ~0, /* none */
318 1.1 skrll PE_ARCH_sh,
319 1.1 skrll bfd_arch_sh,
320 1.1.1.9 christos true,
321 1.1 skrll autofilter_symbollist_generic
322 1.1 skrll },
323 1.1 skrll {
324 1.1.1.12 christos "pei-mcore-little",
325 1.1.1.12 christos "pe-mcore-little",
326 1.1.1.12 christos 7 /* IMAGE_REL_MCORE_RVA */,
327 1.1.1.11 christos ~0, 0, ~0, /* none */
328 1.1.1.12 christos PE_ARCH_mcore,
329 1.1.1.12 christos bfd_arch_mcore,
330 1.1.1.12 christos false,
331 1.1.1.12 christos autofilter_symbollist_generic
332 1.1.1.12 christos },
333 1.1.1.12 christos {
334 1.1.1.12 christos "pei-mcore-big",
335 1.1.1.12 christos "pe-mcore-big",
336 1.1.1.12 christos 7 /* IMAGE_REL_MCORE_RVA */,
337 1.1.1.12 christos ~0, 0, ~0, /* none */
338 1.1.1.12 christos PE_ARCH_mcore,
339 1.1.1.12 christos bfd_arch_mcore,
340 1.1.1.9 christos false,
341 1.1 skrll autofilter_symbollist_generic
342 1.1 skrll },
343 1.1 skrll {
344 1.1 skrll "pei-arm-little",
345 1.1 skrll "pe-arm-little",
346 1.1 skrll 11 /* ARM_RVA32 */,
347 1.1.1.11 christos ~0, 0, ~0, /* none */
348 1.1 skrll PE_ARCH_arm,
349 1.1 skrll bfd_arch_arm,
350 1.1.1.9 christos true,
351 1.1 skrll autofilter_symbollist_generic
352 1.1 skrll },
353 1.1 skrll {
354 1.1 skrll "pei-arm-wince-little",
355 1.1 skrll "pe-arm-wince-little",
356 1.1 skrll 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
357 1.1.1.11 christos 15, 15, /* ARM_SECREL (dito) */
358 1.1.1.11 christos 14, /* ARM_SECTION (dito) */
359 1.1 skrll PE_ARCH_arm_wince,
360 1.1 skrll bfd_arch_arm,
361 1.1.1.9 christos false,
362 1.1 skrll autofilter_symbollist_generic
363 1.1 skrll },
364 1.1.1.12 christos #endif
365 1.1.1.10 christos {
366 1.1.1.10 christos "pei-aarch64-little",
367 1.1.1.10 christos "pe-aarch64-little",
368 1.1.1.11 christos 2, /* IMAGE_REL_ARM64_ADDR32NB */
369 1.1.1.11 christos 8, /* IMAGE_REL_ARM64_SECREL */
370 1.1.1.11 christos 11, /* IMAGE_REL_ARM64_SECREL_LOW12L */
371 1.1.1.11 christos 13, /* IMAGE_REL_ARM64_SECTION */
372 1.1.1.10 christos PE_ARCH_aarch64,
373 1.1.1.10 christos bfd_arch_aarch64,
374 1.1.1.10 christos false,
375 1.1.1.10 christos autofilter_symbollist_generic
376 1.1.1.10 christos },
377 1.1.1.12 christos {
378 1.1.1.12 christos "pei-aarch64-little",
379 1.1.1.12 christos "pe-bigobj-aarch64-little",
380 1.1.1.12 christos 2, /* IMAGE_REL_ARM64_ADDR32NB */
381 1.1.1.12 christos 8, /* IMAGE_REL_ARM64_SECREL */
382 1.1.1.12 christos 11, /* IMAGE_REL_ARM64_SECREL_LOW12L */
383 1.1.1.12 christos 13, /* IMAGE_REL_ARM64_SECTION */
384 1.1.1.12 christos PE_ARCH_aarch64,
385 1.1.1.12 christos bfd_arch_aarch64,
386 1.1.1.12 christos false,
387 1.1.1.12 christos autofilter_symbollist_generic
388 1.1.1.12 christos },
389 1.1.1.11 christos { NULL, NULL, 0, 0, 0, 0, 0, 0, false, NULL }
390 1.1 skrll };
391 1.1 skrll
392 1.1 skrll static const pe_details_type *pe_details;
393 1.1 skrll
394 1.1 skrll /* Do not specify library suffix explicitly, to allow for dllized versions. */
395 1.1 skrll static const autofilter_entry_type autofilter_liblist[] =
396 1.1 skrll {
397 1.1 skrll { STRING_COMMA_LEN ("libcegcc") },
398 1.1 skrll { STRING_COMMA_LEN ("libcygwin") },
399 1.1 skrll { STRING_COMMA_LEN ("libgcc") },
400 1.1 skrll { STRING_COMMA_LEN ("libgcc_s") },
401 1.1 skrll { STRING_COMMA_LEN ("libstdc++") },
402 1.1 skrll { STRING_COMMA_LEN ("libmingw32") },
403 1.1 skrll { STRING_COMMA_LEN ("libmingwex") },
404 1.1 skrll { STRING_COMMA_LEN ("libg2c") },
405 1.1 skrll { STRING_COMMA_LEN ("libsupc++") },
406 1.1 skrll { STRING_COMMA_LEN ("libobjc") },
407 1.1 skrll { STRING_COMMA_LEN ("libgcj") },
408 1.1.1.6 christos { STRING_COMMA_LEN ("libmsvcrt") },
409 1.1.1.6 christos { STRING_COMMA_LEN ("libmsvcrt-os") },
410 1.1.1.9 christos { STRING_COMMA_LEN ("libucrt") },
411 1.1.1.11 christos { STRING_COMMA_LEN ("libucrtapp") },
412 1.1.1.6 christos { STRING_COMMA_LEN ("libucrtbase") },
413 1.1.1.11 christos { STRING_COMMA_LEN ("libpthread") },
414 1.1.1.11 christos { STRING_COMMA_LEN ("libwinpthread") },
415 1.1 skrll { NULL, 0 }
416 1.1 skrll };
417 1.1 skrll
418 1.1 skrll /* Regardless of the suffix issue mentioned above, we must ensure that
419 1.1 skrll we do not falsely match on a leading substring, such as when libtool
420 1.1 skrll builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
421 1.1 skrll This routine ensures that the leading part of the name matches and that
422 1.1 skrll it is followed by only an optional version suffix and a file extension,
423 1.1 skrll returning zero if so or -1 if not. */
424 1.1 skrll static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
425 1.1 skrll {
426 1.1.1.3 christos if (filename_ncmp (libname, afptr->name, afptr->len))
427 1.1 skrll return -1;
428 1.1 skrll
429 1.1 skrll libname += afptr->len;
430 1.1 skrll
431 1.1 skrll /* Be liberal in interpreting what counts as a version suffix; we
432 1.1 skrll accept anything that has a dash to separate it from the name and
433 1.1 skrll begins with a digit. */
434 1.1 skrll if (libname[0] == '-')
435 1.1 skrll {
436 1.1 skrll if (!ISDIGIT (*++libname))
437 1.1 skrll return -1;
438 1.1 skrll /* Ensure the filename has an extension. */
439 1.1 skrll while (*++libname != '.')
440 1.1 skrll if (!*libname)
441 1.1 skrll return -1;
442 1.1 skrll }
443 1.1 skrll else if (libname[0] != '.')
444 1.1 skrll return -1;
445 1.1 skrll
446 1.1 skrll return 0;
447 1.1 skrll }
448 1.1 skrll
449 1.1 skrll static const autofilter_entry_type autofilter_objlist[] =
450 1.1 skrll {
451 1.1 skrll { STRING_COMMA_LEN ("crt0.o") },
452 1.1 skrll { STRING_COMMA_LEN ("crt1.o") },
453 1.1 skrll { STRING_COMMA_LEN ("crt2.o") },
454 1.1 skrll { STRING_COMMA_LEN ("dllcrt1.o") },
455 1.1 skrll { STRING_COMMA_LEN ("dllcrt2.o") },
456 1.1 skrll { STRING_COMMA_LEN ("gcrt0.o") },
457 1.1 skrll { STRING_COMMA_LEN ("gcrt1.o") },
458 1.1 skrll { STRING_COMMA_LEN ("gcrt2.o") },
459 1.1 skrll { STRING_COMMA_LEN ("crtbegin.o") },
460 1.1 skrll { STRING_COMMA_LEN ("crtend.o") },
461 1.1 skrll { NULL, 0 }
462 1.1 skrll };
463 1.1 skrll
464 1.1 skrll static const autofilter_entry_type autofilter_symbolprefixlist[] =
465 1.1 skrll {
466 1.1 skrll /* _imp_ is treated specially, as it is always underscored. */
467 1.1 skrll /* { STRING_COMMA_LEN ("_imp_") }, */
468 1.1 skrll /* Don't export some c++ symbols. */
469 1.1 skrll { STRING_COMMA_LEN ("__rtti_") },
470 1.1 skrll { STRING_COMMA_LEN ("__builtin_") },
471 1.1 skrll /* Don't re-export auto-imported symbols. */
472 1.1.1.2 christos { STRING_COMMA_LEN ("__nm_") },
473 1.1 skrll /* Don't export symbols specifying internal DLL layout. */
474 1.1 skrll { STRING_COMMA_LEN ("_head_") },
475 1.1 skrll { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
476 1.1 skrll /* Don't export section labels or artificial symbols
477 1.1 skrll (eg ".weak.foo". */
478 1.1 skrll { STRING_COMMA_LEN (".") },
479 1.1 skrll { NULL, 0 }
480 1.1 skrll };
481 1.1 skrll
482 1.1 skrll static const autofilter_entry_type autofilter_symbolsuffixlist[] =
483 1.1 skrll {
484 1.1 skrll { STRING_COMMA_LEN ("_iname") },
485 1.1 skrll { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
486 1.1 skrll { NULL, 0 }
487 1.1 skrll };
488 1.1 skrll
489 1.1 skrll #define U(str) (pe_details->underscored ? "_" str : str)
490 1.1 skrll
491 1.1 skrll void
492 1.1 skrll pe_dll_id_target (const char *target)
493 1.1 skrll {
494 1.1 skrll int i;
495 1.1 skrll
496 1.1 skrll for (i = 0; pe_detail_list[i].target_name; i++)
497 1.1 skrll if (strcmp (pe_detail_list[i].target_name, target) == 0
498 1.1 skrll || strcmp (pe_detail_list[i].object_target, target) == 0)
499 1.1 skrll {
500 1.1.1.2 christos int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */
501 1.1.1.2 christos if (u == -1)
502 1.1.1.2 christos bfd_get_target_info (target, NULL, NULL, &u, NULL);
503 1.1.1.2 christos if (u == -1)
504 1.1.1.2 christos abort ();
505 1.1.1.9 christos pe_detail_list[i].underscored = u != 0;
506 1.1 skrll pe_details = pe_detail_list + i;
507 1.1.1.2 christos pe_leading_underscore = (u != 0 ? 1 : 0);
508 1.1 skrll return;
509 1.1 skrll }
510 1.1.1.7 christos einfo (_("%X%P: unsupported PEI architecture: %s\n"), target);
511 1.1 skrll exit (1);
512 1.1 skrll }
513 1.1 skrll
514 1.1 skrll /* Helper functions for qsort. Relocs must be sorted so that we can write
515 1.1 skrll them out by pages. */
516 1.1 skrll
517 1.1 skrll typedef struct
518 1.1 skrll {
519 1.1 skrll bfd_vma vma;
520 1.1 skrll char type;
521 1.1 skrll short extra;
522 1.1.1.8 christos int idx;
523 1.1 skrll }
524 1.1 skrll reloc_data_type;
525 1.1 skrll
526 1.1 skrll static int
527 1.1 skrll reloc_sort (const void *va, const void *vb)
528 1.1 skrll {
529 1.1.1.8 christos const reloc_data_type *a = (const reloc_data_type *) va;
530 1.1.1.8 christos const reloc_data_type *b = (const reloc_data_type *) vb;
531 1.1 skrll
532 1.1.1.8 christos if (a->vma > b->vma)
533 1.1.1.8 christos return 1;
534 1.1.1.8 christos if (a->vma < b->vma)
535 1.1.1.8 christos return -1;
536 1.1.1.8 christos if (a->idx > b->idx)
537 1.1.1.8 christos return 1;
538 1.1.1.8 christos if (a->idx < b->idx)
539 1.1.1.8 christos return -1;
540 1.1.1.8 christos return 0;
541 1.1 skrll }
542 1.1 skrll
543 1.1 skrll static int
544 1.1 skrll pe_export_sort (const void *va, const void *vb)
545 1.1 skrll {
546 1.1 skrll const def_file_export *a = va;
547 1.1 skrll const def_file_export *b = vb;
548 1.1.1.2 christos char *an = a->name;
549 1.1.1.2 christos char *bn = b->name;
550 1.1.1.2 christos if (a->its_name)
551 1.1.1.2 christos an = a->its_name;
552 1.1.1.2 christos if (b->its_name)
553 1.1.1.2 christos bn = b->its_name;
554 1.1 skrll
555 1.1.1.2 christos return strcmp (an, bn);
556 1.1 skrll }
557 1.1 skrll
558 1.1 skrll /* Read and process the .DEF file. */
559 1.1 skrll
560 1.1 skrll /* These correspond to the entries in pe_def_file->exports[]. I use
561 1.1 skrll exported_symbol_sections[i] to tag whether or not the symbol was
562 1.1 skrll defined, since we can't export symbols we don't have. */
563 1.1 skrll
564 1.1 skrll static bfd_vma *exported_symbol_offsets;
565 1.1 skrll static struct bfd_section **exported_symbol_sections;
566 1.1 skrll static int export_table_size;
567 1.1 skrll static int count_exported;
568 1.1 skrll static int count_exported_byname;
569 1.1 skrll static int count_with_ordinals;
570 1.1.1.9 christos static const char *dll_filename;
571 1.1 skrll static int min_ordinal, max_ordinal;
572 1.1 skrll static int *exported_symbols;
573 1.1 skrll
574 1.1 skrll typedef struct exclude_list_struct
575 1.1 skrll {
576 1.1 skrll char *string;
577 1.1 skrll struct exclude_list_struct *next;
578 1.1.1.2 christos exclude_type type;
579 1.1 skrll }
580 1.1 skrll exclude_list_struct;
581 1.1 skrll
582 1.1 skrll static struct exclude_list_struct *excludes = 0;
583 1.1 skrll
584 1.1 skrll void
585 1.1.1.2 christos pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
586 1.1 skrll {
587 1.1 skrll char *local_copy;
588 1.1 skrll char *exclude_string;
589 1.1 skrll
590 1.1 skrll local_copy = xstrdup (new_excludes);
591 1.1 skrll
592 1.1 skrll exclude_string = strtok (local_copy, ",:");
593 1.1 skrll for (; exclude_string; exclude_string = strtok (NULL, ",:"))
594 1.1 skrll {
595 1.1 skrll struct exclude_list_struct *new_exclude;
596 1.1 skrll
597 1.1 skrll new_exclude = xmalloc (sizeof (struct exclude_list_struct));
598 1.1 skrll new_exclude->string = xmalloc (strlen (exclude_string) + 1);
599 1.1 skrll strcpy (new_exclude->string, exclude_string);
600 1.1 skrll new_exclude->type = type;
601 1.1 skrll new_exclude->next = excludes;
602 1.1 skrll excludes = new_exclude;
603 1.1 skrll }
604 1.1 skrll
605 1.1 skrll free (local_copy);
606 1.1 skrll }
607 1.1 skrll
608 1.1.1.9 christos static bool
609 1.1 skrll is_import (const char* n)
610 1.1 skrll {
611 1.1.1.9 christos return (startswith (n, "__imp_"));
612 1.1 skrll }
613 1.1 skrll
614 1.1 skrll /* abfd is a bfd containing n (or NULL)
615 1.1 skrll It can be used for contextual checks. */
616 1.1 skrll
617 1.1 skrll static int
618 1.1 skrll auto_export (bfd *abfd, def_file *d, const char *n)
619 1.1 skrll {
620 1.1.1.3 christos def_file_export key;
621 1.1 skrll struct exclude_list_struct *ex;
622 1.1 skrll const autofilter_entry_type *afptr;
623 1.1.1.3 christos const char * libname = NULL;
624 1.1.1.3 christos
625 1.1 skrll if (abfd && abfd->my_archive)
626 1.1.1.9 christos libname = lbasename (bfd_get_filename (abfd->my_archive));
627 1.1 skrll
628 1.1.1.3 christos key.name = key.its_name = (char *) n;
629 1.1.1.3 christos
630 1.1.1.3 christos /* Return false if n is in the d->exports table. */
631 1.1.1.9 christos if (d->num_exports != 0
632 1.1.1.9 christos && bsearch (&key, d->exports, d->num_exports,
633 1.1.1.9 christos sizeof (pe_def_file->exports[0]), pe_export_sort))
634 1.1.1.3 christos return 0;
635 1.1 skrll
636 1.1 skrll if (pe_dll_do_default_excludes)
637 1.1 skrll {
638 1.1 skrll const char * p;
639 1.1 skrll int len;
640 1.1 skrll
641 1.1 skrll if (pe_dll_extra_pe_debug)
642 1.1 skrll printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
643 1.1 skrll n, abfd, abfd->my_archive);
644 1.1 skrll
645 1.1 skrll /* First of all, make context checks:
646 1.1 skrll Don't export anything from standard libs. */
647 1.1 skrll if (libname)
648 1.1 skrll {
649 1.1 skrll afptr = autofilter_liblist;
650 1.1 skrll
651 1.1 skrll while (afptr->name)
652 1.1 skrll {
653 1.1 skrll if (libnamencmp (libname, afptr) == 0 )
654 1.1 skrll return 0;
655 1.1 skrll afptr++;
656 1.1 skrll }
657 1.1 skrll }
658 1.1 skrll
659 1.1 skrll /* Next, exclude symbols from certain startup objects. */
660 1.1 skrll
661 1.1.1.9 christos if (abfd && (p = lbasename (bfd_get_filename (abfd))))
662 1.1 skrll {
663 1.1 skrll afptr = autofilter_objlist;
664 1.1 skrll while (afptr->name)
665 1.1 skrll {
666 1.1 skrll if (strcmp (p, afptr->name) == 0)
667 1.1 skrll return 0;
668 1.1 skrll afptr++;
669 1.1 skrll }
670 1.1 skrll }
671 1.1 skrll
672 1.1 skrll /* Don't try to blindly exclude all symbols
673 1.1 skrll that begin with '__'; this was tried and
674 1.1 skrll it is too restrictive. Instead we have
675 1.1 skrll a target specific list to use: */
676 1.1.1.2 christos afptr = pe_details->autofilter_symbollist;
677 1.1 skrll
678 1.1 skrll while (afptr->name)
679 1.1 skrll {
680 1.1 skrll if (strcmp (n, afptr->name) == 0)
681 1.1 skrll return 0;
682 1.1 skrll
683 1.1 skrll afptr++;
684 1.1 skrll }
685 1.1 skrll
686 1.1 skrll /* Next, exclude symbols starting with ... */
687 1.1 skrll afptr = autofilter_symbolprefixlist;
688 1.1 skrll while (afptr->name)
689 1.1 skrll {
690 1.1 skrll if (strncmp (n, afptr->name, afptr->len) == 0)
691 1.1 skrll return 0;
692 1.1 skrll
693 1.1 skrll afptr++;
694 1.1 skrll }
695 1.1 skrll
696 1.1 skrll /* Finally, exclude symbols ending with ... */
697 1.1 skrll len = strlen (n);
698 1.1 skrll afptr = autofilter_symbolsuffixlist;
699 1.1 skrll while (afptr->name)
700 1.1 skrll {
701 1.1 skrll if ((len >= afptr->len)
702 1.1 skrll /* Add 1 to insure match with trailing '\0'. */
703 1.1 skrll && strncmp (n + len - afptr->len, afptr->name,
704 1.1 skrll afptr->len + 1) == 0)
705 1.1 skrll return 0;
706 1.1 skrll
707 1.1 skrll afptr++;
708 1.1 skrll }
709 1.1 skrll }
710 1.1 skrll
711 1.1 skrll for (ex = excludes; ex; ex = ex->next)
712 1.1 skrll {
713 1.1.1.2 christos if (ex->type == EXCLUDELIBS)
714 1.1 skrll {
715 1.1 skrll if (libname
716 1.1.1.3 christos && ((filename_cmp (libname, ex->string) == 0)
717 1.1 skrll || (strcasecmp ("ALL", ex->string) == 0)))
718 1.1 skrll return 0;
719 1.1 skrll }
720 1.1.1.2 christos else if (ex->type == EXCLUDEFORIMPLIB)
721 1.1.1.2 christos {
722 1.1.1.9 christos if (filename_cmp (bfd_get_filename (abfd), ex->string) == 0)
723 1.1.1.2 christos return 0;
724 1.1.1.2 christos }
725 1.1 skrll else if (strcmp (n, ex->string) == 0)
726 1.1 skrll return 0;
727 1.1 skrll }
728 1.1 skrll
729 1.1 skrll return 1;
730 1.1 skrll }
731 1.1 skrll
732 1.1 skrll static void
733 1.1.1.2 christos process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
734 1.1 skrll {
735 1.1 skrll int i, j;
736 1.1.1.10 christos unsigned int ui;
737 1.1 skrll struct bfd_link_hash_entry *blhe;
738 1.1 skrll bfd *b;
739 1.1 skrll struct bfd_section *s;
740 1.1 skrll def_file_export *e = 0;
741 1.1.1.9 christos bool resort_needed;
742 1.1 skrll
743 1.1 skrll if (!pe_def_file)
744 1.1 skrll pe_def_file = def_file_empty ();
745 1.1 skrll
746 1.1 skrll /* First, run around to all the objects looking for the .drectve
747 1.1 skrll sections, and push those into the def file too. */
748 1.1.1.4 christos for (b = info->input_bfds; b; b = b->link.next)
749 1.1 skrll {
750 1.1 skrll s = bfd_get_section_by_name (b, ".drectve");
751 1.1 skrll if (s)
752 1.1 skrll {
753 1.1 skrll long size = s->size;
754 1.1 skrll char *buf = xmalloc (size);
755 1.1 skrll
756 1.1 skrll bfd_get_section_contents (b, s, buf, 0, size);
757 1.1 skrll def_file_add_directive (pe_def_file, buf, size);
758 1.1 skrll free (buf);
759 1.1 skrll }
760 1.1 skrll }
761 1.1 skrll
762 1.1.1.2 christos /* Process aligned common symbol information from the
763 1.1.1.2 christos .drectve sections now; common symbol allocation is
764 1.1.1.2 christos done before final link, so it will be too late to
765 1.1.1.2 christos process them in process_embedded_commands() called
766 1.1.1.2 christos from _bfd_coff_link_input_bfd(). */
767 1.1.1.2 christos if (pe_def_file->aligncomms)
768 1.1.1.2 christos {
769 1.1.1.2 christos def_file_aligncomm *ac = pe_def_file->aligncomms;
770 1.1.1.2 christos while (ac)
771 1.1.1.2 christos {
772 1.1.1.2 christos struct coff_link_hash_entry *sym_hash;
773 1.1.1.2 christos sym_hash = coff_link_hash_lookup (coff_hash_table (info),
774 1.1.1.9 christos ac->symbol_name, false, false, false);
775 1.1.1.2 christos if (sym_hash && sym_hash->root.type == bfd_link_hash_common
776 1.1.1.6 christos && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
777 1.1.1.2 christos {
778 1.1.1.2 christos sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
779 1.1.1.2 christos }
780 1.1.1.2 christos ac = ac->next;
781 1.1.1.2 christos }
782 1.1.1.2 christos }
783 1.1.1.2 christos
784 1.1.1.10 christos if (pe_def_file->exclude_symbols)
785 1.1.1.10 christos {
786 1.1.1.10 christos for (ui = 0; ui < pe_def_file->num_exclude_symbols; ui++)
787 1.1.1.10 christos {
788 1.1.1.10 christos pe_dll_add_excludes (pe_def_file->exclude_symbols[ui].symbol_name,
789 1.1.1.10 christos EXCLUDESYMS);
790 1.1.1.10 christos }
791 1.1.1.10 christos }
792 1.1.1.10 christos
793 1.1.1.2 christos /* If we are building an executable and there is nothing
794 1.1.1.2 christos to export, we do not build an export table at all. */
795 1.1.1.4 christos if (bfd_link_executable (info) && pe_def_file->num_exports == 0
796 1.1.1.2 christos && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
797 1.1 skrll return;
798 1.1 skrll
799 1.1 skrll /* Now, maybe export everything else the default way. */
800 1.1.1.2 christos if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
801 1.1.1.2 christos && !pe_dll_exclude_all_symbols)
802 1.1 skrll {
803 1.1.1.4 christos for (b = info->input_bfds; b; b = b->link.next)
804 1.1 skrll {
805 1.1 skrll asymbol **symbols;
806 1.1 skrll int nsyms;
807 1.1 skrll
808 1.1 skrll if (!bfd_generic_link_read_symbols (b))
809 1.1 skrll {
810 1.1.1.11 christos fatal (_("%P: %pB: could not read symbols: %E\n"), b);
811 1.1 skrll return;
812 1.1 skrll }
813 1.1 skrll
814 1.1 skrll symbols = bfd_get_outsymbols (b);
815 1.1 skrll nsyms = bfd_get_symcount (b);
816 1.1 skrll
817 1.1 skrll for (j = 0; j < nsyms; j++)
818 1.1 skrll {
819 1.1 skrll /* We should export symbols which are either global or not
820 1.1 skrll anything at all. (.bss data is the latter)
821 1.1.1.12 christos We should not export undefined symbols.
822 1.1.1.12 christos Compilers may generate template data (initializers) for
823 1.1.1.12 christos thread-local variables in .tls$* sections, but they are only
824 1.1.1.12 christos used by the DLL loader. Symbols in those sections are used
825 1.1.1.12 christos to access thread-local variables, but only via offsets to the
826 1.1.1.12 christos beginning of the .tls output section. These offsets can't be
827 1.1.1.12 christos exported. PE targets not using BSF_THREAD_LOCAL, we need to
828 1.1.1.12 christos go by section name for now. */
829 1.1.1.9 christos bool would_export
830 1.1.1.3 christos = (symbols[j]->section != bfd_und_section_ptr
831 1.1.1.12 christos && !startswith (symbols[j]->section->name, ".tls$")
832 1.1.1.3 christos && ((symbols[j]->flags & BSF_GLOBAL)
833 1.1.1.3 christos || (symbols[j]->flags == 0)));
834 1.1.1.3 christos if (link_info.version_info && would_export)
835 1.1.1.6 christos would_export
836 1.1.1.6 christos = !bfd_hide_sym_by_version (link_info.version_info,
837 1.1.1.6 christos symbols[j]->name);
838 1.1.1.2 christos if (would_export)
839 1.1 skrll {
840 1.1 skrll const char *sn = symbols[j]->name;
841 1.1 skrll
842 1.1 skrll /* We should not re-export imported stuff. */
843 1.1 skrll {
844 1.1 skrll char *name;
845 1.1 skrll if (is_import (sn))
846 1.1.1.6 christos continue;
847 1.1 skrll
848 1.1 skrll name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
849 1.1 skrll sprintf (name, "%s%s", "__imp_", sn);
850 1.1 skrll
851 1.1 skrll blhe = bfd_link_hash_lookup (info->hash, name,
852 1.1.1.9 christos false, false, false);
853 1.1 skrll free (name);
854 1.1 skrll
855 1.1 skrll if (blhe && blhe->type == bfd_link_hash_defined)
856 1.1 skrll continue;
857 1.1 skrll }
858 1.1 skrll
859 1.1 skrll if (pe_details->underscored && *sn == '_')
860 1.1 skrll sn++;
861 1.1 skrll
862 1.1 skrll if (auto_export (b, pe_def_file, sn))
863 1.1 skrll {
864 1.1.1.10 christos bool is_dup = false;
865 1.1 skrll def_file_export *p;
866 1.1.1.3 christos
867 1.1.1.3 christos p = def_file_add_export (pe_def_file, sn, 0, -1,
868 1.1.1.3 christos NULL, &is_dup);
869 1.1 skrll /* Fill data flag properly, from dlltool.c. */
870 1.1.1.3 christos if (!is_dup)
871 1.1.1.6 christos p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
872 1.1 skrll }
873 1.1 skrll }
874 1.1 skrll }
875 1.1 skrll }
876 1.1 skrll }
877 1.1 skrll
878 1.1 skrll #undef NE
879 1.1 skrll #define NE pe_def_file->num_exports
880 1.1 skrll
881 1.1.1.2 christos /* Don't create an empty export table. */
882 1.1.1.2 christos if (NE == 0)
883 1.1.1.2 christos return;
884 1.1.1.2 christos
885 1.1.1.9 christos resort_needed = false;
886 1.1.1.3 christos
887 1.1 skrll /* Canonicalize the export list. */
888 1.1 skrll if (pe_dll_kill_ats)
889 1.1 skrll {
890 1.1 skrll for (i = 0; i < NE; i++)
891 1.1 skrll {
892 1.1.1.4 christos /* Check for fastcall/stdcall-decoration, but ignore
893 1.1.1.4 christos C++ mangled names. */
894 1.1.1.4 christos if (pe_def_file->exports[i].name[0] != '?'
895 1.1.1.4 christos && strchr (pe_def_file->exports[i].name, '@'))
896 1.1 skrll {
897 1.1 skrll /* This will preserve internal_name, which may have been
898 1.1 skrll pointing to the same memory as name, or might not
899 1.1 skrll have. */
900 1.1 skrll int lead_at = (*pe_def_file->exports[i].name == '@');
901 1.1 skrll char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
902 1.1.1.4 christos char *tmp_at = strrchr (tmp, '@');
903 1.1 skrll
904 1.1 skrll if (tmp_at)
905 1.1.1.6 christos *tmp_at = 0;
906 1.1 skrll else
907 1.1.1.7 christos einfo (_("%X%P: cannot export %s: invalid export name\n"),
908 1.1 skrll pe_def_file->exports[i].name);
909 1.1 skrll pe_def_file->exports[i].name = tmp;
910 1.1.1.9 christos resort_needed = true;
911 1.1 skrll }
912 1.1 skrll }
913 1.1 skrll }
914 1.1 skrll
915 1.1.1.3 christos /* Re-sort the exports table as we have possibly changed the order
916 1.1.1.3 christos by removing leading @. */
917 1.1.1.3 christos if (resort_needed)
918 1.1.1.3 christos qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
919 1.1.1.6 christos pe_export_sort);
920 1.1.1.3 christos
921 1.1 skrll if (pe_dll_stdcall_aliases)
922 1.1 skrll {
923 1.1 skrll for (i = 0; i < NE; i++)
924 1.1 skrll {
925 1.1 skrll if (is_import (pe_def_file->exports[i].name))
926 1.1 skrll continue;
927 1.1 skrll
928 1.1 skrll if (strchr (pe_def_file->exports[i].name, '@'))
929 1.1 skrll {
930 1.1.1.10 christos bool is_dup = true;
931 1.1 skrll int lead_at = (*pe_def_file->exports[i].name == '@');
932 1.1 skrll char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
933 1.1 skrll
934 1.1 skrll *(strchr (tmp, '@')) = 0;
935 1.1 skrll if (auto_export (NULL, pe_def_file, tmp))
936 1.1 skrll def_file_add_export (pe_def_file, tmp,
937 1.1 skrll pe_def_file->exports[i].internal_name,
938 1.1.1.3 christos -1, NULL, &is_dup);
939 1.1.1.3 christos if (is_dup)
940 1.1.1.6 christos free (tmp);
941 1.1 skrll }
942 1.1 skrll }
943 1.1 skrll }
944 1.1 skrll
945 1.1 skrll /* Convenience, but watch out for it changing. */
946 1.1 skrll e = pe_def_file->exports;
947 1.1 skrll
948 1.1 skrll for (i = 0, j = 0; i < NE; i++)
949 1.1 skrll {
950 1.1 skrll if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
951 1.1 skrll {
952 1.1 skrll /* This is a duplicate. */
953 1.1 skrll if (e[j - 1].ordinal != -1
954 1.1 skrll && e[i].ordinal != -1
955 1.1 skrll && e[j - 1].ordinal != e[i].ordinal)
956 1.1 skrll {
957 1.1 skrll if (pe_dll_warn_dup_exports)
958 1.1 skrll /* xgettext:c-format */
959 1.1.1.7 christos einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
960 1.1 skrll e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
961 1.1 skrll }
962 1.1 skrll else
963 1.1 skrll {
964 1.1 skrll if (pe_dll_warn_dup_exports)
965 1.1 skrll /* xgettext:c-format */
966 1.1.1.7 christos einfo (_("%P: warning, duplicate EXPORT: %s\n"),
967 1.1 skrll e[j - 1].name);
968 1.1 skrll }
969 1.1 skrll
970 1.1 skrll if (e[i].ordinal != -1)
971 1.1 skrll e[j - 1].ordinal = e[i].ordinal;
972 1.1 skrll e[j - 1].flag_private |= e[i].flag_private;
973 1.1 skrll e[j - 1].flag_constant |= e[i].flag_constant;
974 1.1 skrll e[j - 1].flag_noname |= e[i].flag_noname;
975 1.1 skrll e[j - 1].flag_data |= e[i].flag_data;
976 1.1.1.9 christos free (e[i].name);
977 1.1.1.9 christos free (e[i].internal_name);
978 1.1.1.9 christos free (e[i].its_name);
979 1.1 skrll }
980 1.1 skrll else
981 1.1 skrll {
982 1.1 skrll if (i != j)
983 1.1 skrll e[j] = e[i];
984 1.1 skrll j++;
985 1.1 skrll }
986 1.1 skrll }
987 1.1 skrll pe_def_file->num_exports = j; /* == NE */
988 1.1 skrll
989 1.1.1.3 christos exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
990 1.1.1.3 christos exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
991 1.1.1.3 christos
992 1.1.1.3 christos memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
993 1.1.1.3 christos max_ordinal = 0;
994 1.1.1.3 christos min_ordinal = 65536;
995 1.1.1.3 christos count_exported = 0;
996 1.1.1.3 christos count_exported_byname = 0;
997 1.1.1.3 christos count_with_ordinals = 0;
998 1.1.1.3 christos
999 1.1 skrll for (i = 0; i < NE; i++)
1000 1.1 skrll {
1001 1.1.1.5 christos char *int_name = pe_def_file->exports[i].internal_name;
1002 1.1 skrll char *name;
1003 1.1.1.5 christos
1004 1.1.1.5 christos /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
1005 1.1.1.5 christos lang_add_gc_name (int_name);
1006 1.1.1.5 christos
1007 1.1.1.5 christos name = xmalloc (strlen (int_name) + 2);
1008 1.1.1.5 christos if (pe_details->underscored && int_name[0] != '@')
1009 1.1 skrll {
1010 1.1 skrll *name = '_';
1011 1.1.1.5 christos strcpy (name + 1, int_name);
1012 1.1.1.5 christos
1013 1.1.1.5 christos /* PR 19803: The alias must be preserved as well. */
1014 1.1.1.5 christos lang_add_gc_name (xstrdup (name));
1015 1.1 skrll }
1016 1.1 skrll else
1017 1.1.1.5 christos strcpy (name, int_name);
1018 1.1 skrll
1019 1.1 skrll blhe = bfd_link_hash_lookup (info->hash,
1020 1.1 skrll name,
1021 1.1.1.9 christos false, false, true);
1022 1.1 skrll
1023 1.1 skrll if (blhe
1024 1.1 skrll && (blhe->type == bfd_link_hash_defined
1025 1.1 skrll || (blhe->type == bfd_link_hash_common)))
1026 1.1 skrll {
1027 1.1 skrll count_exported++;
1028 1.1 skrll if (!pe_def_file->exports[i].flag_noname)
1029 1.1 skrll count_exported_byname++;
1030 1.1 skrll
1031 1.1 skrll /* Only fill in the sections. The actual offsets are computed
1032 1.1 skrll in fill_exported_offsets() after common symbols are laid
1033 1.1 skrll out. */
1034 1.1 skrll if (blhe->type == bfd_link_hash_defined)
1035 1.1 skrll exported_symbol_sections[i] = blhe->u.def.section;
1036 1.1 skrll else
1037 1.1 skrll exported_symbol_sections[i] = blhe->u.c.p->section;
1038 1.1 skrll
1039 1.1 skrll if (pe_def_file->exports[i].ordinal != -1)
1040 1.1 skrll {
1041 1.1 skrll if (max_ordinal < pe_def_file->exports[i].ordinal)
1042 1.1 skrll max_ordinal = pe_def_file->exports[i].ordinal;
1043 1.1 skrll if (min_ordinal > pe_def_file->exports[i].ordinal)
1044 1.1 skrll min_ordinal = pe_def_file->exports[i].ordinal;
1045 1.1 skrll count_with_ordinals++;
1046 1.1 skrll }
1047 1.1 skrll }
1048 1.1.1.2 christos /* Check for forward exports. These are indicated in DEF files by an
1049 1.1.1.6 christos export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
1050 1.1.1.2 christos but we must take care not to be fooled when the user wants to export
1051 1.1.1.2 christos a symbol that actually really has a dot in it, so we only check
1052 1.1.1.2 christos for them here, after real defined symbols have already been matched. */
1053 1.1.1.5 christos else if (strchr (int_name, '.'))
1054 1.1.1.2 christos {
1055 1.1.1.2 christos count_exported++;
1056 1.1.1.2 christos if (!pe_def_file->exports[i].flag_noname)
1057 1.1.1.2 christos count_exported_byname++;
1058 1.1.1.2 christos
1059 1.1.1.2 christos pe_def_file->exports[i].flag_forward = 1;
1060 1.1.1.2 christos
1061 1.1.1.2 christos if (pe_def_file->exports[i].ordinal != -1)
1062 1.1.1.2 christos {
1063 1.1.1.2 christos if (max_ordinal < pe_def_file->exports[i].ordinal)
1064 1.1.1.2 christos max_ordinal = pe_def_file->exports[i].ordinal;
1065 1.1.1.2 christos if (min_ordinal > pe_def_file->exports[i].ordinal)
1066 1.1.1.2 christos min_ordinal = pe_def_file->exports[i].ordinal;
1067 1.1.1.2 christos count_with_ordinals++;
1068 1.1.1.2 christos }
1069 1.1.1.2 christos }
1070 1.1 skrll else if (blhe && blhe->type == bfd_link_hash_undefined)
1071 1.1 skrll {
1072 1.1 skrll /* xgettext:c-format */
1073 1.1.1.7 christos einfo (_("%X%P: cannot export %s: symbol not defined\n"),
1074 1.1.1.5 christos int_name);
1075 1.1 skrll }
1076 1.1 skrll else if (blhe)
1077 1.1 skrll {
1078 1.1 skrll /* xgettext:c-format */
1079 1.1.1.7 christos einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
1080 1.1.1.5 christos int_name,
1081 1.1 skrll blhe->type, bfd_link_hash_defined);
1082 1.1 skrll }
1083 1.1 skrll else
1084 1.1 skrll {
1085 1.1 skrll /* xgettext:c-format */
1086 1.1.1.7 christos einfo (_("%X%P: cannot export %s: symbol not found\n"),
1087 1.1.1.5 christos int_name);
1088 1.1 skrll }
1089 1.1 skrll free (name);
1090 1.1 skrll }
1091 1.1 skrll }
1092 1.1 skrll
1093 1.1 skrll /* Build the bfd that will contain .edata and .reloc sections. */
1094 1.1 skrll
1095 1.1 skrll static void
1096 1.1.1.10 christos build_filler_bfd (bool include_edata)
1097 1.1 skrll {
1098 1.1 skrll lang_input_statement_type *filler_file;
1099 1.1.1.10 christos
1100 1.1 skrll filler_file = lang_add_input_file ("dll stuff",
1101 1.1 skrll lang_input_file_is_fake_enum,
1102 1.1 skrll NULL);
1103 1.1 skrll filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
1104 1.1 skrll link_info.output_bfd);
1105 1.1 skrll if (filler_bfd == NULL
1106 1.1 skrll || !bfd_set_arch_mach (filler_bfd,
1107 1.1 skrll bfd_get_arch (link_info.output_bfd),
1108 1.1 skrll bfd_get_mach (link_info.output_bfd)))
1109 1.1 skrll {
1110 1.1.1.11 christos fatal (_("%P: can not create BFD: %E\n"));
1111 1.1 skrll return;
1112 1.1 skrll }
1113 1.1 skrll
1114 1.1 skrll if (include_edata)
1115 1.1 skrll {
1116 1.1 skrll edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
1117 1.1 skrll if (edata_s == NULL
1118 1.1.1.8 christos || !bfd_set_section_flags (edata_s, (SEC_HAS_CONTENTS
1119 1.1.1.12 christos | SEC_DATA
1120 1.1.1.8 christos | SEC_ALLOC
1121 1.1.1.8 christos | SEC_LOAD
1122 1.1.1.8 christos | SEC_KEEP
1123 1.1.1.8 christos | SEC_IN_MEMORY)))
1124 1.1 skrll {
1125 1.1.1.6 christos einfo (_("%X%P: can not create .edata section: %E\n"));
1126 1.1 skrll return;
1127 1.1 skrll }
1128 1.1.1.8 christos bfd_set_section_size (edata_s, edata_sz);
1129 1.1 skrll }
1130 1.1 skrll
1131 1.1 skrll reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1132 1.1 skrll if (reloc_s == NULL
1133 1.1.1.8 christos || !bfd_set_section_flags (reloc_s, (SEC_HAS_CONTENTS
1134 1.1.1.12 christos | SEC_DATA
1135 1.1.1.8 christos | SEC_LOAD
1136 1.1.1.8 christos | SEC_KEEP
1137 1.1.1.8 christos | SEC_IN_MEMORY)))
1138 1.1 skrll {
1139 1.1.1.6 christos einfo (_("%X%P: can not create .reloc section: %E\n"));
1140 1.1 skrll return;
1141 1.1 skrll }
1142 1.1 skrll
1143 1.1.1.8 christos bfd_set_section_size (reloc_s, 0);
1144 1.1 skrll
1145 1.1 skrll ldlang_add_file (filler_file);
1146 1.1 skrll }
1147 1.1 skrll
1148 1.1 skrll /* Gather all the exported symbols and build the .edata section. */
1149 1.1 skrll
1150 1.1 skrll static void
1151 1.1.1.9 christos generate_edata (void)
1152 1.1 skrll {
1153 1.1 skrll int i, next_ordinal;
1154 1.1 skrll int name_table_size = 0;
1155 1.1 skrll
1156 1.1 skrll /* First, we need to know how many exported symbols there are,
1157 1.1 skrll and what the range of ordinals is. */
1158 1.1 skrll if (count_with_ordinals && max_ordinal > count_exported)
1159 1.1 skrll {
1160 1.1 skrll if (min_ordinal > max_ordinal - count_exported + 1)
1161 1.1 skrll min_ordinal = max_ordinal - count_exported + 1;
1162 1.1 skrll }
1163 1.1 skrll else
1164 1.1 skrll {
1165 1.1 skrll min_ordinal = 1;
1166 1.1 skrll max_ordinal = count_exported;
1167 1.1 skrll }
1168 1.1 skrll
1169 1.1 skrll export_table_size = max_ordinal - min_ordinal + 1;
1170 1.1 skrll exported_symbols = xmalloc (export_table_size * sizeof (int));
1171 1.1 skrll for (i = 0; i < export_table_size; i++)
1172 1.1 skrll exported_symbols[i] = -1;
1173 1.1 skrll
1174 1.1 skrll /* Now we need to assign ordinals to those that don't have them. */
1175 1.1 skrll for (i = 0; i < NE; i++)
1176 1.1 skrll {
1177 1.1.1.6 christos if (exported_symbol_sections[i]
1178 1.1.1.6 christos || pe_def_file->exports[i].flag_forward)
1179 1.1 skrll {
1180 1.1 skrll if (pe_def_file->exports[i].ordinal != -1)
1181 1.1 skrll {
1182 1.1 skrll int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1183 1.1 skrll int pi = exported_symbols[ei];
1184 1.1 skrll
1185 1.1 skrll if (pi != -1)
1186 1.1 skrll {
1187 1.1 skrll /* xgettext:c-format */
1188 1.1.1.7 christos einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
1189 1.1 skrll pe_def_file->exports[i].ordinal,
1190 1.1 skrll pe_def_file->exports[i].name,
1191 1.1 skrll pe_def_file->exports[pi].name);
1192 1.1 skrll }
1193 1.1 skrll exported_symbols[ei] = i;
1194 1.1 skrll }
1195 1.1.1.2 christos if (pe_def_file->exports[i].its_name)
1196 1.1.1.2 christos name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1197 1.1.1.2 christos else
1198 1.1.1.2 christos name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1199 1.1 skrll }
1200 1.1 skrll
1201 1.1 skrll /* Reserve space for the forward name. */
1202 1.1 skrll if (pe_def_file->exports[i].flag_forward)
1203 1.1 skrll {
1204 1.1 skrll name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1205 1.1 skrll }
1206 1.1 skrll }
1207 1.1 skrll
1208 1.1 skrll next_ordinal = min_ordinal;
1209 1.1 skrll for (i = 0; i < NE; i++)
1210 1.1.1.6 christos if ((exported_symbol_sections[i]
1211 1.1.1.6 christos || pe_def_file->exports[i].flag_forward)
1212 1.1.1.6 christos && pe_def_file->exports[i].ordinal == -1)
1213 1.1 skrll {
1214 1.1 skrll while (exported_symbols[next_ordinal - min_ordinal] != -1)
1215 1.1 skrll next_ordinal++;
1216 1.1 skrll
1217 1.1 skrll exported_symbols[next_ordinal - min_ordinal] = i;
1218 1.1 skrll pe_def_file->exports[i].ordinal = next_ordinal;
1219 1.1 skrll }
1220 1.1 skrll
1221 1.1.1.6 christos /* PR 12969: Check for more than 1^16 ordinals. */
1222 1.1.1.6 christos if (max_ordinal > 65535 || next_ordinal > 65535)
1223 1.1.1.6 christos /* xgettext:c-format */
1224 1.1.1.7 christos einfo(_("%X%P: error: export ordinal too large: %d\n"),
1225 1.1.1.6 christos max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
1226 1.1.1.6 christos
1227 1.1 skrll /* OK, now we can allocate some memory. */
1228 1.1 skrll edata_sz = (40 /* directory */
1229 1.1 skrll + 4 * export_table_size /* addresses */
1230 1.1 skrll + 4 * count_exported_byname /* name ptrs */
1231 1.1 skrll + 2 * count_exported_byname /* ordinals */
1232 1.1.1.9 christos + name_table_size + strlen (dll_filename) + 1);
1233 1.1 skrll }
1234 1.1 skrll
1235 1.1 skrll /* Fill the exported symbol offsets. The preliminary work has already
1236 1.1.1.2 christos been done in process_def_file_and_drectve(). */
1237 1.1 skrll
1238 1.1 skrll static void
1239 1.1 skrll fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1240 1.1 skrll {
1241 1.1 skrll int i;
1242 1.1 skrll struct bfd_link_hash_entry *blhe;
1243 1.1 skrll
1244 1.1 skrll for (i = 0; i < pe_def_file->num_exports; i++)
1245 1.1 skrll {
1246 1.1 skrll char *name;
1247 1.1 skrll
1248 1.1 skrll name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1249 1.1 skrll if (pe_details->underscored
1250 1.1.1.6 christos && *pe_def_file->exports[i].internal_name != '@')
1251 1.1 skrll {
1252 1.1 skrll *name = '_';
1253 1.1 skrll strcpy (name + 1, pe_def_file->exports[i].internal_name);
1254 1.1 skrll }
1255 1.1 skrll else
1256 1.1 skrll strcpy (name, pe_def_file->exports[i].internal_name);
1257 1.1 skrll
1258 1.1 skrll blhe = bfd_link_hash_lookup (info->hash,
1259 1.1 skrll name,
1260 1.1.1.9 christos false, false, true);
1261 1.1 skrll
1262 1.1 skrll if (blhe && blhe->type == bfd_link_hash_defined)
1263 1.1 skrll exported_symbol_offsets[i] = blhe->u.def.value;
1264 1.1 skrll
1265 1.1 skrll free (name);
1266 1.1 skrll }
1267 1.1 skrll }
1268 1.1 skrll
1269 1.1 skrll static void
1270 1.1 skrll fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1271 1.1 skrll {
1272 1.1 skrll int s, hint;
1273 1.1 skrll unsigned char *edirectory;
1274 1.1 skrll unsigned char *eaddresses;
1275 1.1 skrll unsigned char *enameptrs;
1276 1.1 skrll unsigned char *eordinals;
1277 1.1 skrll char *enamestr;
1278 1.1 skrll
1279 1.1 skrll edata_d = xmalloc (edata_sz);
1280 1.1 skrll
1281 1.1 skrll /* Note use of array pointer math here. */
1282 1.1 skrll edirectory = edata_d;
1283 1.1.1.2 christos eaddresses = edirectory + 40;
1284 1.1 skrll enameptrs = eaddresses + 4 * export_table_size;
1285 1.1 skrll eordinals = enameptrs + 4 * count_exported_byname;
1286 1.1 skrll enamestr = (char *) eordinals + 2 * count_exported_byname;
1287 1.1 skrll
1288 1.1 skrll #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1289 1.1 skrll + edata_s->output_section->vma - image_base)
1290 1.1 skrll
1291 1.1 skrll memset (edata_d, 0, edata_sz);
1292 1.1.1.4 christos
1293 1.1.1.9 christos if (pe_data (abfd)->timestamp == -1)
1294 1.1.1.10 christos {
1295 1.1.1.10 christos time_t now = bfd_get_current_time (0);
1296 1.1.1.10 christos H_PUT_32 (abfd, now, edata_d + 4);
1297 1.1.1.10 christos }
1298 1.1.1.9 christos else
1299 1.1.1.9 christos H_PUT_32 (abfd, pe_data (abfd)->timestamp, edata_d + 4);
1300 1.1.1.4 christos
1301 1.1 skrll if (pe_def_file->version_major != -1)
1302 1.1 skrll {
1303 1.1 skrll bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1304 1.1 skrll bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1305 1.1 skrll }
1306 1.1 skrll
1307 1.1 skrll bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1308 1.1.1.9 christos strcpy (enamestr, dll_filename);
1309 1.1 skrll enamestr += strlen (enamestr) + 1;
1310 1.1 skrll bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1311 1.1 skrll bfd_put_32 (abfd, export_table_size, edata_d + 20);
1312 1.1 skrll bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1313 1.1 skrll bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1314 1.1 skrll bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1315 1.1 skrll bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1316 1.1 skrll
1317 1.1 skrll fill_exported_offsets (abfd, info);
1318 1.1 skrll
1319 1.1 skrll /* Ok, now for the filling in part.
1320 1.1 skrll Scan alphabetically - ie the ordering in the exports[] table,
1321 1.1 skrll rather than by ordinal - the ordering in the exported_symbol[]
1322 1.1 skrll table. See dlltool.c and:
1323 1.1.1.6 christos http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1324 1.1 skrll for more information. */
1325 1.1 skrll hint = 0;
1326 1.1 skrll for (s = 0; s < NE; s++)
1327 1.1 skrll {
1328 1.1 skrll struct bfd_section *ssec = exported_symbol_sections[s];
1329 1.1.1.6 christos if (pe_def_file->exports[s].ordinal != -1
1330 1.1.1.6 christos && (pe_def_file->exports[s].flag_forward || ssec != NULL))
1331 1.1 skrll {
1332 1.1 skrll int ord = pe_def_file->exports[s].ordinal;
1333 1.1 skrll
1334 1.1 skrll if (pe_def_file->exports[s].flag_forward)
1335 1.1 skrll {
1336 1.1 skrll bfd_put_32 (abfd, ERVA (enamestr),
1337 1.1.1.6 christos eaddresses + 4 * (ord - min_ordinal));
1338 1.1 skrll
1339 1.1 skrll strcpy (enamestr, pe_def_file->exports[s].internal_name);
1340 1.1 skrll enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1341 1.1 skrll }
1342 1.1 skrll else
1343 1.1 skrll {
1344 1.1 skrll bfd_vma srva = (exported_symbol_offsets[s]
1345 1.1 skrll + ssec->output_section->vma
1346 1.1 skrll + ssec->output_offset);
1347 1.1 skrll
1348 1.1 skrll bfd_put_32 (abfd, srva - image_base,
1349 1.1.1.6 christos eaddresses + 4 * (ord - min_ordinal));
1350 1.1 skrll }
1351 1.1 skrll
1352 1.1 skrll if (!pe_def_file->exports[s].flag_noname)
1353 1.1 skrll {
1354 1.1 skrll char *ename = pe_def_file->exports[s].name;
1355 1.1.1.2 christos if (pe_def_file->exports[s].its_name)
1356 1.1.1.2 christos ename = pe_def_file->exports[s].its_name;
1357 1.1 skrll
1358 1.1 skrll bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1359 1.1 skrll enameptrs += 4;
1360 1.1 skrll strcpy (enamestr, ename);
1361 1.1 skrll enamestr += strlen (enamestr) + 1;
1362 1.1 skrll bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1363 1.1 skrll eordinals += 2;
1364 1.1 skrll pe_def_file->exports[s].hint = hint++;
1365 1.1 skrll }
1366 1.1 skrll }
1367 1.1 skrll }
1368 1.1 skrll }
1369 1.1 skrll
1370 1.1 skrll
1371 1.1 skrll static struct bfd_section *current_sec;
1372 1.1 skrll
1373 1.1.1.7 christos static void
1374 1.1.1.7 christos pe_walk_relocs (struct bfd_link_info *info,
1375 1.1.1.7 christos char *name,
1376 1.1.1.7 christos const char *symname,
1377 1.1.1.7 christos struct bfd_hash_table *import_hash,
1378 1.1.1.7 christos void (*cb) (arelent *, asection *, char *, const char *))
1379 1.1 skrll {
1380 1.1 skrll bfd *b;
1381 1.1 skrll asection *s;
1382 1.1 skrll
1383 1.1.1.4 christos for (b = info->input_bfds; b; b = b->link.next)
1384 1.1 skrll {
1385 1.1 skrll asymbol **symbols;
1386 1.1 skrll
1387 1.1 skrll if (!bfd_generic_link_read_symbols (b))
1388 1.1 skrll {
1389 1.1.1.11 christos fatal (_("%P: %pB: could not read symbols: %E\n"), b);
1390 1.1 skrll return;
1391 1.1 skrll }
1392 1.1 skrll
1393 1.1 skrll symbols = bfd_get_outsymbols (b);
1394 1.1 skrll
1395 1.1 skrll for (s = b->sections; s; s = s->next)
1396 1.1 skrll {
1397 1.1 skrll arelent **relocs;
1398 1.1 skrll int relsize, nrelocs, i;
1399 1.1.1.8 christos int flags = bfd_section_flags (s);
1400 1.1 skrll
1401 1.1 skrll /* Skip discarded linkonce sections. */
1402 1.1 skrll if (flags & SEC_LINK_ONCE
1403 1.1 skrll && s->output_section == bfd_abs_section_ptr)
1404 1.1 skrll continue;
1405 1.1 skrll
1406 1.1 skrll current_sec = s;
1407 1.1 skrll
1408 1.1 skrll relsize = bfd_get_reloc_upper_bound (b, s);
1409 1.1 skrll relocs = xmalloc (relsize);
1410 1.1 skrll nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1411 1.1 skrll
1412 1.1 skrll for (i = 0; i < nrelocs; i++)
1413 1.1 skrll {
1414 1.1 skrll struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1415 1.1 skrll
1416 1.1.1.7 christos /* Warning: the callback needs to be passed NAME directly. */
1417 1.1.1.7 christos if (import_hash)
1418 1.1.1.7 christos {
1419 1.1.1.9 christos if (bfd_hash_lookup (import_hash, sym->name, false, false))
1420 1.1.1.7 christos {
1421 1.1.1.7 christos strcpy (name, sym->name);
1422 1.1.1.7 christos cb (relocs[i], s, name, symname);
1423 1.1.1.7 christos }
1424 1.1.1.7 christos }
1425 1.1.1.7 christos else
1426 1.1.1.7 christos {
1427 1.1.1.7 christos if (strcmp (name, sym->name) == 0)
1428 1.1.1.7 christos cb (relocs[i], s, name, symname);
1429 1.1.1.7 christos }
1430 1.1 skrll }
1431 1.1 skrll
1432 1.1 skrll free (relocs);
1433 1.1 skrll
1434 1.1 skrll /* Warning: the allocated symbols are remembered in BFD and reused
1435 1.1 skrll later, so don't free them! */
1436 1.1 skrll /* free (symbols); */
1437 1.1 skrll }
1438 1.1 skrll }
1439 1.1 skrll }
1440 1.1 skrll
1441 1.1.1.7 christos void
1442 1.1.1.7 christos pe_find_data_imports (const char *symhead,
1443 1.1.1.7 christos void (*cb) (arelent *, asection *, char *, const char *))
1444 1.1.1.7 christos {
1445 1.1.1.7 christos struct bfd_link_hash_entry *undef;
1446 1.1.1.7 christos const size_t headlen = strlen (symhead);
1447 1.1.1.7 christos size_t namelen = 0;
1448 1.1.1.7 christos char *buf, *name;
1449 1.1.1.7 christos struct bfd_hash_table *import_hash;
1450 1.1.1.7 christos
1451 1.1.1.7 christos for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1452 1.1.1.7 christos if (undef->type == bfd_link_hash_undefined)
1453 1.1.1.7 christos {
1454 1.1.1.7 christos size_t len = strlen (undef->root.string);
1455 1.1.1.7 christos if (namelen < len)
1456 1.1.1.7 christos namelen = len;
1457 1.1.1.7 christos }
1458 1.1.1.7 christos if (namelen == 0)
1459 1.1.1.7 christos return;
1460 1.1.1.7 christos
1461 1.1.1.7 christos /* For the pseudo-relocation support version 2, we can collect the symbols
1462 1.1.1.7 christos that are subject to auto-import and adjust the relocations en masse. */
1463 1.1.1.7 christos if (link_info.pei386_runtime_pseudo_reloc == 2)
1464 1.1.1.7 christos {
1465 1.1.1.7 christos import_hash
1466 1.1.1.7 christos = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
1467 1.1.1.7 christos if (!bfd_hash_table_init (import_hash,
1468 1.1.1.7 christos bfd_hash_newfunc,
1469 1.1.1.7 christos sizeof (struct bfd_hash_entry)))
1470 1.1.1.11 christos fatal (_("%P: bfd_hash_table_init failed: %E\n"));
1471 1.1.1.7 christos }
1472 1.1.1.7 christos else
1473 1.1.1.7 christos import_hash = NULL;
1474 1.1.1.7 christos
1475 1.1.1.7 christos /* We are being a bit cunning here. The buffer will have space for
1476 1.1.1.7 christos prefixes at the beginning. The prefix is modified here and in a
1477 1.1.1.7 christos number of functions called from this function. */
1478 1.1.1.7 christos #define PREFIX_LEN 32
1479 1.1.1.7 christos buf = xmalloc (PREFIX_LEN + namelen + 1);
1480 1.1.1.7 christos name = buf + PREFIX_LEN;
1481 1.1.1.7 christos
1482 1.1.1.7 christos for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1483 1.1.1.7 christos if (undef->type == bfd_link_hash_undefined)
1484 1.1.1.7 christos {
1485 1.1.1.7 christos struct bfd_link_hash_entry *sym;
1486 1.1.1.7 christos char *impname;
1487 1.1.1.7 christos
1488 1.1.1.7 christos if (pe_dll_extra_pe_debug)
1489 1.1.1.10 christos printf ("%s:%s\n", __func__, undef->root.string);
1490 1.1.1.7 christos
1491 1.1.1.7 christos strcpy (name, undef->root.string);
1492 1.1.1.7 christos impname = name - (sizeof "__imp_" - 1);
1493 1.1.1.7 christos memcpy (impname, "__imp_", sizeof "__imp_" - 1);
1494 1.1.1.7 christos
1495 1.1.1.7 christos sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
1496 1.1.1.7 christos
1497 1.1.1.7 christos if (sym && sym->type == bfd_link_hash_defined)
1498 1.1.1.7 christos {
1499 1.1.1.7 christos if (import_hash)
1500 1.1.1.9 christos bfd_hash_lookup (import_hash, undef->root.string, true, false);
1501 1.1.1.7 christos else
1502 1.1.1.7 christos {
1503 1.1.1.7 christos bfd *b = sym->u.def.section->owner;
1504 1.1.1.7 christos const char *symname = NULL;
1505 1.1.1.7 christos asymbol **symbols;
1506 1.1.1.7 christos int nsyms, i;
1507 1.1.1.7 christos
1508 1.1.1.7 christos if (!bfd_generic_link_read_symbols (b))
1509 1.1.1.7 christos {
1510 1.1.1.11 christos fatal (_("%P: %pB: could not read symbols: %E\n"), b);
1511 1.1.1.7 christos return;
1512 1.1.1.7 christos }
1513 1.1.1.7 christos
1514 1.1.1.7 christos symbols = bfd_get_outsymbols (b);
1515 1.1.1.7 christos nsyms = bfd_get_symcount (b);
1516 1.1.1.7 christos
1517 1.1.1.7 christos for (i = 0; i < nsyms; i++)
1518 1.1.1.7 christos if (strncmp (symbols[i]->name, symhead, headlen) == 0)
1519 1.1.1.7 christos {
1520 1.1.1.7 christos if (pe_dll_extra_pe_debug)
1521 1.1.1.7 christos printf ("->%s\n", symbols[i]->name);
1522 1.1.1.7 christos
1523 1.1.1.7 christos symname = symbols[i]->name + headlen;
1524 1.1.1.7 christos break;
1525 1.1.1.7 christos }
1526 1.1.1.7 christos
1527 1.1.1.7 christos /* If the symobl isn't part of an import table, there is no
1528 1.1.1.7 christos point in building a fixup, this would give rise to link
1529 1.1.1.7 christos errors for mangled symbols instead of the original one. */
1530 1.1.1.7 christos if (symname)
1531 1.1.1.7 christos pe_walk_relocs (&link_info, name, symname, NULL, cb);
1532 1.1.1.7 christos else
1533 1.1.1.7 christos continue;
1534 1.1.1.7 christos }
1535 1.1.1.7 christos
1536 1.1.1.7 christos /* Let's differentiate it somehow from defined. */
1537 1.1.1.7 christos undef->type = bfd_link_hash_defweak;
1538 1.1.1.7 christos undef->u.def.value = sym->u.def.value;
1539 1.1.1.7 christos undef->u.def.section = sym->u.def.section;
1540 1.1.1.7 christos
1541 1.1.1.8 christos /* We replace the original name with the __imp_ prefixed one, this
1542 1.1.1.8 christos 1) may trash memory 2) leads to duplicate symbols. But this is
1543 1.1.1.8 christos better than having a misleading name that can confuse GDB. */
1544 1.1.1.8 christos undef->root.string = sym->root.string;
1545 1.1.1.8 christos
1546 1.1.1.7 christos if (link_info.pei386_auto_import == -1)
1547 1.1.1.7 christos {
1548 1.1.1.9 christos static bool warned = false;
1549 1.1.1.7 christos
1550 1.1.1.7 christos info_msg (_("Info: resolving %s by linking to %s "
1551 1.1.1.7 christos "(auto-import)\n"), name, impname);
1552 1.1.1.7 christos
1553 1.1.1.7 christos /* PR linker/4844. */
1554 1.1.1.7 christos if (!warned)
1555 1.1.1.7 christos {
1556 1.1.1.7 christos einfo (_("%P: warning: auto-importing has been activated "
1557 1.1.1.7 christos "without --enable-auto-import specified on the "
1558 1.1.1.7 christos "command line; this should work unless it "
1559 1.1.1.7 christos "involves constant data structures referencing "
1560 1.1.1.7 christos "symbols from auto-imported DLLs\n"));
1561 1.1.1.9 christos warned = true;
1562 1.1.1.7 christos }
1563 1.1.1.7 christos }
1564 1.1.1.7 christos }
1565 1.1.1.7 christos }
1566 1.1.1.7 christos
1567 1.1.1.7 christos /* If we have the import hash table, walk the relocations only once. */
1568 1.1.1.7 christos if (import_hash)
1569 1.1.1.7 christos {
1570 1.1.1.7 christos pe_walk_relocs (&link_info, name, NULL, import_hash, cb);
1571 1.1.1.7 christos bfd_hash_table_free (import_hash);
1572 1.1.1.7 christos free (import_hash);
1573 1.1.1.7 christos }
1574 1.1.1.7 christos
1575 1.1.1.7 christos free (buf);
1576 1.1.1.7 christos }
1577 1.1.1.7 christos
1578 1.1 skrll /* Gather all the relocations and build the .reloc section. */
1579 1.1 skrll
1580 1.1 skrll static void
1581 1.1 skrll generate_reloc (bfd *abfd, struct bfd_link_info *info)
1582 1.1 skrll {
1583 1.1 skrll /* For .reloc stuff. */
1584 1.1 skrll reloc_data_type *reloc_data;
1585 1.1 skrll int total_relocs = 0;
1586 1.1 skrll int i;
1587 1.1 skrll bfd_vma sec_page = (bfd_vma) -1;
1588 1.1.1.10 christos bfd_vma page_ptr;
1589 1.1 skrll bfd *b;
1590 1.1 skrll struct bfd_section *s;
1591 1.1 skrll
1592 1.1.1.9 christos if (reloc_s == NULL || reloc_s->output_section == bfd_abs_section_ptr)
1593 1.1.1.9 christos return;
1594 1.1.1.10 christos
1595 1.1.1.10 christos /* Set an upper bound for the total number of relocations we will have to generate. */
1596 1.1 skrll total_relocs = 0;
1597 1.1.1.4 christos for (b = info->input_bfds; b; b = b->link.next)
1598 1.1 skrll for (s = b->sections; s; s = s->next)
1599 1.1 skrll total_relocs += s->reloc_count;
1600 1.1 skrll
1601 1.1 skrll reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1602 1.1 skrll
1603 1.1 skrll total_relocs = 0;
1604 1.1.1.10 christos for (b = info->input_bfds; b; b = b->link.next)
1605 1.1 skrll {
1606 1.1 skrll arelent **relocs;
1607 1.1.1.2 christos int relsize, nrelocs;
1608 1.1.1.10 christos asymbol **symbols;
1609 1.1.1.10 christos
1610 1.1.1.10 christos if (!bfd_generic_link_read_symbols (b))
1611 1.1.1.10 christos {
1612 1.1.1.11 christos fatal (_("%P: %pB: could not read symbols: %E\n"), b);
1613 1.1.1.10 christos return;
1614 1.1.1.10 christos }
1615 1.1.1.10 christos
1616 1.1.1.10 christos symbols = bfd_get_outsymbols (b);
1617 1.1 skrll
1618 1.1 skrll for (s = b->sections; s; s = s->next)
1619 1.1 skrll {
1620 1.1.1.10 christos bfd_vma sec_vma;
1621 1.1 skrll
1622 1.1.1.10 christos /* If the section is not going to be output, then ignore it. */
1623 1.1.1.10 christos if (s->output_section == NULL)
1624 1.1.1.10 christos {
1625 1.1.1.10 christos /* FIXME: This should not happen. Convert to the correct
1626 1.1.1.10 christos form here, but really, this should be investigated. */
1627 1.1.1.10 christos s->output_section = bfd_abs_section_ptr;
1628 1.1.1.10 christos continue;
1629 1.1.1.10 christos }
1630 1.1 skrll
1631 1.1 skrll /* I don't know why there would be a reloc for these, but I've
1632 1.1 skrll seen it happen - DJ */
1633 1.1.1.3 christos if (s->output_section == bfd_abs_section_ptr)
1634 1.1 skrll continue;
1635 1.1 skrll
1636 1.1.1.10 christos /* If it's not loaded, we don't need to relocate it this way. */
1637 1.1.1.10 christos if (!(s->output_section->flags & SEC_LOAD))
1638 1.1.1.10 christos continue;
1639 1.1.1.10 christos
1640 1.1.1.10 christos /* This happens when linking with --just-symbols=<file>
1641 1.1.1.10 christos so do not generate an error. */
1642 1.1 skrll if (s->output_section->vma == 0)
1643 1.1.1.10 christos continue;
1644 1.1 skrll
1645 1.1.1.10 christos sec_vma = s->output_section->vma + s->output_offset;
1646 1.1 skrll
1647 1.1 skrll relsize = bfd_get_reloc_upper_bound (b, s);
1648 1.1 skrll relocs = xmalloc (relsize);
1649 1.1 skrll nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1650 1.1 skrll
1651 1.1 skrll for (i = 0; i < nrelocs; i++)
1652 1.1 skrll {
1653 1.1 skrll if (pe_dll_extra_pe_debug)
1654 1.1 skrll {
1655 1.1 skrll struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1656 1.1 skrll printf ("rel: %s\n", sym->name);
1657 1.1 skrll }
1658 1.1 skrll if (!relocs[i]->howto->pc_relative
1659 1.1.1.11 christos && (bfd_get_flavour (b) != bfd_target_coff_flavour
1660 1.1.1.11 christos || (relocs[i]->howto->type != pe_details->imagebase_reloc
1661 1.1.1.11 christos && (relocs[i]->howto->type < pe_details->secrel_reloc_lo
1662 1.1.1.11 christos || relocs[i]->howto->type > pe_details->secrel_reloc_hi)
1663 1.1.1.11 christos && relocs[i]->howto->type != pe_details->section_reloc)))
1664 1.1 skrll {
1665 1.1 skrll struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1666 1.1.1.9 christos const struct bfd_link_hash_entry *blhe
1667 1.1.1.9 christos = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1668 1.1.1.9 christos false, false, false);
1669 1.1.1.2 christos /* Don't create relocs for undefined weak symbols. */
1670 1.1.1.12 christos if (sym->flags & BSF_WEAK)
1671 1.1 skrll {
1672 1.1.1.2 christos if (blhe && blhe->type == bfd_link_hash_undefweak)
1673 1.1.1.2 christos {
1674 1.1.1.2 christos /* Check aux sym and see if it is defined or not. */
1675 1.1.1.2 christos struct coff_link_hash_entry *h, *h2;
1676 1.1.1.2 christos h = (struct coff_link_hash_entry *)blhe;
1677 1.1.1.2 christos if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1678 1.1.1.2 christos continue;
1679 1.1.1.2 christos h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1680 1.1.1.10 christos [h->aux->x_sym.x_tagndx.u32];
1681 1.1.1.2 christos /* We don't want a base reloc if the aux sym is not
1682 1.1.1.2 christos found, undefined, or if it is the constant ABS
1683 1.1.1.2 christos zero default value. (We broaden that slightly by
1684 1.1.1.2 christos not testing the value, just the section; there's
1685 1.1.1.2 christos no reason we'd want a reference to any absolute
1686 1.1.1.2 christos address to get relocated during rebasing). */
1687 1.1.1.2 christos if (!h2 || h2->root.type == bfd_link_hash_undefined
1688 1.1.1.3 christos || h2->root.u.def.section == bfd_abs_section_ptr)
1689 1.1.1.2 christos continue;
1690 1.1.1.2 christos }
1691 1.1.1.2 christos else if (!blhe || blhe->type != bfd_link_hash_defined)
1692 1.1.1.2 christos continue;
1693 1.1 skrll }
1694 1.1.1.3 christos /* Nor for Dwarf FDE references to discarded sections. */
1695 1.1.1.12 christos if (bfd_is_abs_section (sym->section->output_section))
1696 1.1.1.3 christos {
1697 1.1.1.3 christos /* We only ignore relocs from .eh_frame sections, as
1698 1.1.1.3 christos they are discarded by the final link rather than
1699 1.1.1.3 christos resolved against the kept section. */
1700 1.1.1.3 christos if (!strcmp (s->name, ".eh_frame"))
1701 1.1.1.3 christos continue;
1702 1.1.1.3 christos }
1703 1.1.1.9 christos /* Nor for absolute symbols. */
1704 1.1.1.12 christos if (blhe && ldexp_is_final_sym_absolute (blhe)
1705 1.1.1.12 christos && (!blhe->linker_def
1706 1.1.1.12 christos || (strcmp (sym->name, "__image_base__")
1707 1.1.1.12 christos && strcmp (sym->name, U ("__ImageBase")))))
1708 1.1.1.9 christos continue;
1709 1.1 skrll
1710 1.1 skrll reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1711 1.1.1.8 christos reloc_data[total_relocs].idx = total_relocs;
1712 1.1 skrll
1713 1.1.1.9 christos /* Since we're only about to determine .reloc's size,
1714 1.1.1.9 christos subsequent output section VMA calculations will shift up
1715 1.1.1.9 christos sections at this or higher addresses. Relocations for
1716 1.1.1.9 christos such sections would hence end up not being correct. */
1717 1.1.1.9 christos if (reloc_data[total_relocs].vma
1718 1.1.1.9 christos >= reloc_s->output_section->vma)
1719 1.1.1.9 christos einfo (_("%P: base relocation for section `%s' above "
1720 1.1.1.9 christos ".reloc section\n"), s->output_section->name);
1721 1.1.1.9 christos
1722 1.1 skrll #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1723 1.1 skrll
1724 1.1 skrll switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1725 1.1 skrll relocs[i]->howto->rightshift)
1726 1.1 skrll {
1727 1.1.1.10 christos #ifdef pe_use_plus
1728 1.1 skrll case BITS_AND_SHIFT (64, 0):
1729 1.1.1.9 christos reloc_data[total_relocs].type = IMAGE_REL_BASED_DIR64;
1730 1.1 skrll total_relocs++;
1731 1.1 skrll break;
1732 1.1 skrll #endif
1733 1.1 skrll case BITS_AND_SHIFT (32, 0):
1734 1.1.1.9 christos reloc_data[total_relocs].type = IMAGE_REL_BASED_HIGHLOW;
1735 1.1 skrll total_relocs++;
1736 1.1 skrll break;
1737 1.1 skrll case BITS_AND_SHIFT (16, 0):
1738 1.1.1.9 christos reloc_data[total_relocs].type = IMAGE_REL_BASED_LOW;
1739 1.1 skrll total_relocs++;
1740 1.1 skrll break;
1741 1.1 skrll case BITS_AND_SHIFT (26, 2):
1742 1.1.1.9 christos reloc_data[total_relocs].type =
1743 1.1.1.9 christos IMAGE_REL_BASED_ARM_MOV32;
1744 1.1 skrll total_relocs++;
1745 1.1 skrll break;
1746 1.1 skrll case BITS_AND_SHIFT (24, 2):
1747 1.1 skrll /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1748 1.1 skrll Those ARM_xxx definitions should go in proper
1749 1.1 skrll header someday. */
1750 1.1 skrll if (relocs[i]->howto->type == 0
1751 1.1 skrll /* Older GNU linkers used 5 instead of 0 for this reloc. */
1752 1.1 skrll || relocs[i]->howto->type == 5)
1753 1.1 skrll /* This is an ARM_26D reloc, which is an ARM_26 reloc
1754 1.1 skrll that has already been fully processed during a
1755 1.1 skrll previous link stage, so ignore it here. */
1756 1.1 skrll break;
1757 1.1 skrll /* Fall through. */
1758 1.1 skrll default:
1759 1.1 skrll /* xgettext:c-format */
1760 1.1.1.7 christos einfo (_("%X%P: error: %d-bit reloc in dll\n"),
1761 1.1 skrll relocs[i]->howto->bitsize);
1762 1.1 skrll break;
1763 1.1 skrll }
1764 1.1 skrll }
1765 1.1 skrll }
1766 1.1.1.10 christos
1767 1.1 skrll free (relocs);
1768 1.1 skrll /* Warning: the allocated symbols are remembered in BFD and
1769 1.1 skrll reused later, so don't free them! */
1770 1.1 skrll }
1771 1.1 skrll }
1772 1.1 skrll
1773 1.1.1.10 christos /* This can happen for example when LTO has eliminated all code. */
1774 1.1.1.10 christos if (total_relocs == 0)
1775 1.1.1.10 christos return;
1776 1.1.1.10 christos
1777 1.1 skrll /* At this point, we have total_relocs relocation addresses in
1778 1.1 skrll reloc_addresses, which are all suitable for the .reloc section.
1779 1.1 skrll We must now create the new sections. */
1780 1.1 skrll qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1781 1.1 skrll
1782 1.1 skrll for (i = 0; i < total_relocs; i++)
1783 1.1 skrll {
1784 1.1 skrll bfd_vma this_page = (reloc_data[i].vma >> 12);
1785 1.1 skrll
1786 1.1 skrll if (this_page != sec_page)
1787 1.1 skrll {
1788 1.1 skrll reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1789 1.1 skrll reloc_sz += 8;
1790 1.1 skrll sec_page = this_page;
1791 1.1 skrll }
1792 1.1 skrll
1793 1.1 skrll reloc_sz += 2;
1794 1.1 skrll }
1795 1.1 skrll
1796 1.1 skrll reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1797 1.1 skrll reloc_d = xmalloc (reloc_sz);
1798 1.1.1.10 christos
1799 1.1.1.10 christos page_ptr = sec_page = (bfd_vma) -1;
1800 1.1 skrll reloc_sz = 0;
1801 1.1 skrll
1802 1.1 skrll for (i = 0; i < total_relocs; i++)
1803 1.1 skrll {
1804 1.1 skrll bfd_vma rva = reloc_data[i].vma - image_base;
1805 1.1 skrll bfd_vma this_page = (rva & ~0xfff);
1806 1.1 skrll
1807 1.1 skrll if (this_page != sec_page)
1808 1.1 skrll {
1809 1.1 skrll while (reloc_sz & 3)
1810 1.1 skrll reloc_d[reloc_sz++] = 0;
1811 1.1 skrll
1812 1.1 skrll if (page_ptr != (bfd_vma) -1)
1813 1.1 skrll bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1814 1.1 skrll
1815 1.1 skrll bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1816 1.1 skrll page_ptr = reloc_sz;
1817 1.1 skrll reloc_sz += 8;
1818 1.1 skrll sec_page = this_page;
1819 1.1 skrll }
1820 1.1 skrll
1821 1.1 skrll bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1822 1.1 skrll reloc_d + reloc_sz);
1823 1.1 skrll reloc_sz += 2;
1824 1.1 skrll
1825 1.1.1.9 christos if (reloc_data[i].type == IMAGE_REL_BASED_HIGHADJ)
1826 1.1 skrll {
1827 1.1 skrll bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1828 1.1 skrll reloc_sz += 2;
1829 1.1 skrll }
1830 1.1 skrll }
1831 1.1 skrll
1832 1.1 skrll while (reloc_sz & 3)
1833 1.1 skrll reloc_d[reloc_sz++] = 0;
1834 1.1 skrll
1835 1.1 skrll if (page_ptr != (bfd_vma) -1)
1836 1.1 skrll bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1837 1.1 skrll }
1838 1.1 skrll
1839 1.1 skrll /* Given the exiting def_file structure, print out a .DEF file that
1840 1.1 skrll corresponds to it. */
1841 1.1 skrll
1842 1.1 skrll static void
1843 1.1 skrll quoteput (char *s, FILE *f, int needs_quotes)
1844 1.1 skrll {
1845 1.1 skrll char *cp;
1846 1.1 skrll
1847 1.1 skrll for (cp = s; *cp; cp++)
1848 1.1 skrll if (*cp == '\''
1849 1.1 skrll || *cp == '"'
1850 1.1 skrll || *cp == '\\'
1851 1.1 skrll || ISSPACE (*cp)
1852 1.1 skrll || *cp == ','
1853 1.1 skrll || *cp == ';')
1854 1.1 skrll needs_quotes = 1;
1855 1.1 skrll
1856 1.1 skrll if (needs_quotes)
1857 1.1 skrll {
1858 1.1 skrll putc ('"', f);
1859 1.1 skrll
1860 1.1 skrll while (*s)
1861 1.1 skrll {
1862 1.1 skrll if (*s == '"' || *s == '\\')
1863 1.1 skrll putc ('\\', f);
1864 1.1 skrll
1865 1.1 skrll putc (*s, f);
1866 1.1 skrll s++;
1867 1.1 skrll }
1868 1.1 skrll
1869 1.1 skrll putc ('"', f);
1870 1.1 skrll }
1871 1.1 skrll else
1872 1.1 skrll fputs (s, f);
1873 1.1 skrll }
1874 1.1 skrll
1875 1.1 skrll void
1876 1.1 skrll pe_dll_generate_def_file (const char *pe_out_def_filename)
1877 1.1 skrll {
1878 1.1 skrll int i;
1879 1.1 skrll FILE *out = fopen (pe_out_def_filename, "w");
1880 1.1 skrll
1881 1.1 skrll if (out == NULL)
1882 1.1 skrll /* xgettext:c-format */
1883 1.1.1.7 christos einfo (_("%P: can't open output def file %s\n"),
1884 1.1.1.6 christos pe_out_def_filename);
1885 1.1 skrll
1886 1.1 skrll if (pe_def_file)
1887 1.1 skrll {
1888 1.1 skrll if (pe_def_file->name)
1889 1.1 skrll {
1890 1.1 skrll if (pe_def_file->is_dll)
1891 1.1 skrll fprintf (out, "LIBRARY ");
1892 1.1 skrll else
1893 1.1 skrll fprintf (out, "NAME ");
1894 1.1 skrll
1895 1.1 skrll quoteput (pe_def_file->name, out, 1);
1896 1.1 skrll
1897 1.1 skrll if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1898 1.1.1.10 christos fprintf (out, " BASE=0x%" PRIx64,
1899 1.1.1.10 christos (uint64_t) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase);
1900 1.1 skrll fprintf (out, "\n");
1901 1.1 skrll }
1902 1.1 skrll
1903 1.1 skrll if (pe_def_file->description)
1904 1.1 skrll {
1905 1.1 skrll fprintf (out, "DESCRIPTION ");
1906 1.1 skrll quoteput (pe_def_file->description, out, 1);
1907 1.1 skrll fprintf (out, "\n");
1908 1.1 skrll }
1909 1.1 skrll
1910 1.1 skrll if (pe_def_file->version_minor != -1)
1911 1.1 skrll fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1912 1.1 skrll pe_def_file->version_minor);
1913 1.1 skrll else if (pe_def_file->version_major != -1)
1914 1.1 skrll fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1915 1.1 skrll
1916 1.1 skrll if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1917 1.1 skrll fprintf (out, "\n");
1918 1.1 skrll
1919 1.1 skrll if (pe_def_file->stack_commit != -1)
1920 1.1 skrll fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1921 1.1 skrll pe_def_file->stack_reserve, pe_def_file->stack_commit);
1922 1.1 skrll else if (pe_def_file->stack_reserve != -1)
1923 1.1 skrll fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1924 1.1 skrll
1925 1.1 skrll if (pe_def_file->heap_commit != -1)
1926 1.1 skrll fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1927 1.1 skrll pe_def_file->heap_reserve, pe_def_file->heap_commit);
1928 1.1 skrll else if (pe_def_file->heap_reserve != -1)
1929 1.1 skrll fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1930 1.1 skrll
1931 1.1 skrll if (pe_def_file->num_section_defs > 0)
1932 1.1 skrll {
1933 1.1 skrll fprintf (out, "\nSECTIONS\n\n");
1934 1.1 skrll
1935 1.1 skrll for (i = 0; i < pe_def_file->num_section_defs; i++)
1936 1.1 skrll {
1937 1.1 skrll fprintf (out, " ");
1938 1.1 skrll quoteput (pe_def_file->section_defs[i].name, out, 0);
1939 1.1 skrll
1940 1.1 skrll if (pe_def_file->section_defs[i].class)
1941 1.1 skrll {
1942 1.1 skrll fprintf (out, " CLASS ");
1943 1.1 skrll quoteput (pe_def_file->section_defs[i].class, out, 0);
1944 1.1 skrll }
1945 1.1 skrll
1946 1.1 skrll if (pe_def_file->section_defs[i].flag_read)
1947 1.1 skrll fprintf (out, " READ");
1948 1.1 skrll
1949 1.1 skrll if (pe_def_file->section_defs[i].flag_write)
1950 1.1 skrll fprintf (out, " WRITE");
1951 1.1 skrll
1952 1.1 skrll if (pe_def_file->section_defs[i].flag_execute)
1953 1.1 skrll fprintf (out, " EXECUTE");
1954 1.1 skrll
1955 1.1 skrll if (pe_def_file->section_defs[i].flag_shared)
1956 1.1 skrll fprintf (out, " SHARED");
1957 1.1 skrll
1958 1.1 skrll fprintf (out, "\n");
1959 1.1 skrll }
1960 1.1 skrll }
1961 1.1 skrll
1962 1.1 skrll if (pe_def_file->num_exports > 0)
1963 1.1 skrll {
1964 1.1 skrll fprintf (out, "EXPORTS\n");
1965 1.1 skrll
1966 1.1 skrll for (i = 0; i < pe_def_file->num_exports; i++)
1967 1.1 skrll {
1968 1.1 skrll def_file_export *e = pe_def_file->exports + i;
1969 1.1 skrll fprintf (out, " ");
1970 1.1 skrll quoteput (e->name, out, 0);
1971 1.1 skrll
1972 1.1 skrll if (e->internal_name && strcmp (e->internal_name, e->name))
1973 1.1 skrll {
1974 1.1 skrll fprintf (out, " = ");
1975 1.1 skrll quoteput (e->internal_name, out, 0);
1976 1.1 skrll }
1977 1.1 skrll
1978 1.1 skrll if (e->ordinal != -1)
1979 1.1 skrll fprintf (out, " @%d", e->ordinal);
1980 1.1 skrll
1981 1.1 skrll if (e->flag_private)
1982 1.1 skrll fprintf (out, " PRIVATE");
1983 1.1 skrll
1984 1.1 skrll if (e->flag_constant)
1985 1.1 skrll fprintf (out, " CONSTANT");
1986 1.1 skrll
1987 1.1 skrll if (e->flag_noname)
1988 1.1 skrll fprintf (out, " NONAME");
1989 1.1 skrll
1990 1.1 skrll if (e->flag_data)
1991 1.1 skrll fprintf (out, " DATA");
1992 1.1 skrll
1993 1.1 skrll fprintf (out, "\n");
1994 1.1 skrll }
1995 1.1 skrll }
1996 1.1 skrll
1997 1.1 skrll if (pe_def_file->num_imports > 0)
1998 1.1 skrll {
1999 1.1 skrll fprintf (out, "\nIMPORTS\n\n");
2000 1.1 skrll
2001 1.1 skrll for (i = 0; i < pe_def_file->num_imports; i++)
2002 1.1 skrll {
2003 1.1 skrll def_file_import *im = pe_def_file->imports + i;
2004 1.1 skrll fprintf (out, " ");
2005 1.1 skrll
2006 1.1 skrll if (im->internal_name
2007 1.1 skrll && (!im->name || strcmp (im->internal_name, im->name)))
2008 1.1 skrll {
2009 1.1 skrll quoteput (im->internal_name, out, 0);
2010 1.1 skrll fprintf (out, " = ");
2011 1.1 skrll }
2012 1.1 skrll
2013 1.1 skrll quoteput (im->module->name, out, 0);
2014 1.1 skrll fprintf (out, ".");
2015 1.1 skrll
2016 1.1 skrll if (im->name)
2017 1.1 skrll quoteput (im->name, out, 0);
2018 1.1 skrll else
2019 1.1 skrll fprintf (out, "%d", im->ordinal);
2020 1.1 skrll
2021 1.1.1.2 christos if (im->its_name)
2022 1.1.1.2 christos {
2023 1.1.1.2 christos fprintf (out, " == ");
2024 1.1.1.2 christos quoteput (im->its_name, out, 0);
2025 1.1.1.2 christos }
2026 1.1.1.2 christos
2027 1.1 skrll fprintf (out, "\n");
2028 1.1 skrll }
2029 1.1 skrll }
2030 1.1 skrll }
2031 1.1 skrll else
2032 1.1 skrll fprintf (out, _("; no contents available\n"));
2033 1.1 skrll
2034 1.1 skrll if (fclose (out) == EOF)
2035 1.1 skrll /* xgettext:c-format */
2036 1.1.1.7 christos einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename);
2037 1.1 skrll }
2038 1.1 skrll
2039 1.1 skrll /* Generate the import library. */
2040 1.1 skrll
2041 1.1 skrll static asymbol **symtab;
2042 1.1 skrll static int symptr;
2043 1.1 skrll static int tmp_seq;
2044 1.1 skrll static char *dll_symname;
2045 1.1 skrll
2046 1.1.1.3 christos #define UNDSEC bfd_und_section_ptr
2047 1.1 skrll
2048 1.1 skrll static asection *
2049 1.1 skrll quick_section (bfd *abfd, const char *name, int flags, int align)
2050 1.1 skrll {
2051 1.1 skrll asection *sec;
2052 1.1 skrll asymbol *sym;
2053 1.1 skrll
2054 1.1 skrll sec = bfd_make_section_old_way (abfd, name);
2055 1.1.1.8 christos bfd_set_section_flags (sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
2056 1.1.1.8 christos bfd_set_section_alignment (sec, align);
2057 1.1 skrll /* Remember to undo this before trying to link internally! */
2058 1.1 skrll sec->output_section = sec;
2059 1.1 skrll
2060 1.1 skrll sym = bfd_make_empty_symbol (abfd);
2061 1.1 skrll symtab[symptr++] = sym;
2062 1.1 skrll sym->name = sec->name;
2063 1.1 skrll sym->section = sec;
2064 1.1 skrll sym->flags = BSF_LOCAL;
2065 1.1 skrll sym->value = 0;
2066 1.1 skrll
2067 1.1 skrll return sec;
2068 1.1 skrll }
2069 1.1 skrll
2070 1.1 skrll static void
2071 1.1 skrll quick_symbol (bfd *abfd,
2072 1.1 skrll const char *n1,
2073 1.1 skrll const char *n2,
2074 1.1 skrll const char *n3,
2075 1.1 skrll asection *sec,
2076 1.1 skrll int flags,
2077 1.1 skrll int addr)
2078 1.1 skrll {
2079 1.1 skrll asymbol *sym;
2080 1.1 skrll char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
2081 1.1 skrll
2082 1.1 skrll strcpy (name, n1);
2083 1.1 skrll strcat (name, n2);
2084 1.1 skrll strcat (name, n3);
2085 1.1 skrll sym = bfd_make_empty_symbol (abfd);
2086 1.1 skrll sym->name = name;
2087 1.1 skrll sym->section = sec;
2088 1.1 skrll sym->flags = flags;
2089 1.1 skrll sym->value = addr;
2090 1.1 skrll symtab[symptr++] = sym;
2091 1.1 skrll }
2092 1.1 skrll
2093 1.1 skrll static arelent *reltab = 0;
2094 1.1 skrll static int relcount = 0, relsize = 0;
2095 1.1 skrll
2096 1.1 skrll static void
2097 1.1 skrll quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
2098 1.1 skrll {
2099 1.1 skrll if (relcount >= relsize - 1)
2100 1.1 skrll {
2101 1.1 skrll relsize += 10;
2102 1.1 skrll if (reltab)
2103 1.1 skrll reltab = xrealloc (reltab, relsize * sizeof (arelent));
2104 1.1 skrll else
2105 1.1 skrll reltab = xmalloc (relsize * sizeof (arelent));
2106 1.1 skrll }
2107 1.1 skrll reltab[relcount].address = address;
2108 1.1 skrll reltab[relcount].addend = 0;
2109 1.1 skrll reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
2110 1.1 skrll reltab[relcount].sym_ptr_ptr = symtab + symidx;
2111 1.1 skrll relcount++;
2112 1.1 skrll }
2113 1.1 skrll
2114 1.1 skrll static void
2115 1.1 skrll save_relocs (asection *sec)
2116 1.1 skrll {
2117 1.1 skrll int i;
2118 1.1 skrll
2119 1.1 skrll sec->relocation = reltab;
2120 1.1 skrll sec->reloc_count = relcount;
2121 1.1 skrll sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
2122 1.1 skrll for (i = 0; i < relcount; i++)
2123 1.1 skrll sec->orelocation[i] = sec->relocation + i;
2124 1.1 skrll sec->orelocation[relcount] = 0;
2125 1.1 skrll sec->flags |= SEC_RELOC;
2126 1.1 skrll reltab = 0;
2127 1.1 skrll relcount = relsize = 0;
2128 1.1 skrll }
2129 1.1 skrll
2130 1.1 skrll /* .section .idata$2
2131 1.1.1.6 christos .global __head_my_dll
2132 1.1 skrll __head_my_dll:
2133 1.1.1.6 christos .rva hname
2134 1.1.1.6 christos .long 0
2135 1.1.1.6 christos .long 0
2136 1.1.1.6 christos .rva __my_dll_iname
2137 1.1.1.6 christos .rva fthunk
2138 1.1 skrll
2139 1.1.1.6 christos .section .idata$5
2140 1.1.1.6 christos .long 0
2141 1.1 skrll fthunk:
2142 1.1 skrll
2143 1.1.1.6 christos .section .idata$4
2144 1.1.1.6 christos .long 0
2145 1.1 skrll hname: */
2146 1.1 skrll
2147 1.1 skrll static bfd *
2148 1.1 skrll make_head (bfd *parent)
2149 1.1 skrll {
2150 1.1 skrll asection *id2, *id5, *id4;
2151 1.1 skrll unsigned char *d2, *d5, *d4;
2152 1.1 skrll char *oname;
2153 1.1 skrll bfd *abfd;
2154 1.1 skrll
2155 1.1.1.11 christos oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
2156 1.1 skrll tmp_seq++;
2157 1.1 skrll
2158 1.1 skrll abfd = bfd_create (oname, parent);
2159 1.1.1.10 christos free (oname);
2160 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2161 1.1 skrll bfd_make_writable (abfd);
2162 1.1 skrll
2163 1.1 skrll bfd_set_format (abfd, bfd_object);
2164 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2165 1.1 skrll
2166 1.1 skrll symptr = 0;
2167 1.1 skrll symtab = xmalloc (6 * sizeof (asymbol *));
2168 1.1 skrll id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2169 1.1 skrll id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2170 1.1 skrll id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2171 1.1 skrll quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2172 1.1 skrll quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2173 1.1 skrll
2174 1.1 skrll /* OK, pay attention here. I got confused myself looking back at
2175 1.1 skrll it. We create a four-byte section to mark the beginning of the
2176 1.1 skrll list, and we include an offset of 4 in the section, so that the
2177 1.1 skrll pointer to the list points to the *end* of this section, which is
2178 1.1 skrll the start of the list of sections from other objects. */
2179 1.1 skrll
2180 1.1.1.8 christos bfd_set_section_size (id2, 20);
2181 1.1 skrll d2 = xmalloc (20);
2182 1.1 skrll id2->contents = d2;
2183 1.1 skrll memset (d2, 0, 20);
2184 1.1.1.2 christos if (pe_use_nul_prefixed_import_tables)
2185 1.1.1.2 christos d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
2186 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2187 1.1 skrll quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
2188 1.1 skrll quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
2189 1.1 skrll save_relocs (id2);
2190 1.1 skrll
2191 1.1.1.2 christos if (pe_use_nul_prefixed_import_tables)
2192 1.1.1.8 christos bfd_set_section_size (id5, PE_IDATA5_SIZE);
2193 1.1.1.2 christos else
2194 1.1.1.8 christos bfd_set_section_size (id5, 0);
2195 1.1 skrll d5 = xmalloc (PE_IDATA5_SIZE);
2196 1.1 skrll id5->contents = d5;
2197 1.1 skrll memset (d5, 0, PE_IDATA5_SIZE);
2198 1.1.1.2 christos if (pe_use_nul_prefixed_import_tables)
2199 1.1.1.8 christos bfd_set_section_size (id4, PE_IDATA4_SIZE);
2200 1.1.1.2 christos else
2201 1.1.1.8 christos bfd_set_section_size (id4, 0);
2202 1.1 skrll d4 = xmalloc (PE_IDATA4_SIZE);
2203 1.1 skrll id4->contents = d4;
2204 1.1 skrll memset (d4, 0, PE_IDATA4_SIZE);
2205 1.1 skrll
2206 1.1 skrll bfd_set_symtab (abfd, symtab, symptr);
2207 1.1 skrll
2208 1.1 skrll bfd_set_section_contents (abfd, id2, d2, 0, 20);
2209 1.1.1.2 christos if (pe_use_nul_prefixed_import_tables)
2210 1.1.1.2 christos {
2211 1.1.1.2 christos bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2212 1.1.1.2 christos bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2213 1.1.1.2 christos }
2214 1.1.1.2 christos else
2215 1.1.1.2 christos {
2216 1.1.1.2 christos bfd_set_section_contents (abfd, id5, d5, 0, 0);
2217 1.1.1.2 christos bfd_set_section_contents (abfd, id4, d4, 0, 0);
2218 1.1.1.2 christos }
2219 1.1 skrll
2220 1.1 skrll bfd_make_readable (abfd);
2221 1.1 skrll return abfd;
2222 1.1 skrll }
2223 1.1 skrll
2224 1.1 skrll /* .section .idata$4
2225 1.1.1.6 christos .long 0
2226 1.1 skrll [.long 0] for PE+
2227 1.1.1.6 christos .section .idata$5
2228 1.1.1.6 christos .long 0
2229 1.1 skrll [.long 0] for PE+
2230 1.1.1.6 christos .section idata$7
2231 1.1.1.6 christos .global __my_dll_iname
2232 1.1 skrll __my_dll_iname:
2233 1.1.1.6 christos .asciz "my.dll" */
2234 1.1 skrll
2235 1.1 skrll static bfd *
2236 1.1 skrll make_tail (bfd *parent)
2237 1.1 skrll {
2238 1.1 skrll asection *id4, *id5, *id7;
2239 1.1 skrll unsigned char *d4, *d5, *d7;
2240 1.1 skrll int len;
2241 1.1 skrll char *oname;
2242 1.1 skrll bfd *abfd;
2243 1.1 skrll
2244 1.1.1.11 christos oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
2245 1.1 skrll tmp_seq++;
2246 1.1 skrll
2247 1.1 skrll abfd = bfd_create (oname, parent);
2248 1.1.1.10 christos free (oname);
2249 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2250 1.1 skrll bfd_make_writable (abfd);
2251 1.1 skrll
2252 1.1 skrll bfd_set_format (abfd, bfd_object);
2253 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2254 1.1 skrll
2255 1.1 skrll symptr = 0;
2256 1.1 skrll symtab = xmalloc (5 * sizeof (asymbol *));
2257 1.1 skrll id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2258 1.1 skrll id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2259 1.1 skrll id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2260 1.1 skrll quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
2261 1.1 skrll
2262 1.1.1.8 christos bfd_set_section_size (id4, PE_IDATA4_SIZE);
2263 1.1 skrll d4 = xmalloc (PE_IDATA4_SIZE);
2264 1.1 skrll id4->contents = d4;
2265 1.1 skrll memset (d4, 0, PE_IDATA4_SIZE);
2266 1.1 skrll
2267 1.1.1.8 christos bfd_set_section_size (id5, PE_IDATA5_SIZE);
2268 1.1 skrll d5 = xmalloc (PE_IDATA5_SIZE);
2269 1.1 skrll id5->contents = d5;
2270 1.1 skrll memset (d5, 0, PE_IDATA5_SIZE);
2271 1.1 skrll
2272 1.1 skrll len = strlen (dll_filename) + 1;
2273 1.1 skrll if (len & 1)
2274 1.1 skrll len++;
2275 1.1.1.8 christos bfd_set_section_size (id7, len);
2276 1.1 skrll d7 = xmalloc (len);
2277 1.1 skrll id7->contents = d7;
2278 1.1 skrll strcpy ((char *) d7, dll_filename);
2279 1.1 skrll /* If len was odd, the above
2280 1.1 skrll strcpy leaves behind an undefined byte. That is harmless,
2281 1.1 skrll but we set it to 0 just so the binary dumps are pretty. */
2282 1.1 skrll d7[len - 1] = 0;
2283 1.1 skrll
2284 1.1 skrll bfd_set_symtab (abfd, symtab, symptr);
2285 1.1 skrll
2286 1.1 skrll bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2287 1.1 skrll bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2288 1.1 skrll bfd_set_section_contents (abfd, id7, d7, 0, len);
2289 1.1 skrll
2290 1.1 skrll bfd_make_readable (abfd);
2291 1.1 skrll return abfd;
2292 1.1 skrll }
2293 1.1 skrll
2294 1.1 skrll /* .text
2295 1.1.1.6 christos .global _function
2296 1.1.1.6 christos .global ___imp_function
2297 1.1.1.6 christos .global __imp__function
2298 1.1 skrll _function:
2299 1.1.1.6 christos jmp *__imp__function:
2300 1.1 skrll
2301 1.1.1.6 christos .section idata$7
2302 1.1.1.6 christos .long __head_my_dll
2303 1.1 skrll
2304 1.1.1.6 christos .section .idata$5
2305 1.1 skrll ___imp_function:
2306 1.1 skrll __imp__function:
2307 1.1 skrll iat?
2308 1.1.1.6 christos .section .idata$4
2309 1.1 skrll iat?
2310 1.1.1.6 christos .section .idata$6
2311 1.1 skrll ID<ordinal>:
2312 1.1.1.6 christos .short <hint>
2313 1.1.1.6 christos .asciz "function" xlate? (add underscore, kill at) */
2314 1.1 skrll
2315 1.1 skrll static const unsigned char jmp_ix86_bytes[] =
2316 1.1 skrll {
2317 1.1 skrll 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2318 1.1 skrll };
2319 1.1 skrll
2320 1.1.1.10 christos static const unsigned char jmp_aarch64_bytes[] =
2321 1.1.1.10 christos {
2322 1.1.1.10 christos 0x10, 0x00, 0x00, 0x90, /* adrp x16, 0 */
2323 1.1.1.10 christos 0x10, 0x02, 0x00, 0x91, /* add x16, x16, #0x0 */
2324 1.1.1.10 christos 0x10, 0x02, 0x40, 0xf9, /* ldr x16, [x16] */
2325 1.1.1.10 christos 0x00, 0x02, 0x1f, 0xd6 /* br x16 */
2326 1.1.1.10 christos };
2327 1.1.1.10 christos
2328 1.1 skrll /* _function:
2329 1.1.1.6 christos mov.l ip+8,r0
2330 1.1.1.6 christos mov.l @r0,r0
2331 1.1.1.6 christos jmp @r0
2332 1.1.1.6 christos nop
2333 1.1.1.6 christos .dw __imp_function */
2334 1.1 skrll
2335 1.1 skrll static const unsigned char jmp_sh_bytes[] =
2336 1.1 skrll {
2337 1.1 skrll 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2338 1.1 skrll };
2339 1.1 skrll
2340 1.1 skrll static const unsigned char jmp_arm_bytes[] =
2341 1.1 skrll {
2342 1.1 skrll 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2343 1.1 skrll 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2344 1.1 skrll 0, 0, 0, 0
2345 1.1 skrll };
2346 1.1 skrll
2347 1.1 skrll
2348 1.1 skrll static bfd *
2349 1.1.1.9 christos make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
2350 1.1 skrll {
2351 1.1 skrll asection *tx, *id7, *id5, *id4, *id6;
2352 1.1 skrll unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2353 1.1 skrll int len;
2354 1.1 skrll char *oname;
2355 1.1 skrll bfd *abfd;
2356 1.1 skrll const unsigned char *jmp_bytes = NULL;
2357 1.1 skrll int jmp_byte_count = 0;
2358 1.1.1.10 christos const char *internal_name = exp->internal_name;
2359 1.1.1.10 christos
2360 1.1.1.10 christos if (!exp->flag_noname)
2361 1.1.1.10 christos {
2362 1.1.1.10 christos /* Check for a decorated symbol name */
2363 1.1.1.10 christos struct decoration_hash_entry *entry;
2364 1.1.1.10 christos
2365 1.1.1.10 christos entry = (struct decoration_hash_entry *)
2366 1.1.1.10 christos bfd_hash_lookup (&(coff_hash_table (&link_info)->decoration_hash),
2367 1.1.1.10 christos internal_name, false, false);
2368 1.1.1.10 christos if (entry)
2369 1.1.1.10 christos {
2370 1.1.1.10 christos if (entry->decorated_link)
2371 1.1.1.10 christos {
2372 1.1.1.10 christos internal_name = entry->decorated_link->root.string;
2373 1.1.1.10 christos
2374 1.1.1.10 christos if (pe_details->underscored && internal_name[0] == '_')
2375 1.1.1.10 christos internal_name++;
2376 1.1.1.10 christos }
2377 1.1.1.10 christos else
2378 1.1.1.10 christos {
2379 1.1.1.10 christos einfo (_("%P: error: NULL decorated name for %s\n"), internal_name);
2380 1.1.1.10 christos }
2381 1.1.1.10 christos }
2382 1.1.1.10 christos }
2383 1.1 skrll
2384 1.1 skrll /* Include the jump stub section only if it is needed. A jump
2385 1.1 skrll stub is needed if the symbol being imported <sym> is a function
2386 1.1 skrll symbol and there is at least one undefined reference to that
2387 1.1 skrll symbol. In other words, if all the import references to <sym> are
2388 1.1 skrll explicitly through _declspec(dllimport) then the jump stub is not
2389 1.1 skrll needed. */
2390 1.1 skrll if (include_jmp_stub)
2391 1.1 skrll {
2392 1.1 skrll switch (pe_details->pe_arch)
2393 1.1 skrll {
2394 1.1 skrll case PE_ARCH_i386:
2395 1.1 skrll jmp_bytes = jmp_ix86_bytes;
2396 1.1 skrll jmp_byte_count = sizeof (jmp_ix86_bytes);
2397 1.1 skrll break;
2398 1.1 skrll case PE_ARCH_sh:
2399 1.1 skrll jmp_bytes = jmp_sh_bytes;
2400 1.1 skrll jmp_byte_count = sizeof (jmp_sh_bytes);
2401 1.1 skrll break;
2402 1.1 skrll case PE_ARCH_arm:
2403 1.1 skrll case PE_ARCH_arm_wince:
2404 1.1 skrll jmp_bytes = jmp_arm_bytes;
2405 1.1 skrll jmp_byte_count = sizeof (jmp_arm_bytes);
2406 1.1 skrll break;
2407 1.1.1.10 christos case PE_ARCH_aarch64:
2408 1.1.1.10 christos jmp_bytes = jmp_aarch64_bytes;
2409 1.1.1.10 christos jmp_byte_count = sizeof (jmp_aarch64_bytes);
2410 1.1.1.10 christos break;
2411 1.1 skrll default:
2412 1.1 skrll abort ();
2413 1.1 skrll }
2414 1.1 skrll }
2415 1.1 skrll
2416 1.1.1.11 christos oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
2417 1.1 skrll tmp_seq++;
2418 1.1 skrll
2419 1.1 skrll abfd = bfd_create (oname, parent);
2420 1.1.1.10 christos free (oname);
2421 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2422 1.1 skrll bfd_make_writable (abfd);
2423 1.1 skrll
2424 1.1 skrll bfd_set_format (abfd, bfd_object);
2425 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2426 1.1 skrll
2427 1.1 skrll symptr = 0;
2428 1.1.1.2 christos symtab = xmalloc (12 * sizeof (asymbol *));
2429 1.1.1.2 christos
2430 1.1.1.2 christos tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2431 1.1 skrll id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2432 1.1 skrll id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2433 1.1 skrll id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2434 1.1 skrll id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2435 1.1 skrll
2436 1.1.1.10 christos if (*internal_name == '@')
2437 1.1 skrll {
2438 1.1 skrll quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2439 1.1 skrll BSF_GLOBAL, 0);
2440 1.1 skrll if (include_jmp_stub)
2441 1.1.1.10 christos quick_symbol (abfd, "", internal_name, "", tx, BSF_GLOBAL, 0);
2442 1.1.1.10 christos quick_symbol (abfd, "__imp_", internal_name, "", id5,
2443 1.1 skrll BSF_GLOBAL, 0);
2444 1.1 skrll /* Fastcall applies only to functions,
2445 1.1 skrll so no need for auto-import symbol. */
2446 1.1 skrll }
2447 1.1 skrll else
2448 1.1 skrll {
2449 1.1 skrll quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2450 1.1 skrll BSF_GLOBAL, 0);
2451 1.1 skrll if (include_jmp_stub)
2452 1.1.1.10 christos quick_symbol (abfd, U (""), internal_name, "", tx,
2453 1.1 skrll BSF_GLOBAL, 0);
2454 1.1.1.10 christos quick_symbol (abfd, "__imp_", U (""), internal_name, id5,
2455 1.1 skrll BSF_GLOBAL, 0);
2456 1.1 skrll /* Symbol to reference ord/name of imported
2457 1.1 skrll data symbol, used to implement auto-import. */
2458 1.1 skrll if (exp->flag_data)
2459 1.1.1.10 christos quick_symbol (abfd, "__nm_", U (""), internal_name, id6,
2460 1.1 skrll BSF_GLOBAL,0);
2461 1.1 skrll }
2462 1.1 skrll if (pe_dll_compat_implib)
2463 1.1.1.10 christos quick_symbol (abfd, "___imp_", internal_name, "", id5,
2464 1.1 skrll BSF_GLOBAL, 0);
2465 1.1 skrll
2466 1.1 skrll if (include_jmp_stub)
2467 1.1 skrll {
2468 1.1.1.8 christos bfd_set_section_size (tx, jmp_byte_count);
2469 1.1 skrll td = xmalloc (jmp_byte_count);
2470 1.1 skrll tx->contents = td;
2471 1.1 skrll memcpy (td, jmp_bytes, jmp_byte_count);
2472 1.1 skrll
2473 1.1 skrll switch (pe_details->pe_arch)
2474 1.1 skrll {
2475 1.1 skrll case PE_ARCH_i386:
2476 1.1.1.10 christos #ifdef pe_use_plus
2477 1.1 skrll quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2478 1.1 skrll #else
2479 1.1.1.2 christos /* Mark this object as SAFESEH compatible. */
2480 1.1.1.2 christos quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2481 1.1.1.2 christos BSF_LOCAL, 1);
2482 1.1.1.6 christos quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2483 1.1 skrll #endif
2484 1.1 skrll break;
2485 1.1 skrll case PE_ARCH_sh:
2486 1.1 skrll quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2487 1.1 skrll break;
2488 1.1 skrll case PE_ARCH_arm:
2489 1.1.1.6 christos case PE_ARCH_arm_wince:
2490 1.1 skrll quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2491 1.1 skrll break;
2492 1.1.1.10 christos case PE_ARCH_aarch64:
2493 1.1.1.10 christos quick_reloc (abfd, 0, BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL, 2);
2494 1.1.1.10 christos quick_reloc (abfd, 4, BFD_RELOC_AARCH64_ADD_LO12, 2);
2495 1.1.1.10 christos break;
2496 1.1 skrll default:
2497 1.1 skrll abort ();
2498 1.1 skrll }
2499 1.1 skrll save_relocs (tx);
2500 1.1 skrll }
2501 1.1 skrll else
2502 1.1.1.8 christos bfd_set_section_size (tx, 0);
2503 1.1 skrll
2504 1.1.1.8 christos bfd_set_section_size (id7, 4);
2505 1.1 skrll d7 = xmalloc (4);
2506 1.1 skrll id7->contents = d7;
2507 1.1 skrll memset (d7, 0, 4);
2508 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2509 1.1 skrll save_relocs (id7);
2510 1.1 skrll
2511 1.1.1.8 christos bfd_set_section_size (id5, PE_IDATA5_SIZE);
2512 1.1 skrll d5 = xmalloc (PE_IDATA5_SIZE);
2513 1.1 skrll id5->contents = d5;
2514 1.1 skrll memset (d5, 0, PE_IDATA5_SIZE);
2515 1.1 skrll
2516 1.1 skrll if (exp->flag_noname)
2517 1.1 skrll {
2518 1.1 skrll d5[0] = exp->ordinal;
2519 1.1 skrll d5[1] = exp->ordinal >> 8;
2520 1.1 skrll d5[PE_IDATA5_SIZE - 1] = 0x80;
2521 1.1 skrll }
2522 1.1 skrll else
2523 1.1 skrll {
2524 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2525 1.1 skrll save_relocs (id5);
2526 1.1 skrll }
2527 1.1 skrll
2528 1.1.1.8 christos bfd_set_section_size (id4, PE_IDATA4_SIZE);
2529 1.1 skrll d4 = xmalloc (PE_IDATA4_SIZE);
2530 1.1 skrll id4->contents = d4;
2531 1.1 skrll memset (d4, 0, PE_IDATA4_SIZE);
2532 1.1 skrll
2533 1.1 skrll if (exp->flag_noname)
2534 1.1 skrll {
2535 1.1 skrll d4[0] = exp->ordinal;
2536 1.1 skrll d4[1] = exp->ordinal >> 8;
2537 1.1 skrll d4[PE_IDATA4_SIZE - 1] = 0x80;
2538 1.1 skrll }
2539 1.1 skrll else
2540 1.1 skrll {
2541 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2542 1.1 skrll save_relocs (id4);
2543 1.1 skrll }
2544 1.1 skrll
2545 1.1 skrll if (exp->flag_noname)
2546 1.1 skrll {
2547 1.1 skrll len = 0;
2548 1.1.1.8 christos bfd_set_section_size (id6, 0);
2549 1.1 skrll }
2550 1.1 skrll else
2551 1.1 skrll {
2552 1.1.1.11 christos /* { short, asciz } = { hint, name } */
2553 1.1.1.2 christos if (exp->its_name)
2554 1.1.1.2 christos len = 2 + strlen (exp->its_name) + 1;
2555 1.1.1.2 christos else
2556 1.1.1.2 christos len = 2 + strlen (exp->name) + 1;
2557 1.1 skrll if (len & 1)
2558 1.1 skrll len++;
2559 1.1.1.8 christos bfd_set_section_size (id6, len);
2560 1.1 skrll d6 = xmalloc (len);
2561 1.1 skrll id6->contents = d6;
2562 1.1 skrll memset (d6, 0, len);
2563 1.1.1.11 christos d6[0] = exp->hint & 0xff;
2564 1.1.1.11 christos d6[1] = exp->hint >> 8;
2565 1.1.1.2 christos if (exp->its_name)
2566 1.1.1.2 christos strcpy ((char*) d6 + 2, exp->its_name);
2567 1.1.1.2 christos else
2568 1.1.1.2 christos strcpy ((char *) d6 + 2, exp->name);
2569 1.1 skrll }
2570 1.1 skrll
2571 1.1 skrll bfd_set_symtab (abfd, symtab, symptr);
2572 1.1 skrll
2573 1.1 skrll if (include_jmp_stub)
2574 1.1 skrll bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2575 1.1 skrll bfd_set_section_contents (abfd, id7, d7, 0, 4);
2576 1.1 skrll bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2577 1.1 skrll bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2578 1.1 skrll if (!exp->flag_noname)
2579 1.1 skrll bfd_set_section_contents (abfd, id6, d6, 0, len);
2580 1.1 skrll
2581 1.1 skrll bfd_make_readable (abfd);
2582 1.1 skrll return abfd;
2583 1.1 skrll }
2584 1.1 skrll
2585 1.1 skrll static bfd *
2586 1.1 skrll make_singleton_name_thunk (const char *import, bfd *parent)
2587 1.1 skrll {
2588 1.1 skrll /* Name thunks go to idata$4. */
2589 1.1 skrll asection *id4;
2590 1.1 skrll unsigned char *d4;
2591 1.1 skrll char *oname;
2592 1.1 skrll bfd *abfd;
2593 1.1 skrll
2594 1.1.1.11 christos oname = xasprintf ("%s_nmth%06d.o", dll_symname, tmp_seq);
2595 1.1 skrll tmp_seq++;
2596 1.1 skrll
2597 1.1 skrll abfd = bfd_create (oname, parent);
2598 1.1.1.10 christos free (oname);
2599 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2600 1.1 skrll bfd_make_writable (abfd);
2601 1.1 skrll
2602 1.1 skrll bfd_set_format (abfd, bfd_object);
2603 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2604 1.1 skrll
2605 1.1 skrll symptr = 0;
2606 1.1 skrll symtab = xmalloc (3 * sizeof (asymbol *));
2607 1.1 skrll id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2608 1.1.1.2 christos quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2609 1.1.1.2 christos quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2610 1.1 skrll
2611 1.1 skrll /* We need space for the real thunk and for the null terminator. */
2612 1.1.1.8 christos bfd_set_section_size (id4, PE_IDATA4_SIZE * 2);
2613 1.1 skrll d4 = xmalloc (PE_IDATA4_SIZE * 2);
2614 1.1 skrll id4->contents = d4;
2615 1.1 skrll memset (d4, 0, PE_IDATA4_SIZE * 2);
2616 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2617 1.1 skrll save_relocs (id4);
2618 1.1 skrll
2619 1.1 skrll bfd_set_symtab (abfd, symtab, symptr);
2620 1.1 skrll
2621 1.1 skrll bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2622 1.1 skrll
2623 1.1 skrll bfd_make_readable (abfd);
2624 1.1 skrll return abfd;
2625 1.1 skrll }
2626 1.1 skrll
2627 1.1.1.7 christos static const char *
2628 1.1.1.6 christos make_import_fixup_mark (arelent *rel, char *name)
2629 1.1 skrll {
2630 1.1 skrll /* We convert reloc to symbol, for later reference. */
2631 1.1.1.6 christos static unsigned int counter;
2632 1.1 skrll struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2633 1.1 skrll bfd *abfd = bfd_asymbol_bfd (sym);
2634 1.1 skrll struct bfd_link_hash_entry *bh;
2635 1.1.1.9 christos char *fixup_name, buf[256];
2636 1.1.1.6 christos size_t prefix_len;
2637 1.1 skrll
2638 1.1.1.6 christos /* "name" buffer has space before the symbol name for prefixes. */
2639 1.1.1.6 christos sprintf (buf, "__fu%d_", counter++);
2640 1.1.1.6 christos prefix_len = strlen (buf);
2641 1.1.1.6 christos fixup_name = name - prefix_len;
2642 1.1.1.6 christos memcpy (fixup_name, buf, prefix_len);
2643 1.1 skrll
2644 1.1 skrll bh = NULL;
2645 1.1.1.11 christos _bfd_generic_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2646 1.1.1.11 christos current_sec, /* sym->section, */
2647 1.1.1.11 christos rel->address, NULL, true, false, &bh);
2648 1.1 skrll
2649 1.1.1.7 christos return bh->root.string;
2650 1.1 skrll }
2651 1.1 skrll
2652 1.1 skrll /* .section .idata$2
2653 1.1.1.6 christos .rva __nm_thnk_SYM (singleton thunk with name of func)
2654 1.1.1.6 christos .long 0
2655 1.1.1.6 christos .long 0
2656 1.1.1.6 christos .rva __my_dll_iname (name of dll)
2657 1.1.1.6 christos .rva __fuNN_SYM (pointer to reference (address) in text) */
2658 1.1 skrll
2659 1.1 skrll static bfd *
2660 1.1 skrll make_import_fixup_entry (const char *name,
2661 1.1 skrll const char *fixup_name,
2662 1.1.1.2 christos const char *symname,
2663 1.1 skrll bfd *parent)
2664 1.1 skrll {
2665 1.1 skrll asection *id2;
2666 1.1 skrll unsigned char *d2;
2667 1.1 skrll char *oname;
2668 1.1 skrll bfd *abfd;
2669 1.1 skrll
2670 1.1.1.11 christos oname = xasprintf ("%s_fu%06d.o", dll_symname, tmp_seq);
2671 1.1 skrll tmp_seq++;
2672 1.1 skrll
2673 1.1 skrll abfd = bfd_create (oname, parent);
2674 1.1.1.10 christos free (oname);
2675 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2676 1.1 skrll bfd_make_writable (abfd);
2677 1.1 skrll
2678 1.1 skrll bfd_set_format (abfd, bfd_object);
2679 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2680 1.1 skrll
2681 1.1 skrll symptr = 0;
2682 1.1 skrll symtab = xmalloc (6 * sizeof (asymbol *));
2683 1.1 skrll id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2684 1.1 skrll
2685 1.1.1.2 christos quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2686 1.1.1.2 christos quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2687 1.1.1.7 christos quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2688 1.1 skrll
2689 1.1.1.8 christos bfd_set_section_size (id2, 20);
2690 1.1 skrll d2 = xmalloc (20);
2691 1.1 skrll id2->contents = d2;
2692 1.1 skrll memset (d2, 0, 20);
2693 1.1 skrll
2694 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2695 1.1 skrll quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2696 1.1 skrll quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2697 1.1 skrll save_relocs (id2);
2698 1.1 skrll
2699 1.1 skrll bfd_set_symtab (abfd, symtab, symptr);
2700 1.1 skrll
2701 1.1 skrll bfd_set_section_contents (abfd, id2, d2, 0, 20);
2702 1.1 skrll
2703 1.1 skrll bfd_make_readable (abfd);
2704 1.1 skrll return abfd;
2705 1.1 skrll }
2706 1.1 skrll
2707 1.1 skrll /* .section .rdata_runtime_pseudo_reloc
2708 1.1.1.6 christos .long addend
2709 1.1.1.6 christos .rva __fuNN_SYM (pointer to reference (address) in text) */
2710 1.1 skrll
2711 1.1 skrll static bfd *
2712 1.1 skrll make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2713 1.1 skrll const char *fixup_name,
2714 1.1.1.2 christos bfd_vma addend ATTRIBUTE_UNUSED,
2715 1.1.1.2 christos bfd_vma bitsize,
2716 1.1 skrll bfd *parent)
2717 1.1 skrll {
2718 1.1 skrll asection *rt_rel;
2719 1.1 skrll unsigned char *rt_rel_d;
2720 1.1 skrll char *oname;
2721 1.1 skrll bfd *abfd;
2722 1.1.1.7 christos bfd_size_type size;
2723 1.1.1.7 christos
2724 1.1.1.11 christos oname = xasprintf ("%s_rtr%06d.o", dll_symname, tmp_seq);
2725 1.1 skrll tmp_seq++;
2726 1.1 skrll
2727 1.1 skrll abfd = bfd_create (oname, parent);
2728 1.1.1.10 christos free (oname);
2729 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2730 1.1 skrll bfd_make_writable (abfd);
2731 1.1 skrll
2732 1.1 skrll bfd_set_format (abfd, bfd_object);
2733 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2734 1.1 skrll
2735 1.1.1.2 christos if (link_info.pei386_runtime_pseudo_reloc == 2)
2736 1.1.1.2 christos {
2737 1.1.1.7 christos if (runtime_pseudp_reloc_v2_init)
2738 1.1.1.7 christos size = 3 * sizeof (asymbol *);
2739 1.1.1.7 christos else
2740 1.1.1.7 christos size = 6 * sizeof (asymbol *);
2741 1.1.1.2 christos }
2742 1.1.1.2 christos else
2743 1.1.1.7 christos size = 2 * sizeof (asymbol *);
2744 1.1.1.7 christos
2745 1.1.1.7 christos symptr = 0;
2746 1.1.1.7 christos symtab = xmalloc (size);
2747 1.1.1.7 christos
2748 1.1.1.7 christos rt_rel
2749 1.1.1.7 christos = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2750 1.1.1.10 christos bfd_coff_set_long_section_names (abfd, true);
2751 1.1 skrll
2752 1.1 skrll quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2753 1.1 skrll
2754 1.1.1.2 christos if (link_info.pei386_runtime_pseudo_reloc == 2)
2755 1.1.1.2 christos {
2756 1.1.1.7 christos size = 12;
2757 1.1.1.7 christos if (!runtime_pseudp_reloc_v2_init)
2758 1.1.1.7 christos {
2759 1.1.1.7 christos size += 12;
2760 1.1.1.9 christos runtime_pseudp_reloc_v2_init = true;
2761 1.1.1.7 christos }
2762 1.1.1.7 christos
2763 1.1.1.2 christos quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2764 1.1.1.2 christos
2765 1.1.1.8 christos bfd_set_section_size (rt_rel, size);
2766 1.1.1.2 christos rt_rel_d = xmalloc (size);
2767 1.1.1.2 christos rt_rel->contents = rt_rel_d;
2768 1.1.1.2 christos memset (rt_rel_d, 0, size);
2769 1.1.1.7 christos quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2770 1.1.1.7 christos quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2771 1.1.1.7 christos bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2772 1.1.1.7 christos if (size != 12)
2773 1.1.1.7 christos bfd_put_32 (abfd, 1, rt_rel_d + 8);
2774 1.1.1.2 christos save_relocs (rt_rel);
2775 1.1 skrll
2776 1.1.1.2 christos bfd_set_symtab (abfd, symtab, symptr);
2777 1.1 skrll
2778 1.1.1.2 christos bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2779 1.1.1.7 christos }
2780 1.1.1.2 christos else
2781 1.1.1.7 christos {
2782 1.1.1.8 christos bfd_set_section_size (rt_rel, 8);
2783 1.1.1.2 christos rt_rel_d = xmalloc (8);
2784 1.1.1.2 christos rt_rel->contents = rt_rel_d;
2785 1.1.1.2 christos memset (rt_rel_d, 0, 8);
2786 1.1 skrll
2787 1.1.1.2 christos bfd_put_32 (abfd, addend, rt_rel_d);
2788 1.1.1.2 christos quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2789 1.1 skrll
2790 1.1.1.2 christos save_relocs (rt_rel);
2791 1.1.1.2 christos
2792 1.1.1.2 christos bfd_set_symtab (abfd, symtab, symptr);
2793 1.1.1.2 christos
2794 1.1.1.2 christos bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2795 1.1.1.2 christos }
2796 1.1.1.7 christos
2797 1.1 skrll bfd_make_readable (abfd);
2798 1.1 skrll return abfd;
2799 1.1 skrll }
2800 1.1 skrll
2801 1.1 skrll /* .section .rdata
2802 1.1.1.6 christos .rva __pei386_runtime_relocator */
2803 1.1 skrll
2804 1.1 skrll static bfd *
2805 1.1 skrll pe_create_runtime_relocator_reference (bfd *parent)
2806 1.1 skrll {
2807 1.1 skrll asection *extern_rt_rel;
2808 1.1 skrll unsigned char *extern_rt_rel_d;
2809 1.1 skrll char *oname;
2810 1.1 skrll bfd *abfd;
2811 1.1 skrll
2812 1.1.1.11 christos oname = xasprintf ("%s_ertr%06d.o", dll_symname, tmp_seq);
2813 1.1 skrll tmp_seq++;
2814 1.1 skrll
2815 1.1 skrll abfd = bfd_create (oname, parent);
2816 1.1.1.10 christos free (oname);
2817 1.1 skrll bfd_find_target (pe_details->object_target, abfd);
2818 1.1 skrll bfd_make_writable (abfd);
2819 1.1 skrll
2820 1.1 skrll bfd_set_format (abfd, bfd_object);
2821 1.1 skrll bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2822 1.1 skrll
2823 1.1 skrll symptr = 0;
2824 1.1 skrll symtab = xmalloc (2 * sizeof (asymbol *));
2825 1.1 skrll extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2826 1.1 skrll
2827 1.1 skrll quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2828 1.1 skrll BSF_NO_FLAGS, 0);
2829 1.1 skrll
2830 1.1.1.8 christos bfd_set_section_size (extern_rt_rel, PE_IDATA5_SIZE);
2831 1.1.1.4 christos extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
2832 1.1 skrll extern_rt_rel->contents = extern_rt_rel_d;
2833 1.1 skrll
2834 1.1 skrll quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2835 1.1 skrll save_relocs (extern_rt_rel);
2836 1.1 skrll
2837 1.1 skrll bfd_set_symtab (abfd, symtab, symptr);
2838 1.1 skrll
2839 1.1.1.2 christos bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2840 1.1 skrll
2841 1.1 skrll bfd_make_readable (abfd);
2842 1.1 skrll return abfd;
2843 1.1 skrll }
2844 1.1 skrll
2845 1.1 skrll void
2846 1.1.1.7 christos pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name,
2847 1.1.1.7 christos const char *symname)
2848 1.1 skrll {
2849 1.1.1.7 christos const char *fixup_name = make_import_fixup_mark (rel, name);
2850 1.1 skrll bfd *b;
2851 1.1.1.2 christos
2852 1.1.1.7 christos /* This is the original implementation of the auto-import feature, which
2853 1.1.1.7 christos primarily relied on the OS loader to patch things up with some help
2854 1.1.1.7 christos from the pseudo-relocator to overcome the main limitation. See the
2855 1.1.1.7 christos comment at the beginning of the file for an overview of the feature. */
2856 1.1.1.7 christos if (link_info.pei386_runtime_pseudo_reloc != 2)
2857 1.1.1.7 christos {
2858 1.1.1.7 christos struct bfd_link_hash_entry *name_thunk_sym;
2859 1.1.1.7 christos /* name buffer is allocated with space at beginning for prefixes. */
2860 1.1.1.7 christos char *thname = name - (sizeof "__nm_thnk_" - 1);
2861 1.1.1.7 christos memcpy (thname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2862 1.1.1.7 christos name_thunk_sym = bfd_link_hash_lookup (link_info.hash, thname, 0, 0, 1);
2863 1.1.1.2 christos
2864 1.1.1.7 christos if (!(name_thunk_sym && name_thunk_sym->type == bfd_link_hash_defined))
2865 1.1.1.6 christos {
2866 1.1.1.7 christos b = make_singleton_name_thunk (name, link_info.output_bfd);
2867 1.1.1.9 christos add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2868 1.1.1.7 christos
2869 1.1.1.7 christos /* If we ever use autoimport, we have to cast text section writable. */
2870 1.1.1.9 christos config.text_read_only = false;
2871 1.1.1.6 christos link_info.output_bfd->flags &= ~WP_TEXT;
2872 1.1.1.6 christos }
2873 1.1.1.7 christos
2874 1.1.1.7 christos if (addend == 0 || link_info.pei386_runtime_pseudo_reloc == 1)
2875 1.1.1.6 christos {
2876 1.1.1.7 christos b = make_import_fixup_entry (name, fixup_name, symname,
2877 1.1.1.7 christos link_info.output_bfd);
2878 1.1.1.9 christos add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2879 1.1.1.2 christos }
2880 1.1 skrll }
2881 1.1 skrll
2882 1.1.1.7 christos /* In the original implementation, the pseudo-relocator was only used when
2883 1.1.1.7 christos the addend was not null. In the new implementation, the OS loader is
2884 1.1.1.7 christos completely bypassed and the pseudo-relocator does the entire work. */
2885 1.1.1.7 christos if ((addend != 0 && link_info.pei386_runtime_pseudo_reloc == 1)
2886 1.1.1.6 christos || link_info.pei386_runtime_pseudo_reloc == 2)
2887 1.1.1.6 christos {
2888 1.1.1.6 christos if (pe_dll_extra_pe_debug)
2889 1.1.1.6 christos printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2890 1.1.1.6 christos fixup_name, (int) addend);
2891 1.1 skrll
2892 1.1.1.9 christos b = make_runtime_pseudo_reloc (name, fixup_name, addend,
2893 1.1.1.9 christos rel->howto->bitsize,
2894 1.1.1.6 christos link_info.output_bfd);
2895 1.1.1.9 christos add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2896 1.1.1.6 christos
2897 1.1.1.7 christos if (runtime_pseudo_relocs_created++ == 0)
2898 1.1.1.6 christos {
2899 1.1.1.6 christos b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2900 1.1.1.9 christos add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2901 1.1.1.6 christos }
2902 1.1.1.6 christos }
2903 1.1.1.7 christos
2904 1.1.1.6 christos else if (addend != 0)
2905 1.1.1.10 christos einfo (_("%X%P: %H: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
2906 1.1.1.7 christos s->owner, s, rel->address, (*rel->sym_ptr_ptr)->name);
2907 1.1 skrll }
2908 1.1 skrll
2909 1.1 skrll void
2910 1.1.1.2 christos pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2911 1.1 skrll {
2912 1.1 skrll int i;
2913 1.1 skrll bfd *ar_head;
2914 1.1 skrll bfd *ar_tail;
2915 1.1 skrll bfd *outarch;
2916 1.1.1.2 christos bfd *ibfd;
2917 1.1 skrll bfd *head = 0;
2918 1.1 skrll
2919 1.1 skrll unlink_if_ordinary (impfilename);
2920 1.1 skrll
2921 1.1 skrll outarch = bfd_openw (impfilename, 0);
2922 1.1 skrll
2923 1.1 skrll if (!outarch)
2924 1.1 skrll {
2925 1.1 skrll /* xgettext:c-format */
2926 1.1.1.7 christos einfo (_("%X%P: can't open .lib file: %s\n"), impfilename);
2927 1.1 skrll return;
2928 1.1 skrll }
2929 1.1 skrll
2930 1.1.1.3 christos if (verbose)
2931 1.1.1.3 christos /* xgettext:c-format */
2932 1.1.1.3 christos info_msg (_("Creating library file: %s\n"), impfilename);
2933 1.1.1.2 christos
2934 1.1 skrll bfd_set_format (outarch, bfd_archive);
2935 1.1 skrll outarch->has_armap = 1;
2936 1.1 skrll
2937 1.1 skrll /* Work out a reasonable size of things to put onto one line. */
2938 1.1 skrll ar_head = make_head (outarch);
2939 1.1 skrll
2940 1.1.1.2 christos /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2941 1.1.1.4 christos for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
2942 1.1.1.2 christos {
2943 1.1.1.2 christos /* Iterate the exclude list. */
2944 1.1.1.2 christos struct exclude_list_struct *ex;
2945 1.1.1.2 christos char found;
2946 1.1.1.2 christos for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2947 1.1.1.2 christos {
2948 1.1.1.2 christos if (ex->type != EXCLUDEFORIMPLIB)
2949 1.1.1.2 christos continue;
2950 1.1.1.9 christos found = (filename_cmp (ex->string, bfd_get_filename (ibfd)) == 0);
2951 1.1.1.2 christos }
2952 1.1.1.2 christos /* If it matched, we must open a fresh BFD for it (the original
2953 1.1.1.6 christos input BFD is still needed for the DLL's final link) and add
2954 1.1.1.6 christos it into the archive member chain. */
2955 1.1.1.2 christos if (found)
2956 1.1.1.2 christos {
2957 1.1.1.2 christos bfd *newbfd = bfd_openr (ibfd->my_archive
2958 1.1.1.9 christos ? bfd_get_filename (ibfd->my_archive)
2959 1.1.1.9 christos : bfd_get_filename (ibfd), NULL);
2960 1.1.1.2 christos if (!newbfd)
2961 1.1.1.2 christos {
2962 1.1.1.9 christos einfo (_("%X%P: bfd_openr %s: %E\n"), bfd_get_filename (ibfd));
2963 1.1.1.2 christos return;
2964 1.1.1.2 christos }
2965 1.1.1.2 christos if (ibfd->my_archive)
2966 1.1.1.2 christos {
2967 1.1.1.2 christos /* Must now iterate through archive until we find the
2968 1.1.1.2 christos required member. A minor shame that we'll open the
2969 1.1.1.2 christos archive once per member that we require from it, and
2970 1.1.1.2 christos leak those archive bfds rather than reuse them. */
2971 1.1.1.2 christos bfd *arbfd = newbfd;
2972 1.1.1.2 christos if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2973 1.1.1.2 christos {
2974 1.1.1.7 christos einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
2975 1.1.1.9 christos bfd_get_filename (ibfd->my_archive),
2976 1.1.1.9 christos bfd_get_filename (ibfd));
2977 1.1.1.2 christos return;
2978 1.1.1.2 christos }
2979 1.1.1.2 christos newbfd = NULL;
2980 1.1.1.2 christos while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2981 1.1.1.2 christos {
2982 1.1.1.9 christos if (filename_cmp (bfd_get_filename (newbfd),
2983 1.1.1.9 christos bfd_get_filename (ibfd)) == 0)
2984 1.1.1.2 christos break;
2985 1.1.1.2 christos }
2986 1.1.1.2 christos if (!newbfd)
2987 1.1.1.2 christos {
2988 1.1.1.7 christos einfo (_("%X%P: %s(%s): can't find member in archive"),
2989 1.1.1.9 christos bfd_get_filename (ibfd->my_archive),
2990 1.1.1.9 christos bfd_get_filename (ibfd));
2991 1.1.1.2 christos return;
2992 1.1.1.2 christos }
2993 1.1.1.2 christos }
2994 1.1.1.2 christos newbfd->archive_next = head;
2995 1.1.1.2 christos head = newbfd;
2996 1.1.1.2 christos }
2997 1.1.1.2 christos }
2998 1.1.1.2 christos
2999 1.1 skrll for (i = 0; i < def->num_exports; i++)
3000 1.1 skrll {
3001 1.1 skrll /* The import library doesn't know about the internal name. */
3002 1.1 skrll char *internal = def->exports[i].internal_name;
3003 1.1 skrll bfd *n;
3004 1.1 skrll
3005 1.1.1.2 christos /* Don't add PRIVATE entries to import lib. */
3006 1.1 skrll if (pe_def_file->exports[i].flag_private)
3007 1.1 skrll continue;
3008 1.1.1.5 christos
3009 1.1 skrll def->exports[i].internal_name = def->exports[i].name;
3010 1.1.1.5 christos
3011 1.1.1.5 christos /* PR 19803: If a symbol has been discard due to garbage
3012 1.1.1.5 christos collection then do not create any exports for it. */
3013 1.1.1.5 christos {
3014 1.1.1.5 christos struct coff_link_hash_entry *h;
3015 1.1.1.5 christos
3016 1.1.1.5 christos h = coff_link_hash_lookup (coff_hash_table (info), internal,
3017 1.1.1.9 christos false, false, false);
3018 1.1.1.5 christos if (h != NULL
3019 1.1.1.5 christos /* If the symbol is hidden and undefined then it
3020 1.1.1.5 christos has been swept up by garbage collection. */
3021 1.1.1.5 christos && h->symbol_class == C_HIDDEN
3022 1.1.1.5 christos && h->root.u.def.section == bfd_und_section_ptr)
3023 1.1.1.5 christos continue;
3024 1.1.1.5 christos
3025 1.1.1.5 christos /* If necessary, check with an underscore prefix as well. */
3026 1.1.1.5 christos if (pe_details->underscored && internal[0] != '@')
3027 1.1.1.5 christos {
3028 1.1.1.5 christos char *name;
3029 1.1.1.5 christos
3030 1.1.1.5 christos name = xmalloc (strlen (internal) + 2);
3031 1.1.1.5 christos sprintf (name, "_%s", internal);
3032 1.1.1.5 christos
3033 1.1.1.5 christos h = coff_link_hash_lookup (coff_hash_table (info), name,
3034 1.1.1.9 christos false, false, false);
3035 1.1.1.5 christos free (name);
3036 1.1.1.5 christos
3037 1.1.1.5 christos if (h != NULL
3038 1.1.1.5 christos /* If the symbol is hidden and undefined then it
3039 1.1.1.5 christos has been swept up by garbage collection. */
3040 1.1.1.5 christos && h->symbol_class == C_HIDDEN
3041 1.1.1.5 christos && h->root.u.def.section == bfd_und_section_ptr)
3042 1.1.1.5 christos continue;
3043 1.1.1.5 christos }
3044 1.1.1.5 christos }
3045 1.1.1.5 christos
3046 1.1.1.9 christos n = make_one (def->exports + i, outarch, !(def->exports + i)->flag_data);
3047 1.1 skrll n->archive_next = head;
3048 1.1 skrll head = n;
3049 1.1 skrll def->exports[i].internal_name = internal;
3050 1.1 skrll }
3051 1.1 skrll
3052 1.1 skrll ar_tail = make_tail (outarch);
3053 1.1 skrll
3054 1.1 skrll if (ar_head == NULL || ar_tail == NULL)
3055 1.1 skrll return;
3056 1.1 skrll
3057 1.1 skrll /* Now stick them all into the archive. */
3058 1.1 skrll ar_head->archive_next = head;
3059 1.1 skrll ar_tail->archive_next = ar_head;
3060 1.1 skrll head = ar_tail;
3061 1.1 skrll
3062 1.1 skrll if (! bfd_set_archive_head (outarch, head))
3063 1.1.1.7 christos einfo ("%X%P: bfd_set_archive_head: %E\n");
3064 1.1 skrll
3065 1.1 skrll if (! bfd_close (outarch))
3066 1.1.1.7 christos einfo ("%X%P: bfd_close %s: %E\n", impfilename);
3067 1.1 skrll }
3068 1.1 skrll
3069 1.1.1.3 christos static int undef_count = 0;
3070 1.1.1.3 christos
3071 1.1.1.3 christos struct key_value
3072 1.1.1.3 christos {
3073 1.1.1.3 christos char *key;
3074 1.1.1.3 christos const char *oname;
3075 1.1.1.3 christos };
3076 1.1.1.3 christos
3077 1.1.1.3 christos static struct key_value *udef_table;
3078 1.1.1.3 christos
3079 1.1.1.3 christos static int undef_sort_cmp (const void *l1, const void *r1)
3080 1.1.1.3 christos {
3081 1.1.1.3 christos const struct key_value *l = l1;
3082 1.1.1.3 christos const struct key_value *r = r1;
3083 1.1.1.3 christos
3084 1.1.1.3 christos return strcmp (l->key, r->key);
3085 1.1.1.3 christos }
3086 1.1.1.3 christos
3087 1.1.1.3 christos static struct bfd_link_hash_entry *
3088 1.1.1.3 christos pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
3089 1.1.1.3 christos {
3090 1.1.1.3 christos struct bfd_link_hash_entry *h = NULL;
3091 1.1.1.3 christos struct key_value *kv;
3092 1.1.1.3 christos struct key_value key;
3093 1.1.1.5 christos char *at, *lname = xmalloc (strlen (name) + 3);
3094 1.1.1.4 christos
3095 1.1.1.3 christos strcpy (lname, name);
3096 1.1.1.3 christos
3097 1.1.1.3 christos at = strchr (lname + (lname[0] == '@'), '@');
3098 1.1.1.3 christos if (at)
3099 1.1.1.3 christos at[1] = 0;
3100 1.1.1.3 christos
3101 1.1.1.3 christos key.key = lname;
3102 1.1.1.3 christos kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
3103 1.1.1.3 christos undef_sort_cmp);
3104 1.1.1.3 christos
3105 1.1.1.3 christos if (kv)
3106 1.1.1.3 christos {
3107 1.1.1.9 christos h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3108 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3109 1.1.1.6 christos goto return_h;
3110 1.1.1.3 christos }
3111 1.1.1.5 christos
3112 1.1.1.3 christos if (lname[0] == '?')
3113 1.1.1.5 christos goto return_NULL;
3114 1.1.1.5 christos
3115 1.1.1.3 christos if (at || lname[0] == '@')
3116 1.1.1.3 christos {
3117 1.1.1.3 christos if (lname[0] == '@')
3118 1.1.1.6 christos {
3119 1.1.1.3 christos if (pe_details->underscored)
3120 1.1.1.3 christos lname[0] = '_';
3121 1.1.1.3 christos else
3122 1.1.1.9 christos /* Use memmove rather than strcpy as that
3123 1.1.1.9 christos can handle overlapping buffers. */
3124 1.1.1.9 christos memmove (lname, lname + 1, strlen (lname));
3125 1.1.1.3 christos key.key = lname;
3126 1.1.1.3 christos kv = bsearch (&key, udef_table, undef_count,
3127 1.1.1.3 christos sizeof (struct key_value), undef_sort_cmp);
3128 1.1.1.3 christos if (kv)
3129 1.1.1.3 christos {
3130 1.1.1.9 christos h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3131 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3132 1.1.1.5 christos goto return_h;
3133 1.1.1.3 christos }
3134 1.1.1.3 christos }
3135 1.1.1.3 christos if (at)
3136 1.1.1.6 christos *strchr (lname, '@') = 0;
3137 1.1.1.3 christos key.key = lname;
3138 1.1.1.3 christos kv = bsearch (&key, udef_table, undef_count,
3139 1.1.1.3 christos sizeof (struct key_value), undef_sort_cmp);
3140 1.1.1.3 christos if (kv)
3141 1.1.1.3 christos {
3142 1.1.1.9 christos h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3143 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3144 1.1.1.5 christos goto return_h;
3145 1.1.1.3 christos }
3146 1.1.1.5 christos goto return_NULL;
3147 1.1.1.3 christos }
3148 1.1.1.3 christos
3149 1.1.1.3 christos strcat (lname, "@");
3150 1.1.1.3 christos key.key = lname;
3151 1.1.1.3 christos kv = bsearch (&key, udef_table, undef_count,
3152 1.1.1.3 christos sizeof (struct key_value), undef_sort_cmp);
3153 1.1.1.3 christos
3154 1.1.1.3 christos if (kv)
3155 1.1.1.3 christos {
3156 1.1.1.9 christos h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3157 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3158 1.1.1.5 christos goto return_h;
3159 1.1.1.3 christos }
3160 1.1.1.3 christos
3161 1.1.1.3 christos if (lname[0] == '_' && pe_details->underscored)
3162 1.1.1.3 christos lname[0] = '@';
3163 1.1.1.3 christos else
3164 1.1.1.3 christos {
3165 1.1.1.3 christos memmove (lname + 1, lname, strlen (lname) + 1);
3166 1.1.1.3 christos lname[0] = '@';
3167 1.1.1.3 christos }
3168 1.1.1.3 christos key.key = lname;
3169 1.1.1.3 christos
3170 1.1.1.3 christos kv = bsearch (&key, udef_table, undef_count,
3171 1.1.1.3 christos sizeof (struct key_value), undef_sort_cmp);
3172 1.1.1.3 christos
3173 1.1.1.3 christos if (kv)
3174 1.1.1.3 christos {
3175 1.1.1.9 christos h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3176 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3177 1.1.1.6 christos goto return_h;
3178 1.1.1.3 christos }
3179 1.1.1.4 christos
3180 1.1.1.5 christos return_NULL:
3181 1.1.1.5 christos h = NULL;
3182 1.1.1.5 christos return_h:
3183 1.1.1.5 christos free (lname);
3184 1.1.1.5 christos return h;
3185 1.1.1.3 christos }
3186 1.1.1.3 christos
3187 1.1.1.9 christos static bool
3188 1.1.1.3 christos pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
3189 1.1.1.6 christos void *inf ATTRIBUTE_UNUSED)
3190 1.1.1.3 christos {
3191 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3192 1.1.1.3 christos undef_count++;
3193 1.1.1.9 christos return true;
3194 1.1.1.3 christos }
3195 1.1.1.2 christos
3196 1.1.1.9 christos static bool
3197 1.1.1.3 christos pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
3198 1.1.1.2 christos {
3199 1.1.1.3 christos if (h->type == bfd_link_hash_undefined)
3200 1.1.1.2 christos {
3201 1.1.1.3 christos char *at;
3202 1.1.1.3 christos
3203 1.1.1.3 christos udef_table[undef_count].key = xstrdup (h->root.string);
3204 1.1.1.3 christos at = strchr (udef_table[undef_count].key
3205 1.1.1.3 christos + (udef_table[undef_count].key[0] == '@'), '@');
3206 1.1.1.3 christos if (at)
3207 1.1.1.6 christos at[1] = 0;
3208 1.1.1.3 christos udef_table[undef_count].oname = h->root.string;
3209 1.1.1.3 christos undef_count++;
3210 1.1.1.2 christos }
3211 1.1.1.9 christos return true;
3212 1.1.1.2 christos }
3213 1.1.1.2 christos
3214 1.1.1.3 christos static void
3215 1.1.1.3 christos pe_create_undef_table (void)
3216 1.1.1.2 christos {
3217 1.1.1.3 christos undef_count = 0;
3218 1.1.1.3 christos
3219 1.1.1.3 christos /* count undefined symbols */
3220 1.1.1.3 christos
3221 1.1.1.3 christos bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
3222 1.1.1.3 christos
3223 1.1.1.3 christos /* create and fill the corresponding table */
3224 1.1.1.3 christos udef_table = xmalloc (undef_count * sizeof (struct key_value));
3225 1.1.1.3 christos
3226 1.1.1.3 christos undef_count = 0;
3227 1.1.1.3 christos bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
3228 1.1.1.3 christos
3229 1.1.1.3 christos /* sort items */
3230 1.1.1.3 christos qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
3231 1.1.1.2 christos }
3232 1.1.1.2 christos
3233 1.1 skrll static void
3234 1.1.1.2 christos add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
3235 1.1 skrll {
3236 1.1 skrll lang_input_statement_type *fake_file;
3237 1.1 skrll
3238 1.1 skrll fake_file = lang_add_input_file (name,
3239 1.1 skrll lang_input_file_is_fake_enum,
3240 1.1 skrll NULL);
3241 1.1 skrll fake_file->the_bfd = abfd;
3242 1.1 skrll ldlang_add_file (fake_file);
3243 1.1 skrll
3244 1.1.1.2 christos if (!bfd_link_add_symbols (abfd, linfo))
3245 1.1.1.7 christos einfo (_("%X%P: add symbols %s: %E\n"), name);
3246 1.1 skrll }
3247 1.1 skrll
3248 1.1 skrll void
3249 1.1.1.2 christos pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
3250 1.1 skrll {
3251 1.1 skrll pe_dll_id_target (bfd_get_target (output_bfd));
3252 1.1 skrll
3253 1.1.1.9 christos if (pe_def_file)
3254 1.1 skrll {
3255 1.1.1.9 christos int i, j;
3256 1.1.1.9 christos def_file_module *module;
3257 1.1.1.9 christos def_file_import *imp;
3258 1.1.1.3 christos
3259 1.1.1.9 christos imp = pe_def_file->imports;
3260 1.1 skrll
3261 1.1.1.9 christos pe_create_undef_table ();
3262 1.1 skrll
3263 1.1.1.9 christos for (module = pe_def_file->modules; module; module = module->next)
3264 1.1.1.9 christos {
3265 1.1.1.9 christos int do_this_dll = 0;
3266 1.1 skrll
3267 1.1.1.9 christos for (i = 0; i < pe_def_file->num_imports; i++)
3268 1.1.1.9 christos if (imp[i].module == module)
3269 1.1.1.9 christos break;
3270 1.1.1.9 christos if (i >= pe_def_file->num_imports)
3271 1.1.1.9 christos continue;
3272 1.1.1.3 christos
3273 1.1.1.9 christos dll_filename = module->name;
3274 1.1.1.9 christos dll_symname = xstrdup (module->name);
3275 1.1.1.9 christos for (j = 0; dll_symname[j]; j++)
3276 1.1.1.9 christos if (!ISALNUM (dll_symname[j]))
3277 1.1.1.9 christos dll_symname[j] = '_';
3278 1.1.1.9 christos
3279 1.1.1.9 christos for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3280 1.1.1.9 christos {
3281 1.1.1.9 christos def_file_export exp;
3282 1.1.1.9 christos struct bfd_link_hash_entry *blhe;
3283 1.1.1.9 christos int lead_at = (*imp[i].internal_name == '@');
3284 1.1.1.9 christos /* See if we need this import. */
3285 1.1.1.9 christos size_t len = strlen (imp[i].internal_name);
3286 1.1.1.9 christos char *name = xmalloc (len + 2 + 6);
3287 1.1.1.9 christos bool include_jmp_stub = false;
3288 1.1.1.9 christos bool is_cdecl = false;
3289 1.1.1.9 christos bool is_undef = false;
3290 1.1.1.9 christos
3291 1.1.1.9 christos if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3292 1.1.1.9 christos is_cdecl = true;
3293 1.1.1.3 christos
3294 1.1.1.3 christos if (lead_at)
3295 1.1.1.9 christos sprintf (name, "%s", imp[i].internal_name);
3296 1.1.1.3 christos else
3297 1.1.1.9 christos sprintf (name, "%s%s",U (""), imp[i].internal_name);
3298 1.1.1.3 christos
3299 1.1.1.3 christos blhe = bfd_link_hash_lookup (linfo->hash, name,
3300 1.1.1.9 christos false, false, false);
3301 1.1 skrll
3302 1.1.1.9 christos /* Include the jump stub for <sym> only if the <sym>
3303 1.1.1.9 christos is undefined. */
3304 1.1.1.9 christos if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3305 1.1.1.9 christos {
3306 1.1.1.9 christos if (lead_at)
3307 1.1.1.9 christos sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3308 1.1.1.9 christos else
3309 1.1.1.9 christos sprintf (name, "%s%s%s", "__imp_", U (""),
3310 1.1.1.9 christos imp[i].internal_name);
3311 1.1.1.9 christos
3312 1.1.1.9 christos blhe = bfd_link_hash_lookup (linfo->hash, name,
3313 1.1.1.9 christos false, false, false);
3314 1.1.1.9 christos if (blhe)
3315 1.1.1.9 christos is_undef = (blhe->type == bfd_link_hash_undefined);
3316 1.1.1.10 christos
3317 1.1.1.10 christos if (is_cdecl && (!blhe || !is_undef))
3318 1.1.1.10 christos {
3319 1.1.1.10 christos blhe = pe_find_cdecl_alias_match (linfo, name + 6);
3320 1.1.1.10 christos include_jmp_stub = true;
3321 1.1.1.10 christos if (blhe)
3322 1.1.1.10 christos is_undef = (blhe->type == bfd_link_hash_undefined);
3323 1.1.1.10 christos }
3324 1.1.1.9 christos }
3325 1.1.1.9 christos else
3326 1.1.1.9 christos {
3327 1.1.1.9 christos include_jmp_stub = true;
3328 1.1.1.9 christos is_undef = (blhe->type == bfd_link_hash_undefined);
3329 1.1.1.9 christos }
3330 1.1.1.3 christos
3331 1.1.1.9 christos free (name);
3332 1.1.1.9 christos
3333 1.1.1.9 christos if (is_undef)
3334 1.1.1.3 christos {
3335 1.1.1.9 christos bfd *one;
3336 1.1.1.9 christos /* We do. */
3337 1.1.1.9 christos if (!do_this_dll)
3338 1.1.1.9 christos {
3339 1.1.1.9 christos bfd *ar_head = make_head (output_bfd);
3340 1.1.1.9 christos add_bfd_to_link (ar_head, bfd_get_filename (ar_head),
3341 1.1.1.9 christos linfo);
3342 1.1.1.9 christos do_this_dll = 1;
3343 1.1.1.9 christos }
3344 1.1.1.9 christos exp.internal_name = imp[i].internal_name;
3345 1.1.1.9 christos exp.name = imp[i].name;
3346 1.1.1.9 christos exp.its_name = imp[i].its_name;
3347 1.1.1.9 christos exp.ordinal = imp[i].ordinal;
3348 1.1.1.9 christos exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3349 1.1.1.9 christos exp.flag_private = 0;
3350 1.1.1.9 christos exp.flag_constant = 0;
3351 1.1.1.9 christos exp.flag_data = imp[i].data;
3352 1.1.1.9 christos exp.flag_noname = exp.name ? 0 : 1;
3353 1.1.1.9 christos one = make_one (&exp, output_bfd,
3354 1.1.1.9 christos !exp.flag_data && include_jmp_stub);
3355 1.1.1.9 christos add_bfd_to_link (one, bfd_get_filename (one), linfo);
3356 1.1.1.3 christos }
3357 1.1.1.3 christos }
3358 1.1.1.9 christos if (do_this_dll)
3359 1.1.1.9 christos {
3360 1.1.1.9 christos bfd *ar_tail = make_tail (output_bfd);
3361 1.1.1.9 christos add_bfd_to_link (ar_tail, bfd_get_filename (ar_tail), linfo);
3362 1.1.1.9 christos }
3363 1.1.1.9 christos
3364 1.1.1.9 christos free (dll_symname);
3365 1.1.1.3 christos }
3366 1.1.1.9 christos
3367 1.1.1.9 christos while (undef_count)
3368 1.1 skrll {
3369 1.1.1.9 christos --undef_count;
3370 1.1.1.9 christos free (udef_table[undef_count].key);
3371 1.1 skrll }
3372 1.1.1.9 christos free (udef_table);
3373 1.1 skrll }
3374 1.1.1.3 christos
3375 1.1.1.9 christos if (pe_def_file && pe_def_file->name)
3376 1.1.1.9 christos dll_filename = pe_def_file->name;
3377 1.1.1.9 christos else
3378 1.1.1.3 christos {
3379 1.1.1.9 christos dll_filename = bfd_get_filename (output_bfd);
3380 1.1.1.9 christos for (const char *p = dll_filename; *p; p++)
3381 1.1.1.9 christos if (*p == '\\' || *p == '/' || *p == ':')
3382 1.1.1.9 christos dll_filename = p + 1;
3383 1.1.1.3 christos }
3384 1.1.1.9 christos dll_symname = xstrdup (dll_filename);
3385 1.1.1.9 christos for (int i = 0; dll_symname[i]; i++)
3386 1.1.1.9 christos if (!ISALNUM (dll_symname[i]))
3387 1.1.1.9 christos dll_symname[i] = '_';
3388 1.1 skrll }
3389 1.1 skrll
3390 1.1 skrll /* We were handed a *.DLL file. Parse it and turn it into a set of
3391 1.1 skrll IMPORTS directives in the def file. Return TRUE if the file was
3392 1.1 skrll handled, FALSE if not. */
3393 1.1 skrll
3394 1.1 skrll static unsigned int
3395 1.1.1.10 christos pe_get16 (bfd *abfd, int where, bool *fail)
3396 1.1 skrll {
3397 1.1 skrll unsigned char b[2];
3398 1.1 skrll
3399 1.1.1.10 christos if (bfd_seek (abfd, where, SEEK_SET) != 0
3400 1.1.1.10 christos || bfd_read (b, 2, abfd) != 2)
3401 1.1.1.10 christos {
3402 1.1.1.10 christos *fail = true;
3403 1.1.1.10 christos return 0;
3404 1.1.1.10 christos }
3405 1.1 skrll return b[0] + (b[1] << 8);
3406 1.1 skrll }
3407 1.1 skrll
3408 1.1 skrll static unsigned int
3409 1.1.1.10 christos pe_get32 (bfd *abfd, int where, bool *fail)
3410 1.1 skrll {
3411 1.1 skrll unsigned char b[4];
3412 1.1 skrll
3413 1.1.1.10 christos if (bfd_seek (abfd, where, SEEK_SET) != 0
3414 1.1.1.10 christos || bfd_read (b, 4, abfd) != 4)
3415 1.1.1.10 christos {
3416 1.1.1.10 christos *fail = true;
3417 1.1.1.10 christos return 0;
3418 1.1.1.10 christos }
3419 1.1.1.8 christos return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
3420 1.1 skrll }
3421 1.1 skrll
3422 1.1 skrll static unsigned int
3423 1.1 skrll pe_as32 (void *ptr)
3424 1.1 skrll {
3425 1.1 skrll unsigned char *b = ptr;
3426 1.1 skrll
3427 1.1.1.8 christos return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
3428 1.1 skrll }
3429 1.1 skrll
3430 1.1.1.9 christos bool
3431 1.1 skrll pe_implied_import_dll (const char *filename)
3432 1.1 skrll {
3433 1.1 skrll bfd *dll;
3434 1.1 skrll bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3435 1.1 skrll bfd_vma export_rva, export_size, nsections, secptr, expptr;
3436 1.1 skrll bfd_vma exp_funcbase;
3437 1.1 skrll unsigned char *expdata;
3438 1.1 skrll char *erva;
3439 1.1.1.2 christos bfd_vma name_rvas, nexp;
3440 1.1.1.2 christos const char *dllname;
3441 1.1 skrll /* Initialization with start > end guarantees that is_data
3442 1.1 skrll will not be set by mistake, and avoids compiler warning. */
3443 1.1 skrll bfd_vma data_start = 1;
3444 1.1 skrll bfd_vma data_end = 0;
3445 1.1 skrll bfd_vma rdata_start = 1;
3446 1.1 skrll bfd_vma rdata_end = 0;
3447 1.1 skrll bfd_vma bss_start = 1;
3448 1.1 skrll bfd_vma bss_end = 0;
3449 1.1.1.7 christos int from;
3450 1.1 skrll
3451 1.1 skrll /* No, I can't use bfd here. kernel32.dll puts its export table in
3452 1.1 skrll the middle of the .rdata section. */
3453 1.1 skrll dll = bfd_openr (filename, pe_details->target_name);
3454 1.1 skrll if (!dll)
3455 1.1 skrll {
3456 1.1.1.7 christos einfo (_("%X%P: open %s: %E\n"), filename);
3457 1.1.1.9 christos return false;
3458 1.1 skrll }
3459 1.1 skrll
3460 1.1.1.9 christos track_dependency_files (filename);
3461 1.1.1.9 christos
3462 1.1 skrll /* PEI dlls seem to be bfd_objects. */
3463 1.1 skrll if (!bfd_check_format (dll, bfd_object))
3464 1.1 skrll {
3465 1.1.1.10 christos notdll:
3466 1.1.1.7 christos einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename);
3467 1.1.1.9 christos return false;
3468 1.1 skrll }
3469 1.1 skrll
3470 1.1.1.2 christos /* Get pe_header, optional header and numbers of directory entries. */
3471 1.1.1.10 christos bool fail = false;
3472 1.1.1.10 christos pe_header_offset = pe_get32 (dll, 0x3c, &fail);
3473 1.1.1.10 christos if (fail)
3474 1.1.1.10 christos goto notdll;
3475 1.1 skrll opthdr_ofs = pe_header_offset + 4 + 20;
3476 1.1.1.10 christos #ifdef pe_use_plus
3477 1.1.1.10 christos /* NumberOfRvaAndSizes. */
3478 1.1.1.10 christos num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4, &fail);
3479 1.1 skrll #else
3480 1.1.1.10 christos num_entries = pe_get32 (dll, opthdr_ofs + 92, &fail);
3481 1.1 skrll #endif
3482 1.1.1.10 christos if (fail)
3483 1.1.1.10 christos goto notdll;
3484 1.1 skrll
3485 1.1.1.2 christos /* No import or export directory entry. */
3486 1.1.1.2 christos if (num_entries < 1)
3487 1.1.1.9 christos return false;
3488 1.1 skrll
3489 1.1.1.10 christos #ifdef pe_use_plus
3490 1.1.1.10 christos export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4, &fail);
3491 1.1.1.10 christos export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4, &fail);
3492 1.1 skrll #else
3493 1.1.1.10 christos export_rva = pe_get32 (dll, opthdr_ofs + 96, &fail);
3494 1.1.1.10 christos export_size = pe_get32 (dll, opthdr_ofs + 100, &fail);
3495 1.1 skrll #endif
3496 1.1.1.10 christos if (fail)
3497 1.1.1.10 christos goto notdll;
3498 1.1.1.2 christos
3499 1.1.1.2 christos /* No export table - nothing to export. */
3500 1.1.1.2 christos if (export_size == 0)
3501 1.1.1.9 christos return false;
3502 1.1.1.2 christos
3503 1.1.1.10 christos nsections = pe_get16 (dll, pe_header_offset + 4 + 2, &fail);
3504 1.1 skrll secptr = (pe_header_offset + 4 + 20 +
3505 1.1.1.10 christos pe_get16 (dll, pe_header_offset + 4 + 16, &fail));
3506 1.1.1.10 christos if (fail)
3507 1.1.1.10 christos goto notdll;
3508 1.1 skrll expptr = 0;
3509 1.1 skrll
3510 1.1 skrll /* Get the rva and size of the export section. */
3511 1.1 skrll for (i = 0; i < nsections; i++)
3512 1.1 skrll {
3513 1.1 skrll char sname[8];
3514 1.1 skrll bfd_vma secptr1 = secptr + 40 * i;
3515 1.1.1.10 christos bfd_vma vaddr = pe_get32 (dll, secptr1 + 12, &fail);
3516 1.1.1.10 christos bfd_vma vsize = pe_get32 (dll, secptr1 + 16, &fail);
3517 1.1.1.10 christos bfd_vma fptr = pe_get32 (dll, secptr1 + 20, &fail);
3518 1.1.1.10 christos
3519 1.1.1.10 christos if (fail
3520 1.1.1.10 christos || bfd_seek (dll, secptr1, SEEK_SET) != 0
3521 1.1.1.10 christos || bfd_read (sname, 8, dll) != 8)
3522 1.1.1.10 christos goto notdll;
3523 1.1 skrll
3524 1.1 skrll if (vaddr <= export_rva && vaddr + vsize > export_rva)
3525 1.1 skrll {
3526 1.1 skrll expptr = fptr + (export_rva - vaddr);
3527 1.1 skrll if (export_rva + export_size > vaddr + vsize)
3528 1.1 skrll export_size = vsize - (export_rva - vaddr);
3529 1.1 skrll break;
3530 1.1 skrll }
3531 1.1 skrll }
3532 1.1 skrll
3533 1.1 skrll /* Scan sections and store the base and size of the
3534 1.1 skrll data and bss segments in data/base_start/end. */
3535 1.1 skrll for (i = 0; i < nsections; i++)
3536 1.1 skrll {
3537 1.1 skrll bfd_vma secptr1 = secptr + 40 * i;
3538 1.1.1.10 christos bfd_vma vsize = pe_get32 (dll, secptr1 + 8, &fail);
3539 1.1.1.10 christos bfd_vma vaddr = pe_get32 (dll, secptr1 + 12, &fail);
3540 1.1.1.10 christos bfd_vma flags = pe_get32 (dll, secptr1 + 36, &fail);
3541 1.1 skrll char sec_name[9];
3542 1.1 skrll
3543 1.1 skrll sec_name[8] = '\0';
3544 1.1.1.10 christos if (fail
3545 1.1.1.10 christos || bfd_seek (dll, secptr1 + 0, SEEK_SET) != 0
3546 1.1.1.10 christos || bfd_read (sec_name, 8, dll) != 8)
3547 1.1.1.10 christos goto notdll;
3548 1.1 skrll
3549 1.1 skrll if (strcmp(sec_name,".data") == 0)
3550 1.1 skrll {
3551 1.1 skrll data_start = vaddr;
3552 1.1 skrll data_end = vaddr + vsize;
3553 1.1 skrll
3554 1.1 skrll if (pe_dll_extra_pe_debug)
3555 1.1 skrll printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3556 1.1.1.10 christos __func__, sec_name, (unsigned long) vaddr,
3557 1.1 skrll (unsigned long) (vaddr + vsize), (unsigned long) flags);
3558 1.1 skrll }
3559 1.1 skrll else if (strcmp(sec_name,".rdata") == 0)
3560 1.1 skrll {
3561 1.1 skrll rdata_start = vaddr;
3562 1.1 skrll rdata_end = vaddr + vsize;
3563 1.1 skrll
3564 1.1 skrll if (pe_dll_extra_pe_debug)
3565 1.1 skrll printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3566 1.1.1.10 christos __func__, sec_name, (unsigned long) vaddr,
3567 1.1 skrll (unsigned long) (vaddr + vsize), (unsigned long) flags);
3568 1.1 skrll }
3569 1.1 skrll else if (strcmp (sec_name,".bss") == 0)
3570 1.1 skrll {
3571 1.1 skrll bss_start = vaddr;
3572 1.1 skrll bss_end = vaddr + vsize;
3573 1.1 skrll
3574 1.1 skrll if (pe_dll_extra_pe_debug)
3575 1.1 skrll printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3576 1.1.1.10 christos __func__, sec_name, (unsigned long) vaddr,
3577 1.1 skrll (unsigned long) (vaddr + vsize), (unsigned long) flags);
3578 1.1 skrll }
3579 1.1 skrll }
3580 1.1 skrll
3581 1.1 skrll expdata = xmalloc (export_size);
3582 1.1.1.10 christos if (bfd_seek (dll, expptr, SEEK_SET) != 0
3583 1.1.1.10 christos || bfd_read (expdata, export_size, dll) != export_size)
3584 1.1.1.10 christos goto notdll;
3585 1.1 skrll erva = (char *) expdata - export_rva;
3586 1.1 skrll
3587 1.1 skrll if (pe_def_file == 0)
3588 1.1 skrll pe_def_file = def_file_empty ();
3589 1.1 skrll
3590 1.1 skrll nexp = pe_as32 (expdata + 24);
3591 1.1 skrll name_rvas = pe_as32 (expdata + 32);
3592 1.1 skrll exp_funcbase = pe_as32 (expdata + 28);
3593 1.1 skrll
3594 1.1 skrll /* Use internal dll name instead of filename
3595 1.1 skrll to enable symbolic dll linking. */
3596 1.1.1.2 christos dllname = erva + pe_as32 (expdata + 12);
3597 1.1 skrll
3598 1.1 skrll /* Check to see if the dll has already been added to
3599 1.1 skrll the definition list and if so return without error.
3600 1.1 skrll This avoids multiple symbol definitions. */
3601 1.1.1.2 christos if (def_get_module (pe_def_file, dllname))
3602 1.1 skrll {
3603 1.1 skrll if (pe_dll_extra_pe_debug)
3604 1.1.1.2 christos printf ("%s is already loaded\n", dllname);
3605 1.1.1.9 christos return true;
3606 1.1 skrll }
3607 1.1 skrll
3608 1.1.1.7 christos /* This is an optimized version of the insertion loop, which avoids lots of
3609 1.1.1.7 christos calls to realloc and memmove from def_file_add_import. */
3610 1.1.1.7 christos if ((from = def_file_add_import_from (pe_def_file, nexp,
3611 1.1.1.7 christos erva + pe_as32 (erva + name_rvas),
3612 1.1.1.7 christos dllname, 0, NULL, NULL)) >= 0)
3613 1.1.1.7 christos {
3614 1.1.1.7 christos for (i = 0; i < nexp; i++)
3615 1.1.1.7 christos {
3616 1.1.1.7 christos /* Pointer to the names vector. */
3617 1.1.1.7 christos bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3618 1.1.1.7 christos def_file_import *imp;
3619 1.1.1.7 christos /* Pointer to the function address vector. */
3620 1.1.1.7 christos bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3621 1.1.1.7 christos /* is_data is true if the address is in the data, rdata or bss
3622 1.1.1.7 christos segment. */
3623 1.1.1.7 christos const int is_data =
3624 1.1.1.7 christos (func_rva >= data_start && func_rva < data_end)
3625 1.1.1.7 christos || (func_rva >= rdata_start && func_rva < rdata_end)
3626 1.1.1.7 christos || (func_rva >= bss_start && func_rva < bss_end);
3627 1.1.1.7 christos
3628 1.1.1.7 christos imp = def_file_add_import_at (pe_def_file, from + i, erva + name_rva,
3629 1.1.1.7 christos dllname, i, NULL, NULL);
3630 1.1.1.7 christos /* Mark symbol type. */
3631 1.1.1.7 christos imp->data = is_data;
3632 1.1.1.7 christos
3633 1.1.1.7 christos if (pe_dll_extra_pe_debug)
3634 1.1.1.7 christos printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3635 1.1.1.10 christos __func__, dllname, erva + name_rva,
3636 1.1.1.7 christos (unsigned long) func_rva, is_data ? "(data)" : "");
3637 1.1.1.7 christos }
3638 1.1.1.7 christos
3639 1.1.1.9 christos return true;
3640 1.1.1.7 christos }
3641 1.1.1.7 christos
3642 1.1 skrll /* Iterate through the list of symbols. */
3643 1.1 skrll for (i = 0; i < nexp; i++)
3644 1.1 skrll {
3645 1.1 skrll /* Pointer to the names vector. */
3646 1.1 skrll bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3647 1.1 skrll def_file_import *imp;
3648 1.1 skrll /* Pointer to the function address vector. */
3649 1.1 skrll bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3650 1.1 skrll int is_data = 0;
3651 1.1 skrll
3652 1.1 skrll /* Skip unwanted symbols, which are
3653 1.1 skrll exported in buggy auto-import releases. */
3654 1.1.1.9 christos if (! startswith (erva + name_rva, "__nm_"))
3655 1.1.1.6 christos {
3656 1.1.1.10 christos bool is_dup = false;
3657 1.1.1.6 christos /* is_data is true if the address is in the data, rdata or bss
3658 1.1 skrll segment. */
3659 1.1.1.6 christos is_data =
3660 1.1 skrll (func_rva >= data_start && func_rva < data_end)
3661 1.1 skrll || (func_rva >= rdata_start && func_rva < rdata_end)
3662 1.1 skrll || (func_rva >= bss_start && func_rva < bss_end);
3663 1.1 skrll
3664 1.1 skrll imp = def_file_add_import (pe_def_file, erva + name_rva,
3665 1.1.1.3 christos dllname, i, NULL, NULL, &is_dup);
3666 1.1.1.6 christos /* Mark symbol type. */
3667 1.1.1.6 christos if (!is_dup)
3668 1.1.1.6 christos imp->data = is_data;
3669 1.1 skrll
3670 1.1.1.6 christos if (pe_dll_extra_pe_debug)
3671 1.1 skrll printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3672 1.1.1.10 christos __func__, dllname, erva + name_rva,
3673 1.1 skrll (unsigned long) func_rva, is_data ? "(data)" : "");
3674 1.1.1.6 christos }
3675 1.1 skrll }
3676 1.1 skrll
3677 1.1.1.9 christos return true;
3678 1.1 skrll }
3679 1.1 skrll
3680 1.1.1.2 christos void
3681 1.1.1.2 christos pe_output_file_set_long_section_names (bfd *abfd)
3682 1.1.1.2 christos {
3683 1.1.1.2 christos if (pe_use_coff_long_section_names < 0)
3684 1.1.1.2 christos return;
3685 1.1.1.2 christos if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3686 1.1.1.7 christos einfo (_("%X%P: error: can't use long section names on this arch\n"));
3687 1.1.1.2 christos }
3688 1.1.1.2 christos
3689 1.1 skrll /* These are the main functions, called from the emulation. The first
3690 1.1 skrll is called after the bfds are read, so we can guess at how much space
3691 1.1 skrll we need. The second is called after everything is placed, so we
3692 1.1 skrll can put the right values in place. */
3693 1.1 skrll
3694 1.1 skrll void
3695 1.1 skrll pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3696 1.1 skrll {
3697 1.1 skrll pe_dll_id_target (bfd_get_target (abfd));
3698 1.1.1.2 christos pe_output_file_set_long_section_names (abfd);
3699 1.1.1.2 christos process_def_file_and_drectve (abfd, info);
3700 1.1 skrll
3701 1.1.1.10 christos if (pe_def_file->num_exports == 0
3702 1.1.1.10 christos && (!bfd_link_pic (info) || pe_dll_exclude_all_symbols))
3703 1.1.1.8 christos {
3704 1.1.1.8 christos if (pe_dll_enable_reloc_section)
3705 1.1.1.8 christos {
3706 1.1.1.10 christos build_filler_bfd (false /* edata not needed. */);
3707 1.1.1.8 christos pe_output_file_set_long_section_names (filler_bfd);
3708 1.1.1.8 christos }
3709 1.1.1.8 christos return;
3710 1.1.1.8 christos }
3711 1.1 skrll
3712 1.1.1.9 christos generate_edata ();
3713 1.1.1.10 christos build_filler_bfd (true /* edata is needed. */);
3714 1.1.1.2 christos pe_output_file_set_long_section_names (filler_bfd);
3715 1.1 skrll }
3716 1.1 skrll
3717 1.1 skrll void
3718 1.1 skrll pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3719 1.1 skrll {
3720 1.1 skrll pe_dll_id_target (bfd_get_target (abfd));
3721 1.1.1.2 christos pe_output_file_set_long_section_names (abfd);
3722 1.1.1.12 christos if (pe_dll_enable_reloc_section)
3723 1.1.1.12 christos {
3724 1.1.1.12 christos build_filler_bfd (false);
3725 1.1.1.12 christos pe_output_file_set_long_section_names (filler_bfd);
3726 1.1.1.12 christos }
3727 1.1 skrll }
3728 1.1 skrll
3729 1.1 skrll void
3730 1.1 skrll pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3731 1.1 skrll {
3732 1.1.1.8 christos pe_exe_fill_sections (abfd, info);
3733 1.1 skrll
3734 1.1.1.8 christos if (edata_s)
3735 1.1 skrll {
3736 1.1.1.8 christos fill_edata (abfd, info);
3737 1.1.1.8 christos edata_s->contents = edata_d;
3738 1.1 skrll }
3739 1.1 skrll
3740 1.1.1.4 christos if (bfd_link_dll (info))
3741 1.1 skrll pe_data (abfd)->dll = 1;
3742 1.1 skrll }
3743 1.1 skrll
3744 1.1 skrll void
3745 1.1 skrll pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3746 1.1 skrll {
3747 1.1 skrll pe_dll_id_target (bfd_get_target (abfd));
3748 1.1.1.2 christos pe_output_file_set_long_section_names (abfd);
3749 1.1 skrll image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3750 1.1 skrll
3751 1.1 skrll generate_reloc (abfd, info);
3752 1.1.1.10 christos
3753 1.1 skrll if (reloc_sz > 0)
3754 1.1 skrll {
3755 1.1.1.8 christos bfd_set_section_size (reloc_s, reloc_sz);
3756 1.1 skrll
3757 1.1 skrll /* Resize the sections. */
3758 1.1 skrll lang_reset_memory_regions ();
3759 1.1.1.9 christos lang_size_sections (NULL, true);
3760 1.1 skrll
3761 1.1 skrll /* Redo special stuff. */
3762 1.1 skrll ldemul_after_allocation ();
3763 1.1 skrll
3764 1.1 skrll /* Do the assignments again. */
3765 1.1.1.2 christos lang_do_assignments (lang_final_phase_enum);
3766 1.1.1.10 christos
3767 1.1.1.10 christos reloc_s->contents = reloc_d;
3768 1.1.1.10 christos }
3769 1.1.1.10 christos else if (reloc_s)
3770 1.1.1.10 christos {
3771 1.1.1.10 christos /* Do not emit an empty reloc section. */
3772 1.1.1.10 christos bfd_set_section_flags (reloc_s, SEC_IN_MEMORY | SEC_EXCLUDE);
3773 1.1.1.10 christos reloc_s->output_section = bfd_abs_section_ptr;
3774 1.1 skrll }
3775 1.1 skrll }
3776 1.1 skrll
3777 1.1.1.9 christos bool
3778 1.1 skrll pe_bfd_is_dll (bfd *abfd)
3779 1.1 skrll {
3780 1.1 skrll return (bfd_get_format (abfd) == bfd_object
3781 1.1.1.6 christos && obj_pe (abfd)
3782 1.1.1.6 christos && pe_data (abfd)->dll);
3783 1.1 skrll }
3784