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