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