]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/pe-dll.c
bfd/
[thirdparty/binutils-gdb.git] / ld / pe-dll.c
CommitLineData
252b5132 1/* Routines to help build PEI-format DLLs (Win32 etc)
54727719 2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4d8907ac 3 Free Software Foundation, Inc.
252b5132
RH
4 Written by DJ Delorie <dj@cygnus.com>
5
6 This file is part of GLD, the Gnu Linker.
7
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
75be928b
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
252b5132 22
252b5132 23#include "sysdep.h"
3db64b00 24#include "bfd.h"
252b5132
RH
25#include "bfdlink.h"
26#include "libiberty.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"
799133e8 43#include "pe-dll.h"
99ad8390
NC
44
45#ifdef pe_use_x86_64
46
47#define PE_IDATA4_SIZE 8
48#define PE_IDATA5_SIZE 8
49#include "pep-dll.h"
50#undef AOUTSZ
51#define AOUTSZ PEPAOUTSZ
52#define PEAOUTHDR PEPAOUTHDR
53
54#else
55
1069dd8d 56#include "pe-dll.h"
252b5132 57
99ad8390
NC
58#endif
59
60#ifndef PE_IDATA4_SIZE
61#define PE_IDATA4_SIZE 4
62#endif
63
64#ifndef PE_IDATA5_SIZE
65#define PE_IDATA5_SIZE 4
66#endif
67
775cabad
NC
68/* This file turns a regular Windows PE image into a DLL. Because of
69 the complexity of this operation, it has been broken down into a
70 number of separate modules which are all called by the main function
71 at the end of this file. This function is not re-entrant and is
72 normally only called once, so static variables are used to reduce
73 the number of parameters and return values required.
b7a26f91 74
99ad8390 75 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
775cabad
NC
76
77/* Auto-import feature by Paul Sokolovsky
78
79 Quick facts:
80
81 1. With this feature on, DLL clients can import variables from DLL
82 without any concern from their side (for example, without any source
83 code modifications).
84
85 2. This is done completely in bounds of the PE specification (to be fair,
396a2467 86 there's a place where it pokes nose out of, but in practice it works).
775cabad
NC
87 So, resulting module can be used with any other PE compiler/linker.
88
89 3. Auto-import is fully compatible with standard import method and they
90 can be mixed together.
91
92 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
93 reference to it; load time: negligible; virtual/physical memory: should be
94 less than effect of DLL relocation, and I sincerely hope it doesn't affect
95 DLL sharability (too much).
96
97 Idea
98
99 The obvious and only way to get rid of dllimport insanity is to make client
100 access variable directly in the DLL, bypassing extra dereference. I.e.,
396a2467 101 whenever client contains something like
775cabad
NC
102
103 mov dll_var,%eax,
104
105 address of dll_var in the command should be relocated to point into loaded
106 DLL. The aim is to make OS loader do so, and than make ld help with that.
107 Import section of PE made following way: there's a vector of structures
108 each describing imports from particular DLL. Each such structure points
396a2467 109 to two other parallel vectors: one holding imported names, and one which
775cabad
NC
110 will hold address of corresponding imported name. So, the solution is
111 de-vectorize these structures, making import locations be sparse and
112 pointing directly into code. Before continuing, it is worth a note that,
113 while authors strives to make PE act ELF-like, there're some other people
114 make ELF act PE-like: elfvector, ;-) .
115
116 Implementation
117
118 For each reference of data symbol to be imported from DLL (to set of which
119 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
120 import fixup entry is generated. That entry is of type
53baae48 121 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
775cabad
NC
122 fixup entry contains pointer to symbol's address within .text section
123 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
124 (so, DLL name is referenced by multiple entries), and pointer to symbol
125 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
126 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
00479ba8 127 containing imported name. Here comes that "on the edge" problem mentioned
775cabad
NC
128 above: PE specification rambles that name vector (OriginalFirstThunk)
129 should run in parallel with addresses vector (FirstThunk), i.e. that they
130 should have same number of elements and terminated with zero. We violate
396a2467 131 this, since FirstThunk points directly into machine code. But in practice,
775cabad
NC
132 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
133 puts addresses to FirstThunk, not something else. It once again should be
134 noted that dll and symbol name structures are reused across fixup entries
135 and should be there anyway to support standard import stuff, so sustained
136 overhead is 20 bytes per reference. Other question is whether having several
137 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
138 done even by native compiler/linker (libth32's functions are in fact reside
139 in windows9x kernel32.dll, so if you use it, you have two
140 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
141 referencing the same PE structures several times is valid. The answer is why
396a2467 142 not, prohibiting that (detecting violation) would require more work on
775cabad
NC
143 behalf of loader than not doing it.
144
99ad8390 145 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
b044cda1 146
1579bae1 147static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
b044cda1 148
775cabad 149/* For emultempl/pe.em. */
252b5132 150
775cabad 151def_file * pe_def_file = 0;
252b5132
RH
152int pe_dll_export_everything = 0;
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;
252b5132 159
775cabad 160/* Static variables and types. */
252b5132
RH
161
162static bfd_vma image_base;
252b5132 163static bfd *filler_bfd;
198beae2 164static struct bfd_section *edata_s, *reloc_s;
252b5132 165static unsigned char *edata_d, *reloc_d;
1069dd8d 166static size_t edata_sz, reloc_sz;
2fa9fc65 167static int runtime_pseudo_relocs_created = 0;
252b5132 168
775cabad 169typedef struct
5b8273bf 170{
e916811a 171 const char *name;
5b8273bf
NC
172 int len;
173}
174autofilter_entry_type;
775cabad
NC
175
176typedef struct
5b8273bf 177{
e916811a
CF
178 const char *target_name;
179 const char *object_target;
5b8273bf
NC
180 unsigned int imagebase_reloc;
181 int pe_arch;
182 int bfd_arch;
183 bfd_boolean underscored;
e916811a 184 const autofilter_entry_type* autofilter_symbollist;
5b8273bf
NC
185}
186pe_details_type;
187
e916811a 188static const autofilter_entry_type autofilter_symbollist_generic[] =
5b8273bf 189{
0112cd26 190 { STRING_COMMA_LEN (".text") },
5b8273bf 191 /* Entry point symbols. */
0112cd26
NC
192 { STRING_COMMA_LEN ("DllMain") },
193 { STRING_COMMA_LEN ("DllMainCRTStartup") },
194 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
5b8273bf 195 /* Runtime pseudo-reloc. */
0112cd26
NC
196 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
197 { STRING_COMMA_LEN ("do_pseudo_reloc") },
198 { STRING_COMMA_LEN (NULL) }
5b8273bf
NC
199};
200
e916811a 201static const autofilter_entry_type autofilter_symbollist_i386[] =
5b8273bf 202{
0112cd26 203 { STRING_COMMA_LEN (".text") },
5b8273bf 204 /* Entry point symbols, and entry hooks. */
0112cd26
NC
205 { STRING_COMMA_LEN ("cygwin_crt0") },
206 { STRING_COMMA_LEN ("DllMain@12") },
207 { STRING_COMMA_LEN ("DllEntryPoint@0") },
208 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
209 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
210 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
211 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
212 { STRING_COMMA_LEN ("cygwin_attach_dll") },
213 { STRING_COMMA_LEN ("cygwin_premain0") },
214 { STRING_COMMA_LEN ("cygwin_premain1") },
215 { STRING_COMMA_LEN ("cygwin_premain2") },
216 { STRING_COMMA_LEN ("cygwin_premain3") },
5b8273bf 217 /* Runtime pseudo-reloc. */
0112cd26
NC
218 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
219 { STRING_COMMA_LEN ("do_pseudo_reloc") },
5b8273bf 220 /* Global vars that should not be exported. */
0112cd26
NC
221 { STRING_COMMA_LEN ("impure_ptr") },
222 { STRING_COMMA_LEN ("_impure_ptr") },
223 { STRING_COMMA_LEN ("_fmode") },
224 { STRING_COMMA_LEN ("environ") },
225 { STRING_COMMA_LEN (NULL) }
5b8273bf 226};
b044cda1 227
5b8273bf
NC
228#define PE_ARCH_i386 1
229#define PE_ARCH_sh 2
230#define PE_ARCH_mips 3
231#define PE_ARCH_arm 4
775cabad 232#define PE_ARCH_arm_epoc 5
7148cc28 233#define PE_ARCH_arm_wince 6
c6c37250 234
e916811a 235static const pe_details_type pe_detail_list[] =
775cabad 236{
c6c37250 237 {
99ad8390
NC
238#ifdef pe_use_x86_64
239 "pei-x86-64",
240 "pe-x86-64",
241 3 /* R_IMAGEBASE */,
242#else
c6c37250
DD
243 "pei-i386",
244 "pe-i386",
245 7 /* R_IMAGEBASE */,
99ad8390 246#endif
c6c37250
DD
247 PE_ARCH_i386,
248 bfd_arch_i386,
5b8273bf
NC
249 TRUE,
250 autofilter_symbollist_i386
c6c37250 251 },
344a211f
NC
252 {
253 "pei-shl",
254 "pe-shl",
255 16 /* R_SH_IMAGEBASE */,
256 PE_ARCH_sh,
257 bfd_arch_sh,
5b8273bf
NC
258 TRUE,
259 autofilter_symbollist_generic
344a211f
NC
260 },
261 {
262 "pei-mips",
263 "pe-mips",
264 34 /* MIPS_R_RVA */,
265 PE_ARCH_mips,
266 bfd_arch_mips,
5b8273bf
NC
267 FALSE,
268 autofilter_symbollist_generic
344a211f
NC
269 },
270 {
271 "pei-arm-little",
272 "pe-arm-little",
273 11 /* ARM_RVA32 */,
274 PE_ARCH_arm,
275 bfd_arch_arm,
5b8273bf
NC
276 TRUE,
277 autofilter_symbollist_generic
344a211f 278 },
775cabad
NC
279 {
280 "epoc-pei-arm-little",
281 "epoc-pe-arm-little",
282 11 /* ARM_RVA32 */,
283 PE_ARCH_arm_epoc,
284 bfd_arch_arm,
5b8273bf
NC
285 FALSE,
286 autofilter_symbollist_generic
775cabad 287 },
7148cc28
NC
288 {
289 "pei-arm-wince-little",
290 "pe-arm-wince-little",
291 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
292 PE_ARCH_arm_wince,
293 bfd_arch_arm,
294 FALSE,
295 autofilter_symbollist_generic
296 },
5b8273bf 297 { NULL, NULL, 0, 0, 0, FALSE, NULL }
c6c37250
DD
298};
299
e916811a 300static const pe_details_type *pe_details;
c6c37250 301
775cabad 302/* Do not specify library suffix explicitly, to allow for dllized versions. */
e916811a 303static const autofilter_entry_type autofilter_liblist[] =
775cabad 304{
0112cd26
NC
305 { STRING_COMMA_LEN ("libcegcc") },
306 { STRING_COMMA_LEN ("libcygwin") },
307 { STRING_COMMA_LEN ("libgcc") },
308 { STRING_COMMA_LEN ("libstdc++") },
309 { STRING_COMMA_LEN ("libmingw32") },
310 { STRING_COMMA_LEN ("libmingwex") },
311 { STRING_COMMA_LEN ("libg2c") },
312 { STRING_COMMA_LEN ("libsupc++") },
313 { STRING_COMMA_LEN ("libobjc") },
314 { STRING_COMMA_LEN ("libgcj") },
315 { STRING_COMMA_LEN (NULL) }
b044cda1 316};
775cabad 317
e916811a 318static const autofilter_entry_type autofilter_objlist[] =
775cabad 319{
0112cd26
NC
320 { STRING_COMMA_LEN ("crt0.o") },
321 { STRING_COMMA_LEN ("crt1.o") },
322 { STRING_COMMA_LEN ("crt2.o") },
323 { STRING_COMMA_LEN ("dllcrt1.o") },
324 { STRING_COMMA_LEN ("dllcrt2.o") },
325 { STRING_COMMA_LEN ("gcrt0.o") },
326 { STRING_COMMA_LEN ("gcrt1.o") },
327 { STRING_COMMA_LEN ("gcrt2.o") },
328 { STRING_COMMA_LEN ("crtbegin.o") },
329 { STRING_COMMA_LEN ("crtend.o") },
330 { STRING_COMMA_LEN (NULL) }
b044cda1 331};
775cabad 332
e916811a 333static const autofilter_entry_type autofilter_symbolprefixlist[] =
775cabad 334{
00479ba8
NC
335 /* _imp_ is treated specially, as it is always underscored. */
336 /* { STRING_COMMA_LEN ("_imp_") }, */
337 /* Don't export some c++ symbols. */
0112cd26 338 { STRING_COMMA_LEN ("__rtti_") },
00479ba8 339 { STRING_COMMA_LEN ("__builtin_") },
39cebe23 340 /* Don't re-export auto-imported symbols. */
0112cd26 341 { STRING_COMMA_LEN ("_nm_") },
775cabad 342 /* Don't export symbols specifying internal DLL layout. */
0112cd26
NC
343 { STRING_COMMA_LEN ("_head_") },
344 { STRING_COMMA_LEN (NULL) }
b044cda1 345};
775cabad 346
e916811a 347static const autofilter_entry_type autofilter_symbolsuffixlist[] =
775cabad 348{
0112cd26
NC
349 { STRING_COMMA_LEN ("_iname") },
350 { STRING_COMMA_LEN (NULL) }
b044cda1
CW
351};
352
c6c37250
DD
353#define U(str) (pe_details->underscored ? "_" str : str)
354
355void
1579bae1 356pe_dll_id_target (const char *target)
c6c37250
DD
357{
358 int i;
775cabad 359
d643799d 360 for (i = 0; pe_detail_list[i].target_name; i++)
9d68bc82
DD
361 if (strcmp (pe_detail_list[i].target_name, target) == 0
362 || strcmp (pe_detail_list[i].object_target, target) == 0)
c6c37250 363 {
d643799d 364 pe_details = pe_detail_list + i;
c6c37250
DD
365 return;
366 }
367 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
368 exit (1);
369}
370
b7a26f91 371/* Helper functions for qsort. Relocs must be sorted so that we can write
775cabad 372 them out by pages. */
252b5132 373
775cabad
NC
374typedef struct
375 {
376 bfd_vma vma;
377 char type;
378 short extra;
379 }
380reloc_data_type;
c6c37250 381
252b5132 382static int
1579bae1 383reloc_sort (const void *va, const void *vb)
252b5132 384{
1579bae1
AM
385 bfd_vma a = ((const reloc_data_type *) va)->vma;
386 bfd_vma b = ((const reloc_data_type *) vb)->vma;
775cabad 387
c6c37250 388 return (a > b) ? 1 : ((a < b) ? -1 : 0);
252b5132
RH
389}
390
391static int
1579bae1 392pe_export_sort (const void *va, const void *vb)
252b5132 393{
1579bae1
AM
394 const def_file_export *a = va;
395 const def_file_export *b = vb;
775cabad 396
252b5132
RH
397 return strcmp (a->name, b->name);
398}
399
775cabad 400/* Read and process the .DEF file. */
252b5132
RH
401
402/* These correspond to the entries in pe_def_file->exports[]. I use
403 exported_symbol_sections[i] to tag whether or not the symbol was
5cc18311 404 defined, since we can't export symbols we don't have. */
252b5132
RH
405
406static bfd_vma *exported_symbol_offsets;
198beae2 407static struct bfd_section **exported_symbol_sections;
252b5132
RH
408static int export_table_size;
409static int count_exported;
410static int count_exported_byname;
411static int count_with_ordinals;
412static const char *dll_name;
413static int min_ordinal, max_ordinal;
414static int *exported_symbols;
415
775cabad
NC
416typedef struct exclude_list_struct
417 {
418 char *string;
419 struct exclude_list_struct *next;
658957db 420 int type;
775cabad
NC
421 }
422exclude_list_struct;
86b1cc60 423
252b5132
RH
424static struct exclude_list_struct *excludes = 0;
425
426void
1579bae1 427pe_dll_add_excludes (const char *new_excludes, const int type)
252b5132
RH
428{
429 char *local_copy;
430 char *exclude_string;
431
432 local_copy = xstrdup (new_excludes);
433
434 exclude_string = strtok (local_copy, ",:");
435 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
436 {
437 struct exclude_list_struct *new_exclude;
438
1579bae1
AM
439 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
440 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
252b5132 441 strcpy (new_exclude->string, exclude_string);
70b0be79 442 new_exclude->type = type;
252b5132
RH
443 new_exclude->next = excludes;
444 excludes = new_exclude;
445 }
446
447 free (local_copy);
448}
449
00479ba8
NC
450static bfd_boolean
451is_import (const char* n)
452{
e916811a 453 return (CONST_STRNEQ (n, "__imp_"));
00479ba8 454}
70b0be79 455
775cabad
NC
456/* abfd is a bfd containing n (or NULL)
457 It can be used for contextual checks. */
458
252b5132 459static int
1579bae1 460auto_export (bfd *abfd, def_file *d, const char *n)
252b5132
RH
461{
462 int i;
463 struct exclude_list_struct *ex;
e916811a 464 const autofilter_entry_type *afptr;
70b0be79
CF
465 const char * libname = 0;
466 if (abfd && abfd->my_archive)
467 libname = lbasename (abfd->my_archive->filename);
b044cda1 468
252b5132
RH
469 for (i = 0; i < d->num_exports; i++)
470 if (strcmp (d->exports[i].name, n) == 0)
471 return 0;
775cabad 472
252b5132
RH
473 if (pe_dll_do_default_excludes)
474 {
663dd378 475 const char * p;
775cabad
NC
476 int len;
477
b044cda1 478 if (pe_dll_extra_pe_debug)
775cabad
NC
479 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
480 n, abfd, abfd->my_archive);
b044cda1
CW
481
482 /* First of all, make context checks:
1579bae1 483 Don't export anything from standard libs. */
658957db 484 if (libname)
b044cda1
CW
485 {
486 afptr = autofilter_liblist;
775cabad 487
b044cda1
CW
488 while (afptr->name)
489 {
70b0be79 490 if (strncmp (libname, afptr->name, afptr->len) == 0 )
b044cda1
CW
491 return 0;
492 afptr++;
493 }
494 }
495
775cabad 496 /* Next, exclude symbols from certain startup objects. */
775cabad 497
59d28a94 498 if (abfd && (p = lbasename (abfd->filename)))
663dd378 499 {
b7a26f91
KH
500 afptr = autofilter_objlist;
501 while (afptr->name)
59d28a94 502 {
b7a26f91
KH
503 if (strcmp (p, afptr->name) == 0)
504 return 0;
59d28a94 505 afptr++;
663dd378 506 }
775cabad 507 }
b044cda1
CW
508
509 /* Don't try to blindly exclude all symbols
510 that begin with '__'; this was tried and
5b8273bf
NC
511 it is too restrictive. Instead we have
512 a target specific list to use: */
513 afptr = pe_details->autofilter_symbollist;
99ad8390 514
b044cda1
CW
515 while (afptr->name)
516 {
517 if (strcmp (n, afptr->name) == 0)
518 return 0;
775cabad 519
b7a26f91 520 afptr++;
b044cda1
CW
521 }
522
775cabad 523 /* Next, exclude symbols starting with ... */
b044cda1
CW
524 afptr = autofilter_symbolprefixlist;
525 while (afptr->name)
526 {
527 if (strncmp (n, afptr->name, afptr->len) == 0)
528 return 0;
775cabad 529
b7a26f91 530 afptr++;
b044cda1
CW
531 }
532
775cabad
NC
533 /* Finally, exclude symbols ending with ... */
534 len = strlen (n);
535 afptr = autofilter_symbolsuffixlist;
536 while (afptr->name)
537 {
b7a26f91 538 if ((len >= afptr->len)
775cabad 539 /* Add 1 to insure match with trailing '\0'. */
b7a26f91
KH
540 && strncmp (n + len - afptr->len, afptr->name,
541 afptr->len + 1) == 0)
775cabad
NC
542 return 0;
543
b7a26f91 544 afptr++;
775cabad 545 }
252b5132 546 }
775cabad 547
252b5132 548 for (ex = excludes; ex; ex = ex->next)
70b0be79
CF
549 {
550 if (ex->type == 1) /* exclude-libs */
551 {
552 if (libname
553 && ((strcmp (libname, ex->string) == 0)
554 || (strcasecmp ("ALL", ex->string) == 0)))
555 return 0;
556 }
557 else if (strcmp (n, ex->string) == 0)
658957db 558 return 0;
70b0be79 559 }
775cabad 560
252b5132
RH
561 return 1;
562}
563
564static void
1579bae1 565process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
252b5132
RH
566{
567 int i, j;
568 struct bfd_link_hash_entry *blhe;
569 bfd *b;
198beae2 570 struct bfd_section *s;
d643799d 571 def_file_export *e = 0;
252b5132
RH
572
573 if (!pe_def_file)
574 pe_def_file = def_file_empty ();
575
576 /* First, run around to all the objects looking for the .drectve
86b1cc60 577 sections, and push those into the def file too. */
252b5132
RH
578 for (b = info->input_bfds; b; b = b->link_next)
579 {
580 s = bfd_get_section_by_name (b, ".drectve");
581 if (s)
582 {
eea6121a 583 long size = s->size;
252b5132 584 char *buf = xmalloc (size);
775cabad 585
252b5132
RH
586 bfd_get_section_contents (b, s, buf, 0, size);
587 def_file_add_directive (pe_def_file, buf, size);
588 free (buf);
589 }
590 }
591
2b817be1
NC
592 /* If we are not building a DLL, when there are no exports
593 we do not build an export table at all. */
594 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
7b0eaa22 595 && info->executable)
2b817be1
NC
596 return;
597
86b1cc60 598 /* Now, maybe export everything else the default way. */
252b5132
RH
599 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
600 {
601 for (b = info->input_bfds; b; b = b->link_next)
602 {
603 asymbol **symbols;
604 int nsyms, symsize;
605
606 symsize = bfd_get_symtab_upper_bound (b);
1579bae1 607 symbols = xmalloc (symsize);
252b5132
RH
608 nsyms = bfd_canonicalize_symtab (b, symbols);
609
610 for (j = 0; j < nsyms; j++)
611 {
d643799d 612 /* We should export symbols which are either global or not
1579bae1
AM
613 anything at all. (.bss data is the latter)
614 We should not export undefined symbols. */
b044cda1
CW
615 if (symbols[j]->section != &bfd_und_section
616 && ((symbols[j]->flags & BSF_GLOBAL)
617 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
252b5132
RH
618 {
619 const char *sn = symbols[j]->name;
b044cda1 620
775cabad 621 /* We should not re-export imported stuff. */
b044cda1 622 {
e916811a 623 char *name;
00479ba8
NC
624 if (is_import (sn))
625 continue;
626
e916811a 627 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
00479ba8 628 sprintf (name, "%s%s", "__imp_", sn);
775cabad 629
b044cda1 630 blhe = bfd_link_hash_lookup (info->hash, name,
b34976b6 631 FALSE, FALSE, FALSE);
b044cda1
CW
632 free (name);
633
b7a26f91 634 if (blhe && blhe->type == bfd_link_hash_defined)
b044cda1
CW
635 continue;
636 }
637
00479ba8 638 if (pe_details->underscored && *sn == '_')
252b5132 639 sn++;
775cabad 640
b044cda1
CW
641 if (auto_export (b, pe_def_file, sn))
642 {
643 def_file_export *p;
644 p=def_file_add_export (pe_def_file, sn, 0, -1);
775cabad 645 /* Fill data flag properly, from dlltool.c. */
b044cda1
CW
646 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
647 }
252b5132
RH
648 }
649 }
650 }
651 }
652
653#undef NE
654#define NE pe_def_file->num_exports
655
86b1cc60 656 /* Canonicalize the export list. */
252b5132
RH
657 if (pe_dll_kill_ats)
658 {
659 for (i = 0; i < NE; i++)
660 {
661 if (strchr (pe_def_file->exports[i].name, '@'))
662 {
86b1cc60 663 /* This will preserve internal_name, which may have been
1579bae1
AM
664 pointing to the same memory as name, or might not
665 have. */
666 int lead_at = (*pe_def_file->exports[i].name == '@');
c9e38879 667 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
a8d701fd 668 char *tmp_at = strchr (tmp, '@');
775cabad 669
a8d701fd
DS
670 if (tmp_at)
671 *tmp_at = 0;
672 else
673 einfo (_("%XCannot export %s: invalid export name\n"),
674 pe_def_file->exports[i].name);
252b5132
RH
675 pe_def_file->exports[i].name = tmp;
676 }
677 }
678 }
679
680 if (pe_dll_stdcall_aliases)
681 {
682 for (i = 0; i < NE; i++)
683 {
00479ba8
NC
684 if (is_import (pe_def_file->exports[i].name))
685 continue;
686
252b5132
RH
687 if (strchr (pe_def_file->exports[i].name, '@'))
688 {
1579bae1 689 int lead_at = (*pe_def_file->exports[i].name == '@');
c9e38879 690 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
775cabad 691
252b5132 692 *(strchr (tmp, '@')) = 0;
b044cda1 693 if (auto_export (NULL, pe_def_file, tmp))
252b5132 694 def_file_add_export (pe_def_file, tmp,
b044cda1
CW
695 pe_def_file->exports[i].internal_name,
696 -1);
252b5132
RH
697 else
698 free (tmp);
699 }
700 }
701 }
702
86b1cc60
KH
703 /* Convenience, but watch out for it changing. */
704 e = pe_def_file->exports;
252b5132 705
1579bae1 706 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
198beae2 707 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
252b5132 708
198beae2 709 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
252b5132
RH
710 max_ordinal = 0;
711 min_ordinal = 65536;
712 count_exported = 0;
713 count_exported_byname = 0;
714 count_with_ordinals = 0;
715
1579bae1
AM
716 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
717 pe_export_sort);
252b5132
RH
718 for (i = 0, j = 0; i < NE; i++)
719 {
720 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
721 {
870df5dc 722 /* This is a duplicate. */
252b5132
RH
723 if (e[j - 1].ordinal != -1
724 && e[i].ordinal != -1
725 && e[j - 1].ordinal != e[i].ordinal)
726 {
870df5dc
NC
727 if (pe_dll_warn_dup_exports)
728 /* xgettext:c-format */
486e80e2 729 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
870df5dc 730 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
252b5132
RH
731 }
732 else
733 {
870df5dc
NC
734 if (pe_dll_warn_dup_exports)
735 /* xgettext:c-format */
736 einfo (_("Warning, duplicate EXPORT: %s\n"),
737 e[j - 1].name);
252b5132 738 }
775cabad 739
486e80e2 740 if (e[i].ordinal != -1)
252b5132
RH
741 e[j - 1].ordinal = e[i].ordinal;
742 e[j - 1].flag_private |= e[i].flag_private;
743 e[j - 1].flag_constant |= e[i].flag_constant;
744 e[j - 1].flag_noname |= e[i].flag_noname;
745 e[j - 1].flag_data |= e[i].flag_data;
746 }
747 else
748 {
749 if (i != j)
750 e[j] = e[i];
751 j++;
752 }
753 }
754 pe_def_file->num_exports = j; /* == NE */
755
756 for (i = 0; i < NE; i++)
757 {
1579bae1 758 char *name;
775cabad 759
a8d701fd
DS
760 /* Check for forward exports */
761 if (strchr (pe_def_file->exports[i].internal_name, '.'))
762 {
763 count_exported++;
764 if (!pe_def_file->exports[i].flag_noname)
765 count_exported_byname++;
766
767 pe_def_file->exports[i].flag_forward = 1;
768
769 if (pe_def_file->exports[i].ordinal != -1)
770 {
771 if (max_ordinal < pe_def_file->exports[i].ordinal)
772 max_ordinal = pe_def_file->exports[i].ordinal;
773 if (min_ordinal > pe_def_file->exports[i].ordinal)
774 min_ordinal = pe_def_file->exports[i].ordinal;
775 count_with_ordinals++;
776 }
777
778 continue;
779 }
780
1579bae1 781 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
c9e38879
NC
782 if (pe_details->underscored
783 && (*pe_def_file->exports[i].internal_name != '@'))
c6c37250
DD
784 {
785 *name = '_';
786 strcpy (name + 1, pe_def_file->exports[i].internal_name);
787 }
788 else
789 strcpy (name, pe_def_file->exports[i].internal_name);
252b5132
RH
790
791 blhe = bfd_link_hash_lookup (info->hash,
792 name,
b34976b6 793 FALSE, FALSE, TRUE);
252b5132 794
8a5b676c 795 if (blhe
d643799d 796 && (blhe->type == bfd_link_hash_defined
8a5b676c 797 || (blhe->type == bfd_link_hash_common)))
252b5132
RH
798 {
799 count_exported++;
800 if (!pe_def_file->exports[i].flag_noname)
801 count_exported_byname++;
8a5b676c
DD
802
803 /* Only fill in the sections. The actual offsets are computed
804 in fill_exported_offsets() after common symbols are laid
805 out. */
d643799d 806 if (blhe->type == bfd_link_hash_defined)
8a5b676c
DD
807 exported_symbol_sections[i] = blhe->u.def.section;
808 else
809 exported_symbol_sections[i] = blhe->u.c.p->section;
5cc18311 810
252b5132
RH
811 if (pe_def_file->exports[i].ordinal != -1)
812 {
813 if (max_ordinal < pe_def_file->exports[i].ordinal)
814 max_ordinal = pe_def_file->exports[i].ordinal;
815 if (min_ordinal > pe_def_file->exports[i].ordinal)
816 min_ordinal = pe_def_file->exports[i].ordinal;
817 count_with_ordinals++;
818 }
819 }
820 else if (blhe && blhe->type == bfd_link_hash_undefined)
821 {
822 /* xgettext:c-format */
823 einfo (_("%XCannot export %s: symbol not defined\n"),
824 pe_def_file->exports[i].internal_name);
825 }
826 else if (blhe)
827 {
828 /* xgettext:c-format */
829 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
830 pe_def_file->exports[i].internal_name,
831 blhe->type, bfd_link_hash_defined);
832 }
833 else
834 {
835 /* xgettext:c-format */
836 einfo (_("%XCannot export %s: symbol not found\n"),
837 pe_def_file->exports[i].internal_name);
838 }
839 free (name);
840 }
841}
842
775cabad 843/* Build the bfd that will contain .edata and .reloc sections. */
252b5132
RH
844
845static void
1579bae1 846build_filler_bfd (int include_edata)
252b5132
RH
847{
848 lang_input_statement_type *filler_file;
849 filler_file = lang_add_input_file ("dll stuff",
850 lang_input_file_is_fake_enum,
851 NULL);
852 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
853 if (filler_bfd == NULL
854 || !bfd_set_arch_mach (filler_bfd,
855 bfd_get_arch (output_bfd),
856 bfd_get_mach (output_bfd)))
857 {
36230712 858 einfo ("%X%P: can not create BFD: %E\n");
252b5132
RH
859 return;
860 }
861
c6c37250 862 if (include_edata)
252b5132 863 {
c6c37250
DD
864 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
865 if (edata_s == NULL
866 || !bfd_set_section_flags (filler_bfd, edata_s,
867 (SEC_HAS_CONTENTS
868 | SEC_ALLOC
869 | SEC_LOAD
870 | SEC_KEEP
871 | SEC_IN_MEMORY)))
872 {
873 einfo ("%X%P: can not create .edata section: %E\n");
874 return;
875 }
876 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
252b5132 877 }
252b5132
RH
878
879 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
880 if (reloc_s == NULL
881 || !bfd_set_section_flags (filler_bfd, reloc_s,
882 (SEC_HAS_CONTENTS
883 | SEC_ALLOC
884 | SEC_LOAD
885 | SEC_KEEP
886 | SEC_IN_MEMORY)))
887 {
888 einfo ("%X%P: can not create .reloc section: %E\n");
889 return;
890 }
775cabad 891
252b5132
RH
892 bfd_set_section_size (filler_bfd, reloc_s, 0);
893
894 ldlang_add_file (filler_file);
895}
896
775cabad 897/* Gather all the exported symbols and build the .edata section. */
252b5132
RH
898
899static void
1579bae1 900generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132
RH
901{
902 int i, next_ordinal;
903 int name_table_size = 0;
904 const char *dlnp;
905
906 /* First, we need to know how many exported symbols there are,
5cc18311 907 and what the range of ordinals is. */
252b5132 908 if (pe_def_file->name)
775cabad 909 dll_name = pe_def_file->name;
252b5132
RH
910 else
911 {
912 dll_name = abfd->filename;
775cabad 913
252b5132 914 for (dlnp = dll_name; *dlnp; dlnp++)
775cabad
NC
915 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
916 dll_name = dlnp + 1;
252b5132
RH
917 }
918
919 if (count_with_ordinals && max_ordinal > count_exported)
920 {
921 if (min_ordinal > max_ordinal - count_exported + 1)
922 min_ordinal = max_ordinal - count_exported + 1;
923 }
924 else
925 {
926 min_ordinal = 1;
927 max_ordinal = count_exported;
928 }
252b5132 929
775cabad 930 export_table_size = max_ordinal - min_ordinal + 1;
1579bae1 931 exported_symbols = xmalloc (export_table_size * sizeof (int));
252b5132
RH
932 for (i = 0; i < export_table_size; i++)
933 exported_symbols[i] = -1;
934
86b1cc60 935 /* Now we need to assign ordinals to those that don't have them. */
252b5132
RH
936 for (i = 0; i < NE; i++)
937 {
a8d701fd
DS
938 if (exported_symbol_sections[i] ||
939 pe_def_file->exports[i].flag_forward)
252b5132
RH
940 {
941 if (pe_def_file->exports[i].ordinal != -1)
942 {
943 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
944 int pi = exported_symbols[ei];
775cabad 945
252b5132
RH
946 if (pi != -1)
947 {
948 /* xgettext:c-format */
486e80e2 949 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
252b5132
RH
950 pe_def_file->exports[i].ordinal,
951 pe_def_file->exports[i].name,
952 pe_def_file->exports[pi].name);
953 }
954 exported_symbols[ei] = i;
955 }
956 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
957 }
a8d701fd
DS
958
959 /* Reserve space for the forward name. */
960 if (pe_def_file->exports[i].flag_forward)
961 {
962 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
963 }
252b5132
RH
964 }
965
966 next_ordinal = min_ordinal;
967 for (i = 0; i < NE; i++)
a8d701fd
DS
968 if ((exported_symbol_sections[i] ||
969 pe_def_file->exports[i].flag_forward) &&
970 pe_def_file->exports[i].ordinal == -1)
971 {
972 while (exported_symbols[next_ordinal - min_ordinal] != -1)
973 next_ordinal++;
775cabad 974
a8d701fd
DS
975 exported_symbols[next_ordinal - min_ordinal] = i;
976 pe_def_file->exports[i].ordinal = next_ordinal;
977 }
252b5132 978
86b1cc60 979 /* OK, now we can allocate some memory. */
775cabad
NC
980 edata_sz = (40 /* directory */
981 + 4 * export_table_size /* addresses */
252b5132
RH
982 + 4 * count_exported_byname /* name ptrs */
983 + 2 * count_exported_byname /* ordinals */
984 + name_table_size + strlen (dll_name) + 1);
985}
986
8a5b676c
DD
987/* Fill the exported symbol offsets. The preliminary work has already
988 been done in process_def_file(). */
989
990static void
1579bae1 991fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
8a5b676c 992{
f0c87f88 993 int i;
8a5b676c 994 struct bfd_link_hash_entry *blhe;
5cc18311 995
8a5b676c
DD
996 for (i = 0; i < pe_def_file->num_exports; i++)
997 {
1579bae1 998 char *name;
775cabad 999
1579bae1 1000 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
c9e38879 1001 if (pe_details->underscored
1579bae1 1002 && *pe_def_file->exports[i].internal_name != '@')
8a5b676c
DD
1003 {
1004 *name = '_';
1005 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1006 }
1007 else
1008 strcpy (name, pe_def_file->exports[i].internal_name);
1009
1010 blhe = bfd_link_hash_lookup (info->hash,
1011 name,
b34976b6 1012 FALSE, FALSE, TRUE);
8a5b676c 1013
1579bae1 1014 if (blhe && blhe->type == bfd_link_hash_defined)
775cabad
NC
1015 exported_symbol_offsets[i] = blhe->u.def.value;
1016
8a5b676c
DD
1017 free (name);
1018 }
1019}
1020
252b5132 1021static void
1579bae1 1022fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132 1023{
03a1c9a7 1024 int s, hint;
252b5132 1025 unsigned char *edirectory;
2f9636ba
AM
1026 unsigned char *eaddresses;
1027 unsigned char *enameptrs;
1028 unsigned char *eordinals;
47639182 1029 char *enamestr;
252b5132
RH
1030 time_t now;
1031
1032 time (&now);
1033
1579bae1 1034 edata_d = xmalloc (edata_sz);
252b5132 1035
86b1cc60 1036 /* Note use of array pointer math here. */
252b5132 1037 edirectory = edata_d;
2f9636ba
AM
1038 eaddresses = edata_d + 40;
1039 enameptrs = eaddresses + 4 * export_table_size;
1040 eordinals = enameptrs + 4 * count_exported_byname;
47639182 1041 enamestr = (char *) eordinals + 2 * count_exported_byname;
252b5132 1042
1579bae1
AM
1043#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1044 + edata_s->output_section->vma - image_base)
252b5132 1045
c2a94a7a 1046 memset (edata_d, 0, edata_sz);
252b5132
RH
1047 bfd_put_32 (abfd, now, edata_d + 4);
1048 if (pe_def_file->version_major != -1)
1049 {
1050 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1051 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1052 }
775cabad 1053
252b5132
RH
1054 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1055 strcpy (enamestr, dll_name);
1056 enamestr += strlen (enamestr) + 1;
1057 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1058 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1059 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1060 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1061 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1062 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1063
8a5b676c
DD
1064 fill_exported_offsets (abfd, info);
1065
03a1c9a7
NC
1066 /* Ok, now for the filling in part.
1067 Scan alphabetically - ie the ordering in the exports[] table,
1068 rather than by ordinal - the ordering in the exported_symbol[]
1069 table. See dlltool.c and:
1070 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1579bae1 1071 for more information. */
252b5132 1072 hint = 0;
03a1c9a7 1073 for (s = 0; s < NE; s++)
252b5132 1074 {
f5a95868 1075 struct bfd_section *ssec = exported_symbol_sections[s];
a8d701fd
DS
1076 if (pe_def_file->exports[s].ordinal != -1 &&
1077 (pe_def_file->exports[s].flag_forward || ssec != NULL))
252b5132 1078 {
45b1f63c 1079 int ord = pe_def_file->exports[s].ordinal;
252b5132 1080
a8d701fd
DS
1081 if (pe_def_file->exports[s].flag_forward)
1082 {
1083 bfd_put_32 (abfd, ERVA (enamestr),
1084 eaddresses + 4 * (ord - min_ordinal));
1085
1086 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1087 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1088 }
1089 else
1090 {
1091 unsigned long srva = (exported_symbol_offsets[s]
1092 + ssec->output_section->vma
1093 + ssec->output_offset);
1094
1095 bfd_put_32 (abfd, srva - image_base,
1096 eaddresses + 4 * (ord - min_ordinal));
1097 }
775cabad 1098
252b5132
RH
1099 if (!pe_def_file->exports[s].flag_noname)
1100 {
1101 char *ename = pe_def_file->exports[s].name;
03a1c9a7 1102
2f9636ba
AM
1103 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1104 enameptrs += 4;
252b5132
RH
1105 strcpy (enamestr, ename);
1106 enamestr += strlen (enamestr) + 1;
2f9636ba
AM
1107 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1108 eordinals += 2;
252b5132
RH
1109 pe_def_file->exports[s].hint = hint++;
1110 }
252b5132
RH
1111 }
1112 }
1113}
1114
b044cda1 1115
198beae2 1116static struct bfd_section *current_sec;
b044cda1
CW
1117
1118void
1579bae1
AM
1119pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1120 const char *name,
1121 int (*cb) (arelent *, asection *))
b044cda1
CW
1122{
1123 bfd *b;
0d888aac 1124 asection *s;
b044cda1
CW
1125
1126 for (b = info->input_bfds; b; b = b->link_next)
1127 {
775cabad
NC
1128 asymbol **symbols;
1129 int nsyms, symsize;
1130
1131 symsize = bfd_get_symtab_upper_bound (b);
1579bae1 1132 symbols = xmalloc (symsize);
775cabad 1133 nsyms = bfd_canonicalize_symtab (b, symbols);
b044cda1
CW
1134
1135 for (s = b->sections; s; s = s->next)
1136 {
775cabad
NC
1137 arelent **relocs;
1138 int relsize, nrelocs, i;
b044cda1
CW
1139 int flags = bfd_get_section_flags (b, s);
1140
775cabad 1141 /* Skip discarded linkonce sections. */
b044cda1
CW
1142 if (flags & SEC_LINK_ONCE
1143 && s->output_section == bfd_abs_section_ptr)
1144 continue;
1145
0d888aac 1146 current_sec = s;
b044cda1 1147
b044cda1 1148 relsize = bfd_get_reloc_upper_bound (b, s);
1579bae1 1149 relocs = xmalloc (relsize);
b044cda1
CW
1150 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1151
1152 for (i = 0; i < nrelocs; i++)
1153 {
fc0a2244 1154 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
775cabad
NC
1155
1156 if (!strcmp (name, sym->name))
1157 cb (relocs[i], s);
b044cda1 1158 }
775cabad 1159
b044cda1 1160 free (relocs);
775cabad 1161
b044cda1
CW
1162 /* Warning: the allocated symbols are remembered in BFD and reused
1163 later, so don't free them! */
1164 /* free (symbols); */
1165 }
1166 }
1167}
1168
775cabad 1169/* Gather all the relocations and build the .reloc section. */
252b5132
RH
1170
1171static void
1579bae1 1172generate_reloc (bfd *abfd, struct bfd_link_info *info)
252b5132
RH
1173{
1174
86b1cc60 1175 /* For .reloc stuff. */
c6c37250 1176 reloc_data_type *reloc_data;
252b5132
RH
1177 int total_relocs = 0;
1178 int i;
1579bae1 1179 unsigned long sec_page = (unsigned long) -1;
252b5132
RH
1180 unsigned long page_ptr, page_count;
1181 int bi;
1182 bfd *b;
198beae2 1183 struct bfd_section *s;
252b5132
RH
1184
1185 total_relocs = 0;
1186 for (b = info->input_bfds; b; b = b->link_next)
1187 for (s = b->sections; s; s = s->next)
1188 total_relocs += s->reloc_count;
1189
1579bae1 1190 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
252b5132
RH
1191
1192 total_relocs = 0;
1193 bi = 0;
1194 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1195 {
1196 arelent **relocs;
1197 int relsize, nrelocs, i;
1198
1199 for (s = b->sections; s; s = s->next)
1200 {
1201 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1202 asymbol **symbols;
1203 int nsyms, symsize;
1204
86b1cc60 1205 /* If it's not loaded, we don't need to relocate it this way. */
252b5132
RH
1206 if (!(s->output_section->flags & SEC_LOAD))
1207 continue;
1208
1209 /* I don't know why there would be a reloc for these, but I've
86b1cc60 1210 seen it happen - DJ */
252b5132
RH
1211 if (s->output_section == &bfd_abs_section)
1212 continue;
1213
1214 if (s->output_section->vma == 0)
1215 {
86b1cc60 1216 /* Huh? Shouldn't happen, but punt if it does. */
252b5132
RH
1217 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1218 s->output_section->name, s->output_section->index,
1219 s->output_section->flags);
1220 continue;
1221 }
1222
1223 symsize = bfd_get_symtab_upper_bound (b);
1579bae1 1224 symbols = xmalloc (symsize);
252b5132
RH
1225 nsyms = bfd_canonicalize_symtab (b, symbols);
1226
1227 relsize = bfd_get_reloc_upper_bound (b, s);
1579bae1 1228 relocs = xmalloc (relsize);
252b5132
RH
1229 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1230
1231 for (i = 0; i < nrelocs; i++)
1232 {
b044cda1 1233 if (pe_dll_extra_pe_debug)
b7a26f91 1234 {
fc0a2244 1235 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
b7a26f91 1236 printf ("rel: %s\n", sym->name);
b044cda1 1237 }
252b5132 1238 if (!relocs[i]->howto->pc_relative
c6c37250 1239 && relocs[i]->howto->type != pe_details->imagebase_reloc)
252b5132 1240 {
c6c37250 1241 bfd_vma sym_vma;
fc0a2244 1242 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
775cabad 1243
c6c37250
DD
1244 sym_vma = (relocs[i]->addend
1245 + sym->value
1246 + sym->section->vma
1247 + sym->section->output_offset
1248 + sym->section->output_section->vma);
1249 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
5cc18311 1250
344a211f 1251#define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
5cc18311 1252
344a211f
NC
1253 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1254 relocs[i]->howto->rightshift)
252b5132 1255 {
99ad8390
NC
1256#ifdef pe_use_x86_64
1257 case BITS_AND_SHIFT (64, 0):
1258 reloc_data[total_relocs].type = 10;
1259 total_relocs++;
1260 break;
1261#endif
344a211f 1262 case BITS_AND_SHIFT (32, 0):
c6c37250
DD
1263 reloc_data[total_relocs].type = 3;
1264 total_relocs++;
252b5132 1265 break;
344a211f
NC
1266 case BITS_AND_SHIFT (16, 0):
1267 reloc_data[total_relocs].type = 2;
1268 total_relocs++;
1269 break;
1270 case BITS_AND_SHIFT (16, 16):
1271 reloc_data[total_relocs].type = 4;
86b1cc60
KH
1272 /* FIXME: we can't know the symbol's right value
1273 yet, but we probably can safely assume that
1274 CE will relocate us in 64k blocks, so leaving
1275 it zero is safe. */
344a211f
NC
1276 reloc_data[total_relocs].extra = 0;
1277 total_relocs++;
1278 break;
1279 case BITS_AND_SHIFT (26, 2):
1280 reloc_data[total_relocs].type = 5;
1281 total_relocs++;
1282 break;
fea39bcb 1283 case BITS_AND_SHIFT (24, 2):
d3793eaa
NC
1284 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1285 Those ARM_xxx definitions should go in proper
1286 header someday. */
1287 if (relocs[i]->howto->type == 0
1288 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1289 || relocs[i]->howto->type == 5)
fea39bcb
NC
1290 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1291 that has already been fully processed during a
1292 previous link stage, so ignore it here. */
1293 break;
1294 /* Fall through. */
252b5132
RH
1295 default:
1296 /* xgettext:c-format */
1297 einfo (_("%XError: %d-bit reloc in dll\n"),
1298 relocs[i]->howto->bitsize);
1299 break;
1300 }
1301 }
1302 }
1303 free (relocs);
86b1cc60
KH
1304 /* Warning: the allocated symbols are remembered in BFD and
1305 reused later, so don't free them! */
252b5132
RH
1306 }
1307 }
1308
1309 /* At this point, we have total_relocs relocation addresses in
1310 reloc_addresses, which are all suitable for the .reloc section.
5cc18311 1311 We must now create the new sections. */
c6c37250 1312 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
252b5132
RH
1313
1314 for (i = 0; i < total_relocs; i++)
1315 {
c6c37250 1316 unsigned long this_page = (reloc_data[i].vma >> 12);
5cc18311 1317
252b5132
RH
1318 if (this_page != sec_page)
1319 {
775cabad 1320 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
252b5132
RH
1321 reloc_sz += 8;
1322 sec_page = this_page;
1323 }
5cc18311 1324
252b5132 1325 reloc_sz += 2;
5cc18311 1326
344a211f
NC
1327 if (reloc_data[i].type == 4)
1328 reloc_sz += 2;
252b5132 1329 }
b7a26f91 1330
775cabad 1331 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1579bae1
AM
1332 reloc_d = xmalloc (reloc_sz);
1333 sec_page = (unsigned long) -1;
252b5132 1334 reloc_sz = 0;
1579bae1 1335 page_ptr = (unsigned long) -1;
252b5132 1336 page_count = 0;
775cabad 1337
252b5132
RH
1338 for (i = 0; i < total_relocs; i++)
1339 {
c6c37250 1340 unsigned long rva = reloc_data[i].vma - image_base;
252b5132 1341 unsigned long this_page = (rva & ~0xfff);
775cabad 1342
252b5132
RH
1343 if (this_page != sec_page)
1344 {
1345 while (reloc_sz & 3)
1346 reloc_d[reloc_sz++] = 0;
775cabad 1347
1579bae1 1348 if (page_ptr != (unsigned long) -1)
252b5132 1349 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1350
252b5132
RH
1351 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1352 page_ptr = reloc_sz;
1353 reloc_sz += 8;
1354 sec_page = this_page;
1355 page_count = 0;
1356 }
775cabad 1357
d643799d 1358 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
c6c37250 1359 reloc_d + reloc_sz);
252b5132 1360 reloc_sz += 2;
775cabad 1361
c6c37250
DD
1362 if (reloc_data[i].type == 4)
1363 {
1364 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1365 reloc_sz += 2;
1366 }
775cabad 1367
252b5132
RH
1368 page_count++;
1369 }
775cabad 1370
252b5132
RH
1371 while (reloc_sz & 3)
1372 reloc_d[reloc_sz++] = 0;
775cabad 1373
1579bae1 1374 if (page_ptr != (unsigned long) -1)
252b5132 1375 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1376
eea6121a 1377 while (reloc_sz < reloc_s->size)
252b5132
RH
1378 reloc_d[reloc_sz++] = 0;
1379}
1380
775cabad
NC
1381/* Given the exiting def_file structure, print out a .DEF file that
1382 corresponds to it. */
252b5132
RH
1383
1384static void
1579bae1 1385quoteput (char *s, FILE *f, int needs_quotes)
252b5132
RH
1386{
1387 char *cp;
775cabad 1388
252b5132
RH
1389 for (cp = s; *cp; cp++)
1390 if (*cp == '\''
1391 || *cp == '"'
1392 || *cp == '\\'
3882b010 1393 || ISSPACE (*cp)
252b5132
RH
1394 || *cp == ','
1395 || *cp == ';')
1396 needs_quotes = 1;
775cabad 1397
252b5132
RH
1398 if (needs_quotes)
1399 {
1400 putc ('"', f);
775cabad 1401
252b5132
RH
1402 while (*s)
1403 {
1404 if (*s == '"' || *s == '\\')
1405 putc ('\\', f);
775cabad 1406
252b5132
RH
1407 putc (*s, f);
1408 s++;
1409 }
775cabad 1410
252b5132
RH
1411 putc ('"', f);
1412 }
1413 else
1414 fputs (s, f);
1415}
1416
1417void
1579bae1 1418pe_dll_generate_def_file (const char *pe_out_def_filename)
252b5132
RH
1419{
1420 int i;
1421 FILE *out = fopen (pe_out_def_filename, "w");
775cabad 1422
252b5132 1423 if (out == NULL)
775cabad
NC
1424 /* xgettext:c-format */
1425 einfo (_("%s: Can't open output def file %s\n"),
1426 program_name, pe_out_def_filename);
252b5132
RH
1427
1428 if (pe_def_file)
1429 {
1430 if (pe_def_file->name)
1431 {
1432 if (pe_def_file->is_dll)
1433 fprintf (out, "LIBRARY ");
1434 else
1435 fprintf (out, "NAME ");
775cabad 1436
252b5132 1437 quoteput (pe_def_file->name, out, 1);
775cabad 1438
252b5132
RH
1439 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1440 fprintf (out, " BASE=0x%lx",
1441 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1442 fprintf (out, "\n");
1443 }
1444
1445 if (pe_def_file->description)
1446 {
1447 fprintf (out, "DESCRIPTION ");
1448 quoteput (pe_def_file->description, out, 1);
1449 fprintf (out, "\n");
1450 }
1451
1452 if (pe_def_file->version_minor != -1)
1453 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1454 pe_def_file->version_minor);
1455 else if (pe_def_file->version_major != -1)
1456 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1457
1458 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1459 fprintf (out, "\n");
1460
1461 if (pe_def_file->stack_commit != -1)
1462 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1463 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1464 else if (pe_def_file->stack_reserve != -1)
1465 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
775cabad 1466
252b5132
RH
1467 if (pe_def_file->heap_commit != -1)
1468 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1469 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1470 else if (pe_def_file->heap_reserve != -1)
1471 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1472
1473 if (pe_def_file->num_section_defs > 0)
1474 {
1475 fprintf (out, "\nSECTIONS\n\n");
775cabad 1476
252b5132
RH
1477 for (i = 0; i < pe_def_file->num_section_defs; i++)
1478 {
1479 fprintf (out, " ");
1480 quoteput (pe_def_file->section_defs[i].name, out, 0);
775cabad 1481
252b5132
RH
1482 if (pe_def_file->section_defs[i].class)
1483 {
1484 fprintf (out, " CLASS ");
1485 quoteput (pe_def_file->section_defs[i].class, out, 0);
1486 }
775cabad 1487
252b5132
RH
1488 if (pe_def_file->section_defs[i].flag_read)
1489 fprintf (out, " READ");
775cabad 1490
252b5132
RH
1491 if (pe_def_file->section_defs[i].flag_write)
1492 fprintf (out, " WRITE");
775cabad 1493
252b5132
RH
1494 if (pe_def_file->section_defs[i].flag_execute)
1495 fprintf (out, " EXECUTE");
775cabad 1496
252b5132
RH
1497 if (pe_def_file->section_defs[i].flag_shared)
1498 fprintf (out, " SHARED");
775cabad 1499
252b5132
RH
1500 fprintf (out, "\n");
1501 }
1502 }
1503
1504 if (pe_def_file->num_exports > 0)
1505 {
b044cda1 1506 fprintf (out, "EXPORTS\n");
775cabad 1507
252b5132
RH
1508 for (i = 0; i < pe_def_file->num_exports; i++)
1509 {
1510 def_file_export *e = pe_def_file->exports + i;
1511 fprintf (out, " ");
1512 quoteput (e->name, out, 0);
775cabad 1513
252b5132
RH
1514 if (e->internal_name && strcmp (e->internal_name, e->name))
1515 {
1516 fprintf (out, " = ");
1517 quoteput (e->internal_name, out, 0);
1518 }
775cabad 1519
252b5132
RH
1520 if (e->ordinal != -1)
1521 fprintf (out, " @%d", e->ordinal);
775cabad 1522
252b5132
RH
1523 if (e->flag_private)
1524 fprintf (out, " PRIVATE");
775cabad 1525
252b5132
RH
1526 if (e->flag_constant)
1527 fprintf (out, " CONSTANT");
775cabad 1528
252b5132
RH
1529 if (e->flag_noname)
1530 fprintf (out, " NONAME");
775cabad 1531
252b5132
RH
1532 if (e->flag_data)
1533 fprintf (out, " DATA");
1534
1535 fprintf (out, "\n");
1536 }
1537 }
1538
1539 if (pe_def_file->num_imports > 0)
1540 {
1541 fprintf (out, "\nIMPORTS\n\n");
775cabad 1542
252b5132
RH
1543 for (i = 0; i < pe_def_file->num_imports; i++)
1544 {
1545 def_file_import *im = pe_def_file->imports + i;
1546 fprintf (out, " ");
775cabad 1547
252b5132
RH
1548 if (im->internal_name
1549 && (!im->name || strcmp (im->internal_name, im->name)))
1550 {
1551 quoteput (im->internal_name, out, 0);
1552 fprintf (out, " = ");
1553 }
775cabad 1554
252b5132
RH
1555 quoteput (im->module->name, out, 0);
1556 fprintf (out, ".");
775cabad 1557
252b5132
RH
1558 if (im->name)
1559 quoteput (im->name, out, 0);
1560 else
1561 fprintf (out, "%d", im->ordinal);
775cabad 1562
252b5132
RH
1563 fprintf (out, "\n");
1564 }
1565 }
1566 }
1567 else
1568 fprintf (out, _("; no contents available\n"));
1569
1570 if (fclose (out) == EOF)
775cabad
NC
1571 /* xgettext:c-format */
1572 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
252b5132
RH
1573}
1574
775cabad 1575/* Generate the import library. */
252b5132
RH
1576
1577static asymbol **symtab;
1578static int symptr;
1579static int tmp_seq;
1580static const char *dll_filename;
1581static char *dll_symname;
1582
1583#define UNDSEC (asection *) &bfd_und_section
1584
1585static asection *
1579bae1 1586quick_section (bfd *abfd, const char *name, int flags, int align)
252b5132
RH
1587{
1588 asection *sec;
1589 asymbol *sym;
1590
1591 sec = bfd_make_section_old_way (abfd, name);
86b1cc60 1592 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
252b5132 1593 bfd_set_section_alignment (abfd, sec, align);
86b1cc60 1594 /* Remember to undo this before trying to link internally! */
252b5132
RH
1595 sec->output_section = sec;
1596
1597 sym = bfd_make_empty_symbol (abfd);
1598 symtab[symptr++] = sym;
1599 sym->name = sec->name;
1600 sym->section = sec;
1601 sym->flags = BSF_LOCAL;
1602 sym->value = 0;
1603
1604 return sec;
1605}
1606
1607static void
1579bae1
AM
1608quick_symbol (bfd *abfd,
1609 const char *n1,
1610 const char *n2,
1611 const char *n3,
1612 asection *sec,
1613 int flags,
1614 int addr)
252b5132
RH
1615{
1616 asymbol *sym;
1579bae1 1617 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
775cabad 1618
252b5132
RH
1619 strcpy (name, n1);
1620 strcat (name, n2);
1621 strcat (name, n3);
1622 sym = bfd_make_empty_symbol (abfd);
1623 sym->name = name;
1624 sym->section = sec;
1625 sym->flags = flags;
1626 sym->value = addr;
1627 symtab[symptr++] = sym;
1628}
1629
1630static arelent *reltab = 0;
1631static int relcount = 0, relsize = 0;
1632
1633static void
1579bae1 1634quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
252b5132 1635{
1579bae1 1636 if (relcount >= relsize - 1)
252b5132
RH
1637 {
1638 relsize += 10;
1639 if (reltab)
1579bae1 1640 reltab = xrealloc (reltab, relsize * sizeof (arelent));
252b5132 1641 else
1579bae1 1642 reltab = xmalloc (relsize * sizeof (arelent));
252b5132
RH
1643 }
1644 reltab[relcount].address = address;
1645 reltab[relcount].addend = 0;
1646 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1647 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1648 relcount++;
1649}
1650
1651static void
1652save_relocs (asection *sec)
1653{
1654 int i;
775cabad 1655
252b5132
RH
1656 sec->relocation = reltab;
1657 sec->reloc_count = relcount;
1579bae1 1658 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
d643799d 1659 for (i = 0; i < relcount; i++)
252b5132
RH
1660 sec->orelocation[i] = sec->relocation + i;
1661 sec->orelocation[relcount] = 0;
1662 sec->flags |= SEC_RELOC;
1663 reltab = 0;
1664 relcount = relsize = 0;
1665}
1666
775cabad
NC
1667/* .section .idata$2
1668 .global __head_my_dll
1669 __head_my_dll:
1670 .rva hname
1671 .long 0
1672 .long 0
1673 .rva __my_dll_iname
1674 .rva fthunk
b7a26f91 1675
775cabad
NC
1676 .section .idata$5
1677 .long 0
1678 fthunk:
b7a26f91 1679
775cabad
NC
1680 .section .idata$4
1681 .long 0
1682 hname: */
252b5132
RH
1683
1684static bfd *
1579bae1 1685make_head (bfd *parent)
252b5132
RH
1686{
1687 asection *id2, *id5, *id4;
1688 unsigned char *d2, *d5, *d4;
1689 char *oname;
1690 bfd *abfd;
1691
1579bae1 1692 oname = xmalloc (20);
252b5132
RH
1693 sprintf (oname, "d%06d.o", tmp_seq);
1694 tmp_seq++;
1695
1696 abfd = bfd_create (oname, parent);
c6c37250 1697 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1698 bfd_make_writable (abfd);
1699
1700 bfd_set_format (abfd, bfd_object);
c6c37250 1701 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1702
1703 symptr = 0;
1579bae1 1704 symtab = xmalloc (6 * sizeof (asymbol *));
252b5132
RH
1705 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1706 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1707 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
d643799d
KH
1708 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1709 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
c6c37250
DD
1710
1711 /* OK, pay attention here. I got confused myself looking back at
1712 it. We create a four-byte section to mark the beginning of the
1713 list, and we include an offset of 4 in the section, so that the
1714 pointer to the list points to the *end* of this section, which is
5cc18311 1715 the start of the list of sections from other objects. */
252b5132
RH
1716
1717 bfd_set_section_size (abfd, id2, 20);
1579bae1 1718 d2 = xmalloc (20);
252b5132
RH
1719 id2->contents = d2;
1720 memset (d2, 0, 20);
775cabad 1721 d2[0] = d2[16] = 4; /* Reloc addend. */
252b5132
RH
1722 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1723 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1724 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1725 save_relocs (id2);
1726
99ad8390
NC
1727 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1728 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 1729 id5->contents = d5;
99ad8390 1730 memset (d5, 0, PE_IDATA5_SIZE);
252b5132 1731
99ad8390
NC
1732 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1733 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 1734 id4->contents = d4;
99ad8390 1735 memset (d4, 0, PE_IDATA4_SIZE);
252b5132
RH
1736
1737 bfd_set_symtab (abfd, symtab, symptr);
1738
1739 bfd_set_section_contents (abfd, id2, d2, 0, 20);
99ad8390
NC
1740 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1741 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
5cc18311 1742
252b5132
RH
1743 bfd_make_readable (abfd);
1744 return abfd;
1745}
1746
775cabad
NC
1747/* .section .idata$4
1748 .long 0
99ad8390 1749 [.long 0] for PE+
775cabad
NC
1750 .section .idata$5
1751 .long 0
99ad8390 1752 [.long 0] for PE+
775cabad
NC
1753 .section idata$7
1754 .global __my_dll_iname
1755 __my_dll_iname:
1756 .asciz "my.dll" */
252b5132
RH
1757
1758static bfd *
1579bae1 1759make_tail (bfd *parent)
252b5132
RH
1760{
1761 asection *id4, *id5, *id7;
1762 unsigned char *d4, *d5, *d7;
1763 int len;
1764 char *oname;
1765 bfd *abfd;
1766
1579bae1 1767 oname = xmalloc (20);
252b5132
RH
1768 sprintf (oname, "d%06d.o", tmp_seq);
1769 tmp_seq++;
1770
1771 abfd = bfd_create (oname, parent);
c6c37250 1772 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1773 bfd_make_writable (abfd);
1774
1775 bfd_set_format (abfd, bfd_object);
c6c37250 1776 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1777
1778 symptr = 0;
1579bae1 1779 symtab = xmalloc (5 * sizeof (asymbol *));
252b5132
RH
1780 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1781 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1782 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
d643799d 1783 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
252b5132 1784
99ad8390
NC
1785 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1786 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 1787 id4->contents = d4;
99ad8390 1788 memset (d4, 0, PE_IDATA4_SIZE);
252b5132 1789
99ad8390
NC
1790 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1791 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 1792 id5->contents = d5;
99ad8390 1793 memset (d5, 0, PE_IDATA5_SIZE);
252b5132 1794
d643799d 1795 len = strlen (dll_filename) + 1;
252b5132 1796 if (len & 1)
d643799d 1797 len++;
252b5132 1798 bfd_set_section_size (abfd, id7, len);
1579bae1 1799 d7 = xmalloc (len);
252b5132 1800 id7->contents = d7;
47639182 1801 strcpy ((char *) d7, dll_filename);
e916811a
CF
1802 /* If len was odd, the above
1803 strcpy leaves behind an undefined byte. That is harmless,
1804 but we set it to 0 just so the binary dumps are pretty. */
1805 d7[len - 1] = 0;
252b5132
RH
1806
1807 bfd_set_symtab (abfd, symtab, symptr);
1808
99ad8390
NC
1809 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1810 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
252b5132
RH
1811 bfd_set_section_contents (abfd, id7, d7, 0, len);
1812
1813 bfd_make_readable (abfd);
1814 return abfd;
1815}
1816
775cabad
NC
1817/* .text
1818 .global _function
1819 .global ___imp_function
1820 .global __imp__function
1821 _function:
1822 jmp *__imp__function:
b7a26f91 1823
775cabad
NC
1824 .section idata$7
1825 .long __head_my_dll
b7a26f91 1826
775cabad
NC
1827 .section .idata$5
1828 ___imp_function:
1829 __imp__function:
1830 iat?
1831 .section .idata$4
1832 iat?
1833 .section .idata$6
1834 ID<ordinal>:
1835 .short <hint>
1836 .asciz "function" xlate? (add underscore, kill at) */
1837
e916811a 1838static const unsigned char jmp_ix86_bytes[] =
775cabad 1839{
252b5132
RH
1840 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1841};
1842
775cabad
NC
1843/* _function:
1844 mov.l ip+8,r0
1845 mov.l @r0,r0
1846 jmp @r0
1847 nop
1848 .dw __imp_function */
344a211f 1849
e916811a 1850static const unsigned char jmp_sh_bytes[] =
775cabad 1851{
344a211f
NC
1852 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1853};
1854
775cabad
NC
1855/* _function:
1856 lui $t0,<high:__imp_function>
1857 lw $t0,<low:__imp_function>
1858 jr $t0
1859 nop */
344a211f 1860
e916811a 1861static const unsigned char jmp_mips_bytes[] =
775cabad 1862{
344a211f
NC
1863 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1864 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1865};
252b5132 1866
e916811a 1867static const unsigned char jmp_arm_bytes[] =
53baae48
NC
1868{
1869 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1870 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1871 0, 0, 0, 0
1872};
1873
1874
252b5132 1875static bfd *
54727719 1876make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
252b5132
RH
1877{
1878 asection *tx, *id7, *id5, *id4, *id6;
23a87948 1879 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
252b5132
RH
1880 int len;
1881 char *oname;
1882 bfd *abfd;
e916811a 1883 const unsigned char *jmp_bytes = NULL;
f0c87f88 1884 int jmp_byte_count = 0;
c6c37250 1885
54727719
NC
1886 /* Include the jump stub section only if it is needed. A jump
1887 stub is needed if the symbol being imported <sym> is a function
1888 symbol and there is at least one undefined reference to that
1889 symbol. In other words, if all the import references to <sym> are
1890 explicitly through _declspec(dllimport) then the jump stub is not
1891 needed. */
1892 if (include_jmp_stub)
c6c37250 1893 {
54727719
NC
1894 switch (pe_details->pe_arch)
1895 {
1896 case PE_ARCH_i386:
1897 jmp_bytes = jmp_ix86_bytes;
1898 jmp_byte_count = sizeof (jmp_ix86_bytes);
1899 break;
1900 case PE_ARCH_sh:
1901 jmp_bytes = jmp_sh_bytes;
1902 jmp_byte_count = sizeof (jmp_sh_bytes);
1903 break;
1904 case PE_ARCH_mips:
1905 jmp_bytes = jmp_mips_bytes;
1906 jmp_byte_count = sizeof (jmp_mips_bytes);
1907 break;
1908 case PE_ARCH_arm:
1909 case PE_ARCH_arm_epoc:
1910 case PE_ARCH_arm_wince:
1911 jmp_bytes = jmp_arm_bytes;
1912 jmp_byte_count = sizeof (jmp_arm_bytes);
1913 break;
1914 default:
1915 abort ();
1916 }
c6c37250 1917 }
252b5132 1918
1579bae1 1919 oname = xmalloc (20);
252b5132
RH
1920 sprintf (oname, "d%06d.o", tmp_seq);
1921 tmp_seq++;
1922
1923 abfd = bfd_create (oname, parent);
c6c37250 1924 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1925 bfd_make_writable (abfd);
1926
1927 bfd_set_format (abfd, bfd_object);
c6c37250 1928 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1929
1930 symptr = 0;
1579bae1 1931 symtab = xmalloc (11 * sizeof (asymbol *));
252b5132
RH
1932 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1933 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1934 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1935 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1936 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
b34976b6 1937
c9e38879
NC
1938 if (*exp->internal_name == '@')
1939 {
1579bae1
AM
1940 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1941 BSF_GLOBAL, 0);
54727719 1942 if (include_jmp_stub)
4b7f0676 1943 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
00479ba8 1944 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
1579bae1 1945 BSF_GLOBAL, 0);
c9e38879
NC
1946 /* Fastcall applies only to functions,
1947 so no need for auto-import symbol. */
1948 }
1949 else
1950 {
4b7f0676
NC
1951 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1952 BSF_GLOBAL, 0);
54727719 1953 if (include_jmp_stub)
1579bae1
AM
1954 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1955 BSF_GLOBAL, 0);
00479ba8 1956 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
1579bae1 1957 BSF_GLOBAL, 0);
c9e38879 1958 /* Symbol to reference ord/name of imported
1579bae1 1959 data symbol, used to implement auto-import. */
c9e38879 1960 if (exp->flag_data)
00479ba8 1961 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
1579bae1 1962 BSF_GLOBAL,0);
c9e38879 1963 }
870df5dc 1964 if (pe_dll_compat_implib)
1579bae1
AM
1965 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1966 BSF_GLOBAL, 0);
252b5132 1967
54727719 1968 if (include_jmp_stub)
775cabad
NC
1969 {
1970 bfd_set_section_size (abfd, tx, jmp_byte_count);
1579bae1 1971 td = xmalloc (jmp_byte_count);
775cabad
NC
1972 tx->contents = td;
1973 memcpy (td, jmp_bytes, jmp_byte_count);
1974
1975 switch (pe_details->pe_arch)
1976 {
1977 case PE_ARCH_i386:
591a748a
NC
1978#ifdef pe_use_x86_64
1979 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
1980#else
1981 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1982#endif
775cabad
NC
1983 break;
1984 case PE_ARCH_sh:
1985 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1986 break;
1987 case PE_ARCH_mips:
1988 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1989 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1990 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1991 break;
53baae48 1992 case PE_ARCH_arm:
7148cc28
NC
1993 case PE_ARCH_arm_epoc:
1994 case PE_ARCH_arm_wince:
53baae48
NC
1995 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1996 break;
775cabad
NC
1997 default:
1998 abort ();
1999 }
2000 save_relocs (tx);
2001 }
54727719
NC
2002 else
2003 bfd_set_section_size (abfd, tx, 0);
252b5132
RH
2004
2005 bfd_set_section_size (abfd, id7, 4);
1579bae1 2006 d7 = xmalloc (4);
252b5132
RH
2007 id7->contents = d7;
2008 memset (d7, 0, 4);
4b7f0676 2009 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
252b5132
RH
2010 save_relocs (id7);
2011
99ad8390
NC
2012 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2013 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 2014 id5->contents = d5;
99ad8390 2015 memset (d5, 0, PE_IDATA5_SIZE);
775cabad 2016
252b5132
RH
2017 if (exp->flag_noname)
2018 {
2019 d5[0] = exp->ordinal;
2020 d5[1] = exp->ordinal >> 8;
99ad8390 2021 d5[PE_IDATA5_SIZE - 1] = 0x80;
252b5132
RH
2022 }
2023 else
2024 {
2025 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2026 save_relocs (id5);
2027 }
2028
99ad8390
NC
2029 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2030 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 2031 id4->contents = d4;
99ad8390 2032 memset (d4, 0, PE_IDATA4_SIZE);
775cabad 2033
252b5132
RH
2034 if (exp->flag_noname)
2035 {
c2a94a7a
DD
2036 d4[0] = exp->ordinal;
2037 d4[1] = exp->ordinal >> 8;
99ad8390 2038 d4[PE_IDATA4_SIZE - 1] = 0x80;
252b5132
RH
2039 }
2040 else
2041 {
2042 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2043 save_relocs (id4);
2044 }
2045
2046 if (exp->flag_noname)
2047 {
2048 len = 0;
2049 bfd_set_section_size (abfd, id6, 0);
2050 }
2051 else
2052 {
e916811a
CF
2053 /* { short, asciz } */
2054 len = 2 + strlen (exp->name) + 1;
252b5132
RH
2055 if (len & 1)
2056 len++;
2057 bfd_set_section_size (abfd, id6, len);
1579bae1 2058 d6 = xmalloc (len);
252b5132
RH
2059 id6->contents = d6;
2060 memset (d6, 0, len);
2061 d6[0] = exp->hint & 0xff;
2062 d6[1] = exp->hint >> 8;
47639182 2063 strcpy ((char *) d6 + 2, exp->name);
252b5132
RH
2064 }
2065
2066 bfd_set_symtab (abfd, symtab, symptr);
2067
54727719
NC
2068 if (include_jmp_stub)
2069 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
252b5132 2070 bfd_set_section_contents (abfd, id7, d7, 0, 4);
99ad8390
NC
2071 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2072 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
252b5132
RH
2073 if (!exp->flag_noname)
2074 bfd_set_section_contents (abfd, id6, d6, 0, len);
2075
2076 bfd_make_readable (abfd);
2077 return abfd;
2078}
2079
b044cda1 2080static bfd *
1579bae1 2081make_singleton_name_thunk (const char *import, bfd *parent)
b044cda1 2082{
775cabad 2083 /* Name thunks go to idata$4. */
b044cda1
CW
2084 asection *id4;
2085 unsigned char *d4;
2086 char *oname;
2087 bfd *abfd;
2088
1579bae1 2089 oname = xmalloc (20);
b044cda1
CW
2090 sprintf (oname, "nmth%06d.o", tmp_seq);
2091 tmp_seq++;
2092
2093 abfd = bfd_create (oname, parent);
2094 bfd_find_target (pe_details->object_target, abfd);
2095 bfd_make_writable (abfd);
2096
2097 bfd_set_format (abfd, bfd_object);
2098 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2099
2100 symptr = 0;
1579bae1 2101 symtab = xmalloc (3 * sizeof (asymbol *));
b044cda1
CW
2102 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2103 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2104 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2105
4e986257
CF
2106 /* We need space for the real thunk and for the null terminator. */
2107 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2108 d4 = xmalloc (PE_IDATA4_SIZE * 2);
b044cda1 2109 id4->contents = d4;
4e986257 2110 memset (d4, 0, PE_IDATA4_SIZE * 2);
b044cda1
CW
2111 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2112 save_relocs (id4);
2113
2114 bfd_set_symtab (abfd, symtab, symptr);
2115
4e986257 2116 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
b044cda1
CW
2117
2118 bfd_make_readable (abfd);
2119 return abfd;
2120}
2121
2122static char *
1579bae1 2123make_import_fixup_mark (arelent *rel)
b044cda1 2124{
775cabad 2125 /* We convert reloc to symbol, for later reference. */
b044cda1
CW
2126 static int counter;
2127 static char *fixup_name = NULL;
db09f25b 2128 static size_t buffer_len = 0;
b7a26f91 2129
fc0a2244 2130 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
b7a26f91 2131
b044cda1 2132 bfd *abfd = bfd_asymbol_bfd (sym);
fe213ce2 2133 struct bfd_link_hash_entry *bh;
b044cda1
CW
2134
2135 if (!fixup_name)
2136 {
1579bae1 2137 fixup_name = xmalloc (384);
b044cda1
CW
2138 buffer_len = 384;
2139 }
2140
2141 if (strlen (sym->name) + 25 > buffer_len)
b7a26f91 2142 /* Assume 25 chars for "__fu" + counter + "_". If counter is
b044cda1 2143 bigger than 20 digits long, we've got worse problems than
775cabad 2144 overflowing this buffer... */
b044cda1
CW
2145 {
2146 free (fixup_name);
a35bc64f
NC
2147 /* New buffer size is length of symbol, plus 25, but
2148 then rounded up to the nearest multiple of 128. */
b044cda1 2149 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1579bae1 2150 fixup_name = xmalloc (buffer_len);
b044cda1 2151 }
b7a26f91 2152
b044cda1
CW
2153 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2154
fe213ce2 2155 bh = NULL;
b7a26f91 2156 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
b044cda1 2157 current_sec, /* sym->section, */
b34976b6 2158 rel->address, NULL, TRUE, FALSE, &bh);
fe213ce2 2159
b044cda1
CW
2160 return fixup_name;
2161}
2162
53baae48 2163/* .section .idata$2
775cabad
NC
2164 .rva __nm_thnk_SYM (singleton thunk with name of func)
2165 .long 0
2166 .long 0
2167 .rva __my_dll_iname (name of dll)
2168 .rva __fuNN_SYM (pointer to reference (address) in text) */
b044cda1
CW
2169
2170static bfd *
1579bae1
AM
2171make_import_fixup_entry (const char *name,
2172 const char *fixup_name,
2173 const char *dll_symname,
2174 bfd *parent)
b044cda1 2175{
53baae48
NC
2176 asection *id2;
2177 unsigned char *d2;
b044cda1
CW
2178 char *oname;
2179 bfd *abfd;
2180
1579bae1 2181 oname = xmalloc (20);
b044cda1
CW
2182 sprintf (oname, "fu%06d.o", tmp_seq);
2183 tmp_seq++;
2184
2185 abfd = bfd_create (oname, parent);
2186 bfd_find_target (pe_details->object_target, abfd);
2187 bfd_make_writable (abfd);
2188
2189 bfd_set_format (abfd, bfd_object);
2190 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2191
2192 symptr = 0;
1579bae1 2193 symtab = xmalloc (6 * sizeof (asymbol *));
53baae48 2194 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
775cabad 2195
b044cda1
CW
2196 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2197 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2198 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2199
53baae48
NC
2200 bfd_set_section_size (abfd, id2, 20);
2201 d2 = xmalloc (20);
2202 id2->contents = d2;
2203 memset (d2, 0, 20);
b044cda1
CW
2204
2205 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2206 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2207 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
53baae48 2208 save_relocs (id2);
b044cda1
CW
2209
2210 bfd_set_symtab (abfd, symtab, symptr);
2211
53baae48 2212 bfd_set_section_contents (abfd, id2, d2, 0, 20);
b044cda1
CW
2213
2214 bfd_make_readable (abfd);
2215 return abfd;
2216}
2217
2fa9fc65
NC
2218/* .section .rdata_runtime_pseudo_reloc
2219 .long addend
2220 .rva __fuNN_SYM (pointer to reference (address) in text) */
2221
2222static bfd *
1579bae1
AM
2223make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2224 const char *fixup_name,
2225 int addend,
2226 bfd *parent)
2fa9fc65
NC
2227{
2228 asection *rt_rel;
2229 unsigned char *rt_rel_d;
2230 char *oname;
2231 bfd *abfd;
2232
1579bae1 2233 oname = xmalloc (20);
2fa9fc65
NC
2234 sprintf (oname, "rtr%06d.o", tmp_seq);
2235 tmp_seq++;
2236
2237 abfd = bfd_create (oname, parent);
2238 bfd_find_target (pe_details->object_target, abfd);
2239 bfd_make_writable (abfd);
2240
2241 bfd_set_format (abfd, bfd_object);
2242 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2243
2244 symptr = 0;
1579bae1
AM
2245 symtab = xmalloc (2 * sizeof (asymbol *));
2246 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2247 SEC_HAS_CONTENTS, 2);
2fa9fc65
NC
2248
2249 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2250
2251 bfd_set_section_size (abfd, rt_rel, 8);
1579bae1 2252 rt_rel_d = xmalloc (8);
2fa9fc65
NC
2253 rt_rel->contents = rt_rel_d;
2254 memset (rt_rel_d, 0, 8);
2255 bfd_put_32 (abfd, addend, rt_rel_d);
2256
2257 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2258 save_relocs (rt_rel);
2259
2260 bfd_set_symtab (abfd, symtab, symptr);
2261
2262 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2263
2264 bfd_make_readable (abfd);
2265 return abfd;
2266}
2267
2268/* .section .rdata
a35bc64f 2269 .rva __pei386_runtime_relocator */
2fa9fc65
NC
2270
2271static bfd *
1579bae1 2272pe_create_runtime_relocator_reference (bfd *parent)
2fa9fc65
NC
2273{
2274 asection *extern_rt_rel;
2275 unsigned char *extern_rt_rel_d;
2276 char *oname;
2277 bfd *abfd;
2278
1579bae1 2279 oname = xmalloc (20);
2fa9fc65
NC
2280 sprintf (oname, "ertr%06d.o", tmp_seq);
2281 tmp_seq++;
2282
2283 abfd = bfd_create (oname, parent);
2284 bfd_find_target (pe_details->object_target, abfd);
2285 bfd_make_writable (abfd);
2286
2287 bfd_set_format (abfd, bfd_object);
2288 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2289
2290 symptr = 0;
1579bae1 2291 symtab = xmalloc (2 * sizeof (asymbol *));
2fa9fc65
NC
2292 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2293
00479ba8 2294 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
1579bae1 2295 BSF_NO_FLAGS, 0);
2fa9fc65
NC
2296
2297 bfd_set_section_size (abfd, extern_rt_rel, 4);
1579bae1 2298 extern_rt_rel_d = xmalloc (4);
2fa9fc65
NC
2299 extern_rt_rel->contents = extern_rt_rel_d;
2300
2301 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2302 save_relocs (extern_rt_rel);
2303
2304 bfd_set_symtab (abfd, symtab, symptr);
2305
2306 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2307
2308 bfd_make_readable (abfd);
2309 return abfd;
2310}
2311
b044cda1 2312void
1579bae1 2313pe_create_import_fixup (arelent *rel, asection *s, int addend)
b044cda1
CW
2314{
2315 char buf[300];
fc0a2244 2316 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
b044cda1 2317 struct bfd_link_hash_entry *name_thunk_sym;
db09f25b 2318 const char *name = sym->name;
b044cda1 2319 char *fixup_name = make_import_fixup_mark (rel);
2fa9fc65 2320 bfd *b;
b044cda1
CW
2321
2322 sprintf (buf, U ("_nm_thnk_%s"), name);
2323
2324 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2325
2326 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2327 {
2328 bfd *b = make_singleton_name_thunk (name, output_bfd);
2329 add_bfd_to_link (b, b->filename, &link_info);
2330
775cabad 2331 /* If we ever use autoimport, we have to cast text section writable. */
b34976b6 2332 config.text_read_only = FALSE;
4d8907ac 2333 output_bfd->flags &= ~WP_TEXT;
b044cda1
CW
2334 }
2335
2fa9fc65
NC
2336 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2337 {
2338 extern char * pe_data_import_dll;
2339 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
aa3d9aba 2340
2fa9fc65
NC
2341 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2342 add_bfd_to_link (b, b->filename, &link_info);
2343 }
2344
2345 if (addend != 0)
2346 {
2347 if (link_info.pei386_runtime_pseudo_reloc)
2348 {
2349 if (pe_dll_extra_pe_debug)
2350 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2351 fixup_name, addend);
2352 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2353 add_bfd_to_link (b, b->filename, &link_info);
2354
2355 if (runtime_pseudo_relocs_created == 0)
2356 {
2357 b = pe_create_runtime_relocator_reference (output_bfd);
2358 add_bfd_to_link (b, b->filename, &link_info);
2359 }
2360 runtime_pseudo_relocs_created++;
b34976b6 2361 }
2fa9fc65
NC
2362 else
2363 {
2364 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2365 s->owner, s, rel->address, sym->name);
2366 einfo ("%X");
2367 }
2368 }
b044cda1
CW
2369}
2370
2371
252b5132 2372void
1579bae1 2373pe_dll_generate_implib (def_file *def, const char *impfilename)
252b5132
RH
2374{
2375 int i;
2376 bfd *ar_head;
2377 bfd *ar_tail;
2378 bfd *outarch;
2379 bfd *head = 0;
2380
5aaace27 2381 dll_filename = (def->name) ? def->name : dll_name;
252b5132 2382 dll_symname = xstrdup (dll_filename);
d643799d 2383 for (i = 0; dll_symname[i]; i++)
3882b010 2384 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2385 dll_symname[i] = '_';
2386
bb14f524 2387 unlink_if_ordinary (impfilename);
252b5132
RH
2388
2389 outarch = bfd_openw (impfilename, 0);
2390
2391 if (!outarch)
2392 {
2393 /* xgettext:c-format */
2394 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2395 return;
2396 }
2397
2398 /* xgettext:c-format */
63d85248
NC
2399 info_msg (_("Creating library file: %s\n"), impfilename);
2400
252b5132
RH
2401 bfd_set_format (outarch, bfd_archive);
2402 outarch->has_armap = 1;
2403
5cc18311 2404 /* Work out a reasonable size of things to put onto one line. */
252b5132 2405 ar_head = make_head (outarch);
252b5132 2406
d643799d 2407 for (i = 0; i < def->num_exports; i++)
252b5132 2408 {
86b1cc60 2409 /* The import library doesn't know about the internal name. */
252b5132
RH
2410 char *internal = def->exports[i].internal_name;
2411 bfd *n;
775cabad 2412
ee31fbd0
NC
2413 /* Don't add PRIVATE entries to import lib. */
2414 if (pe_def_file->exports[i].flag_private)
2415 continue;
252b5132 2416 def->exports[i].internal_name = def->exports[i].name;
54727719
NC
2417 n = make_one (def->exports + i, outarch,
2418 ! (def->exports + i)->flag_data);
252b5132
RH
2419 n->next = head;
2420 head = n;
2421 def->exports[i].internal_name = internal;
2422 }
2423
c6c37250
DD
2424 ar_tail = make_tail (outarch);
2425
2426 if (ar_head == NULL || ar_tail == NULL)
2427 return;
2428
86b1cc60 2429 /* Now stick them all into the archive. */
252b5132
RH
2430 ar_head->next = head;
2431 ar_tail->next = ar_head;
2432 head = ar_tail;
2433
2434 if (! bfd_set_archive_head (outarch, head))
36230712 2435 einfo ("%Xbfd_set_archive_head: %E\n");
5cc18311 2436
252b5132 2437 if (! bfd_close (outarch))
36230712 2438 einfo ("%Xbfd_close %s: %E\n", impfilename);
252b5132
RH
2439
2440 while (head != NULL)
2441 {
2442 bfd *n = head->next;
2443 bfd_close (head);
2444 head = n;
2445 }
2446}
2447
2448static void
1579bae1 2449add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
252b5132
RH
2450{
2451 lang_input_statement_type *fake_file;
775cabad 2452
252b5132
RH
2453 fake_file = lang_add_input_file (name,
2454 lang_input_file_is_fake_enum,
2455 NULL);
2456 fake_file->the_bfd = abfd;
2457 ldlang_add_file (fake_file);
775cabad 2458
252b5132 2459 if (!bfd_link_add_symbols (abfd, link_info))
36230712 2460 einfo ("%Xaddsym %s: %E\n", name);
252b5132
RH
2461}
2462
2463void
1579bae1 2464pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
252b5132
RH
2465{
2466 def_file_module *module;
775cabad 2467
d643799d 2468 pe_dll_id_target (bfd_get_target (output_bfd));
252b5132
RH
2469
2470 if (!pe_def_file)
2471 return;
2472
2473 for (module = pe_def_file->modules; module; module = module->next)
2474 {
2475 int i, do_this_dll;
2476
2477 dll_filename = module->name;
2478 dll_symname = xstrdup (module->name);
d643799d 2479 for (i = 0; dll_symname[i]; i++)
3882b010 2480 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2481 dll_symname[i] = '_';
2482
2483 do_this_dll = 0;
2484
d643799d 2485 for (i = 0; i < pe_def_file->num_imports; i++)
252b5132
RH
2486 if (pe_def_file->imports[i].module == module)
2487 {
2488 def_file_export exp;
2489 struct bfd_link_hash_entry *blhe;
b34976b6 2490 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
86b1cc60 2491 /* See if we need this import. */
1579bae1
AM
2492 size_t len = strlen (pe_def_file->imports[i].internal_name);
2493 char *name = xmalloc (len + 2 + 6);
54727719 2494 bfd_boolean include_jmp_stub = FALSE;
c9e38879
NC
2495
2496 if (lead_at)
00479ba8 2497 sprintf (name, "%s",
1579bae1 2498 pe_def_file->imports[i].internal_name);
c9e38879 2499 else
1579bae1
AM
2500 sprintf (name, "%s%s",U (""),
2501 pe_def_file->imports[i].internal_name);
c9e38879 2502
252b5132 2503 blhe = bfd_link_hash_lookup (link_info->hash, name,
b34976b6 2504 FALSE, FALSE, FALSE);
c9e38879 2505
54727719
NC
2506 /* Include the jump stub for <sym> only if the <sym>
2507 is undefined. */
874c8c99
DD
2508 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2509 {
c9e38879 2510 if (lead_at)
00479ba8 2511 sprintf (name, "%s%s", "__imp_",
c9e38879
NC
2512 pe_def_file->imports[i].internal_name);
2513 else
00479ba8 2514 sprintf (name, "%s%s%s", "__imp_", U (""),
c9e38879
NC
2515 pe_def_file->imports[i].internal_name);
2516
874c8c99 2517 blhe = bfd_link_hash_lookup (link_info->hash, name,
b34976b6 2518 FALSE, FALSE, FALSE);
874c8c99 2519 }
54727719
NC
2520 else
2521 include_jmp_stub = TRUE;
2522
252b5132 2523 free (name);
c9e38879 2524
252b5132
RH
2525 if (blhe && blhe->type == bfd_link_hash_undefined)
2526 {
2527 bfd *one;
86b1cc60 2528 /* We do. */
252b5132
RH
2529 if (!do_this_dll)
2530 {
2531 bfd *ar_head = make_head (output_bfd);
2532 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2533 do_this_dll = 1;
2534 }
2535 exp.internal_name = pe_def_file->imports[i].internal_name;
2536 exp.name = pe_def_file->imports[i].name;
2537 exp.ordinal = pe_def_file->imports[i].ordinal;
2538 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2539 exp.flag_private = 0;
2540 exp.flag_constant = 0;
939ba9d0 2541 exp.flag_data = pe_def_file->imports[i].data;
252b5132 2542 exp.flag_noname = exp.name ? 0 : 1;
54727719 2543 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
252b5132
RH
2544 add_bfd_to_link (one, one->filename, link_info);
2545 }
2546 }
2547 if (do_this_dll)
2548 {
2549 bfd *ar_tail = make_tail (output_bfd);
2550 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2551 }
2552
2553 free (dll_symname);
2554 }
2555}
2556
775cabad 2557/* We were handed a *.DLL file. Parse it and turn it into a set of
b34976b6
AM
2558 IMPORTS directives in the def file. Return TRUE if the file was
2559 handled, FALSE if not. */
252b5132
RH
2560
2561static unsigned int
1579bae1 2562pe_get16 (bfd *abfd, int where)
252b5132
RH
2563{
2564 unsigned char b[2];
775cabad 2565
db09f25b
AM
2566 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2567 bfd_bread (b, (bfd_size_type) 2, abfd);
d643799d 2568 return b[0] + (b[1] << 8);
252b5132
RH
2569}
2570
2571static unsigned int
1579bae1 2572pe_get32 (bfd *abfd, int where)
252b5132
RH
2573{
2574 unsigned char b[4];
775cabad 2575
db09f25b
AM
2576 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2577 bfd_bread (b, (bfd_size_type) 4, abfd);
d643799d 2578 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2579}
2580
252b5132 2581static unsigned int
1579bae1 2582pe_as32 (void *ptr)
252b5132
RH
2583{
2584 unsigned char *b = ptr;
775cabad 2585
d643799d 2586 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2587}
2588
b34976b6 2589bfd_boolean
1579bae1 2590pe_implied_import_dll (const char *filename)
252b5132
RH
2591{
2592 bfd *dll;
2593 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2594 unsigned long export_rva, export_size, nsections, secptr, expptr;
939ba9d0 2595 unsigned long exp_funcbase;
47639182
AM
2596 unsigned char *expdata;
2597 char *erva;
252b5132 2598 unsigned long name_rvas, ordinals, nexp, ordbase;
1069dd8d 2599 const char *dll_name;
939ba9d0
NC
2600 /* Initialization with start > end guarantees that is_data
2601 will not be set by mistake, and avoids compiler warning. */
2602 unsigned long data_start = 1;
661a32f7
DS
2603 unsigned long data_end = 0;
2604 unsigned long rdata_start = 1;
2605 unsigned long rdata_end = 0;
2606 unsigned long bss_start = 1;
2607 unsigned long bss_end = 0;
252b5132
RH
2608
2609 /* No, I can't use bfd here. kernel32.dll puts its export table in
5cc18311 2610 the middle of the .rdata section. */
c6c37250 2611 dll = bfd_openr (filename, pe_details->target_name);
252b5132
RH
2612 if (!dll)
2613 {
36230712 2614 einfo ("%Xopen %s: %E\n", filename);
b34976b6 2615 return FALSE;
252b5132 2616 }
775cabad 2617
86b1cc60 2618 /* PEI dlls seem to be bfd_objects. */
252b5132
RH
2619 if (!bfd_check_format (dll, bfd_object))
2620 {
2621 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
b34976b6 2622 return FALSE;
252b5132
RH
2623 }
2624
939ba9d0 2625 /* Get pe_header, optional header and numbers of export entries. */
252b5132
RH
2626 pe_header_offset = pe_get32 (dll, 0x3c);
2627 opthdr_ofs = pe_header_offset + 4 + 20;
99ad8390
NC
2628#ifdef pe_use_x86_64
2629 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2630#else
252b5132 2631 num_entries = pe_get32 (dll, opthdr_ofs + 92);
99ad8390 2632#endif
775cabad
NC
2633
2634 if (num_entries < 1) /* No exports. */
b34976b6 2635 return FALSE;
775cabad 2636
99ad8390
NC
2637#ifdef pe_use_x86_64
2638 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2639 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2640#else
252b5132
RH
2641 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2642 export_size = pe_get32 (dll, opthdr_ofs + 100);
99ad8390
NC
2643#endif
2644
252b5132
RH
2645 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2646 secptr = (pe_header_offset + 4 + 20 +
2647 pe_get16 (dll, pe_header_offset + 4 + 16));
2648 expptr = 0;
775cabad 2649
1579bae1 2650 /* Get the rva and size of the export section. */
d643799d 2651 for (i = 0; i < nsections; i++)
252b5132
RH
2652 {
2653 char sname[8];
2654 unsigned long secptr1 = secptr + 40 * i;
2655 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2656 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2657 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
775cabad 2658
db09f25b
AM
2659 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2660 bfd_bread (sname, (bfd_size_type) 8, dll);
775cabad 2661
d643799d 2662 if (vaddr <= export_rva && vaddr + vsize > export_rva)
252b5132
RH
2663 {
2664 expptr = fptr + (export_rva - vaddr);
2665 if (export_rva + export_size > vaddr + vsize)
2666 export_size = vsize - (export_rva - vaddr);
2667 break;
2668 }
2669 }
2670
939ba9d0 2671 /* Scan sections and store the base and size of the
1579bae1 2672 data and bss segments in data/base_start/end. */
939ba9d0
NC
2673 for (i = 0; i < nsections; i++)
2674 {
2675 unsigned long secptr1 = secptr + 40 * i;
2676 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2677 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2678 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2679 char sec_name[9];
2680
2681 sec_name[8] = '\0';
2682 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2683 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2684
2685 if (strcmp(sec_name,".data") == 0)
2686 {
2687 data_start = vaddr;
2688 data_end = vaddr + vsize;
2689
661a32f7
DS
2690 if (pe_dll_extra_pe_debug)
2691 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2692 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2693 }
2694 else if (strcmp(sec_name,".rdata") == 0)
2695 {
2696 rdata_start = vaddr;
2697 rdata_end = vaddr + vsize;
2698
939ba9d0
NC
2699 if (pe_dll_extra_pe_debug)
2700 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2701 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
1579bae1 2702 }
939ba9d0
NC
2703 else if (strcmp (sec_name,".bss") == 0)
2704 {
2705 bss_start = vaddr;
2706 bss_end = vaddr + vsize;
2707
2708 if (pe_dll_extra_pe_debug)
2709 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2710 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2711 }
2712 }
2713
1579bae1 2714 expdata = xmalloc (export_size);
db09f25b
AM
2715 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2716 bfd_bread (expdata, (bfd_size_type) export_size, dll);
47639182 2717 erva = (char *) expdata - export_rva;
252b5132
RH
2718
2719 if (pe_def_file == 0)
d643799d 2720 pe_def_file = def_file_empty ();
252b5132 2721
d643799d
KH
2722 nexp = pe_as32 (expdata + 24);
2723 name_rvas = pe_as32 (expdata + 32);
2724 ordinals = pe_as32 (expdata + 36);
2725 ordbase = pe_as32 (expdata + 16);
939ba9d0 2726 exp_funcbase = pe_as32 (expdata + 28);
775cabad 2727
939ba9d0
NC
2728 /* Use internal dll name instead of filename
2729 to enable symbolic dll linking. */
47639182 2730 dll_name = erva + pe_as32 (expdata + 12);
939ba9d0 2731
a35bc64f
NC
2732 /* Check to see if the dll has already been added to
2733 the definition list and if so return without error.
2734 This avoids multiple symbol definitions. */
2735 if (def_get_module (pe_def_file, dll_name))
2736 {
2737 if (pe_dll_extra_pe_debug)
2738 printf ("%s is already loaded\n", dll_name);
2739 return TRUE;
2740 }
2741
939ba9d0 2742 /* Iterate through the list of symbols. */
d643799d 2743 for (i = 0; i < nexp; i++)
252b5132 2744 {
939ba9d0 2745 /* Pointer to the names vector. */
d643799d 2746 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
252b5132 2747 def_file_import *imp;
1579bae1 2748 /* Pointer to the function address vector. */
939ba9d0
NC
2749 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2750 int is_data = 0;
2751
2752 /* Skip unwanted symbols, which are
2753 exported in buggy auto-import releases. */
0112cd26 2754 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
939ba9d0 2755 {
661a32f7
DS
2756 /* is_data is true if the address is in the data, rdata or bss
2757 segment. */
939ba9d0
NC
2758 is_data =
2759 (func_rva >= data_start && func_rva < data_end)
661a32f7 2760 || (func_rva >= rdata_start && func_rva < rdata_end)
939ba9d0
NC
2761 || (func_rva >= bss_start && func_rva < bss_end);
2762
2763 imp = def_file_add_import (pe_def_file, erva + name_rva,
2764 dll_name, i, 0);
396a2467 2765 /* Mark symbol type. */
939ba9d0 2766 imp->data = is_data;
1579bae1 2767
939ba9d0
NC
2768 if (pe_dll_extra_pe_debug)
2769 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2770 __FUNCTION__, dll_name, erva + name_rva,
2771 func_rva, is_data ? "(data)" : "");
2772 }
252b5132
RH
2773 }
2774
b34976b6 2775 return TRUE;
252b5132
RH
2776}
2777
775cabad
NC
2778/* These are the main functions, called from the emulation. The first
2779 is called after the bfds are read, so we can guess at how much space
2780 we need. The second is called after everything is placed, so we
2781 can put the right values in place. */
252b5132
RH
2782
2783void
1579bae1 2784pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
252b5132 2785{
c6c37250 2786 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
2787 process_def_file (abfd, info);
2788
1579bae1 2789 if (pe_def_file->num_exports == 0 && !info->shared)
2b817be1
NC
2790 return;
2791
252b5132 2792 generate_edata (abfd, info);
c6c37250
DD
2793 build_filler_bfd (1);
2794}
2795
2796void
1579bae1 2797pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
c6c37250
DD
2798{
2799 pe_dll_id_target (bfd_get_target (abfd));
2800 build_filler_bfd (0);
252b5132
RH
2801}
2802
2803void
1579bae1 2804pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
252b5132 2805{
c6c37250 2806 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
2807 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2808
2809 generate_reloc (abfd, info);
2810 if (reloc_sz > 0)
2811 {
2812 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2813
2814 /* Resize the sections. */
38975f9e 2815 lang_reset_memory_regions ();
e9ee469a 2816 lang_size_sections (NULL, TRUE);
252b5132
RH
2817
2818 /* Redo special stuff. */
2819 ldemul_after_allocation ();
2820
2821 /* Do the assignments again. */
e9ee469a 2822 lang_do_assignments ();
252b5132
RH
2823 }
2824
2825 fill_edata (abfd, info);
2826
db8acf26 2827 if (info->shared && !info->pie)
2b817be1 2828 pe_data (abfd)->dll = 1;
252b5132
RH
2829
2830 edata_s->contents = edata_d;
2831 reloc_s->contents = reloc_d;
2832}
c6c37250
DD
2833
2834void
1579bae1 2835pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
c6c37250
DD
2836{
2837 pe_dll_id_target (bfd_get_target (abfd));
2838 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2839
2840 generate_reloc (abfd, info);
2841 if (reloc_sz > 0)
2842 {
2843 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2844
2845 /* Resize the sections. */
38975f9e 2846 lang_reset_memory_regions ();
e9ee469a 2847 lang_size_sections (NULL, TRUE);
c6c37250
DD
2848
2849 /* Redo special stuff. */
2850 ldemul_after_allocation ();
2851
2852 /* Do the assignments again. */
e9ee469a 2853 lang_do_assignments ();
c6c37250
DD
2854 }
2855 reloc_s->contents = reloc_d;
2856}
ff2bdb9c
CF
2857
2858bfd_boolean
2859pe_bfd_is_dll (bfd *abfd)
2860{
2861 return (bfd_get_format (abfd) == bfd_object
2862 && obj_pe (abfd)
2863 && pe_data (abfd)->dll);
2864}