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