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