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