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