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