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