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