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