Include the spu_ovl ASCII form in the repository files.
[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
49314f87
DS
1259 /* Don't create relocs for undefined weak symbols. */
1260 if (sym->flags == BSF_WEAK)
1261 {
1262 struct bfd_link_hash_entry *blhe
1263 = bfd_link_hash_lookup (info->hash, sym->name,
1264 FALSE, FALSE, FALSE);
1265 if (!blhe || blhe->type != bfd_link_hash_defined)
1266 continue;
1267 }
1268
c6c37250
DD
1269 sym_vma = (relocs[i]->addend
1270 + sym->value
1271 + sym->section->vma
1272 + sym->section->output_offset
1273 + sym->section->output_section->vma);
1274 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
5cc18311 1275
344a211f 1276#define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
5cc18311 1277
344a211f
NC
1278 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1279 relocs[i]->howto->rightshift)
252b5132 1280 {
99ad8390
NC
1281#ifdef pe_use_x86_64
1282 case BITS_AND_SHIFT (64, 0):
1283 reloc_data[total_relocs].type = 10;
1284 total_relocs++;
1285 break;
1286#endif
344a211f 1287 case BITS_AND_SHIFT (32, 0):
c6c37250
DD
1288 reloc_data[total_relocs].type = 3;
1289 total_relocs++;
252b5132 1290 break;
344a211f
NC
1291 case BITS_AND_SHIFT (16, 0):
1292 reloc_data[total_relocs].type = 2;
1293 total_relocs++;
1294 break;
1295 case BITS_AND_SHIFT (16, 16):
1296 reloc_data[total_relocs].type = 4;
86b1cc60
KH
1297 /* FIXME: we can't know the symbol's right value
1298 yet, but we probably can safely assume that
1299 CE will relocate us in 64k blocks, so leaving
1300 it zero is safe. */
344a211f
NC
1301 reloc_data[total_relocs].extra = 0;
1302 total_relocs++;
1303 break;
1304 case BITS_AND_SHIFT (26, 2):
1305 reloc_data[total_relocs].type = 5;
1306 total_relocs++;
1307 break;
fea39bcb 1308 case BITS_AND_SHIFT (24, 2):
d3793eaa
NC
1309 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1310 Those ARM_xxx definitions should go in proper
1311 header someday. */
1312 if (relocs[i]->howto->type == 0
1313 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1314 || relocs[i]->howto->type == 5)
fea39bcb
NC
1315 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1316 that has already been fully processed during a
1317 previous link stage, so ignore it here. */
1318 break;
1319 /* Fall through. */
252b5132
RH
1320 default:
1321 /* xgettext:c-format */
1322 einfo (_("%XError: %d-bit reloc in dll\n"),
1323 relocs[i]->howto->bitsize);
1324 break;
1325 }
1326 }
1327 }
1328 free (relocs);
86b1cc60
KH
1329 /* Warning: the allocated symbols are remembered in BFD and
1330 reused later, so don't free them! */
252b5132
RH
1331 }
1332 }
1333
1334 /* At this point, we have total_relocs relocation addresses in
1335 reloc_addresses, which are all suitable for the .reloc section.
5cc18311 1336 We must now create the new sections. */
c6c37250 1337 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
252b5132
RH
1338
1339 for (i = 0; i < total_relocs; i++)
1340 {
6ca0987a 1341 bfd_vma this_page = (reloc_data[i].vma >> 12);
5cc18311 1342
252b5132
RH
1343 if (this_page != sec_page)
1344 {
775cabad 1345 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
252b5132
RH
1346 reloc_sz += 8;
1347 sec_page = this_page;
1348 }
5cc18311 1349
252b5132 1350 reloc_sz += 2;
5cc18311 1351
344a211f
NC
1352 if (reloc_data[i].type == 4)
1353 reloc_sz += 2;
252b5132 1354 }
b7a26f91 1355
775cabad 1356 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1579bae1 1357 reloc_d = xmalloc (reloc_sz);
6ca0987a 1358 sec_page = (bfd_vma) -1;
252b5132 1359 reloc_sz = 0;
6ca0987a 1360 page_ptr = (bfd_vma) -1;
252b5132 1361 page_count = 0;
775cabad 1362
252b5132
RH
1363 for (i = 0; i < total_relocs; i++)
1364 {
6ca0987a
KT
1365 bfd_vma rva = reloc_data[i].vma - image_base;
1366 bfd_vma this_page = (rva & ~0xfff);
775cabad 1367
252b5132
RH
1368 if (this_page != sec_page)
1369 {
1370 while (reloc_sz & 3)
1371 reloc_d[reloc_sz++] = 0;
775cabad 1372
6ca0987a 1373 if (page_ptr != (bfd_vma) -1)
252b5132 1374 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1375
252b5132
RH
1376 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1377 page_ptr = reloc_sz;
1378 reloc_sz += 8;
1379 sec_page = this_page;
1380 page_count = 0;
1381 }
775cabad 1382
d643799d 1383 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
c6c37250 1384 reloc_d + reloc_sz);
252b5132 1385 reloc_sz += 2;
775cabad 1386
c6c37250
DD
1387 if (reloc_data[i].type == 4)
1388 {
1389 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1390 reloc_sz += 2;
1391 }
775cabad 1392
252b5132
RH
1393 page_count++;
1394 }
775cabad 1395
252b5132
RH
1396 while (reloc_sz & 3)
1397 reloc_d[reloc_sz++] = 0;
775cabad 1398
6ca0987a 1399 if (page_ptr != (bfd_vma) -1)
252b5132 1400 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1401
eea6121a 1402 while (reloc_sz < reloc_s->size)
252b5132
RH
1403 reloc_d[reloc_sz++] = 0;
1404}
1405
775cabad
NC
1406/* Given the exiting def_file structure, print out a .DEF file that
1407 corresponds to it. */
252b5132
RH
1408
1409static void
1579bae1 1410quoteput (char *s, FILE *f, int needs_quotes)
252b5132
RH
1411{
1412 char *cp;
775cabad 1413
252b5132
RH
1414 for (cp = s; *cp; cp++)
1415 if (*cp == '\''
1416 || *cp == '"'
1417 || *cp == '\\'
3882b010 1418 || ISSPACE (*cp)
252b5132
RH
1419 || *cp == ','
1420 || *cp == ';')
1421 needs_quotes = 1;
775cabad 1422
252b5132
RH
1423 if (needs_quotes)
1424 {
1425 putc ('"', f);
775cabad 1426
252b5132
RH
1427 while (*s)
1428 {
1429 if (*s == '"' || *s == '\\')
1430 putc ('\\', f);
775cabad 1431
252b5132
RH
1432 putc (*s, f);
1433 s++;
1434 }
775cabad 1435
252b5132
RH
1436 putc ('"', f);
1437 }
1438 else
1439 fputs (s, f);
1440}
1441
1442void
1579bae1 1443pe_dll_generate_def_file (const char *pe_out_def_filename)
252b5132
RH
1444{
1445 int i;
1446 FILE *out = fopen (pe_out_def_filename, "w");
775cabad 1447
252b5132 1448 if (out == NULL)
775cabad
NC
1449 /* xgettext:c-format */
1450 einfo (_("%s: Can't open output def file %s\n"),
1451 program_name, pe_out_def_filename);
252b5132
RH
1452
1453 if (pe_def_file)
1454 {
1455 if (pe_def_file->name)
1456 {
1457 if (pe_def_file->is_dll)
1458 fprintf (out, "LIBRARY ");
1459 else
1460 fprintf (out, "NAME ");
775cabad 1461
252b5132 1462 quoteput (pe_def_file->name, out, 1);
775cabad 1463
f13a99db 1464 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
0ead4f8d
KT
1465 {
1466 fprintf (out, " BASE=0x");
1467 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1468 }
252b5132
RH
1469 fprintf (out, "\n");
1470 }
1471
1472 if (pe_def_file->description)
1473 {
1474 fprintf (out, "DESCRIPTION ");
1475 quoteput (pe_def_file->description, out, 1);
1476 fprintf (out, "\n");
1477 }
1478
1479 if (pe_def_file->version_minor != -1)
1480 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1481 pe_def_file->version_minor);
1482 else if (pe_def_file->version_major != -1)
1483 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1484
1485 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1486 fprintf (out, "\n");
1487
1488 if (pe_def_file->stack_commit != -1)
1489 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1490 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1491 else if (pe_def_file->stack_reserve != -1)
1492 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
775cabad 1493
252b5132
RH
1494 if (pe_def_file->heap_commit != -1)
1495 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1496 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1497 else if (pe_def_file->heap_reserve != -1)
1498 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1499
1500 if (pe_def_file->num_section_defs > 0)
1501 {
1502 fprintf (out, "\nSECTIONS\n\n");
775cabad 1503
252b5132
RH
1504 for (i = 0; i < pe_def_file->num_section_defs; i++)
1505 {
1506 fprintf (out, " ");
1507 quoteput (pe_def_file->section_defs[i].name, out, 0);
775cabad 1508
252b5132
RH
1509 if (pe_def_file->section_defs[i].class)
1510 {
1511 fprintf (out, " CLASS ");
1512 quoteput (pe_def_file->section_defs[i].class, out, 0);
1513 }
775cabad 1514
252b5132
RH
1515 if (pe_def_file->section_defs[i].flag_read)
1516 fprintf (out, " READ");
775cabad 1517
252b5132
RH
1518 if (pe_def_file->section_defs[i].flag_write)
1519 fprintf (out, " WRITE");
775cabad 1520
252b5132
RH
1521 if (pe_def_file->section_defs[i].flag_execute)
1522 fprintf (out, " EXECUTE");
775cabad 1523
252b5132
RH
1524 if (pe_def_file->section_defs[i].flag_shared)
1525 fprintf (out, " SHARED");
775cabad 1526
252b5132
RH
1527 fprintf (out, "\n");
1528 }
1529 }
1530
1531 if (pe_def_file->num_exports > 0)
1532 {
b044cda1 1533 fprintf (out, "EXPORTS\n");
775cabad 1534
252b5132
RH
1535 for (i = 0; i < pe_def_file->num_exports; i++)
1536 {
1537 def_file_export *e = pe_def_file->exports + i;
1538 fprintf (out, " ");
1539 quoteput (e->name, out, 0);
775cabad 1540
252b5132
RH
1541 if (e->internal_name && strcmp (e->internal_name, e->name))
1542 {
1543 fprintf (out, " = ");
1544 quoteput (e->internal_name, out, 0);
1545 }
775cabad 1546
252b5132
RH
1547 if (e->ordinal != -1)
1548 fprintf (out, " @%d", e->ordinal);
775cabad 1549
252b5132
RH
1550 if (e->flag_private)
1551 fprintf (out, " PRIVATE");
775cabad 1552
252b5132
RH
1553 if (e->flag_constant)
1554 fprintf (out, " CONSTANT");
775cabad 1555
252b5132
RH
1556 if (e->flag_noname)
1557 fprintf (out, " NONAME");
775cabad 1558
252b5132
RH
1559 if (e->flag_data)
1560 fprintf (out, " DATA");
1561
1562 fprintf (out, "\n");
1563 }
1564 }
1565
1566 if (pe_def_file->num_imports > 0)
1567 {
1568 fprintf (out, "\nIMPORTS\n\n");
775cabad 1569
252b5132
RH
1570 for (i = 0; i < pe_def_file->num_imports; i++)
1571 {
1572 def_file_import *im = pe_def_file->imports + i;
1573 fprintf (out, " ");
775cabad 1574
252b5132
RH
1575 if (im->internal_name
1576 && (!im->name || strcmp (im->internal_name, im->name)))
1577 {
1578 quoteput (im->internal_name, out, 0);
1579 fprintf (out, " = ");
1580 }
775cabad 1581
252b5132
RH
1582 quoteput (im->module->name, out, 0);
1583 fprintf (out, ".");
775cabad 1584
252b5132
RH
1585 if (im->name)
1586 quoteput (im->name, out, 0);
1587 else
1588 fprintf (out, "%d", im->ordinal);
775cabad 1589
252b5132
RH
1590 fprintf (out, "\n");
1591 }
1592 }
1593 }
1594 else
1595 fprintf (out, _("; no contents available\n"));
1596
1597 if (fclose (out) == EOF)
775cabad
NC
1598 /* xgettext:c-format */
1599 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
252b5132
RH
1600}
1601
775cabad 1602/* Generate the import library. */
252b5132
RH
1603
1604static asymbol **symtab;
1605static int symptr;
1606static int tmp_seq;
1607static const char *dll_filename;
1608static char *dll_symname;
1609
1610#define UNDSEC (asection *) &bfd_und_section
1611
1612static asection *
1579bae1 1613quick_section (bfd *abfd, const char *name, int flags, int align)
252b5132
RH
1614{
1615 asection *sec;
1616 asymbol *sym;
1617
1618 sec = bfd_make_section_old_way (abfd, name);
86b1cc60 1619 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
252b5132 1620 bfd_set_section_alignment (abfd, sec, align);
86b1cc60 1621 /* Remember to undo this before trying to link internally! */
252b5132
RH
1622 sec->output_section = sec;
1623
1624 sym = bfd_make_empty_symbol (abfd);
1625 symtab[symptr++] = sym;
1626 sym->name = sec->name;
1627 sym->section = sec;
1628 sym->flags = BSF_LOCAL;
1629 sym->value = 0;
1630
1631 return sec;
1632}
1633
1634static void
1579bae1
AM
1635quick_symbol (bfd *abfd,
1636 const char *n1,
1637 const char *n2,
1638 const char *n3,
1639 asection *sec,
1640 int flags,
1641 int addr)
252b5132
RH
1642{
1643 asymbol *sym;
1579bae1 1644 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
775cabad 1645
252b5132
RH
1646 strcpy (name, n1);
1647 strcat (name, n2);
1648 strcat (name, n3);
1649 sym = bfd_make_empty_symbol (abfd);
1650 sym->name = name;
1651 sym->section = sec;
1652 sym->flags = flags;
1653 sym->value = addr;
1654 symtab[symptr++] = sym;
1655}
1656
1657static arelent *reltab = 0;
1658static int relcount = 0, relsize = 0;
1659
1660static void
0ead4f8d 1661quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
252b5132 1662{
1579bae1 1663 if (relcount >= relsize - 1)
252b5132
RH
1664 {
1665 relsize += 10;
1666 if (reltab)
1579bae1 1667 reltab = xrealloc (reltab, relsize * sizeof (arelent));
252b5132 1668 else
1579bae1 1669 reltab = xmalloc (relsize * sizeof (arelent));
252b5132
RH
1670 }
1671 reltab[relcount].address = address;
1672 reltab[relcount].addend = 0;
1673 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1674 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1675 relcount++;
1676}
1677
1678static void
1679save_relocs (asection *sec)
1680{
1681 int i;
775cabad 1682
252b5132
RH
1683 sec->relocation = reltab;
1684 sec->reloc_count = relcount;
1579bae1 1685 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
d643799d 1686 for (i = 0; i < relcount; i++)
252b5132
RH
1687 sec->orelocation[i] = sec->relocation + i;
1688 sec->orelocation[relcount] = 0;
1689 sec->flags |= SEC_RELOC;
1690 reltab = 0;
1691 relcount = relsize = 0;
1692}
1693
775cabad
NC
1694/* .section .idata$2
1695 .global __head_my_dll
1696 __head_my_dll:
1697 .rva hname
1698 .long 0
1699 .long 0
1700 .rva __my_dll_iname
1701 .rva fthunk
b7a26f91 1702
775cabad
NC
1703 .section .idata$5
1704 .long 0
1705 fthunk:
b7a26f91 1706
775cabad
NC
1707 .section .idata$4
1708 .long 0
1709 hname: */
252b5132
RH
1710
1711static bfd *
1579bae1 1712make_head (bfd *parent)
252b5132
RH
1713{
1714 asection *id2, *id5, *id4;
1715 unsigned char *d2, *d5, *d4;
1716 char *oname;
1717 bfd *abfd;
1718
1579bae1 1719 oname = xmalloc (20);
252b5132
RH
1720 sprintf (oname, "d%06d.o", tmp_seq);
1721 tmp_seq++;
1722
1723 abfd = bfd_create (oname, parent);
c6c37250 1724 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1725 bfd_make_writable (abfd);
1726
1727 bfd_set_format (abfd, bfd_object);
c6c37250 1728 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1729
1730 symptr = 0;
1579bae1 1731 symtab = xmalloc (6 * sizeof (asymbol *));
252b5132
RH
1732 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1733 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1734 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
d643799d
KH
1735 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1736 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
c6c37250
DD
1737
1738 /* OK, pay attention here. I got confused myself looking back at
1739 it. We create a four-byte section to mark the beginning of the
1740 list, and we include an offset of 4 in the section, so that the
1741 pointer to the list points to the *end* of this section, which is
5cc18311 1742 the start of the list of sections from other objects. */
252b5132
RH
1743
1744 bfd_set_section_size (abfd, id2, 20);
1579bae1 1745 d2 = xmalloc (20);
252b5132
RH
1746 id2->contents = d2;
1747 memset (d2, 0, 20);
5f69259e 1748 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
252b5132
RH
1749 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1750 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1751 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1752 save_relocs (id2);
1753
99ad8390
NC
1754 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1755 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 1756 id5->contents = d5;
99ad8390 1757 memset (d5, 0, PE_IDATA5_SIZE);
252b5132 1758
99ad8390
NC
1759 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1760 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 1761 id4->contents = d4;
99ad8390 1762 memset (d4, 0, PE_IDATA4_SIZE);
252b5132
RH
1763
1764 bfd_set_symtab (abfd, symtab, symptr);
1765
1766 bfd_set_section_contents (abfd, id2, d2, 0, 20);
99ad8390
NC
1767 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1768 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
5cc18311 1769
252b5132
RH
1770 bfd_make_readable (abfd);
1771 return abfd;
1772}
1773
775cabad
NC
1774/* .section .idata$4
1775 .long 0
99ad8390 1776 [.long 0] for PE+
775cabad
NC
1777 .section .idata$5
1778 .long 0
99ad8390 1779 [.long 0] for PE+
775cabad
NC
1780 .section idata$7
1781 .global __my_dll_iname
1782 __my_dll_iname:
1783 .asciz "my.dll" */
252b5132
RH
1784
1785static bfd *
1579bae1 1786make_tail (bfd *parent)
252b5132
RH
1787{
1788 asection *id4, *id5, *id7;
1789 unsigned char *d4, *d5, *d7;
1790 int len;
1791 char *oname;
1792 bfd *abfd;
1793
1579bae1 1794 oname = xmalloc (20);
252b5132
RH
1795 sprintf (oname, "d%06d.o", tmp_seq);
1796 tmp_seq++;
1797
1798 abfd = bfd_create (oname, parent);
c6c37250 1799 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1800 bfd_make_writable (abfd);
1801
1802 bfd_set_format (abfd, bfd_object);
c6c37250 1803 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1804
1805 symptr = 0;
1579bae1 1806 symtab = xmalloc (5 * sizeof (asymbol *));
252b5132
RH
1807 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1808 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1809 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
d643799d 1810 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
252b5132 1811
99ad8390
NC
1812 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1813 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 1814 id4->contents = d4;
99ad8390 1815 memset (d4, 0, PE_IDATA4_SIZE);
252b5132 1816
99ad8390
NC
1817 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1818 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 1819 id5->contents = d5;
99ad8390 1820 memset (d5, 0, PE_IDATA5_SIZE);
252b5132 1821
d643799d 1822 len = strlen (dll_filename) + 1;
252b5132 1823 if (len & 1)
d643799d 1824 len++;
252b5132 1825 bfd_set_section_size (abfd, id7, len);
1579bae1 1826 d7 = xmalloc (len);
252b5132 1827 id7->contents = d7;
47639182 1828 strcpy ((char *) d7, dll_filename);
e916811a
CF
1829 /* If len was odd, the above
1830 strcpy leaves behind an undefined byte. That is harmless,
1831 but we set it to 0 just so the binary dumps are pretty. */
1832 d7[len - 1] = 0;
252b5132
RH
1833
1834 bfd_set_symtab (abfd, symtab, symptr);
1835
99ad8390
NC
1836 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1837 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
252b5132
RH
1838 bfd_set_section_contents (abfd, id7, d7, 0, len);
1839
1840 bfd_make_readable (abfd);
1841 return abfd;
1842}
1843
775cabad
NC
1844/* .text
1845 .global _function
1846 .global ___imp_function
1847 .global __imp__function
1848 _function:
1849 jmp *__imp__function:
b7a26f91 1850
775cabad
NC
1851 .section idata$7
1852 .long __head_my_dll
b7a26f91 1853
775cabad
NC
1854 .section .idata$5
1855 ___imp_function:
1856 __imp__function:
1857 iat?
1858 .section .idata$4
1859 iat?
1860 .section .idata$6
1861 ID<ordinal>:
1862 .short <hint>
1863 .asciz "function" xlate? (add underscore, kill at) */
1864
e916811a 1865static const unsigned char jmp_ix86_bytes[] =
775cabad 1866{
252b5132
RH
1867 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1868};
1869
775cabad
NC
1870/* _function:
1871 mov.l ip+8,r0
1872 mov.l @r0,r0
1873 jmp @r0
1874 nop
1875 .dw __imp_function */
344a211f 1876
e916811a 1877static const unsigned char jmp_sh_bytes[] =
775cabad 1878{
344a211f
NC
1879 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1880};
1881
775cabad
NC
1882/* _function:
1883 lui $t0,<high:__imp_function>
1884 lw $t0,<low:__imp_function>
1885 jr $t0
1886 nop */
344a211f 1887
e916811a 1888static const unsigned char jmp_mips_bytes[] =
775cabad 1889{
344a211f
NC
1890 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1891 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1892};
252b5132 1893
e916811a 1894static const unsigned char jmp_arm_bytes[] =
53baae48
NC
1895{
1896 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1897 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1898 0, 0, 0, 0
1899};
1900
1901
252b5132 1902static bfd *
54727719 1903make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
252b5132
RH
1904{
1905 asection *tx, *id7, *id5, *id4, *id6;
23a87948 1906 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
252b5132
RH
1907 int len;
1908 char *oname;
1909 bfd *abfd;
e916811a 1910 const unsigned char *jmp_bytes = NULL;
f0c87f88 1911 int jmp_byte_count = 0;
c6c37250 1912
54727719
NC
1913 /* Include the jump stub section only if it is needed. A jump
1914 stub is needed if the symbol being imported <sym> is a function
1915 symbol and there is at least one undefined reference to that
1916 symbol. In other words, if all the import references to <sym> are
1917 explicitly through _declspec(dllimport) then the jump stub is not
1918 needed. */
1919 if (include_jmp_stub)
c6c37250 1920 {
54727719
NC
1921 switch (pe_details->pe_arch)
1922 {
1923 case PE_ARCH_i386:
1924 jmp_bytes = jmp_ix86_bytes;
1925 jmp_byte_count = sizeof (jmp_ix86_bytes);
1926 break;
1927 case PE_ARCH_sh:
1928 jmp_bytes = jmp_sh_bytes;
1929 jmp_byte_count = sizeof (jmp_sh_bytes);
1930 break;
1931 case PE_ARCH_mips:
1932 jmp_bytes = jmp_mips_bytes;
1933 jmp_byte_count = sizeof (jmp_mips_bytes);
1934 break;
1935 case PE_ARCH_arm:
1936 case PE_ARCH_arm_epoc:
1937 case PE_ARCH_arm_wince:
1938 jmp_bytes = jmp_arm_bytes;
1939 jmp_byte_count = sizeof (jmp_arm_bytes);
1940 break;
1941 default:
1942 abort ();
1943 }
c6c37250 1944 }
252b5132 1945
1579bae1 1946 oname = xmalloc (20);
252b5132
RH
1947 sprintf (oname, "d%06d.o", tmp_seq);
1948 tmp_seq++;
1949
1950 abfd = bfd_create (oname, parent);
c6c37250 1951 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1952 bfd_make_writable (abfd);
1953
1954 bfd_set_format (abfd, bfd_object);
c6c37250 1955 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1956
1957 symptr = 0;
1579bae1 1958 symtab = xmalloc (11 * sizeof (asymbol *));
252b5132
RH
1959 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1960 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1961 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1962 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1963 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
b34976b6 1964
c9e38879
NC
1965 if (*exp->internal_name == '@')
1966 {
1579bae1
AM
1967 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1968 BSF_GLOBAL, 0);
54727719 1969 if (include_jmp_stub)
4b7f0676 1970 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
00479ba8 1971 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
1579bae1 1972 BSF_GLOBAL, 0);
c9e38879
NC
1973 /* Fastcall applies only to functions,
1974 so no need for auto-import symbol. */
1975 }
1976 else
1977 {
4b7f0676
NC
1978 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1979 BSF_GLOBAL, 0);
54727719 1980 if (include_jmp_stub)
1579bae1
AM
1981 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1982 BSF_GLOBAL, 0);
00479ba8 1983 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
1579bae1 1984 BSF_GLOBAL, 0);
c9e38879 1985 /* Symbol to reference ord/name of imported
1579bae1 1986 data symbol, used to implement auto-import. */
c9e38879 1987 if (exp->flag_data)
00479ba8 1988 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
1579bae1 1989 BSF_GLOBAL,0);
c9e38879 1990 }
870df5dc 1991 if (pe_dll_compat_implib)
1579bae1
AM
1992 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1993 BSF_GLOBAL, 0);
252b5132 1994
54727719 1995 if (include_jmp_stub)
775cabad
NC
1996 {
1997 bfd_set_section_size (abfd, tx, jmp_byte_count);
1579bae1 1998 td = xmalloc (jmp_byte_count);
775cabad
NC
1999 tx->contents = td;
2000 memcpy (td, jmp_bytes, jmp_byte_count);
2001
2002 switch (pe_details->pe_arch)
2003 {
2004 case PE_ARCH_i386:
591a748a
NC
2005#ifdef pe_use_x86_64
2006 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2007#else
2008 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2009#endif
775cabad
NC
2010 break;
2011 case PE_ARCH_sh:
2012 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2013 break;
2014 case PE_ARCH_mips:
2015 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2016 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2017 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2018 break;
53baae48 2019 case PE_ARCH_arm:
7148cc28
NC
2020 case PE_ARCH_arm_epoc:
2021 case PE_ARCH_arm_wince:
53baae48
NC
2022 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2023 break;
775cabad
NC
2024 default:
2025 abort ();
2026 }
2027 save_relocs (tx);
2028 }
54727719
NC
2029 else
2030 bfd_set_section_size (abfd, tx, 0);
252b5132
RH
2031
2032 bfd_set_section_size (abfd, id7, 4);
1579bae1 2033 d7 = xmalloc (4);
252b5132
RH
2034 id7->contents = d7;
2035 memset (d7, 0, 4);
4b7f0676 2036 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
252b5132
RH
2037 save_relocs (id7);
2038
99ad8390
NC
2039 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2040 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 2041 id5->contents = d5;
99ad8390 2042 memset (d5, 0, PE_IDATA5_SIZE);
775cabad 2043
252b5132
RH
2044 if (exp->flag_noname)
2045 {
2046 d5[0] = exp->ordinal;
2047 d5[1] = exp->ordinal >> 8;
99ad8390 2048 d5[PE_IDATA5_SIZE - 1] = 0x80;
252b5132
RH
2049 }
2050 else
2051 {
2052 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2053 save_relocs (id5);
2054 }
2055
99ad8390
NC
2056 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2057 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 2058 id4->contents = d4;
99ad8390 2059 memset (d4, 0, PE_IDATA4_SIZE);
775cabad 2060
252b5132
RH
2061 if (exp->flag_noname)
2062 {
c2a94a7a
DD
2063 d4[0] = exp->ordinal;
2064 d4[1] = exp->ordinal >> 8;
99ad8390 2065 d4[PE_IDATA4_SIZE - 1] = 0x80;
252b5132
RH
2066 }
2067 else
2068 {
2069 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2070 save_relocs (id4);
2071 }
2072
2073 if (exp->flag_noname)
2074 {
2075 len = 0;
2076 bfd_set_section_size (abfd, id6, 0);
2077 }
2078 else
2079 {
e916811a
CF
2080 /* { short, asciz } */
2081 len = 2 + strlen (exp->name) + 1;
252b5132
RH
2082 if (len & 1)
2083 len++;
2084 bfd_set_section_size (abfd, id6, len);
1579bae1 2085 d6 = xmalloc (len);
252b5132
RH
2086 id6->contents = d6;
2087 memset (d6, 0, len);
2088 d6[0] = exp->hint & 0xff;
2089 d6[1] = exp->hint >> 8;
47639182 2090 strcpy ((char *) d6 + 2, exp->name);
252b5132
RH
2091 }
2092
2093 bfd_set_symtab (abfd, symtab, symptr);
2094
54727719
NC
2095 if (include_jmp_stub)
2096 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
252b5132 2097 bfd_set_section_contents (abfd, id7, d7, 0, 4);
99ad8390
NC
2098 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2099 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
252b5132
RH
2100 if (!exp->flag_noname)
2101 bfd_set_section_contents (abfd, id6, d6, 0, len);
2102
2103 bfd_make_readable (abfd);
2104 return abfd;
2105}
2106
b044cda1 2107static bfd *
1579bae1 2108make_singleton_name_thunk (const char *import, bfd *parent)
b044cda1 2109{
775cabad 2110 /* Name thunks go to idata$4. */
b044cda1
CW
2111 asection *id4;
2112 unsigned char *d4;
2113 char *oname;
2114 bfd *abfd;
2115
1579bae1 2116 oname = xmalloc (20);
b044cda1
CW
2117 sprintf (oname, "nmth%06d.o", tmp_seq);
2118 tmp_seq++;
2119
2120 abfd = bfd_create (oname, parent);
2121 bfd_find_target (pe_details->object_target, abfd);
2122 bfd_make_writable (abfd);
2123
2124 bfd_set_format (abfd, bfd_object);
2125 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2126
2127 symptr = 0;
1579bae1 2128 symtab = xmalloc (3 * sizeof (asymbol *));
b044cda1
CW
2129 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2130 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2131 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2132
4e986257
CF
2133 /* We need space for the real thunk and for the null terminator. */
2134 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2135 d4 = xmalloc (PE_IDATA4_SIZE * 2);
b044cda1 2136 id4->contents = d4;
4e986257 2137 memset (d4, 0, PE_IDATA4_SIZE * 2);
b044cda1
CW
2138 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2139 save_relocs (id4);
2140
2141 bfd_set_symtab (abfd, symtab, symptr);
2142
4e986257 2143 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
b044cda1
CW
2144
2145 bfd_make_readable (abfd);
2146 return abfd;
2147}
2148
2149static char *
1579bae1 2150make_import_fixup_mark (arelent *rel)
b044cda1 2151{
775cabad 2152 /* We convert reloc to symbol, for later reference. */
b044cda1
CW
2153 static int counter;
2154 static char *fixup_name = NULL;
db09f25b 2155 static size_t buffer_len = 0;
b7a26f91 2156
fc0a2244 2157 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
b7a26f91 2158
b044cda1 2159 bfd *abfd = bfd_asymbol_bfd (sym);
fe213ce2 2160 struct bfd_link_hash_entry *bh;
b044cda1
CW
2161
2162 if (!fixup_name)
2163 {
1579bae1 2164 fixup_name = xmalloc (384);
b044cda1
CW
2165 buffer_len = 384;
2166 }
2167
2168 if (strlen (sym->name) + 25 > buffer_len)
b7a26f91 2169 /* Assume 25 chars for "__fu" + counter + "_". If counter is
b044cda1 2170 bigger than 20 digits long, we've got worse problems than
775cabad 2171 overflowing this buffer... */
b044cda1
CW
2172 {
2173 free (fixup_name);
a35bc64f
NC
2174 /* New buffer size is length of symbol, plus 25, but
2175 then rounded up to the nearest multiple of 128. */
b044cda1 2176 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1579bae1 2177 fixup_name = xmalloc (buffer_len);
b044cda1 2178 }
b7a26f91 2179
b044cda1
CW
2180 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2181
fe213ce2 2182 bh = NULL;
b7a26f91 2183 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
b044cda1 2184 current_sec, /* sym->section, */
b34976b6 2185 rel->address, NULL, TRUE, FALSE, &bh);
fe213ce2 2186
b044cda1
CW
2187 return fixup_name;
2188}
2189
53baae48 2190/* .section .idata$2
775cabad
NC
2191 .rva __nm_thnk_SYM (singleton thunk with name of func)
2192 .long 0
2193 .long 0
2194 .rva __my_dll_iname (name of dll)
2195 .rva __fuNN_SYM (pointer to reference (address) in text) */
b044cda1
CW
2196
2197static bfd *
1579bae1
AM
2198make_import_fixup_entry (const char *name,
2199 const char *fixup_name,
2200 const char *dll_symname,
2201 bfd *parent)
b044cda1 2202{
53baae48
NC
2203 asection *id2;
2204 unsigned char *d2;
b044cda1
CW
2205 char *oname;
2206 bfd *abfd;
2207
1579bae1 2208 oname = xmalloc (20);
b044cda1
CW
2209 sprintf (oname, "fu%06d.o", tmp_seq);
2210 tmp_seq++;
2211
2212 abfd = bfd_create (oname, parent);
2213 bfd_find_target (pe_details->object_target, abfd);
2214 bfd_make_writable (abfd);
2215
2216 bfd_set_format (abfd, bfd_object);
2217 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2218
2219 symptr = 0;
1579bae1 2220 symtab = xmalloc (6 * sizeof (asymbol *));
53baae48 2221 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
775cabad 2222
b044cda1
CW
2223 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2224 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2225 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2226
53baae48
NC
2227 bfd_set_section_size (abfd, id2, 20);
2228 d2 = xmalloc (20);
2229 id2->contents = d2;
2230 memset (d2, 0, 20);
b044cda1
CW
2231
2232 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2233 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2234 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
53baae48 2235 save_relocs (id2);
b044cda1
CW
2236
2237 bfd_set_symtab (abfd, symtab, symptr);
2238
53baae48 2239 bfd_set_section_contents (abfd, id2, d2, 0, 20);
b044cda1
CW
2240
2241 bfd_make_readable (abfd);
2242 return abfd;
2243}
2244
2fa9fc65
NC
2245/* .section .rdata_runtime_pseudo_reloc
2246 .long addend
2247 .rva __fuNN_SYM (pointer to reference (address) in text) */
2248
2249static bfd *
1579bae1
AM
2250make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2251 const char *fixup_name,
2252 int addend,
2253 bfd *parent)
2fa9fc65
NC
2254{
2255 asection *rt_rel;
2256 unsigned char *rt_rel_d;
2257 char *oname;
2258 bfd *abfd;
2259
1579bae1 2260 oname = xmalloc (20);
2fa9fc65
NC
2261 sprintf (oname, "rtr%06d.o", tmp_seq);
2262 tmp_seq++;
2263
2264 abfd = bfd_create (oname, parent);
2265 bfd_find_target (pe_details->object_target, abfd);
2266 bfd_make_writable (abfd);
2267
2268 bfd_set_format (abfd, bfd_object);
2269 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2270
2271 symptr = 0;
1579bae1
AM
2272 symtab = xmalloc (2 * sizeof (asymbol *));
2273 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2274 SEC_HAS_CONTENTS, 2);
2fa9fc65
NC
2275
2276 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2277
2278 bfd_set_section_size (abfd, rt_rel, 8);
1579bae1 2279 rt_rel_d = xmalloc (8);
2fa9fc65
NC
2280 rt_rel->contents = rt_rel_d;
2281 memset (rt_rel_d, 0, 8);
2282 bfd_put_32 (abfd, addend, rt_rel_d);
2283
2284 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2285 save_relocs (rt_rel);
2286
2287 bfd_set_symtab (abfd, symtab, symptr);
2288
2289 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2290
2291 bfd_make_readable (abfd);
2292 return abfd;
2293}
2294
2295/* .section .rdata
a35bc64f 2296 .rva __pei386_runtime_relocator */
2fa9fc65
NC
2297
2298static bfd *
1579bae1 2299pe_create_runtime_relocator_reference (bfd *parent)
2fa9fc65
NC
2300{
2301 asection *extern_rt_rel;
2302 unsigned char *extern_rt_rel_d;
2303 char *oname;
2304 bfd *abfd;
2305
1579bae1 2306 oname = xmalloc (20);
2fa9fc65
NC
2307 sprintf (oname, "ertr%06d.o", tmp_seq);
2308 tmp_seq++;
2309
2310 abfd = bfd_create (oname, parent);
2311 bfd_find_target (pe_details->object_target, abfd);
2312 bfd_make_writable (abfd);
2313
2314 bfd_set_format (abfd, bfd_object);
2315 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2316
2317 symptr = 0;
1579bae1 2318 symtab = xmalloc (2 * sizeof (asymbol *));
2fa9fc65
NC
2319 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2320
00479ba8 2321 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
1579bae1 2322 BSF_NO_FLAGS, 0);
2fa9fc65
NC
2323
2324 bfd_set_section_size (abfd, extern_rt_rel, 4);
1579bae1 2325 extern_rt_rel_d = xmalloc (4);
2fa9fc65
NC
2326 extern_rt_rel->contents = extern_rt_rel_d;
2327
2328 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2329 save_relocs (extern_rt_rel);
2330
2331 bfd_set_symtab (abfd, symtab, symptr);
2332
2333 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2334
2335 bfd_make_readable (abfd);
2336 return abfd;
2337}
2338
b044cda1 2339void
1579bae1 2340pe_create_import_fixup (arelent *rel, asection *s, int addend)
b044cda1
CW
2341{
2342 char buf[300];
fc0a2244 2343 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
b044cda1 2344 struct bfd_link_hash_entry *name_thunk_sym;
db09f25b 2345 const char *name = sym->name;
b044cda1 2346 char *fixup_name = make_import_fixup_mark (rel);
2fa9fc65 2347 bfd *b;
b044cda1
CW
2348
2349 sprintf (buf, U ("_nm_thnk_%s"), name);
2350
2351 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2352
2353 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2354 {
f13a99db 2355 bfd *b = make_singleton_name_thunk (name, link_info.output_bfd);
b044cda1
CW
2356 add_bfd_to_link (b, b->filename, &link_info);
2357
775cabad 2358 /* If we ever use autoimport, we have to cast text section writable. */
b34976b6 2359 config.text_read_only = FALSE;
f13a99db 2360 link_info.output_bfd->flags &= ~WP_TEXT;
b044cda1
CW
2361 }
2362
2fa9fc65
NC
2363 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2364 {
2365 extern char * pe_data_import_dll;
2366 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
aa3d9aba 2367
f13a99db
AM
2368 b = make_import_fixup_entry (name, fixup_name, dll_symname,
2369 link_info.output_bfd);
2fa9fc65
NC
2370 add_bfd_to_link (b, b->filename, &link_info);
2371 }
2372
2373 if (addend != 0)
2374 {
2375 if (link_info.pei386_runtime_pseudo_reloc)
2376 {
2377 if (pe_dll_extra_pe_debug)
2378 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2379 fixup_name, addend);
f13a99db
AM
2380 b = make_runtime_pseudo_reloc (name, fixup_name, addend,
2381 link_info.output_bfd);
2fa9fc65
NC
2382 add_bfd_to_link (b, b->filename, &link_info);
2383
2384 if (runtime_pseudo_relocs_created == 0)
2385 {
f13a99db 2386 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2fa9fc65
NC
2387 add_bfd_to_link (b, b->filename, &link_info);
2388 }
2389 runtime_pseudo_relocs_created++;
b34976b6 2390 }
2fa9fc65
NC
2391 else
2392 {
2393 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2394 s->owner, s, rel->address, sym->name);
2395 einfo ("%X");
2396 }
2397 }
b044cda1
CW
2398}
2399
2400
252b5132 2401void
1579bae1 2402pe_dll_generate_implib (def_file *def, const char *impfilename)
252b5132
RH
2403{
2404 int i;
2405 bfd *ar_head;
2406 bfd *ar_tail;
2407 bfd *outarch;
2408 bfd *head = 0;
2409
5aaace27 2410 dll_filename = (def->name) ? def->name : dll_name;
252b5132 2411 dll_symname = xstrdup (dll_filename);
d643799d 2412 for (i = 0; dll_symname[i]; i++)
3882b010 2413 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2414 dll_symname[i] = '_';
2415
bb14f524 2416 unlink_if_ordinary (impfilename);
252b5132
RH
2417
2418 outarch = bfd_openw (impfilename, 0);
2419
2420 if (!outarch)
2421 {
2422 /* xgettext:c-format */
2423 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2424 return;
2425 }
2426
2427 /* xgettext:c-format */
63d85248
NC
2428 info_msg (_("Creating library file: %s\n"), impfilename);
2429
252b5132
RH
2430 bfd_set_format (outarch, bfd_archive);
2431 outarch->has_armap = 1;
2432
5cc18311 2433 /* Work out a reasonable size of things to put onto one line. */
252b5132 2434 ar_head = make_head (outarch);
252b5132 2435
d643799d 2436 for (i = 0; i < def->num_exports; i++)
252b5132 2437 {
86b1cc60 2438 /* The import library doesn't know about the internal name. */
252b5132
RH
2439 char *internal = def->exports[i].internal_name;
2440 bfd *n;
775cabad 2441
ee31fbd0
NC
2442 /* Don't add PRIVATE entries to import lib. */
2443 if (pe_def_file->exports[i].flag_private)
2444 continue;
252b5132 2445 def->exports[i].internal_name = def->exports[i].name;
54727719
NC
2446 n = make_one (def->exports + i, outarch,
2447 ! (def->exports + i)->flag_data);
cc481421 2448 n->archive_next = head;
252b5132
RH
2449 head = n;
2450 def->exports[i].internal_name = internal;
2451 }
2452
c6c37250
DD
2453 ar_tail = make_tail (outarch);
2454
2455 if (ar_head == NULL || ar_tail == NULL)
2456 return;
2457
86b1cc60 2458 /* Now stick them all into the archive. */
cc481421
AM
2459 ar_head->archive_next = head;
2460 ar_tail->archive_next = ar_head;
252b5132
RH
2461 head = ar_tail;
2462
2463 if (! bfd_set_archive_head (outarch, head))
36230712 2464 einfo ("%Xbfd_set_archive_head: %E\n");
5cc18311 2465
252b5132 2466 if (! bfd_close (outarch))
36230712 2467 einfo ("%Xbfd_close %s: %E\n", impfilename);
252b5132
RH
2468
2469 while (head != NULL)
2470 {
cc481421 2471 bfd *n = head->archive_next;
252b5132
RH
2472 bfd_close (head);
2473 head = n;
2474 }
2475}
2476
2477static void
1579bae1 2478add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
252b5132
RH
2479{
2480 lang_input_statement_type *fake_file;
775cabad 2481
252b5132
RH
2482 fake_file = lang_add_input_file (name,
2483 lang_input_file_is_fake_enum,
2484 NULL);
2485 fake_file->the_bfd = abfd;
2486 ldlang_add_file (fake_file);
775cabad 2487
252b5132 2488 if (!bfd_link_add_symbols (abfd, link_info))
36230712 2489 einfo ("%Xaddsym %s: %E\n", name);
252b5132
RH
2490}
2491
2492void
1579bae1 2493pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
252b5132
RH
2494{
2495 def_file_module *module;
775cabad 2496
d643799d 2497 pe_dll_id_target (bfd_get_target (output_bfd));
252b5132
RH
2498
2499 if (!pe_def_file)
2500 return;
2501
2502 for (module = pe_def_file->modules; module; module = module->next)
2503 {
2504 int i, do_this_dll;
2505
2506 dll_filename = module->name;
2507 dll_symname = xstrdup (module->name);
d643799d 2508 for (i = 0; dll_symname[i]; i++)
3882b010 2509 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2510 dll_symname[i] = '_';
2511
2512 do_this_dll = 0;
2513
d643799d 2514 for (i = 0; i < pe_def_file->num_imports; i++)
252b5132
RH
2515 if (pe_def_file->imports[i].module == module)
2516 {
2517 def_file_export exp;
2518 struct bfd_link_hash_entry *blhe;
b34976b6 2519 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
86b1cc60 2520 /* See if we need this import. */
1579bae1
AM
2521 size_t len = strlen (pe_def_file->imports[i].internal_name);
2522 char *name = xmalloc (len + 2 + 6);
54727719 2523 bfd_boolean include_jmp_stub = FALSE;
c9e38879
NC
2524
2525 if (lead_at)
00479ba8 2526 sprintf (name, "%s",
1579bae1 2527 pe_def_file->imports[i].internal_name);
c9e38879 2528 else
1579bae1
AM
2529 sprintf (name, "%s%s",U (""),
2530 pe_def_file->imports[i].internal_name);
c9e38879 2531
252b5132 2532 blhe = bfd_link_hash_lookup (link_info->hash, name,
b34976b6 2533 FALSE, FALSE, FALSE);
c9e38879 2534
54727719
NC
2535 /* Include the jump stub for <sym> only if the <sym>
2536 is undefined. */
874c8c99
DD
2537 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2538 {
c9e38879 2539 if (lead_at)
00479ba8 2540 sprintf (name, "%s%s", "__imp_",
c9e38879
NC
2541 pe_def_file->imports[i].internal_name);
2542 else
00479ba8 2543 sprintf (name, "%s%s%s", "__imp_", U (""),
c9e38879
NC
2544 pe_def_file->imports[i].internal_name);
2545
874c8c99 2546 blhe = bfd_link_hash_lookup (link_info->hash, name,
b34976b6 2547 FALSE, FALSE, FALSE);
874c8c99 2548 }
54727719
NC
2549 else
2550 include_jmp_stub = TRUE;
2551
252b5132 2552 free (name);
c9e38879 2553
252b5132
RH
2554 if (blhe && blhe->type == bfd_link_hash_undefined)
2555 {
2556 bfd *one;
86b1cc60 2557 /* We do. */
252b5132
RH
2558 if (!do_this_dll)
2559 {
2560 bfd *ar_head = make_head (output_bfd);
2561 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2562 do_this_dll = 1;
2563 }
2564 exp.internal_name = pe_def_file->imports[i].internal_name;
2565 exp.name = pe_def_file->imports[i].name;
2566 exp.ordinal = pe_def_file->imports[i].ordinal;
2567 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2568 exp.flag_private = 0;
2569 exp.flag_constant = 0;
939ba9d0 2570 exp.flag_data = pe_def_file->imports[i].data;
252b5132 2571 exp.flag_noname = exp.name ? 0 : 1;
54727719 2572 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
252b5132
RH
2573 add_bfd_to_link (one, one->filename, link_info);
2574 }
2575 }
2576 if (do_this_dll)
2577 {
2578 bfd *ar_tail = make_tail (output_bfd);
2579 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2580 }
2581
2582 free (dll_symname);
2583 }
2584}
2585
775cabad 2586/* We were handed a *.DLL file. Parse it and turn it into a set of
b34976b6
AM
2587 IMPORTS directives in the def file. Return TRUE if the file was
2588 handled, FALSE if not. */
252b5132
RH
2589
2590static unsigned int
1579bae1 2591pe_get16 (bfd *abfd, int where)
252b5132
RH
2592{
2593 unsigned char b[2];
775cabad 2594
db09f25b
AM
2595 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2596 bfd_bread (b, (bfd_size_type) 2, abfd);
d643799d 2597 return b[0] + (b[1] << 8);
252b5132
RH
2598}
2599
2600static unsigned int
1579bae1 2601pe_get32 (bfd *abfd, int where)
252b5132
RH
2602{
2603 unsigned char b[4];
775cabad 2604
db09f25b
AM
2605 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2606 bfd_bread (b, (bfd_size_type) 4, abfd);
d643799d 2607 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2608}
2609
252b5132 2610static unsigned int
1579bae1 2611pe_as32 (void *ptr)
252b5132
RH
2612{
2613 unsigned char *b = ptr;
775cabad 2614
d643799d 2615 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2616}
2617
b34976b6 2618bfd_boolean
1579bae1 2619pe_implied_import_dll (const char *filename)
252b5132
RH
2620{
2621 bfd *dll;
6ca0987a
KT
2622 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2623 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2624 bfd_vma exp_funcbase;
47639182
AM
2625 unsigned char *expdata;
2626 char *erva;
6ca0987a 2627 bfd_vma name_rvas, ordinals, nexp, ordbase;
1069dd8d 2628 const char *dll_name;
939ba9d0
NC
2629 /* Initialization with start > end guarantees that is_data
2630 will not be set by mistake, and avoids compiler warning. */
6ca0987a
KT
2631 bfd_vma data_start = 1;
2632 bfd_vma data_end = 0;
2633 bfd_vma rdata_start = 1;
2634 bfd_vma rdata_end = 0;
2635 bfd_vma bss_start = 1;
2636 bfd_vma bss_end = 0;
252b5132
RH
2637
2638 /* No, I can't use bfd here. kernel32.dll puts its export table in
5cc18311 2639 the middle of the .rdata section. */
c6c37250 2640 dll = bfd_openr (filename, pe_details->target_name);
252b5132
RH
2641 if (!dll)
2642 {
36230712 2643 einfo ("%Xopen %s: %E\n", filename);
b34976b6 2644 return FALSE;
252b5132 2645 }
775cabad 2646
86b1cc60 2647 /* PEI dlls seem to be bfd_objects. */
252b5132
RH
2648 if (!bfd_check_format (dll, bfd_object))
2649 {
2650 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
b34976b6 2651 return FALSE;
252b5132
RH
2652 }
2653
939ba9d0 2654 /* Get pe_header, optional header and numbers of export entries. */
252b5132
RH
2655 pe_header_offset = pe_get32 (dll, 0x3c);
2656 opthdr_ofs = pe_header_offset + 4 + 20;
99ad8390
NC
2657#ifdef pe_use_x86_64
2658 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2659#else
252b5132 2660 num_entries = pe_get32 (dll, opthdr_ofs + 92);
99ad8390 2661#endif
775cabad
NC
2662
2663 if (num_entries < 1) /* No exports. */
b34976b6 2664 return FALSE;
775cabad 2665
99ad8390
NC
2666#ifdef pe_use_x86_64
2667 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2668 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2669#else
252b5132
RH
2670 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2671 export_size = pe_get32 (dll, opthdr_ofs + 100);
99ad8390
NC
2672#endif
2673
252b5132
RH
2674 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2675 secptr = (pe_header_offset + 4 + 20 +
2676 pe_get16 (dll, pe_header_offset + 4 + 16));
2677 expptr = 0;
775cabad 2678
1579bae1 2679 /* Get the rva and size of the export section. */
d643799d 2680 for (i = 0; i < nsections; i++)
252b5132
RH
2681 {
2682 char sname[8];
6ca0987a
KT
2683 bfd_vma secptr1 = secptr + 40 * i;
2684 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2685 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
2686 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
775cabad 2687
db09f25b
AM
2688 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2689 bfd_bread (sname, (bfd_size_type) 8, dll);
775cabad 2690
d643799d 2691 if (vaddr <= export_rva && vaddr + vsize > export_rva)
252b5132
RH
2692 {
2693 expptr = fptr + (export_rva - vaddr);
2694 if (export_rva + export_size > vaddr + vsize)
2695 export_size = vsize - (export_rva - vaddr);
2696 break;
2697 }
2698 }
2699
939ba9d0 2700 /* Scan sections and store the base and size of the
1579bae1 2701 data and bss segments in data/base_start/end. */
939ba9d0
NC
2702 for (i = 0; i < nsections; i++)
2703 {
6ca0987a
KT
2704 bfd_vma secptr1 = secptr + 40 * i;
2705 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
2706 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2707 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
939ba9d0
NC
2708 char sec_name[9];
2709
2710 sec_name[8] = '\0';
2711 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2712 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2713
2714 if (strcmp(sec_name,".data") == 0)
2715 {
2716 data_start = vaddr;
2717 data_end = vaddr + vsize;
2718
661a32f7
DS
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);
661a32f7
DS
2723 }
2724 else if (strcmp(sec_name,".rdata") == 0)
2725 {
2726 rdata_start = vaddr;
2727 rdata_end = vaddr + vsize;
2728
939ba9d0
NC
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);
1579bae1 2733 }
939ba9d0
NC
2734 else if (strcmp (sec_name,".bss") == 0)
2735 {
2736 bss_start = vaddr;
2737 bss_end = vaddr + vsize;
2738
2739 if (pe_dll_extra_pe_debug)
2740 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
6ca0987a
KT
2741 __FUNCTION__, sec_name, (unsigned long) vaddr,
2742 (unsigned long) (vaddr + vsize), (unsigned long) flags);
939ba9d0
NC
2743 }
2744 }
2745
1579bae1 2746 expdata = xmalloc (export_size);
db09f25b
AM
2747 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2748 bfd_bread (expdata, (bfd_size_type) export_size, dll);
47639182 2749 erva = (char *) expdata - export_rva;
252b5132
RH
2750
2751 if (pe_def_file == 0)
d643799d 2752 pe_def_file = def_file_empty ();
252b5132 2753
d643799d
KH
2754 nexp = pe_as32 (expdata + 24);
2755 name_rvas = pe_as32 (expdata + 32);
2756 ordinals = pe_as32 (expdata + 36);
2757 ordbase = pe_as32 (expdata + 16);
939ba9d0 2758 exp_funcbase = pe_as32 (expdata + 28);
775cabad 2759
939ba9d0
NC
2760 /* Use internal dll name instead of filename
2761 to enable symbolic dll linking. */
47639182 2762 dll_name = erva + pe_as32 (expdata + 12);
939ba9d0 2763
a35bc64f
NC
2764 /* Check to see if the dll has already been added to
2765 the definition list and if so return without error.
2766 This avoids multiple symbol definitions. */
2767 if (def_get_module (pe_def_file, dll_name))
2768 {
2769 if (pe_dll_extra_pe_debug)
2770 printf ("%s is already loaded\n", dll_name);
2771 return TRUE;
2772 }
2773
939ba9d0 2774 /* Iterate through the list of symbols. */
d643799d 2775 for (i = 0; i < nexp; i++)
252b5132 2776 {
939ba9d0 2777 /* Pointer to the names vector. */
6ca0987a 2778 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
252b5132 2779 def_file_import *imp;
1579bae1 2780 /* Pointer to the function address vector. */
6ca0987a 2781 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
939ba9d0
NC
2782 int is_data = 0;
2783
2784 /* Skip unwanted symbols, which are
2785 exported in buggy auto-import releases. */
0112cd26 2786 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
939ba9d0 2787 {
661a32f7
DS
2788 /* is_data is true if the address is in the data, rdata or bss
2789 segment. */
939ba9d0
NC
2790 is_data =
2791 (func_rva >= data_start && func_rva < data_end)
661a32f7 2792 || (func_rva >= rdata_start && func_rva < rdata_end)
939ba9d0
NC
2793 || (func_rva >= bss_start && func_rva < bss_end);
2794
2795 imp = def_file_add_import (pe_def_file, erva + name_rva,
2796 dll_name, i, 0);
396a2467 2797 /* Mark symbol type. */
939ba9d0 2798 imp->data = is_data;
1579bae1 2799
939ba9d0
NC
2800 if (pe_dll_extra_pe_debug)
2801 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2802 __FUNCTION__, dll_name, erva + name_rva,
6ca0987a 2803 (unsigned long) func_rva, is_data ? "(data)" : "");
939ba9d0 2804 }
252b5132
RH
2805 }
2806
b34976b6 2807 return TRUE;
252b5132
RH
2808}
2809
775cabad
NC
2810/* These are the main functions, called from the emulation. The first
2811 is called after the bfds are read, so we can guess at how much space
2812 we need. The second is called after everything is placed, so we
2813 can put the right values in place. */
252b5132
RH
2814
2815void
1579bae1 2816pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
252b5132 2817{
c6c37250 2818 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
2819 process_def_file (abfd, info);
2820
1579bae1 2821 if (pe_def_file->num_exports == 0 && !info->shared)
2b817be1
NC
2822 return;
2823
252b5132 2824 generate_edata (abfd, info);
c6c37250
DD
2825 build_filler_bfd (1);
2826}
2827
2828void
1579bae1 2829pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
c6c37250
DD
2830{
2831 pe_dll_id_target (bfd_get_target (abfd));
2832 build_filler_bfd (0);
252b5132
RH
2833}
2834
2835void
1579bae1 2836pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
252b5132 2837{
c6c37250 2838 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
2839 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2840
2841 generate_reloc (abfd, info);
2842 if (reloc_sz > 0)
2843 {
2844 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2845
2846 /* Resize the sections. */
38975f9e 2847 lang_reset_memory_regions ();
e9ee469a 2848 lang_size_sections (NULL, TRUE);
252b5132
RH
2849
2850 /* Redo special stuff. */
2851 ldemul_after_allocation ();
2852
2853 /* Do the assignments again. */
e9ee469a 2854 lang_do_assignments ();
252b5132
RH
2855 }
2856
2857 fill_edata (abfd, info);
2858
db8acf26 2859 if (info->shared && !info->pie)
2b817be1 2860 pe_data (abfd)->dll = 1;
252b5132
RH
2861
2862 edata_s->contents = edata_d;
2863 reloc_s->contents = reloc_d;
2864}
c6c37250
DD
2865
2866void
1579bae1 2867pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
c6c37250
DD
2868{
2869 pe_dll_id_target (bfd_get_target (abfd));
2870 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2871
2872 generate_reloc (abfd, info);
2873 if (reloc_sz > 0)
2874 {
2875 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2876
2877 /* Resize the sections. */
38975f9e 2878 lang_reset_memory_regions ();
e9ee469a 2879 lang_size_sections (NULL, TRUE);
c6c37250
DD
2880
2881 /* Redo special stuff. */
2882 ldemul_after_allocation ();
2883
2884 /* Do the assignments again. */
e9ee469a 2885 lang_do_assignments ();
c6c37250
DD
2886 }
2887 reloc_s->contents = reloc_d;
2888}
ff2bdb9c
CF
2889
2890bfd_boolean
2891pe_bfd_is_dll (bfd *abfd)
2892{
2893 return (bfd_get_format (abfd) == bfd_object
2894 && obj_pe (abfd)
2895 && pe_data (abfd)->dll);
2896}
This page took 0.567364 seconds and 4 git commands to generate.