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