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