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