* pe-dll.c (auto_export): Use bsearch to speed up scan of exports
[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
1579bae1 837 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
198beae2 838 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
252b5132 839
198beae2 840 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
252b5132
RH
841 max_ordinal = 0;
842 min_ordinal = 65536;
843 count_exported = 0;
844 count_exported_byname = 0;
845 count_with_ordinals = 0;
846
252b5132
RH
847 for (i = 0, j = 0; i < NE; i++)
848 {
849 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
850 {
870df5dc 851 /* This is a duplicate. */
252b5132
RH
852 if (e[j - 1].ordinal != -1
853 && e[i].ordinal != -1
854 && e[j - 1].ordinal != e[i].ordinal)
855 {
870df5dc
NC
856 if (pe_dll_warn_dup_exports)
857 /* xgettext:c-format */
486e80e2 858 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
870df5dc 859 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
252b5132
RH
860 }
861 else
862 {
870df5dc
NC
863 if (pe_dll_warn_dup_exports)
864 /* xgettext:c-format */
865 einfo (_("Warning, duplicate EXPORT: %s\n"),
866 e[j - 1].name);
252b5132 867 }
775cabad 868
486e80e2 869 if (e[i].ordinal != -1)
252b5132
RH
870 e[j - 1].ordinal = e[i].ordinal;
871 e[j - 1].flag_private |= e[i].flag_private;
872 e[j - 1].flag_constant |= e[i].flag_constant;
873 e[j - 1].flag_noname |= e[i].flag_noname;
874 e[j - 1].flag_data |= e[i].flag_data;
875 }
876 else
877 {
878 if (i != j)
879 e[j] = e[i];
880 j++;
881 }
882 }
883 pe_def_file->num_exports = j; /* == NE */
884
885 for (i = 0; i < NE; i++)
886 {
1579bae1 887 char *name;
1579bae1 888 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
c9e38879
NC
889 if (pe_details->underscored
890 && (*pe_def_file->exports[i].internal_name != '@'))
c6c37250
DD
891 {
892 *name = '_';
893 strcpy (name + 1, pe_def_file->exports[i].internal_name);
894 }
895 else
896 strcpy (name, pe_def_file->exports[i].internal_name);
252b5132
RH
897
898 blhe = bfd_link_hash_lookup (info->hash,
899 name,
b34976b6 900 FALSE, FALSE, TRUE);
252b5132 901
8a5b676c 902 if (blhe
d643799d 903 && (blhe->type == bfd_link_hash_defined
8a5b676c 904 || (blhe->type == bfd_link_hash_common)))
252b5132
RH
905 {
906 count_exported++;
907 if (!pe_def_file->exports[i].flag_noname)
908 count_exported_byname++;
8a5b676c
DD
909
910 /* Only fill in the sections. The actual offsets are computed
911 in fill_exported_offsets() after common symbols are laid
912 out. */
d643799d 913 if (blhe->type == bfd_link_hash_defined)
8a5b676c
DD
914 exported_symbol_sections[i] = blhe->u.def.section;
915 else
916 exported_symbol_sections[i] = blhe->u.c.p->section;
5cc18311 917
75898d57
DK
918 if (pe_def_file->exports[i].ordinal != -1)
919 {
920 if (max_ordinal < pe_def_file->exports[i].ordinal)
921 max_ordinal = pe_def_file->exports[i].ordinal;
922 if (min_ordinal > pe_def_file->exports[i].ordinal)
923 min_ordinal = pe_def_file->exports[i].ordinal;
924 count_with_ordinals++;
925 }
926 }
927 /* Check for forward exports. These are indicated in DEF files by an
928 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
929 but we must take care not to be fooled when the user wants to export
930 a symbol that actually really has a dot in it, so we only check
931 for them here, after real defined symbols have already been matched. */
932 else if (strchr (pe_def_file->exports[i].internal_name, '.'))
933 {
934 count_exported++;
935 if (!pe_def_file->exports[i].flag_noname)
936 count_exported_byname++;
937
938 pe_def_file->exports[i].flag_forward = 1;
939
252b5132
RH
940 if (pe_def_file->exports[i].ordinal != -1)
941 {
942 if (max_ordinal < pe_def_file->exports[i].ordinal)
943 max_ordinal = pe_def_file->exports[i].ordinal;
944 if (min_ordinal > pe_def_file->exports[i].ordinal)
945 min_ordinal = pe_def_file->exports[i].ordinal;
946 count_with_ordinals++;
947 }
948 }
949 else if (blhe && blhe->type == bfd_link_hash_undefined)
950 {
951 /* xgettext:c-format */
952 einfo (_("%XCannot export %s: symbol not defined\n"),
953 pe_def_file->exports[i].internal_name);
954 }
955 else if (blhe)
956 {
957 /* xgettext:c-format */
958 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
959 pe_def_file->exports[i].internal_name,
960 blhe->type, bfd_link_hash_defined);
961 }
962 else
963 {
964 /* xgettext:c-format */
965 einfo (_("%XCannot export %s: symbol not found\n"),
966 pe_def_file->exports[i].internal_name);
967 }
968 free (name);
969 }
970}
971
775cabad 972/* Build the bfd that will contain .edata and .reloc sections. */
252b5132
RH
973
974static void
1579bae1 975build_filler_bfd (int include_edata)
252b5132
RH
976{
977 lang_input_statement_type *filler_file;
978 filler_file = lang_add_input_file ("dll stuff",
979 lang_input_file_is_fake_enum,
980 NULL);
f13a99db
AM
981 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
982 link_info.output_bfd);
252b5132
RH
983 if (filler_bfd == NULL
984 || !bfd_set_arch_mach (filler_bfd,
f13a99db
AM
985 bfd_get_arch (link_info.output_bfd),
986 bfd_get_mach (link_info.output_bfd)))
252b5132 987 {
36230712 988 einfo ("%X%P: can not create BFD: %E\n");
252b5132
RH
989 return;
990 }
991
c6c37250 992 if (include_edata)
252b5132 993 {
c6c37250
DD
994 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
995 if (edata_s == NULL
996 || !bfd_set_section_flags (filler_bfd, edata_s,
997 (SEC_HAS_CONTENTS
998 | SEC_ALLOC
999 | SEC_LOAD
1000 | SEC_KEEP
1001 | SEC_IN_MEMORY)))
1002 {
1003 einfo ("%X%P: can not create .edata section: %E\n");
1004 return;
1005 }
1006 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
252b5132 1007 }
252b5132
RH
1008
1009 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1010 if (reloc_s == NULL
1011 || !bfd_set_section_flags (filler_bfd, reloc_s,
1012 (SEC_HAS_CONTENTS
1013 | SEC_ALLOC
1014 | SEC_LOAD
1015 | SEC_KEEP
1016 | SEC_IN_MEMORY)))
1017 {
1018 einfo ("%X%P: can not create .reloc section: %E\n");
1019 return;
1020 }
775cabad 1021
252b5132
RH
1022 bfd_set_section_size (filler_bfd, reloc_s, 0);
1023
1024 ldlang_add_file (filler_file);
1025}
1026
775cabad 1027/* Gather all the exported symbols and build the .edata section. */
252b5132
RH
1028
1029static void
1579bae1 1030generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132
RH
1031{
1032 int i, next_ordinal;
1033 int name_table_size = 0;
1034 const char *dlnp;
1035
1036 /* First, we need to know how many exported symbols there are,
5cc18311 1037 and what the range of ordinals is. */
252b5132 1038 if (pe_def_file->name)
775cabad 1039 dll_name = pe_def_file->name;
252b5132
RH
1040 else
1041 {
1042 dll_name = abfd->filename;
775cabad 1043
252b5132 1044 for (dlnp = dll_name; *dlnp; dlnp++)
775cabad
NC
1045 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1046 dll_name = dlnp + 1;
252b5132
RH
1047 }
1048
1049 if (count_with_ordinals && max_ordinal > count_exported)
1050 {
1051 if (min_ordinal > max_ordinal - count_exported + 1)
1052 min_ordinal = max_ordinal - count_exported + 1;
1053 }
1054 else
1055 {
1056 min_ordinal = 1;
1057 max_ordinal = count_exported;
1058 }
252b5132 1059
775cabad 1060 export_table_size = max_ordinal - min_ordinal + 1;
1579bae1 1061 exported_symbols = xmalloc (export_table_size * sizeof (int));
252b5132
RH
1062 for (i = 0; i < export_table_size; i++)
1063 exported_symbols[i] = -1;
1064
86b1cc60 1065 /* Now we need to assign ordinals to those that don't have them. */
252b5132
RH
1066 for (i = 0; i < NE; i++)
1067 {
a8d701fd
DS
1068 if (exported_symbol_sections[i] ||
1069 pe_def_file->exports[i].flag_forward)
252b5132
RH
1070 {
1071 if (pe_def_file->exports[i].ordinal != -1)
1072 {
1073 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1074 int pi = exported_symbols[ei];
775cabad 1075
252b5132
RH
1076 if (pi != -1)
1077 {
1078 /* xgettext:c-format */
486e80e2 1079 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
252b5132
RH
1080 pe_def_file->exports[i].ordinal,
1081 pe_def_file->exports[i].name,
1082 pe_def_file->exports[pi].name);
1083 }
1084 exported_symbols[ei] = i;
1085 }
7fcab871
KT
1086 if (pe_def_file->exports[i].its_name)
1087 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1088 else
1089 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
252b5132 1090 }
a8d701fd
DS
1091
1092 /* Reserve space for the forward name. */
1093 if (pe_def_file->exports[i].flag_forward)
1094 {
1095 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1096 }
252b5132
RH
1097 }
1098
1099 next_ordinal = min_ordinal;
1100 for (i = 0; i < NE; i++)
a8d701fd
DS
1101 if ((exported_symbol_sections[i] ||
1102 pe_def_file->exports[i].flag_forward) &&
1103 pe_def_file->exports[i].ordinal == -1)
1104 {
1105 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1106 next_ordinal++;
775cabad 1107
a8d701fd
DS
1108 exported_symbols[next_ordinal - min_ordinal] = i;
1109 pe_def_file->exports[i].ordinal = next_ordinal;
1110 }
252b5132 1111
86b1cc60 1112 /* OK, now we can allocate some memory. */
775cabad
NC
1113 edata_sz = (40 /* directory */
1114 + 4 * export_table_size /* addresses */
252b5132
RH
1115 + 4 * count_exported_byname /* name ptrs */
1116 + 2 * count_exported_byname /* ordinals */
1117 + name_table_size + strlen (dll_name) + 1);
1118}
1119
8a5b676c 1120/* Fill the exported symbol offsets. The preliminary work has already
c1711530 1121 been done in process_def_file_and_drectve(). */
8a5b676c
DD
1122
1123static void
1579bae1 1124fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
8a5b676c 1125{
f0c87f88 1126 int i;
8a5b676c 1127 struct bfd_link_hash_entry *blhe;
5cc18311 1128
8a5b676c
DD
1129 for (i = 0; i < pe_def_file->num_exports; i++)
1130 {
1579bae1 1131 char *name;
775cabad 1132
1579bae1 1133 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
c9e38879 1134 if (pe_details->underscored
1579bae1 1135 && *pe_def_file->exports[i].internal_name != '@')
8a5b676c
DD
1136 {
1137 *name = '_';
1138 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1139 }
1140 else
1141 strcpy (name, pe_def_file->exports[i].internal_name);
1142
1143 blhe = bfd_link_hash_lookup (info->hash,
1144 name,
b34976b6 1145 FALSE, FALSE, TRUE);
8a5b676c 1146
1579bae1 1147 if (blhe && blhe->type == bfd_link_hash_defined)
775cabad
NC
1148 exported_symbol_offsets[i] = blhe->u.def.value;
1149
8a5b676c
DD
1150 free (name);
1151 }
1152}
1153
252b5132 1154static void
1579bae1 1155fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132 1156{
03a1c9a7 1157 int s, hint;
252b5132 1158 unsigned char *edirectory;
2f9636ba
AM
1159 unsigned char *eaddresses;
1160 unsigned char *enameptrs;
1161 unsigned char *eordinals;
47639182 1162 char *enamestr;
252b5132
RH
1163 time_t now;
1164
1165 time (&now);
1166
1579bae1 1167 edata_d = xmalloc (edata_sz);
252b5132 1168
86b1cc60 1169 /* Note use of array pointer math here. */
252b5132 1170 edirectory = edata_d;
c7e2358a 1171 eaddresses = edirectory + 40;
2f9636ba
AM
1172 enameptrs = eaddresses + 4 * export_table_size;
1173 eordinals = enameptrs + 4 * count_exported_byname;
47639182 1174 enamestr = (char *) eordinals + 2 * count_exported_byname;
252b5132 1175
1579bae1
AM
1176#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1177 + edata_s->output_section->vma - image_base)
252b5132 1178
c2a94a7a 1179 memset (edata_d, 0, edata_sz);
252b5132
RH
1180 bfd_put_32 (abfd, now, edata_d + 4);
1181 if (pe_def_file->version_major != -1)
1182 {
1183 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1184 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1185 }
775cabad 1186
252b5132
RH
1187 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1188 strcpy (enamestr, dll_name);
1189 enamestr += strlen (enamestr) + 1;
1190 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1191 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1192 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1193 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1194 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1195 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1196
8a5b676c
DD
1197 fill_exported_offsets (abfd, info);
1198
03a1c9a7
NC
1199 /* Ok, now for the filling in part.
1200 Scan alphabetically - ie the ordering in the exports[] table,
1201 rather than by ordinal - the ordering in the exported_symbol[]
1202 table. See dlltool.c and:
1203 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1579bae1 1204 for more information. */
252b5132 1205 hint = 0;
03a1c9a7 1206 for (s = 0; s < NE; s++)
252b5132 1207 {
f5a95868 1208 struct bfd_section *ssec = exported_symbol_sections[s];
a8d701fd
DS
1209 if (pe_def_file->exports[s].ordinal != -1 &&
1210 (pe_def_file->exports[s].flag_forward || ssec != NULL))
252b5132 1211 {
45b1f63c 1212 int ord = pe_def_file->exports[s].ordinal;
252b5132 1213
a8d701fd
DS
1214 if (pe_def_file->exports[s].flag_forward)
1215 {
1216 bfd_put_32 (abfd, ERVA (enamestr),
1217 eaddresses + 4 * (ord - min_ordinal));
1218
1219 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1220 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1221 }
1222 else
1223 {
6ca0987a 1224 bfd_vma srva = (exported_symbol_offsets[s]
a8d701fd
DS
1225 + ssec->output_section->vma
1226 + ssec->output_offset);
1227
1228 bfd_put_32 (abfd, srva - image_base,
1229 eaddresses + 4 * (ord - min_ordinal));
1230 }
775cabad 1231
252b5132
RH
1232 if (!pe_def_file->exports[s].flag_noname)
1233 {
1234 char *ename = pe_def_file->exports[s].name;
7fcab871
KT
1235 if (pe_def_file->exports[s].its_name)
1236 ename = pe_def_file->exports[s].its_name;
03a1c9a7 1237
2f9636ba
AM
1238 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1239 enameptrs += 4;
252b5132
RH
1240 strcpy (enamestr, ename);
1241 enamestr += strlen (enamestr) + 1;
2f9636ba
AM
1242 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1243 eordinals += 2;
252b5132
RH
1244 pe_def_file->exports[s].hint = hint++;
1245 }
252b5132
RH
1246 }
1247 }
1248}
1249
b044cda1 1250
198beae2 1251static struct bfd_section *current_sec;
b044cda1
CW
1252
1253void
1579bae1
AM
1254pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1255 const char *name,
1256 int (*cb) (arelent *, asection *))
b044cda1
CW
1257{
1258 bfd *b;
0d888aac 1259 asection *s;
b044cda1
CW
1260
1261 for (b = info->input_bfds; b; b = b->link_next)
1262 {
775cabad 1263 asymbol **symbols;
775cabad 1264
5c1d2f5f
AM
1265 if (!bfd_generic_link_read_symbols (b))
1266 {
1267 einfo (_("%B%F: could not read symbols: %E\n"), b);
1268 return;
1269 }
1270
1271 symbols = bfd_get_outsymbols (b);
b044cda1
CW
1272
1273 for (s = b->sections; s; s = s->next)
1274 {
775cabad
NC
1275 arelent **relocs;
1276 int relsize, nrelocs, i;
b044cda1
CW
1277 int flags = bfd_get_section_flags (b, s);
1278
775cabad 1279 /* Skip discarded linkonce sections. */
b044cda1
CW
1280 if (flags & SEC_LINK_ONCE
1281 && s->output_section == bfd_abs_section_ptr)
1282 continue;
1283
0d888aac 1284 current_sec = s;
b044cda1 1285
b044cda1 1286 relsize = bfd_get_reloc_upper_bound (b, s);
1579bae1 1287 relocs = xmalloc (relsize);
b044cda1
CW
1288 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1289
1290 for (i = 0; i < nrelocs; i++)
1291 {
fc0a2244 1292 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
775cabad
NC
1293
1294 if (!strcmp (name, sym->name))
1295 cb (relocs[i], s);
b044cda1 1296 }
775cabad 1297
b044cda1 1298 free (relocs);
775cabad 1299
b044cda1
CW
1300 /* Warning: the allocated symbols are remembered in BFD and reused
1301 later, so don't free them! */
1302 /* free (symbols); */
1303 }
1304 }
1305}
1306
775cabad 1307/* Gather all the relocations and build the .reloc section. */
252b5132
RH
1308
1309static void
1579bae1 1310generate_reloc (bfd *abfd, struct bfd_link_info *info)
252b5132
RH
1311{
1312
86b1cc60 1313 /* For .reloc stuff. */
c6c37250 1314 reloc_data_type *reloc_data;
252b5132
RH
1315 int total_relocs = 0;
1316 int i;
6ca0987a
KT
1317 bfd_vma sec_page = (bfd_vma) -1;
1318 bfd_vma page_ptr, page_count;
252b5132
RH
1319 int bi;
1320 bfd *b;
198beae2 1321 struct bfd_section *s;
252b5132
RH
1322
1323 total_relocs = 0;
1324 for (b = info->input_bfds; b; b = b->link_next)
1325 for (s = b->sections; s; s = s->next)
1326 total_relocs += s->reloc_count;
1327
1579bae1 1328 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
252b5132
RH
1329
1330 total_relocs = 0;
1331 bi = 0;
1332 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1333 {
1334 arelent **relocs;
91d6fa6a 1335 int relsize, nrelocs;
252b5132
RH
1336
1337 for (s = b->sections; s; s = s->next)
1338 {
6ca0987a 1339 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
252b5132 1340 asymbol **symbols;
252b5132 1341
86b1cc60 1342 /* If it's not loaded, we don't need to relocate it this way. */
252b5132
RH
1343 if (!(s->output_section->flags & SEC_LOAD))
1344 continue;
1345
1346 /* I don't know why there would be a reloc for these, but I've
86b1cc60 1347 seen it happen - DJ */
252b5132
RH
1348 if (s->output_section == &bfd_abs_section)
1349 continue;
1350
1351 if (s->output_section->vma == 0)
1352 {
86b1cc60 1353 /* Huh? Shouldn't happen, but punt if it does. */
252b5132
RH
1354 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1355 s->output_section->name, s->output_section->index,
1356 s->output_section->flags);
1357 continue;
1358 }
1359
5c1d2f5f
AM
1360 if (!bfd_generic_link_read_symbols (b))
1361 {
1362 einfo (_("%B%F: could not read symbols: %E\n"), b);
1363 return;
1364 }
252b5132 1365
5c1d2f5f 1366 symbols = bfd_get_outsymbols (b);
252b5132 1367 relsize = bfd_get_reloc_upper_bound (b, s);
1579bae1 1368 relocs = xmalloc (relsize);
252b5132
RH
1369 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1370
1371 for (i = 0; i < nrelocs; i++)
1372 {
b044cda1 1373 if (pe_dll_extra_pe_debug)
b7a26f91 1374 {
fc0a2244 1375 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
b7a26f91 1376 printf ("rel: %s\n", sym->name);
b044cda1 1377 }
252b5132 1378 if (!relocs[i]->howto->pc_relative
c6c37250 1379 && relocs[i]->howto->type != pe_details->imagebase_reloc)
252b5132 1380 {
fc0a2244 1381 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
775cabad 1382
1b610c93 1383 /* Don't create relocs for undefined weak symbols. */
49314f87
DS
1384 if (sym->flags == BSF_WEAK)
1385 {
1386 struct bfd_link_hash_entry *blhe
9dda37c1 1387 = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
49314f87 1388 FALSE, FALSE, FALSE);
9dda37c1
DK
1389 if (blhe && blhe->type == bfd_link_hash_undefweak)
1390 {
1391 /* Check aux sym and see if it is defined or not. */
1392 struct coff_link_hash_entry *h, *h2;
1393 h = (struct coff_link_hash_entry *)blhe;
1394 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1395 continue;
1396 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1397 [h->aux->x_sym.x_tagndx.l];
1398 /* We don't want a base reloc if the aux sym is not
1399 found, undefined, or if it is the constant ABS
1400 zero default value. (We broaden that slightly by
1401 not testing the value, just the section; there's
1402 no reason we'd want a reference to any absolute
1403 address to get relocated during rebasing). */
1404 if (!h2 || h2->root.type == bfd_link_hash_undefined
1405 || h2->root.u.def.section == &bfd_abs_section)
1406 continue;
1407 }
1408 else if (!blhe || blhe->type != bfd_link_hash_defined)
1409 continue;
49314f87 1410 }
0432176d
DK
1411 /* Nor for Dwarf FDE references to discarded sections. */
1412 else if (bfd_is_abs_section (sym->section->output_section))
1413 {
1414 /* We only ignore relocs from .eh_frame sections, as
1415 they are discarded by the final link rather than
1416 resolved against the kept section. */
1417 if (!strcmp (s->name, ".eh_frame"))
1418 continue;
1419 }
49314f87 1420
c6c37250 1421 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
5cc18311 1422
344a211f 1423#define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
5cc18311 1424
344a211f
NC
1425 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1426 relocs[i]->howto->rightshift)
252b5132 1427 {
99ad8390
NC
1428#ifdef pe_use_x86_64
1429 case BITS_AND_SHIFT (64, 0):
1430 reloc_data[total_relocs].type = 10;
1431 total_relocs++;
1432 break;
1433#endif
344a211f 1434 case BITS_AND_SHIFT (32, 0):
c6c37250
DD
1435 reloc_data[total_relocs].type = 3;
1436 total_relocs++;
252b5132 1437 break;
344a211f
NC
1438 case BITS_AND_SHIFT (16, 0):
1439 reloc_data[total_relocs].type = 2;
1440 total_relocs++;
1441 break;
1442 case BITS_AND_SHIFT (16, 16):
1443 reloc_data[total_relocs].type = 4;
86b1cc60
KH
1444 /* FIXME: we can't know the symbol's right value
1445 yet, but we probably can safely assume that
1446 CE will relocate us in 64k blocks, so leaving
1447 it zero is safe. */
344a211f
NC
1448 reloc_data[total_relocs].extra = 0;
1449 total_relocs++;
1450 break;
1451 case BITS_AND_SHIFT (26, 2):
1452 reloc_data[total_relocs].type = 5;
1453 total_relocs++;
1454 break;
fea39bcb 1455 case BITS_AND_SHIFT (24, 2):
d3793eaa
NC
1456 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1457 Those ARM_xxx definitions should go in proper
1458 header someday. */
1459 if (relocs[i]->howto->type == 0
1460 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1461 || relocs[i]->howto->type == 5)
fea39bcb
NC
1462 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1463 that has already been fully processed during a
1464 previous link stage, so ignore it here. */
1465 break;
1466 /* Fall through. */
252b5132
RH
1467 default:
1468 /* xgettext:c-format */
1469 einfo (_("%XError: %d-bit reloc in dll\n"),
1470 relocs[i]->howto->bitsize);
1471 break;
1472 }
1473 }
1474 }
1475 free (relocs);
86b1cc60
KH
1476 /* Warning: the allocated symbols are remembered in BFD and
1477 reused later, so don't free them! */
252b5132
RH
1478 }
1479 }
1480
1481 /* At this point, we have total_relocs relocation addresses in
1482 reloc_addresses, which are all suitable for the .reloc section.
5cc18311 1483 We must now create the new sections. */
c6c37250 1484 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
252b5132
RH
1485
1486 for (i = 0; i < total_relocs; i++)
1487 {
6ca0987a 1488 bfd_vma this_page = (reloc_data[i].vma >> 12);
5cc18311 1489
252b5132
RH
1490 if (this_page != sec_page)
1491 {
775cabad 1492 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
252b5132
RH
1493 reloc_sz += 8;
1494 sec_page = this_page;
1495 }
5cc18311 1496
252b5132 1497 reloc_sz += 2;
5cc18311 1498
344a211f
NC
1499 if (reloc_data[i].type == 4)
1500 reloc_sz += 2;
252b5132 1501 }
b7a26f91 1502
775cabad 1503 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1579bae1 1504 reloc_d = xmalloc (reloc_sz);
6ca0987a 1505 sec_page = (bfd_vma) -1;
252b5132 1506 reloc_sz = 0;
6ca0987a 1507 page_ptr = (bfd_vma) -1;
252b5132 1508 page_count = 0;
775cabad 1509
252b5132
RH
1510 for (i = 0; i < total_relocs; i++)
1511 {
6ca0987a
KT
1512 bfd_vma rva = reloc_data[i].vma - image_base;
1513 bfd_vma this_page = (rva & ~0xfff);
775cabad 1514
252b5132
RH
1515 if (this_page != sec_page)
1516 {
1517 while (reloc_sz & 3)
1518 reloc_d[reloc_sz++] = 0;
775cabad 1519
6ca0987a 1520 if (page_ptr != (bfd_vma) -1)
252b5132 1521 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1522
252b5132
RH
1523 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1524 page_ptr = reloc_sz;
1525 reloc_sz += 8;
1526 sec_page = this_page;
1527 page_count = 0;
1528 }
775cabad 1529
d643799d 1530 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
c6c37250 1531 reloc_d + reloc_sz);
252b5132 1532 reloc_sz += 2;
775cabad 1533
c6c37250
DD
1534 if (reloc_data[i].type == 4)
1535 {
1536 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1537 reloc_sz += 2;
1538 }
775cabad 1539
252b5132
RH
1540 page_count++;
1541 }
775cabad 1542
252b5132
RH
1543 while (reloc_sz & 3)
1544 reloc_d[reloc_sz++] = 0;
775cabad 1545
6ca0987a 1546 if (page_ptr != (bfd_vma) -1)
252b5132 1547 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1548
eea6121a 1549 while (reloc_sz < reloc_s->size)
252b5132
RH
1550 reloc_d[reloc_sz++] = 0;
1551}
1552
775cabad
NC
1553/* Given the exiting def_file structure, print out a .DEF file that
1554 corresponds to it. */
252b5132
RH
1555
1556static void
1579bae1 1557quoteput (char *s, FILE *f, int needs_quotes)
252b5132
RH
1558{
1559 char *cp;
775cabad 1560
252b5132
RH
1561 for (cp = s; *cp; cp++)
1562 if (*cp == '\''
1563 || *cp == '"'
1564 || *cp == '\\'
3882b010 1565 || ISSPACE (*cp)
252b5132
RH
1566 || *cp == ','
1567 || *cp == ';')
1568 needs_quotes = 1;
775cabad 1569
252b5132
RH
1570 if (needs_quotes)
1571 {
1572 putc ('"', f);
775cabad 1573
252b5132
RH
1574 while (*s)
1575 {
1576 if (*s == '"' || *s == '\\')
1577 putc ('\\', f);
775cabad 1578
252b5132
RH
1579 putc (*s, f);
1580 s++;
1581 }
775cabad 1582
252b5132
RH
1583 putc ('"', f);
1584 }
1585 else
1586 fputs (s, f);
1587}
1588
1589void
1579bae1 1590pe_dll_generate_def_file (const char *pe_out_def_filename)
252b5132
RH
1591{
1592 int i;
1593 FILE *out = fopen (pe_out_def_filename, "w");
775cabad 1594
252b5132 1595 if (out == NULL)
775cabad
NC
1596 /* xgettext:c-format */
1597 einfo (_("%s: Can't open output def file %s\n"),
1598 program_name, pe_out_def_filename);
252b5132
RH
1599
1600 if (pe_def_file)
1601 {
1602 if (pe_def_file->name)
1603 {
1604 if (pe_def_file->is_dll)
1605 fprintf (out, "LIBRARY ");
1606 else
1607 fprintf (out, "NAME ");
775cabad 1608
252b5132 1609 quoteput (pe_def_file->name, out, 1);
775cabad 1610
f13a99db 1611 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
0ead4f8d
KT
1612 {
1613 fprintf (out, " BASE=0x");
1614 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1615 }
252b5132
RH
1616 fprintf (out, "\n");
1617 }
1618
1619 if (pe_def_file->description)
1620 {
1621 fprintf (out, "DESCRIPTION ");
1622 quoteput (pe_def_file->description, out, 1);
1623 fprintf (out, "\n");
1624 }
1625
1626 if (pe_def_file->version_minor != -1)
1627 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1628 pe_def_file->version_minor);
1629 else if (pe_def_file->version_major != -1)
1630 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1631
1632 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1633 fprintf (out, "\n");
1634
1635 if (pe_def_file->stack_commit != -1)
1636 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1637 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1638 else if (pe_def_file->stack_reserve != -1)
1639 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
775cabad 1640
252b5132
RH
1641 if (pe_def_file->heap_commit != -1)
1642 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1643 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1644 else if (pe_def_file->heap_reserve != -1)
1645 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1646
1647 if (pe_def_file->num_section_defs > 0)
1648 {
1649 fprintf (out, "\nSECTIONS\n\n");
775cabad 1650
252b5132
RH
1651 for (i = 0; i < pe_def_file->num_section_defs; i++)
1652 {
1653 fprintf (out, " ");
1654 quoteput (pe_def_file->section_defs[i].name, out, 0);
775cabad 1655
252b5132
RH
1656 if (pe_def_file->section_defs[i].class)
1657 {
1658 fprintf (out, " CLASS ");
1659 quoteput (pe_def_file->section_defs[i].class, out, 0);
1660 }
775cabad 1661
252b5132
RH
1662 if (pe_def_file->section_defs[i].flag_read)
1663 fprintf (out, " READ");
775cabad 1664
252b5132
RH
1665 if (pe_def_file->section_defs[i].flag_write)
1666 fprintf (out, " WRITE");
775cabad 1667
252b5132
RH
1668 if (pe_def_file->section_defs[i].flag_execute)
1669 fprintf (out, " EXECUTE");
775cabad 1670
252b5132
RH
1671 if (pe_def_file->section_defs[i].flag_shared)
1672 fprintf (out, " SHARED");
775cabad 1673
252b5132
RH
1674 fprintf (out, "\n");
1675 }
1676 }
1677
1678 if (pe_def_file->num_exports > 0)
1679 {
b044cda1 1680 fprintf (out, "EXPORTS\n");
775cabad 1681
252b5132
RH
1682 for (i = 0; i < pe_def_file->num_exports; i++)
1683 {
1684 def_file_export *e = pe_def_file->exports + i;
1685 fprintf (out, " ");
1686 quoteput (e->name, out, 0);
775cabad 1687
252b5132
RH
1688 if (e->internal_name && strcmp (e->internal_name, e->name))
1689 {
1690 fprintf (out, " = ");
1691 quoteput (e->internal_name, out, 0);
1692 }
775cabad 1693
252b5132
RH
1694 if (e->ordinal != -1)
1695 fprintf (out, " @%d", e->ordinal);
775cabad 1696
252b5132
RH
1697 if (e->flag_private)
1698 fprintf (out, " PRIVATE");
775cabad 1699
252b5132
RH
1700 if (e->flag_constant)
1701 fprintf (out, " CONSTANT");
775cabad 1702
252b5132
RH
1703 if (e->flag_noname)
1704 fprintf (out, " NONAME");
775cabad 1705
252b5132
RH
1706 if (e->flag_data)
1707 fprintf (out, " DATA");
1708
1709 fprintf (out, "\n");
1710 }
1711 }
1712
1713 if (pe_def_file->num_imports > 0)
1714 {
1715 fprintf (out, "\nIMPORTS\n\n");
775cabad 1716
252b5132
RH
1717 for (i = 0; i < pe_def_file->num_imports; i++)
1718 {
1719 def_file_import *im = pe_def_file->imports + i;
1720 fprintf (out, " ");
775cabad 1721
252b5132
RH
1722 if (im->internal_name
1723 && (!im->name || strcmp (im->internal_name, im->name)))
1724 {
1725 quoteput (im->internal_name, out, 0);
1726 fprintf (out, " = ");
1727 }
775cabad 1728
252b5132
RH
1729 quoteput (im->module->name, out, 0);
1730 fprintf (out, ".");
775cabad 1731
252b5132
RH
1732 if (im->name)
1733 quoteput (im->name, out, 0);
1734 else
1735 fprintf (out, "%d", im->ordinal);
775cabad 1736
7fcab871
KT
1737 if (im->its_name)
1738 {
1739 fprintf (out, " == ");
1740 quoteput (im->its_name, out, 0);
1741 }
1742
252b5132
RH
1743 fprintf (out, "\n");
1744 }
1745 }
1746 }
1747 else
1748 fprintf (out, _("; no contents available\n"));
1749
1750 if (fclose (out) == EOF)
775cabad
NC
1751 /* xgettext:c-format */
1752 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
252b5132
RH
1753}
1754
775cabad 1755/* Generate the import library. */
252b5132
RH
1756
1757static asymbol **symtab;
1758static int symptr;
1759static int tmp_seq;
9382254d 1760static int tmp_seq2;
252b5132
RH
1761static const char *dll_filename;
1762static char *dll_symname;
1763
1764#define UNDSEC (asection *) &bfd_und_section
1765
1766static asection *
1579bae1 1767quick_section (bfd *abfd, const char *name, int flags, int align)
252b5132
RH
1768{
1769 asection *sec;
1770 asymbol *sym;
1771
1772 sec = bfd_make_section_old_way (abfd, name);
86b1cc60 1773 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
252b5132 1774 bfd_set_section_alignment (abfd, sec, align);
86b1cc60 1775 /* Remember to undo this before trying to link internally! */
252b5132
RH
1776 sec->output_section = sec;
1777
1778 sym = bfd_make_empty_symbol (abfd);
1779 symtab[symptr++] = sym;
1780 sym->name = sec->name;
1781 sym->section = sec;
1782 sym->flags = BSF_LOCAL;
1783 sym->value = 0;
1784
1785 return sec;
1786}
1787
1788static void
1579bae1
AM
1789quick_symbol (bfd *abfd,
1790 const char *n1,
1791 const char *n2,
1792 const char *n3,
1793 asection *sec,
1794 int flags,
1795 int addr)
252b5132
RH
1796{
1797 asymbol *sym;
1579bae1 1798 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
775cabad 1799
252b5132
RH
1800 strcpy (name, n1);
1801 strcat (name, n2);
1802 strcat (name, n3);
1803 sym = bfd_make_empty_symbol (abfd);
1804 sym->name = name;
1805 sym->section = sec;
1806 sym->flags = flags;
1807 sym->value = addr;
1808 symtab[symptr++] = sym;
1809}
1810
1811static arelent *reltab = 0;
1812static int relcount = 0, relsize = 0;
1813
1814static void
0ead4f8d 1815quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
252b5132 1816{
1579bae1 1817 if (relcount >= relsize - 1)
252b5132
RH
1818 {
1819 relsize += 10;
1820 if (reltab)
1579bae1 1821 reltab = xrealloc (reltab, relsize * sizeof (arelent));
252b5132 1822 else
1579bae1 1823 reltab = xmalloc (relsize * sizeof (arelent));
252b5132
RH
1824 }
1825 reltab[relcount].address = address;
1826 reltab[relcount].addend = 0;
1827 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1828 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1829 relcount++;
1830}
1831
1832static void
1833save_relocs (asection *sec)
1834{
1835 int i;
775cabad 1836
252b5132
RH
1837 sec->relocation = reltab;
1838 sec->reloc_count = relcount;
1579bae1 1839 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
d643799d 1840 for (i = 0; i < relcount; i++)
252b5132
RH
1841 sec->orelocation[i] = sec->relocation + i;
1842 sec->orelocation[relcount] = 0;
1843 sec->flags |= SEC_RELOC;
1844 reltab = 0;
1845 relcount = relsize = 0;
1846}
1847
775cabad
NC
1848/* .section .idata$2
1849 .global __head_my_dll
1850 __head_my_dll:
1851 .rva hname
1852 .long 0
1853 .long 0
1854 .rva __my_dll_iname
1855 .rva fthunk
b7a26f91 1856
775cabad
NC
1857 .section .idata$5
1858 .long 0
1859 fthunk:
b7a26f91 1860
775cabad
NC
1861 .section .idata$4
1862 .long 0
1863 hname: */
252b5132
RH
1864
1865static bfd *
1579bae1 1866make_head (bfd *parent)
252b5132
RH
1867{
1868 asection *id2, *id5, *id4;
1869 unsigned char *d2, *d5, *d4;
1870 char *oname;
1871 bfd *abfd;
1872
1579bae1 1873 oname = xmalloc (20);
252b5132
RH
1874 sprintf (oname, "d%06d.o", tmp_seq);
1875 tmp_seq++;
1876
1877 abfd = bfd_create (oname, parent);
c6c37250 1878 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1879 bfd_make_writable (abfd);
1880
1881 bfd_set_format (abfd, bfd_object);
c6c37250 1882 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1883
1884 symptr = 0;
1579bae1 1885 symtab = xmalloc (6 * sizeof (asymbol *));
252b5132
RH
1886 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1887 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1888 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
d643799d
KH
1889 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1890 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
c6c37250
DD
1891
1892 /* OK, pay attention here. I got confused myself looking back at
1893 it. We create a four-byte section to mark the beginning of the
1894 list, and we include an offset of 4 in the section, so that the
1895 pointer to the list points to the *end* of this section, which is
5cc18311 1896 the start of the list of sections from other objects. */
252b5132
RH
1897
1898 bfd_set_section_size (abfd, id2, 20);
1579bae1 1899 d2 = xmalloc (20);
252b5132
RH
1900 id2->contents = d2;
1901 memset (d2, 0, 20);
ce11ba6c
KT
1902 if (pe_use_nul_prefixed_import_tables)
1903 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
252b5132
RH
1904 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1905 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1906 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1907 save_relocs (id2);
1908
ce11ba6c
KT
1909 if (pe_use_nul_prefixed_import_tables)
1910 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1911 else
1912 bfd_set_section_size (abfd, id5, 0);
99ad8390 1913 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 1914 id5->contents = d5;
99ad8390 1915 memset (d5, 0, PE_IDATA5_SIZE);
ce11ba6c
KT
1916 if (pe_use_nul_prefixed_import_tables)
1917 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1918 else
1919 bfd_set_section_size (abfd, id4, 0);
99ad8390 1920 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 1921 id4->contents = d4;
99ad8390 1922 memset (d4, 0, PE_IDATA4_SIZE);
252b5132
RH
1923
1924 bfd_set_symtab (abfd, symtab, symptr);
1925
1926 bfd_set_section_contents (abfd, id2, d2, 0, 20);
ce11ba6c
KT
1927 if (pe_use_nul_prefixed_import_tables)
1928 {
1929 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1930 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1931 }
1932 else
1933 {
1934 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1935 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1936 }
5cc18311 1937
252b5132
RH
1938 bfd_make_readable (abfd);
1939 return abfd;
1940}
1941
775cabad
NC
1942/* .section .idata$4
1943 .long 0
99ad8390 1944 [.long 0] for PE+
775cabad
NC
1945 .section .idata$5
1946 .long 0
99ad8390 1947 [.long 0] for PE+
775cabad
NC
1948 .section idata$7
1949 .global __my_dll_iname
1950 __my_dll_iname:
1951 .asciz "my.dll" */
252b5132
RH
1952
1953static bfd *
1579bae1 1954make_tail (bfd *parent)
252b5132
RH
1955{
1956 asection *id4, *id5, *id7;
1957 unsigned char *d4, *d5, *d7;
1958 int len;
1959 char *oname;
1960 bfd *abfd;
1961
1579bae1 1962 oname = xmalloc (20);
252b5132
RH
1963 sprintf (oname, "d%06d.o", tmp_seq);
1964 tmp_seq++;
1965
1966 abfd = bfd_create (oname, parent);
c6c37250 1967 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1968 bfd_make_writable (abfd);
1969
1970 bfd_set_format (abfd, bfd_object);
c6c37250 1971 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1972
1973 symptr = 0;
1579bae1 1974 symtab = xmalloc (5 * sizeof (asymbol *));
252b5132
RH
1975 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1976 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1977 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
d643799d 1978 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
252b5132 1979
99ad8390
NC
1980 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1981 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 1982 id4->contents = d4;
99ad8390 1983 memset (d4, 0, PE_IDATA4_SIZE);
252b5132 1984
99ad8390
NC
1985 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1986 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 1987 id5->contents = d5;
99ad8390 1988 memset (d5, 0, PE_IDATA5_SIZE);
252b5132 1989
d643799d 1990 len = strlen (dll_filename) + 1;
252b5132 1991 if (len & 1)
d643799d 1992 len++;
252b5132 1993 bfd_set_section_size (abfd, id7, len);
1579bae1 1994 d7 = xmalloc (len);
252b5132 1995 id7->contents = d7;
47639182 1996 strcpy ((char *) d7, dll_filename);
e916811a
CF
1997 /* If len was odd, the above
1998 strcpy leaves behind an undefined byte. That is harmless,
1999 but we set it to 0 just so the binary dumps are pretty. */
2000 d7[len - 1] = 0;
252b5132
RH
2001
2002 bfd_set_symtab (abfd, symtab, symptr);
2003
99ad8390
NC
2004 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2005 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
252b5132
RH
2006 bfd_set_section_contents (abfd, id7, d7, 0, len);
2007
2008 bfd_make_readable (abfd);
2009 return abfd;
2010}
2011
775cabad
NC
2012/* .text
2013 .global _function
2014 .global ___imp_function
2015 .global __imp__function
2016 _function:
2017 jmp *__imp__function:
b7a26f91 2018
775cabad
NC
2019 .section idata$7
2020 .long __head_my_dll
b7a26f91 2021
775cabad
NC
2022 .section .idata$5
2023 ___imp_function:
2024 __imp__function:
2025 iat?
2026 .section .idata$4
2027 iat?
2028 .section .idata$6
2029 ID<ordinal>:
2030 .short <hint>
2031 .asciz "function" xlate? (add underscore, kill at) */
2032
e916811a 2033static const unsigned char jmp_ix86_bytes[] =
775cabad 2034{
252b5132
RH
2035 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2036};
2037
775cabad
NC
2038/* _function:
2039 mov.l ip+8,r0
2040 mov.l @r0,r0
2041 jmp @r0
2042 nop
2043 .dw __imp_function */
344a211f 2044
e916811a 2045static const unsigned char jmp_sh_bytes[] =
775cabad 2046{
344a211f
NC
2047 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2048};
2049
775cabad
NC
2050/* _function:
2051 lui $t0,<high:__imp_function>
2052 lw $t0,<low:__imp_function>
2053 jr $t0
2054 nop */
344a211f 2055
e916811a 2056static const unsigned char jmp_mips_bytes[] =
775cabad 2057{
344a211f
NC
2058 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2059 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2060};
252b5132 2061
e916811a 2062static const unsigned char jmp_arm_bytes[] =
53baae48
NC
2063{
2064 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2065 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2066 0, 0, 0, 0
2067};
2068
2069
252b5132 2070static bfd *
54727719 2071make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
252b5132
RH
2072{
2073 asection *tx, *id7, *id5, *id4, *id6;
23a87948 2074 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
252b5132
RH
2075 int len;
2076 char *oname;
2077 bfd *abfd;
e916811a 2078 const unsigned char *jmp_bytes = NULL;
f0c87f88 2079 int jmp_byte_count = 0;
c6c37250 2080
54727719
NC
2081 /* Include the jump stub section only if it is needed. A jump
2082 stub is needed if the symbol being imported <sym> is a function
2083 symbol and there is at least one undefined reference to that
2084 symbol. In other words, if all the import references to <sym> are
2085 explicitly through _declspec(dllimport) then the jump stub is not
2086 needed. */
2087 if (include_jmp_stub)
c6c37250 2088 {
54727719
NC
2089 switch (pe_details->pe_arch)
2090 {
2091 case PE_ARCH_i386:
2092 jmp_bytes = jmp_ix86_bytes;
2093 jmp_byte_count = sizeof (jmp_ix86_bytes);
2094 break;
2095 case PE_ARCH_sh:
2096 jmp_bytes = jmp_sh_bytes;
2097 jmp_byte_count = sizeof (jmp_sh_bytes);
2098 break;
2099 case PE_ARCH_mips:
2100 jmp_bytes = jmp_mips_bytes;
2101 jmp_byte_count = sizeof (jmp_mips_bytes);
2102 break;
2103 case PE_ARCH_arm:
2104 case PE_ARCH_arm_epoc:
2105 case PE_ARCH_arm_wince:
2106 jmp_bytes = jmp_arm_bytes;
2107 jmp_byte_count = sizeof (jmp_arm_bytes);
2108 break;
2109 default:
2110 abort ();
2111 }
c6c37250 2112 }
252b5132 2113
1579bae1 2114 oname = xmalloc (20);
252b5132
RH
2115 sprintf (oname, "d%06d.o", tmp_seq);
2116 tmp_seq++;
2117
2118 abfd = bfd_create (oname, parent);
c6c37250 2119 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
2120 bfd_make_writable (abfd);
2121
2122 bfd_set_format (abfd, bfd_object);
c6c37250 2123 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
2124
2125 symptr = 0;
17299ac7
NC
2126 symtab = xmalloc (12 * sizeof (asymbol *));
2127
2128 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
252b5132
RH
2129 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2130 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2131 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2132 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
b34976b6 2133
c9e38879
NC
2134 if (*exp->internal_name == '@')
2135 {
1579bae1
AM
2136 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2137 BSF_GLOBAL, 0);
54727719 2138 if (include_jmp_stub)
4b7f0676 2139 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
00479ba8 2140 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
1579bae1 2141 BSF_GLOBAL, 0);
c9e38879
NC
2142 /* Fastcall applies only to functions,
2143 so no need for auto-import symbol. */
2144 }
2145 else
2146 {
4b7f0676
NC
2147 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2148 BSF_GLOBAL, 0);
54727719 2149 if (include_jmp_stub)
1579bae1
AM
2150 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2151 BSF_GLOBAL, 0);
00479ba8 2152 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
1579bae1 2153 BSF_GLOBAL, 0);
c9e38879 2154 /* Symbol to reference ord/name of imported
1579bae1 2155 data symbol, used to implement auto-import. */
c9e38879 2156 if (exp->flag_data)
17f73277 2157 quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
1579bae1 2158 BSF_GLOBAL,0);
c9e38879 2159 }
870df5dc 2160 if (pe_dll_compat_implib)
17f73277 2161 quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
1579bae1 2162 BSF_GLOBAL, 0);
252b5132 2163
54727719 2164 if (include_jmp_stub)
775cabad
NC
2165 {
2166 bfd_set_section_size (abfd, tx, jmp_byte_count);
1579bae1 2167 td = xmalloc (jmp_byte_count);
775cabad
NC
2168 tx->contents = td;
2169 memcpy (td, jmp_bytes, jmp_byte_count);
2170
2171 switch (pe_details->pe_arch)
2172 {
2173 case PE_ARCH_i386:
591a748a
NC
2174#ifdef pe_use_x86_64
2175 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2176#else
17299ac7
NC
2177 /* Mark this object as SAFESEH compatible. */
2178 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2179 BSF_LOCAL, 1);
591a748a
NC
2180 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2181#endif
775cabad
NC
2182 break;
2183 case PE_ARCH_sh:
2184 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2185 break;
2186 case PE_ARCH_mips:
2187 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2188 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2189 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2190 break;
53baae48 2191 case PE_ARCH_arm:
7148cc28
NC
2192 case PE_ARCH_arm_epoc:
2193 case PE_ARCH_arm_wince:
53baae48
NC
2194 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2195 break;
775cabad
NC
2196 default:
2197 abort ();
2198 }
2199 save_relocs (tx);
2200 }
54727719
NC
2201 else
2202 bfd_set_section_size (abfd, tx, 0);
252b5132
RH
2203
2204 bfd_set_section_size (abfd, id7, 4);
1579bae1 2205 d7 = xmalloc (4);
252b5132
RH
2206 id7->contents = d7;
2207 memset (d7, 0, 4);
4b7f0676 2208 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
252b5132
RH
2209 save_relocs (id7);
2210
99ad8390
NC
2211 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2212 d5 = xmalloc (PE_IDATA5_SIZE);
252b5132 2213 id5->contents = d5;
99ad8390 2214 memset (d5, 0, PE_IDATA5_SIZE);
775cabad 2215
252b5132
RH
2216 if (exp->flag_noname)
2217 {
2218 d5[0] = exp->ordinal;
2219 d5[1] = exp->ordinal >> 8;
99ad8390 2220 d5[PE_IDATA5_SIZE - 1] = 0x80;
252b5132
RH
2221 }
2222 else
2223 {
2224 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2225 save_relocs (id5);
2226 }
2227
99ad8390
NC
2228 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2229 d4 = xmalloc (PE_IDATA4_SIZE);
252b5132 2230 id4->contents = d4;
99ad8390 2231 memset (d4, 0, PE_IDATA4_SIZE);
775cabad 2232
252b5132
RH
2233 if (exp->flag_noname)
2234 {
c2a94a7a
DD
2235 d4[0] = exp->ordinal;
2236 d4[1] = exp->ordinal >> 8;
99ad8390 2237 d4[PE_IDATA4_SIZE - 1] = 0x80;
252b5132
RH
2238 }
2239 else
2240 {
2241 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2242 save_relocs (id4);
2243 }
2244
2245 if (exp->flag_noname)
2246 {
2247 len = 0;
2248 bfd_set_section_size (abfd, id6, 0);
2249 }
2250 else
2251 {
e916811a 2252 /* { short, asciz } */
7fcab871
KT
2253 if (exp->its_name)
2254 len = 2 + strlen (exp->its_name) + 1;
2255 else
2256 len = 2 + strlen (exp->name) + 1;
252b5132
RH
2257 if (len & 1)
2258 len++;
2259 bfd_set_section_size (abfd, id6, len);
1579bae1 2260 d6 = xmalloc (len);
252b5132
RH
2261 id6->contents = d6;
2262 memset (d6, 0, len);
2263 d6[0] = exp->hint & 0xff;
2264 d6[1] = exp->hint >> 8;
7fcab871
KT
2265 if (exp->its_name)
2266 strcpy ((char*) d6 + 2, exp->its_name);
2267 else
2268 strcpy ((char *) d6 + 2, exp->name);
252b5132
RH
2269 }
2270
2271 bfd_set_symtab (abfd, symtab, symptr);
2272
54727719
NC
2273 if (include_jmp_stub)
2274 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
252b5132 2275 bfd_set_section_contents (abfd, id7, d7, 0, 4);
99ad8390
NC
2276 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2277 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
252b5132
RH
2278 if (!exp->flag_noname)
2279 bfd_set_section_contents (abfd, id6, d6, 0, len);
2280
2281 bfd_make_readable (abfd);
2282 return abfd;
2283}
2284
9382254d
KT
2285static bfd *
2286make_singleton_name_imp (const char *import, bfd *parent)
2287{
2288 /* Name thunks go to idata$4. */
2289 asection *id5;
2290 unsigned char *d5;
2291 char *oname;
2292 bfd *abfd;
2293
2294 oname = xmalloc (20);
2295 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2296 tmp_seq2++;
2297
2298 abfd = bfd_create (oname, parent);
2299 bfd_find_target (pe_details->object_target, abfd);
2300 bfd_make_writable (abfd);
2301
2302 bfd_set_format (abfd, bfd_object);
2303 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2304
2305 symptr = 0;
2306 symtab = xmalloc (3 * sizeof (asymbol *));
2307 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
17f73277 2308 quick_symbol (abfd, "__imp_", import, "", id5, BSF_GLOBAL, 0);
9382254d
KT
2309
2310 /* We need space for the real thunk and for the null terminator. */
2311 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2312 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2313 id5->contents = d5;
2314 memset (d5, 0, PE_IDATA5_SIZE * 2);
2315 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2316 save_relocs (id5);
2317
2318 bfd_set_symtab (abfd, symtab, symptr);
2319
2320 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2321
2322 bfd_make_readable (abfd);
2323 return abfd;
2324}
2325
b044cda1 2326static bfd *
1579bae1 2327make_singleton_name_thunk (const char *import, bfd *parent)
b044cda1 2328{
775cabad 2329 /* Name thunks go to idata$4. */
b044cda1
CW
2330 asection *id4;
2331 unsigned char *d4;
2332 char *oname;
2333 bfd *abfd;
2334
1579bae1 2335 oname = xmalloc (20);
b044cda1
CW
2336 sprintf (oname, "nmth%06d.o", tmp_seq);
2337 tmp_seq++;
2338
2339 abfd = bfd_create (oname, parent);
2340 bfd_find_target (pe_details->object_target, abfd);
2341 bfd_make_writable (abfd);
2342
2343 bfd_set_format (abfd, bfd_object);
2344 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2345
2346 symptr = 0;
1579bae1 2347 symtab = xmalloc (3 * sizeof (asymbol *));
b044cda1 2348 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
17f73277
KT
2349 quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2350 quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
b044cda1 2351
4e986257
CF
2352 /* We need space for the real thunk and for the null terminator. */
2353 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2354 d4 = xmalloc (PE_IDATA4_SIZE * 2);
b044cda1 2355 id4->contents = d4;
4e986257 2356 memset (d4, 0, PE_IDATA4_SIZE * 2);
b044cda1
CW
2357 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2358 save_relocs (id4);
2359
2360 bfd_set_symtab (abfd, symtab, symptr);
2361
4e986257 2362 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
b044cda1
CW
2363
2364 bfd_make_readable (abfd);
2365 return abfd;
2366}
2367
2368static char *
1579bae1 2369make_import_fixup_mark (arelent *rel)
b044cda1 2370{
775cabad 2371 /* We convert reloc to symbol, for later reference. */
b044cda1
CW
2372 static int counter;
2373 static char *fixup_name = NULL;
db09f25b 2374 static size_t buffer_len = 0;
b7a26f91 2375
fc0a2244 2376 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
b7a26f91 2377
b044cda1 2378 bfd *abfd = bfd_asymbol_bfd (sym);
fe213ce2 2379 struct bfd_link_hash_entry *bh;
b044cda1
CW
2380
2381 if (!fixup_name)
2382 {
1579bae1 2383 fixup_name = xmalloc (384);
b044cda1
CW
2384 buffer_len = 384;
2385 }
2386
2387 if (strlen (sym->name) + 25 > buffer_len)
b7a26f91 2388 /* Assume 25 chars for "__fu" + counter + "_". If counter is
b044cda1 2389 bigger than 20 digits long, we've got worse problems than
775cabad 2390 overflowing this buffer... */
b044cda1
CW
2391 {
2392 free (fixup_name);
a35bc64f
NC
2393 /* New buffer size is length of symbol, plus 25, but
2394 then rounded up to the nearest multiple of 128. */
b044cda1 2395 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1579bae1 2396 fixup_name = xmalloc (buffer_len);
b044cda1 2397 }
b7a26f91 2398
b044cda1
CW
2399 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2400
fe213ce2 2401 bh = NULL;
b7a26f91 2402 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
b044cda1 2403 current_sec, /* sym->section, */
b34976b6 2404 rel->address, NULL, TRUE, FALSE, &bh);
fe213ce2 2405
b044cda1
CW
2406 return fixup_name;
2407}
2408
53baae48 2409/* .section .idata$2
775cabad
NC
2410 .rva __nm_thnk_SYM (singleton thunk with name of func)
2411 .long 0
2412 .long 0
2413 .rva __my_dll_iname (name of dll)
2414 .rva __fuNN_SYM (pointer to reference (address) in text) */
b044cda1
CW
2415
2416static bfd *
1579bae1
AM
2417make_import_fixup_entry (const char *name,
2418 const char *fixup_name,
91d6fa6a 2419 const char *symname,
1579bae1 2420 bfd *parent)
b044cda1 2421{
53baae48
NC
2422 asection *id2;
2423 unsigned char *d2;
b044cda1
CW
2424 char *oname;
2425 bfd *abfd;
2426
1579bae1 2427 oname = xmalloc (20);
b044cda1
CW
2428 sprintf (oname, "fu%06d.o", tmp_seq);
2429 tmp_seq++;
2430
2431 abfd = bfd_create (oname, parent);
2432 bfd_find_target (pe_details->object_target, abfd);
2433 bfd_make_writable (abfd);
2434
2435 bfd_set_format (abfd, bfd_object);
2436 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2437
2438 symptr = 0;
1579bae1 2439 symtab = xmalloc (6 * sizeof (asymbol *));
53baae48 2440 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
775cabad 2441
17f73277 2442 quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
91d6fa6a 2443 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1b610c93 2444 /* For relocator v2 we have to use the .idata$5 element and not
9382254d
KT
2445 fixup_name. */
2446 if (link_info.pei386_runtime_pseudo_reloc == 2)
17f73277 2447 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
9382254d
KT
2448 else
2449 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
b044cda1 2450
53baae48
NC
2451 bfd_set_section_size (abfd, id2, 20);
2452 d2 = xmalloc (20);
2453 id2->contents = d2;
2454 memset (d2, 0, 20);
b044cda1
CW
2455
2456 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2457 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2458 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
53baae48 2459 save_relocs (id2);
b044cda1
CW
2460
2461 bfd_set_symtab (abfd, symtab, symptr);
2462
53baae48 2463 bfd_set_section_contents (abfd, id2, d2, 0, 20);
b044cda1
CW
2464
2465 bfd_make_readable (abfd);
2466 return abfd;
2467}
2468
2fa9fc65
NC
2469/* .section .rdata_runtime_pseudo_reloc
2470 .long addend
2471 .rva __fuNN_SYM (pointer to reference (address) in text) */
2472
2473static bfd *
1579bae1
AM
2474make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2475 const char *fixup_name,
6cb442d3
KT
2476 bfd_vma addend ATTRIBUTE_UNUSED,
2477 bfd_vma bitsize,
1579bae1 2478 bfd *parent)
2fa9fc65
NC
2479{
2480 asection *rt_rel;
2481 unsigned char *rt_rel_d;
2482 char *oname;
2483 bfd *abfd;
1579bae1 2484 oname = xmalloc (20);
2fa9fc65
NC
2485 sprintf (oname, "rtr%06d.o", tmp_seq);
2486 tmp_seq++;
2487
2488 abfd = bfd_create (oname, parent);
2489 bfd_find_target (pe_details->object_target, abfd);
2490 bfd_make_writable (abfd);
2491
2492 bfd_set_format (abfd, bfd_object);
2493 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2494
2495 symptr = 0;
acac4c69
KT
2496 if (link_info.pei386_runtime_pseudo_reloc == 2)
2497 {
2498 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2499 }
2500 else
2501 {
2502 symtab = xmalloc (2 * sizeof (asymbol *));
2503 }
1579bae1
AM
2504 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2505 SEC_HAS_CONTENTS, 2);
2fa9fc65
NC
2506
2507 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2508
6cb442d3
KT
2509 if (link_info.pei386_runtime_pseudo_reloc == 2)
2510 {
2511 size_t size = 12;
2512 if (! runtime_pseudp_reloc_v2_init)
2513 {
2514 size += 12;
2515 runtime_pseudp_reloc_v2_init = 1;
2516 }
17f73277 2517 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
6cb442d3
KT
2518
2519 bfd_set_section_size (abfd, rt_rel, size);
2520 rt_rel_d = xmalloc (size);
2521 rt_rel->contents = rt_rel_d;
2522 memset (rt_rel_d, 0, size);
2523 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2524 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2525 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2526 if (size != 12)
2527 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2528 save_relocs (rt_rel);
2529
2530 bfd_set_symtab (abfd, symtab, symptr);
2531
2532 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2533 }
2534 else
2535 {
2536 bfd_set_section_size (abfd, rt_rel, 8);
2537 rt_rel_d = xmalloc (8);
2538 rt_rel->contents = rt_rel_d;
2539 memset (rt_rel_d, 0, 8);
2fa9fc65 2540
6cb442d3
KT
2541 bfd_put_32 (abfd, addend, rt_rel_d);
2542 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2fa9fc65 2543
6cb442d3 2544 save_relocs (rt_rel);
2fa9fc65 2545
6cb442d3 2546 bfd_set_symtab (abfd, symtab, symptr);
2fa9fc65 2547
6cb442d3
KT
2548 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2549 }
2fa9fc65
NC
2550 bfd_make_readable (abfd);
2551 return abfd;
2552}
2553
2554/* .section .rdata
a35bc64f 2555 .rva __pei386_runtime_relocator */
2fa9fc65
NC
2556
2557static bfd *
1579bae1 2558pe_create_runtime_relocator_reference (bfd *parent)
2fa9fc65
NC
2559{
2560 asection *extern_rt_rel;
2561 unsigned char *extern_rt_rel_d;
2562 char *oname;
2563 bfd *abfd;
2564
1579bae1 2565 oname = xmalloc (20);
2fa9fc65
NC
2566 sprintf (oname, "ertr%06d.o", tmp_seq);
2567 tmp_seq++;
2568
2569 abfd = bfd_create (oname, parent);
2570 bfd_find_target (pe_details->object_target, abfd);
2571 bfd_make_writable (abfd);
2572
2573 bfd_set_format (abfd, bfd_object);
2574 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2575
2576 symptr = 0;
1579bae1 2577 symtab = xmalloc (2 * sizeof (asymbol *));
2fa9fc65
NC
2578 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2579
00479ba8 2580 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
1579bae1 2581 BSF_NO_FLAGS, 0);
2fa9fc65 2582
9382254d
KT
2583 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2584 extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2fa9fc65
NC
2585 extern_rt_rel->contents = extern_rt_rel_d;
2586
2587 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2588 save_relocs (extern_rt_rel);
2589
2590 bfd_set_symtab (abfd, symtab, symptr);
2591
9382254d 2592 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2fa9fc65
NC
2593
2594 bfd_make_readable (abfd);
2595 return abfd;
2596}
2597
b044cda1 2598void
6cb442d3 2599pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
b044cda1
CW
2600{
2601 char buf[300];
fc0a2244 2602 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
b044cda1 2603 struct bfd_link_hash_entry *name_thunk_sym;
9382254d 2604 struct bfd_link_hash_entry *name_imp_sym;
db09f25b 2605 const char *name = sym->name;
b044cda1 2606 char *fixup_name = make_import_fixup_mark (rel);
2fa9fc65 2607 bfd *b;
9382254d
KT
2608 int need_import_table = 1;
2609
17f73277 2610 sprintf (buf, "__imp_%s", name);
9382254d 2611 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
b044cda1 2612
17f73277 2613 sprintf (buf, "__nm_thnk_%s", name);
b044cda1
CW
2614
2615 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2616
9382254d
KT
2617 /* For version 2 pseudo relocation we don't need to add an import
2618 if the import symbol is already present. */
2619 if (link_info.pei386_runtime_pseudo_reloc == 2
2620 && name_imp_sym
2621 && name_imp_sym->type == bfd_link_hash_defined)
2622 need_import_table = 0;
2623
2624 if (need_import_table == 1
2625 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
b044cda1 2626 {
91d6fa6a 2627 b = make_singleton_name_thunk (name, link_info.output_bfd);
b044cda1
CW
2628 add_bfd_to_link (b, b->filename, &link_info);
2629
9382254d
KT
2630 /* If we ever use autoimport, we have to cast text section writable.
2631 But not for version 2. */
2632 if (link_info.pei386_runtime_pseudo_reloc != 2)
2633 {
2634 config.text_read_only = FALSE;
2635 link_info.output_bfd->flags &= ~WP_TEXT;
2636 }
2637 if (link_info.pei386_runtime_pseudo_reloc == 2)
2638 {
2639 b = make_singleton_name_imp (name, link_info.output_bfd);
2640 add_bfd_to_link (b, b->filename, &link_info);
2641 }
b044cda1
CW
2642 }
2643
9382254d
KT
2644 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2645 && need_import_table == 1)
2fa9fc65
NC
2646 {
2647 extern char * pe_data_import_dll;
91d6fa6a 2648 char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
aa3d9aba 2649
91d6fa6a 2650 b = make_import_fixup_entry (name, fixup_name, symname,
f13a99db 2651 link_info.output_bfd);
2fa9fc65
NC
2652 add_bfd_to_link (b, b->filename, &link_info);
2653 }
2654
6cb442d3
KT
2655 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2656 || link_info.pei386_runtime_pseudo_reloc == 2)
2657 {
2658 if (pe_dll_extra_pe_debug)
2659 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2660 fixup_name, (int) addend);
2661
2662 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2663 link_info.output_bfd);
2664 add_bfd_to_link (b, b->filename, &link_info);
2665
2666 if (runtime_pseudo_relocs_created == 0)
2667 {
2668 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2669 add_bfd_to_link (b, b->filename, &link_info);
2670 }
2671 runtime_pseudo_relocs_created++;
2672 }
2673 else if (addend != 0)
2674 {
2675 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2676 s->owner, s, rel->address, sym->name);
2677 einfo ("%X");
2678 }
b044cda1
CW
2679}
2680
2681
252b5132 2682void
e1c37eb5 2683pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
252b5132
RH
2684{
2685 int i;
2686 bfd *ar_head;
2687 bfd *ar_tail;
2688 bfd *outarch;
e1c37eb5 2689 bfd *ibfd;
252b5132
RH
2690 bfd *head = 0;
2691
5aaace27 2692 dll_filename = (def->name) ? def->name : dll_name;
252b5132 2693 dll_symname = xstrdup (dll_filename);
d643799d 2694 for (i = 0; dll_symname[i]; i++)
3882b010 2695 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2696 dll_symname[i] = '_';
2697
bb14f524 2698 unlink_if_ordinary (impfilename);
252b5132
RH
2699
2700 outarch = bfd_openw (impfilename, 0);
2701
2702 if (!outarch)
2703 {
2704 /* xgettext:c-format */
2705 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2706 return;
2707 }
2708
2709 /* xgettext:c-format */
63d85248 2710 info_msg (_("Creating library file: %s\n"), impfilename);
9382254d 2711
252b5132
RH
2712 bfd_set_format (outarch, bfd_archive);
2713 outarch->has_armap = 1;
2714
5cc18311 2715 /* Work out a reasonable size of things to put onto one line. */
252b5132 2716 ar_head = make_head (outarch);
252b5132 2717
e1c37eb5
DK
2718 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2719 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2720 {
2721 /* Iterate the exclude list. */
2722 struct exclude_list_struct *ex;
2723 char found;
2724 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2725 {
2726 if (ex->type != EXCLUDEFORIMPLIB)
2727 continue;
42627821 2728 found = (filename_cmp (ex->string, ibfd->filename) == 0);
e1c37eb5
DK
2729 }
2730 /* If it matched, we must open a fresh BFD for it (the original
2731 input BFD is still needed for the DLL's final link) and add
2732 it into the archive member chain. */
2733 if (found)
2734 {
9382254d 2735 bfd *newbfd = bfd_openr (ibfd->my_archive
e1c37eb5
DK
2736 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2737 if (!newbfd)
2738 {
2739 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2740 return;
2741 }
2742 if (ibfd->my_archive)
2743 {
2744 /* Must now iterate through archive until we find the
2745 required member. A minor shame that we'll open the
2746 archive once per member that we require from it, and
2747 leak those archive bfds rather than reuse them. */
2748 bfd *arbfd = newbfd;
2749 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2750 {
9382254d 2751 einfo (_("%X%s(%s): can't find member in non-archive file"),
e1c37eb5
DK
2752 ibfd->my_archive->filename, ibfd->filename);
2753 return;
2754 }
2755 newbfd = NULL;
2756 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2757 {
42627821 2758 if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
e1c37eb5
DK
2759 break;
2760 }
2761 if (!newbfd)
2762 {
9382254d 2763 einfo (_("%X%s(%s): can't find member in archive"),
e1c37eb5
DK
2764 ibfd->my_archive->filename, ibfd->filename);
2765 return;
2766 }
2767 }
2768 newbfd->archive_next = head;
2769 head = newbfd;
2770 }
2771 }
2772
d643799d 2773 for (i = 0; i < def->num_exports; i++)
252b5132 2774 {
86b1cc60 2775 /* The import library doesn't know about the internal name. */
252b5132
RH
2776 char *internal = def->exports[i].internal_name;
2777 bfd *n;
775cabad 2778
9382254d 2779 /* Don't add PRIVATE entries to import lib. */
ee31fbd0
NC
2780 if (pe_def_file->exports[i].flag_private)
2781 continue;
252b5132 2782 def->exports[i].internal_name = def->exports[i].name;
54727719
NC
2783 n = make_one (def->exports + i, outarch,
2784 ! (def->exports + i)->flag_data);
cc481421 2785 n->archive_next = head;
252b5132
RH
2786 head = n;
2787 def->exports[i].internal_name = internal;
2788 }
2789
c6c37250
DD
2790 ar_tail = make_tail (outarch);
2791
2792 if (ar_head == NULL || ar_tail == NULL)
2793 return;
2794
86b1cc60 2795 /* Now stick them all into the archive. */
cc481421
AM
2796 ar_head->archive_next = head;
2797 ar_tail->archive_next = ar_head;
252b5132
RH
2798 head = ar_tail;
2799
2800 if (! bfd_set_archive_head (outarch, head))
36230712 2801 einfo ("%Xbfd_set_archive_head: %E\n");
5cc18311 2802
252b5132 2803 if (! bfd_close (outarch))
36230712 2804 einfo ("%Xbfd_close %s: %E\n", impfilename);
252b5132
RH
2805
2806 while (head != NULL)
2807 {
cc481421 2808 bfd *n = head->archive_next;
252b5132
RH
2809 bfd_close (head);
2810 head = n;
2811 }
2812}
2813
8a9eab9b
KT
2814static struct bfd_link_hash_entry *found_sym;
2815
2816static bfd_boolean
2817pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2818{
2819 int sl;
2820 char *string = inf;
2821 const char *hs = h->root.string;
2822
2823 sl = strlen (string);
2824 if (h->type == bfd_link_hash_undefined
17f73277
KT
2825 && ((*hs == '@' && (!pe_details->underscored || *string == '_')
2826 && strncmp (hs + 1, string + (pe_details->underscored != 0),
2827 sl - (pe_details->underscored != 0)) == 0)
8a9eab9b
KT
2828 || strncmp (hs, string, sl) == 0)
2829 && h->root.string[sl] == '@')
2830 {
2831 found_sym = h;
2832 return FALSE;
2833 }
2834 return TRUE;
2835}
2836
2837static struct bfd_link_hash_entry *
2838pe_find_cdecl_alias_match (char *name)
2839{
2840 found_sym = 0;
2841 bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2842 (char *) name);
2843 return found_sym;
2844}
2845
252b5132 2846static void
91d6fa6a 2847add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
252b5132
RH
2848{
2849 lang_input_statement_type *fake_file;
775cabad 2850
252b5132
RH
2851 fake_file = lang_add_input_file (name,
2852 lang_input_file_is_fake_enum,
2853 NULL);
2854 fake_file->the_bfd = abfd;
2855 ldlang_add_file (fake_file);
775cabad 2856
91d6fa6a 2857 if (!bfd_link_add_symbols (abfd, linfo))
36230712 2858 einfo ("%Xaddsym %s: %E\n", name);
252b5132
RH
2859}
2860
2861void
91d6fa6a 2862pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
252b5132
RH
2863{
2864 def_file_module *module;
775cabad 2865
d643799d 2866 pe_dll_id_target (bfd_get_target (output_bfd));
252b5132
RH
2867
2868 if (!pe_def_file)
2869 return;
2870
2871 for (module = pe_def_file->modules; module; module = module->next)
2872 {
2873 int i, do_this_dll;
2874
2875 dll_filename = module->name;
2876 dll_symname = xstrdup (module->name);
d643799d 2877 for (i = 0; dll_symname[i]; i++)
3882b010 2878 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2879 dll_symname[i] = '_';
2880
2881 do_this_dll = 0;
2882
d643799d 2883 for (i = 0; i < pe_def_file->num_imports; i++)
252b5132
RH
2884 if (pe_def_file->imports[i].module == module)
2885 {
2886 def_file_export exp;
2887 struct bfd_link_hash_entry *blhe;
b34976b6 2888 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
86b1cc60 2889 /* See if we need this import. */
1579bae1
AM
2890 size_t len = strlen (pe_def_file->imports[i].internal_name);
2891 char *name = xmalloc (len + 2 + 6);
54727719 2892 bfd_boolean include_jmp_stub = FALSE;
8a9eab9b
KT
2893 bfd_boolean is_cdecl = FALSE;
2894 if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2895 is_cdecl = TRUE;
c9e38879
NC
2896
2897 if (lead_at)
00479ba8 2898 sprintf (name, "%s",
1579bae1 2899 pe_def_file->imports[i].internal_name);
c9e38879 2900 else
1579bae1
AM
2901 sprintf (name, "%s%s",U (""),
2902 pe_def_file->imports[i].internal_name);
c9e38879 2903
91d6fa6a 2904 blhe = bfd_link_hash_lookup (linfo->hash, name,
b34976b6 2905 FALSE, FALSE, FALSE);
c9e38879 2906
54727719
NC
2907 /* Include the jump stub for <sym> only if the <sym>
2908 is undefined. */
874c8c99
DD
2909 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2910 {
c9e38879 2911 if (lead_at)
9382254d 2912 sprintf (name, "%s%s", "__imp_",
c9e38879
NC
2913 pe_def_file->imports[i].internal_name);
2914 else
00479ba8 2915 sprintf (name, "%s%s%s", "__imp_", U (""),
c9e38879
NC
2916 pe_def_file->imports[i].internal_name);
2917
91d6fa6a 2918 blhe = bfd_link_hash_lookup (linfo->hash, name,
b34976b6 2919 FALSE, FALSE, FALSE);
874c8c99 2920 }
54727719
NC
2921 else
2922 include_jmp_stub = TRUE;
2923
8a9eab9b
KT
2924 if (is_cdecl && !blhe)
2925 {
2926 sprintf (name, "%s%s",U (""),
2927 pe_def_file->imports[i].internal_name);
2928 blhe = pe_find_cdecl_alias_match (name);
2929 include_jmp_stub = TRUE;
2930 }
2931
252b5132 2932 free (name);
c9e38879 2933
252b5132
RH
2934 if (blhe && blhe->type == bfd_link_hash_undefined)
2935 {
2936 bfd *one;
86b1cc60 2937 /* We do. */
252b5132
RH
2938 if (!do_this_dll)
2939 {
2940 bfd *ar_head = make_head (output_bfd);
91d6fa6a 2941 add_bfd_to_link (ar_head, ar_head->filename, linfo);
252b5132
RH
2942 do_this_dll = 1;
2943 }
2944 exp.internal_name = pe_def_file->imports[i].internal_name;
2945 exp.name = pe_def_file->imports[i].name;
7fcab871 2946 exp.its_name = pe_def_file->imports[i].its_name;
252b5132
RH
2947 exp.ordinal = pe_def_file->imports[i].ordinal;
2948 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2949 exp.flag_private = 0;
2950 exp.flag_constant = 0;
939ba9d0 2951 exp.flag_data = pe_def_file->imports[i].data;
252b5132 2952 exp.flag_noname = exp.name ? 0 : 1;
54727719 2953 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
91d6fa6a 2954 add_bfd_to_link (one, one->filename, linfo);
252b5132
RH
2955 }
2956 }
2957 if (do_this_dll)
2958 {
2959 bfd *ar_tail = make_tail (output_bfd);
91d6fa6a 2960 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
252b5132
RH
2961 }
2962
2963 free (dll_symname);
2964 }
2965}
2966
775cabad 2967/* We were handed a *.DLL file. Parse it and turn it into a set of
b34976b6
AM
2968 IMPORTS directives in the def file. Return TRUE if the file was
2969 handled, FALSE if not. */
252b5132
RH
2970
2971static unsigned int
1579bae1 2972pe_get16 (bfd *abfd, int where)
252b5132
RH
2973{
2974 unsigned char b[2];
775cabad 2975
db09f25b
AM
2976 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2977 bfd_bread (b, (bfd_size_type) 2, abfd);
d643799d 2978 return b[0] + (b[1] << 8);
252b5132
RH
2979}
2980
2981static unsigned int
1579bae1 2982pe_get32 (bfd *abfd, int where)
252b5132
RH
2983{
2984 unsigned char b[4];
775cabad 2985
db09f25b
AM
2986 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2987 bfd_bread (b, (bfd_size_type) 4, abfd);
d643799d 2988 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2989}
2990
252b5132 2991static unsigned int
1579bae1 2992pe_as32 (void *ptr)
252b5132
RH
2993{
2994 unsigned char *b = ptr;
775cabad 2995
d643799d 2996 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2997}
2998
b34976b6 2999bfd_boolean
1579bae1 3000pe_implied_import_dll (const char *filename)
252b5132
RH
3001{
3002 bfd *dll;
6ca0987a
KT
3003 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3004 bfd_vma export_rva, export_size, nsections, secptr, expptr;
3005 bfd_vma exp_funcbase;
47639182
AM
3006 unsigned char *expdata;
3007 char *erva;
c7e2358a 3008 bfd_vma name_rvas, nexp;
91d6fa6a 3009 const char *dllname;
939ba9d0
NC
3010 /* Initialization with start > end guarantees that is_data
3011 will not be set by mistake, and avoids compiler warning. */
6ca0987a
KT
3012 bfd_vma data_start = 1;
3013 bfd_vma data_end = 0;
3014 bfd_vma rdata_start = 1;
3015 bfd_vma rdata_end = 0;
3016 bfd_vma bss_start = 1;
3017 bfd_vma bss_end = 0;
252b5132
RH
3018
3019 /* No, I can't use bfd here. kernel32.dll puts its export table in
5cc18311 3020 the middle of the .rdata section. */
c6c37250 3021 dll = bfd_openr (filename, pe_details->target_name);
252b5132
RH
3022 if (!dll)
3023 {
36230712 3024 einfo ("%Xopen %s: %E\n", filename);
b34976b6 3025 return FALSE;
252b5132 3026 }
775cabad 3027
86b1cc60 3028 /* PEI dlls seem to be bfd_objects. */
252b5132
RH
3029 if (!bfd_check_format (dll, bfd_object))
3030 {
3031 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
b34976b6 3032 return FALSE;
252b5132
RH
3033 }
3034
d0069cab 3035 /* Get pe_header, optional header and numbers of directory entries. */
252b5132
RH
3036 pe_header_offset = pe_get32 (dll, 0x3c);
3037 opthdr_ofs = pe_header_offset + 4 + 20;
99ad8390
NC
3038#ifdef pe_use_x86_64
3039 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3040#else
252b5132 3041 num_entries = pe_get32 (dll, opthdr_ofs + 92);
99ad8390 3042#endif
775cabad 3043
d0069cab
TG
3044 /* No import or export directory entry. */
3045 if (num_entries < 1)
b34976b6 3046 return FALSE;
775cabad 3047
99ad8390
NC
3048#ifdef pe_use_x86_64
3049 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3050 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3051#else
252b5132
RH
3052 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3053 export_size = pe_get32 (dll, opthdr_ofs + 100);
99ad8390 3054#endif
9382254d 3055
d0069cab
TG
3056 /* No export table - nothing to export. */
3057 if (export_size == 0)
3058 return FALSE;
3059
252b5132
RH
3060 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3061 secptr = (pe_header_offset + 4 + 20 +
3062 pe_get16 (dll, pe_header_offset + 4 + 16));
3063 expptr = 0;
775cabad 3064
1579bae1 3065 /* Get the rva and size of the export section. */
d643799d 3066 for (i = 0; i < nsections; i++)
252b5132
RH
3067 {
3068 char sname[8];
6ca0987a
KT
3069 bfd_vma secptr1 = secptr + 40 * i;
3070 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3071 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3072 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
775cabad 3073
db09f25b
AM
3074 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3075 bfd_bread (sname, (bfd_size_type) 8, dll);
775cabad 3076
d643799d 3077 if (vaddr <= export_rva && vaddr + vsize > export_rva)
252b5132
RH
3078 {
3079 expptr = fptr + (export_rva - vaddr);
3080 if (export_rva + export_size > vaddr + vsize)
3081 export_size = vsize - (export_rva - vaddr);
3082 break;
3083 }
3084 }
3085
939ba9d0 3086 /* Scan sections and store the base and size of the
1579bae1 3087 data and bss segments in data/base_start/end. */
939ba9d0
NC
3088 for (i = 0; i < nsections; i++)
3089 {
6ca0987a
KT
3090 bfd_vma secptr1 = secptr + 40 * i;
3091 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3092 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3093 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
939ba9d0
NC
3094 char sec_name[9];
3095
3096 sec_name[8] = '\0';
3097 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3098 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3099
3100 if (strcmp(sec_name,".data") == 0)
3101 {
3102 data_start = vaddr;
3103 data_end = vaddr + vsize;
3104
661a32f7
DS
3105 if (pe_dll_extra_pe_debug)
3106 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
6ca0987a
KT
3107 __FUNCTION__, sec_name, (unsigned long) vaddr,
3108 (unsigned long) (vaddr + vsize), (unsigned long) flags);
661a32f7
DS
3109 }
3110 else if (strcmp(sec_name,".rdata") == 0)
3111 {
3112 rdata_start = vaddr;
3113 rdata_end = vaddr + vsize;
3114
939ba9d0
NC
3115 if (pe_dll_extra_pe_debug)
3116 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
6ca0987a
KT
3117 __FUNCTION__, sec_name, (unsigned long) vaddr,
3118 (unsigned long) (vaddr + vsize), (unsigned long) flags);
1579bae1 3119 }
939ba9d0
NC
3120 else if (strcmp (sec_name,".bss") == 0)
3121 {
3122 bss_start = vaddr;
3123 bss_end = vaddr + vsize;
3124
3125 if (pe_dll_extra_pe_debug)
3126 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
6ca0987a
KT
3127 __FUNCTION__, sec_name, (unsigned long) vaddr,
3128 (unsigned long) (vaddr + vsize), (unsigned long) flags);
939ba9d0
NC
3129 }
3130 }
3131
1579bae1 3132 expdata = xmalloc (export_size);
db09f25b
AM
3133 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3134 bfd_bread (expdata, (bfd_size_type) export_size, dll);
47639182 3135 erva = (char *) expdata - export_rva;
252b5132
RH
3136
3137 if (pe_def_file == 0)
d643799d 3138 pe_def_file = def_file_empty ();
252b5132 3139
d643799d
KH
3140 nexp = pe_as32 (expdata + 24);
3141 name_rvas = pe_as32 (expdata + 32);
939ba9d0 3142 exp_funcbase = pe_as32 (expdata + 28);
775cabad 3143
939ba9d0
NC
3144 /* Use internal dll name instead of filename
3145 to enable symbolic dll linking. */
91d6fa6a 3146 dllname = erva + pe_as32 (expdata + 12);
939ba9d0 3147
a35bc64f
NC
3148 /* Check to see if the dll has already been added to
3149 the definition list and if so return without error.
3150 This avoids multiple symbol definitions. */
91d6fa6a 3151 if (def_get_module (pe_def_file, dllname))
a35bc64f
NC
3152 {
3153 if (pe_dll_extra_pe_debug)
91d6fa6a 3154 printf ("%s is already loaded\n", dllname);
a35bc64f
NC
3155 return TRUE;
3156 }
3157
939ba9d0 3158 /* Iterate through the list of symbols. */
d643799d 3159 for (i = 0; i < nexp; i++)
252b5132 3160 {
939ba9d0 3161 /* Pointer to the names vector. */
6ca0987a 3162 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
252b5132 3163 def_file_import *imp;
1579bae1 3164 /* Pointer to the function address vector. */
6ca0987a 3165 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
939ba9d0
NC
3166 int is_data = 0;
3167
3168 /* Skip unwanted symbols, which are
3169 exported in buggy auto-import releases. */
17f73277 3170 if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
939ba9d0 3171 {
db17156e 3172 int is_dup = 0;
661a32f7
DS
3173 /* is_data is true if the address is in the data, rdata or bss
3174 segment. */
939ba9d0
NC
3175 is_data =
3176 (func_rva >= data_start && func_rva < data_end)
661a32f7 3177 || (func_rva >= rdata_start && func_rva < rdata_end)
939ba9d0
NC
3178 || (func_rva >= bss_start && func_rva < bss_end);
3179
3180 imp = def_file_add_import (pe_def_file, erva + name_rva,
db17156e 3181 dllname, i, 0, NULL, &is_dup);
396a2467 3182 /* Mark symbol type. */
db17156e
KT
3183 if (!is_dup)
3184 imp->data = is_data;
1579bae1 3185
939ba9d0
NC
3186 if (pe_dll_extra_pe_debug)
3187 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
91d6fa6a 3188 __FUNCTION__, dllname, erva + name_rva,
6ca0987a 3189 (unsigned long) func_rva, is_data ? "(data)" : "");
939ba9d0 3190 }
252b5132
RH
3191 }
3192
b34976b6 3193 return TRUE;
252b5132
RH
3194}
3195
88183869
DK
3196void
3197pe_output_file_set_long_section_names (bfd *abfd)
3198{
3199 if (pe_use_coff_long_section_names < 0)
3200 return;
3201 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3202 einfo (_("%XError: can't use long section names on this arch\n"));
3203}
3204
775cabad
NC
3205/* These are the main functions, called from the emulation. The first
3206 is called after the bfds are read, so we can guess at how much space
3207 we need. The second is called after everything is placed, so we
3208 can put the right values in place. */
252b5132
RH
3209
3210void
1579bae1 3211pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
252b5132 3212{
c6c37250 3213 pe_dll_id_target (bfd_get_target (abfd));
88183869 3214 pe_output_file_set_long_section_names (abfd);
c1711530 3215 process_def_file_and_drectve (abfd, info);
252b5132 3216
1579bae1 3217 if (pe_def_file->num_exports == 0 && !info->shared)
2b817be1
NC
3218 return;
3219
252b5132 3220 generate_edata (abfd, info);
c6c37250 3221 build_filler_bfd (1);
88183869 3222 pe_output_file_set_long_section_names (filler_bfd);
c6c37250
DD
3223}
3224
3225void
1579bae1 3226pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
c6c37250
DD
3227{
3228 pe_dll_id_target (bfd_get_target (abfd));
88183869 3229 pe_output_file_set_long_section_names (abfd);
c6c37250 3230 build_filler_bfd (0);
88183869 3231 pe_output_file_set_long_section_names (filler_bfd);
252b5132
RH
3232}
3233
3234void
1579bae1 3235pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
252b5132 3236{
c6c37250 3237 pe_dll_id_target (bfd_get_target (abfd));
88183869 3238 pe_output_file_set_long_section_names (abfd);
252b5132
RH
3239 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3240
3241 generate_reloc (abfd, info);
3242 if (reloc_sz > 0)
3243 {
3244 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3245
3246 /* Resize the sections. */
38975f9e 3247 lang_reset_memory_regions ();
e9ee469a 3248 lang_size_sections (NULL, TRUE);
252b5132
RH
3249
3250 /* Redo special stuff. */
3251 ldemul_after_allocation ();
3252
3253 /* Do the assignments again. */
2f65ac72 3254 lang_do_assignments (lang_final_phase_enum);
252b5132
RH
3255 }
3256
3257 fill_edata (abfd, info);
3258
db8acf26 3259 if (info->shared && !info->pie)
2b817be1 3260 pe_data (abfd)->dll = 1;
252b5132
RH
3261
3262 edata_s->contents = edata_d;
3263 reloc_s->contents = reloc_d;
3264}
c6c37250
DD
3265
3266void
1579bae1 3267pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
c6c37250
DD
3268{
3269 pe_dll_id_target (bfd_get_target (abfd));
88183869 3270 pe_output_file_set_long_section_names (abfd);
c6c37250
DD
3271 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3272
3273 generate_reloc (abfd, info);
3274 if (reloc_sz > 0)
3275 {
3276 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3277
3278 /* Resize the sections. */
38975f9e 3279 lang_reset_memory_regions ();
e9ee469a 3280 lang_size_sections (NULL, TRUE);
c6c37250
DD
3281
3282 /* Redo special stuff. */
3283 ldemul_after_allocation ();
3284
3285 /* Do the assignments again. */
2f65ac72 3286 lang_do_assignments (lang_final_phase_enum);
c6c37250
DD
3287 }
3288 reloc_s->contents = reloc_d;
3289}
ff2bdb9c
CF
3290
3291bfd_boolean
3292pe_bfd_is_dll (bfd *abfd)
3293{
3294 return (bfd_get_format (abfd) == bfd_object
3295 && obj_pe (abfd)
3296 && pe_data (abfd)->dll);
3297}
This page took 0.723632 seconds and 4 git commands to generate.