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