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