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