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