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