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