]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/pe-dll.c
Add code to create and use directory tables.
[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,
202 0
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
86b1cc60 567 /* Now, maybe export everything else the default way. */
252b5132
RH
568 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
569 {
570 for (b = info->input_bfds; b; b = b->link_next)
571 {
572 asymbol **symbols;
573 int nsyms, symsize;
574
575 symsize = bfd_get_symtab_upper_bound (b);
576 symbols = (asymbol **) xmalloc (symsize);
577 nsyms = bfd_canonicalize_symtab (b, symbols);
578
579 for (j = 0; j < nsyms; j++)
580 {
d643799d 581 /* We should export symbols which are either global or not
b044cda1 582 anything at all. (.bss data is the latter)
775cabad 583 We should not export undefined symbols. */
b044cda1
CW
584 if (symbols[j]->section != &bfd_und_section
585 && ((symbols[j]->flags & BSF_GLOBAL)
586 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
252b5132
RH
587 {
588 const char *sn = symbols[j]->name;
b044cda1 589
775cabad 590 /* We should not re-export imported stuff. */
b044cda1
CW
591 {
592 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
593 sprintf (name, "%s%s", U("_imp_"), sn);
775cabad 594
b044cda1 595 blhe = bfd_link_hash_lookup (info->hash, name,
b34976b6 596 FALSE, FALSE, FALSE);
b044cda1
CW
597 free (name);
598
b7a26f91 599 if (blhe && blhe->type == bfd_link_hash_defined)
b044cda1
CW
600 continue;
601 }
602
252b5132
RH
603 if (*sn == '_')
604 sn++;
775cabad 605
b044cda1
CW
606 if (auto_export (b, pe_def_file, sn))
607 {
608 def_file_export *p;
609 p=def_file_add_export (pe_def_file, sn, 0, -1);
775cabad 610 /* Fill data flag properly, from dlltool.c. */
b044cda1
CW
611 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
612 }
252b5132
RH
613 }
614 }
615 }
616 }
617
618#undef NE
619#define NE pe_def_file->num_exports
620
86b1cc60 621 /* Canonicalize the export list. */
252b5132
RH
622 if (pe_dll_kill_ats)
623 {
624 for (i = 0; i < NE; i++)
625 {
626 if (strchr (pe_def_file->exports[i].name, '@'))
627 {
86b1cc60
KH
628 /* This will preserve internal_name, which may have been
629 pointing to the same memory as name, or might not
630 have. */
c9e38879
NC
631 int lead_at = (*pe_def_file->exports[i].name =='@');
632 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
775cabad 633
252b5132
RH
634 *(strchr (tmp, '@')) = 0;
635 pe_def_file->exports[i].name = tmp;
636 }
637 }
638 }
639
640 if (pe_dll_stdcall_aliases)
641 {
642 for (i = 0; i < NE; i++)
643 {
644 if (strchr (pe_def_file->exports[i].name, '@'))
645 {
c9e38879
NC
646 int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
647 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
775cabad 648
252b5132 649 *(strchr (tmp, '@')) = 0;
b044cda1 650 if (auto_export (NULL, pe_def_file, tmp))
252b5132 651 def_file_add_export (pe_def_file, tmp,
b044cda1
CW
652 pe_def_file->exports[i].internal_name,
653 -1);
252b5132
RH
654 else
655 free (tmp);
656 }
657 }
658 }
659
86b1cc60
KH
660 /* Convenience, but watch out for it changing. */
661 e = pe_def_file->exports;
252b5132
RH
662
663 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
664 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
665
666 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
667 max_ordinal = 0;
668 min_ordinal = 65536;
669 count_exported = 0;
670 count_exported_byname = 0;
671 count_with_ordinals = 0;
672
673 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
674 for (i = 0, j = 0; i < NE; i++)
675 {
676 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
677 {
870df5dc 678 /* This is a duplicate. */
252b5132
RH
679 if (e[j - 1].ordinal != -1
680 && e[i].ordinal != -1
681 && e[j - 1].ordinal != e[i].ordinal)
682 {
870df5dc
NC
683 if (pe_dll_warn_dup_exports)
684 /* xgettext:c-format */
486e80e2 685 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
870df5dc 686 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
252b5132
RH
687 }
688 else
689 {
870df5dc
NC
690 if (pe_dll_warn_dup_exports)
691 /* xgettext:c-format */
692 einfo (_("Warning, duplicate EXPORT: %s\n"),
693 e[j - 1].name);
252b5132 694 }
775cabad 695
486e80e2 696 if (e[i].ordinal != -1)
252b5132
RH
697 e[j - 1].ordinal = e[i].ordinal;
698 e[j - 1].flag_private |= e[i].flag_private;
699 e[j - 1].flag_constant |= e[i].flag_constant;
700 e[j - 1].flag_noname |= e[i].flag_noname;
701 e[j - 1].flag_data |= e[i].flag_data;
702 }
703 else
704 {
705 if (i != j)
706 e[j] = e[i];
707 j++;
708 }
709 }
710 pe_def_file->num_exports = j; /* == NE */
711
712 for (i = 0; i < NE; i++)
713 {
714 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
775cabad 715
c9e38879
NC
716 if (pe_details->underscored
717 && (*pe_def_file->exports[i].internal_name != '@'))
c6c37250
DD
718 {
719 *name = '_';
720 strcpy (name + 1, pe_def_file->exports[i].internal_name);
721 }
722 else
723 strcpy (name, pe_def_file->exports[i].internal_name);
252b5132
RH
724
725 blhe = bfd_link_hash_lookup (info->hash,
726 name,
b34976b6 727 FALSE, FALSE, TRUE);
252b5132 728
8a5b676c 729 if (blhe
d643799d 730 && (blhe->type == bfd_link_hash_defined
8a5b676c 731 || (blhe->type == bfd_link_hash_common)))
252b5132
RH
732 {
733 count_exported++;
734 if (!pe_def_file->exports[i].flag_noname)
735 count_exported_byname++;
8a5b676c
DD
736
737 /* Only fill in the sections. The actual offsets are computed
738 in fill_exported_offsets() after common symbols are laid
739 out. */
d643799d 740 if (blhe->type == bfd_link_hash_defined)
8a5b676c
DD
741 exported_symbol_sections[i] = blhe->u.def.section;
742 else
743 exported_symbol_sections[i] = blhe->u.c.p->section;
5cc18311 744
252b5132
RH
745 if (pe_def_file->exports[i].ordinal != -1)
746 {
747 if (max_ordinal < pe_def_file->exports[i].ordinal)
748 max_ordinal = pe_def_file->exports[i].ordinal;
749 if (min_ordinal > pe_def_file->exports[i].ordinal)
750 min_ordinal = pe_def_file->exports[i].ordinal;
751 count_with_ordinals++;
752 }
753 }
754 else if (blhe && blhe->type == bfd_link_hash_undefined)
755 {
756 /* xgettext:c-format */
757 einfo (_("%XCannot export %s: symbol not defined\n"),
758 pe_def_file->exports[i].internal_name);
759 }
760 else if (blhe)
761 {
762 /* xgettext:c-format */
763 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
764 pe_def_file->exports[i].internal_name,
765 blhe->type, bfd_link_hash_defined);
766 }
767 else
768 {
769 /* xgettext:c-format */
770 einfo (_("%XCannot export %s: symbol not found\n"),
771 pe_def_file->exports[i].internal_name);
772 }
773 free (name);
774 }
775}
776
775cabad 777/* Build the bfd that will contain .edata and .reloc sections. */
252b5132
RH
778
779static void
c6c37250
DD
780build_filler_bfd (include_edata)
781 int include_edata;
252b5132
RH
782{
783 lang_input_statement_type *filler_file;
784 filler_file = lang_add_input_file ("dll stuff",
785 lang_input_file_is_fake_enum,
786 NULL);
787 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
788 if (filler_bfd == NULL
789 || !bfd_set_arch_mach (filler_bfd,
790 bfd_get_arch (output_bfd),
791 bfd_get_mach (output_bfd)))
792 {
793 einfo ("%X%P: can not create BFD %E\n");
794 return;
795 }
796
c6c37250 797 if (include_edata)
252b5132 798 {
c6c37250
DD
799 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
800 if (edata_s == NULL
801 || !bfd_set_section_flags (filler_bfd, edata_s,
802 (SEC_HAS_CONTENTS
803 | SEC_ALLOC
804 | SEC_LOAD
805 | SEC_KEEP
806 | SEC_IN_MEMORY)))
807 {
808 einfo ("%X%P: can not create .edata section: %E\n");
809 return;
810 }
811 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
252b5132 812 }
252b5132
RH
813
814 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
815 if (reloc_s == NULL
816 || !bfd_set_section_flags (filler_bfd, reloc_s,
817 (SEC_HAS_CONTENTS
818 | SEC_ALLOC
819 | SEC_LOAD
820 | SEC_KEEP
821 | SEC_IN_MEMORY)))
822 {
823 einfo ("%X%P: can not create .reloc section: %E\n");
824 return;
825 }
775cabad 826
252b5132
RH
827 bfd_set_section_size (filler_bfd, reloc_s, 0);
828
829 ldlang_add_file (filler_file);
830}
831
775cabad 832/* Gather all the exported symbols and build the .edata section. */
252b5132
RH
833
834static void
835generate_edata (abfd, info)
836 bfd *abfd;
1069dd8d 837 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
838{
839 int i, next_ordinal;
840 int name_table_size = 0;
841 const char *dlnp;
842
843 /* First, we need to know how many exported symbols there are,
5cc18311 844 and what the range of ordinals is. */
252b5132 845 if (pe_def_file->name)
775cabad 846 dll_name = pe_def_file->name;
252b5132
RH
847 else
848 {
849 dll_name = abfd->filename;
775cabad 850
252b5132 851 for (dlnp = dll_name; *dlnp; dlnp++)
775cabad
NC
852 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
853 dll_name = dlnp + 1;
252b5132
RH
854 }
855
856 if (count_with_ordinals && max_ordinal > count_exported)
857 {
858 if (min_ordinal > max_ordinal - count_exported + 1)
859 min_ordinal = max_ordinal - count_exported + 1;
860 }
861 else
862 {
863 min_ordinal = 1;
864 max_ordinal = count_exported;
865 }
252b5132 866
775cabad 867 export_table_size = max_ordinal - min_ordinal + 1;
252b5132
RH
868 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
869 for (i = 0; i < export_table_size; i++)
870 exported_symbols[i] = -1;
871
86b1cc60 872 /* Now we need to assign ordinals to those that don't have them. */
252b5132
RH
873 for (i = 0; i < NE; i++)
874 {
875 if (exported_symbol_sections[i])
876 {
877 if (pe_def_file->exports[i].ordinal != -1)
878 {
879 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
880 int pi = exported_symbols[ei];
775cabad 881
252b5132
RH
882 if (pi != -1)
883 {
884 /* xgettext:c-format */
486e80e2 885 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
252b5132
RH
886 pe_def_file->exports[i].ordinal,
887 pe_def_file->exports[i].name,
888 pe_def_file->exports[pi].name);
889 }
890 exported_symbols[ei] = i;
891 }
892 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
893 }
894 }
895
896 next_ordinal = min_ordinal;
897 for (i = 0; i < NE; i++)
898 if (exported_symbol_sections[i])
899 if (pe_def_file->exports[i].ordinal == -1)
900 {
901 while (exported_symbols[next_ordinal - min_ordinal] != -1)
b7a26f91 902 next_ordinal++;
775cabad 903
252b5132
RH
904 exported_symbols[next_ordinal - min_ordinal] = i;
905 pe_def_file->exports[i].ordinal = next_ordinal;
906 }
907
86b1cc60 908 /* OK, now we can allocate some memory. */
775cabad
NC
909 edata_sz = (40 /* directory */
910 + 4 * export_table_size /* addresses */
252b5132
RH
911 + 4 * count_exported_byname /* name ptrs */
912 + 2 * count_exported_byname /* ordinals */
913 + name_table_size + strlen (dll_name) + 1);
914}
915
8a5b676c
DD
916/* Fill the exported symbol offsets. The preliminary work has already
917 been done in process_def_file(). */
918
919static void
920fill_exported_offsets (abfd, info)
f0c87f88 921 bfd *abfd ATTRIBUTE_UNUSED;
8a5b676c
DD
922 struct bfd_link_info *info;
923{
f0c87f88 924 int i;
8a5b676c 925 struct bfd_link_hash_entry *blhe;
5cc18311 926
8a5b676c
DD
927 for (i = 0; i < pe_def_file->num_exports; i++)
928 {
929 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
775cabad 930
c9e38879
NC
931 if (pe_details->underscored
932 && (*pe_def_file->exports[i].internal_name != '@'))
8a5b676c
DD
933 {
934 *name = '_';
935 strcpy (name + 1, pe_def_file->exports[i].internal_name);
936 }
937 else
938 strcpy (name, pe_def_file->exports[i].internal_name);
939
940 blhe = bfd_link_hash_lookup (info->hash,
941 name,
b34976b6 942 FALSE, FALSE, TRUE);
8a5b676c
DD
943
944 if (blhe && (blhe->type == bfd_link_hash_defined))
775cabad
NC
945 exported_symbol_offsets[i] = blhe->u.def.value;
946
8a5b676c
DD
947 free (name);
948 }
949}
950
252b5132
RH
951static void
952fill_edata (abfd, info)
953 bfd *abfd;
1069dd8d 954 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
955{
956 int i, hint;
957 unsigned char *edirectory;
958 unsigned long *eaddresses;
959 unsigned long *enameptrs;
960 unsigned short *eordinals;
961 unsigned char *enamestr;
962 time_t now;
963
964 time (&now);
965
966 edata_d = (unsigned char *) xmalloc (edata_sz);
967
86b1cc60 968 /* Note use of array pointer math here. */
252b5132
RH
969 edirectory = edata_d;
970 eaddresses = (unsigned long *) (edata_d + 40);
971 enameptrs = eaddresses + export_table_size;
972 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
973 enamestr = (char *) (eordinals + count_exported_byname);
974
975#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
976
c2a94a7a 977 memset (edata_d, 0, edata_sz);
252b5132
RH
978 bfd_put_32 (abfd, now, edata_d + 4);
979 if (pe_def_file->version_major != -1)
980 {
981 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
982 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
983 }
775cabad 984
252b5132
RH
985 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
986 strcpy (enamestr, dll_name);
987 enamestr += strlen (enamestr) + 1;
988 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
989 bfd_put_32 (abfd, export_table_size, edata_d + 20);
990 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
991 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
992 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
993 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
994
8a5b676c
DD
995 fill_exported_offsets (abfd, info);
996
86b1cc60 997 /* Ok, now for the filling in part. */
252b5132
RH
998 hint = 0;
999 for (i = 0; i < export_table_size; i++)
1000 {
1001 int s = exported_symbols[i];
775cabad 1002
252b5132
RH
1003 if (s != -1)
1004 {
1005 struct sec *ssec = exported_symbol_sections[s];
1006 unsigned long srva = (exported_symbol_offsets[s]
1007 + ssec->output_section->vma
1008 + ssec->output_offset);
45b1f63c 1009 int ord = pe_def_file->exports[s].ordinal;
252b5132 1010
45b1f63c
DD
1011 bfd_put_32 (abfd, srva - image_base,
1012 (void *) (eaddresses + ord - min_ordinal));
775cabad 1013
252b5132
RH
1014 if (!pe_def_file->exports[s].flag_noname)
1015 {
1016 char *ename = pe_def_file->exports[s].name;
1017 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
45b1f63c 1018 enameptrs++;
252b5132
RH
1019 strcpy (enamestr, ename);
1020 enamestr += strlen (enamestr) + 1;
45b1f63c
DD
1021 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
1022 eordinals++;
252b5132
RH
1023 pe_def_file->exports[s].hint = hint++;
1024 }
252b5132
RH
1025 }
1026 }
1027}
1028
b044cda1
CW
1029
1030static struct sec *current_sec;
1031
1032void
1033pe_walk_relocs_of_symbol (info, name, cb)
1034 struct bfd_link_info *info;
db09f25b 1035 const char *name;
0d888aac 1036 int (*cb) (arelent *, asection *);
b044cda1
CW
1037{
1038 bfd *b;
0d888aac 1039 asection *s;
b044cda1
CW
1040
1041 for (b = info->input_bfds; b; b = b->link_next)
1042 {
775cabad
NC
1043 asymbol **symbols;
1044 int nsyms, symsize;
1045
1046 symsize = bfd_get_symtab_upper_bound (b);
1047 symbols = (asymbol **) xmalloc (symsize);
1048 nsyms = bfd_canonicalize_symtab (b, symbols);
b044cda1
CW
1049
1050 for (s = b->sections; s; s = s->next)
1051 {
775cabad
NC
1052 arelent **relocs;
1053 int relsize, nrelocs, i;
b044cda1
CW
1054 int flags = bfd_get_section_flags (b, s);
1055
775cabad 1056 /* Skip discarded linkonce sections. */
b044cda1
CW
1057 if (flags & SEC_LINK_ONCE
1058 && s->output_section == bfd_abs_section_ptr)
1059 continue;
1060
0d888aac 1061 current_sec = s;
b044cda1 1062
b044cda1
CW
1063 relsize = bfd_get_reloc_upper_bound (b, s);
1064 relocs = (arelent **) xmalloc ((size_t) relsize);
1065 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1066
1067 for (i = 0; i < nrelocs; i++)
1068 {
1069 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
775cabad
NC
1070
1071 if (!strcmp (name, sym->name))
1072 cb (relocs[i], s);
b044cda1 1073 }
775cabad 1074
b044cda1 1075 free (relocs);
775cabad 1076
b044cda1
CW
1077 /* Warning: the allocated symbols are remembered in BFD and reused
1078 later, so don't free them! */
1079 /* free (symbols); */
1080 }
1081 }
1082}
1083
775cabad 1084/* Gather all the relocations and build the .reloc section. */
252b5132
RH
1085
1086static void
1087generate_reloc (abfd, info)
1088 bfd *abfd;
1089 struct bfd_link_info *info;
1090{
1091
86b1cc60 1092 /* For .reloc stuff. */
c6c37250 1093 reloc_data_type *reloc_data;
252b5132
RH
1094 int total_relocs = 0;
1095 int i;
1096 unsigned long sec_page = (unsigned long) (-1);
1097 unsigned long page_ptr, page_count;
1098 int bi;
1099 bfd *b;
1100 struct sec *s;
1101
1102 total_relocs = 0;
1103 for (b = info->input_bfds; b; b = b->link_next)
1104 for (s = b->sections; s; s = s->next)
1105 total_relocs += s->reloc_count;
1106
b044cda1
CW
1107 reloc_data =
1108 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
252b5132
RH
1109
1110 total_relocs = 0;
1111 bi = 0;
1112 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1113 {
1114 arelent **relocs;
1115 int relsize, nrelocs, i;
1116
1117 for (s = b->sections; s; s = s->next)
1118 {
1119 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1120 asymbol **symbols;
1121 int nsyms, symsize;
1122
86b1cc60 1123 /* If it's not loaded, we don't need to relocate it this way. */
252b5132
RH
1124 if (!(s->output_section->flags & SEC_LOAD))
1125 continue;
1126
1127 /* I don't know why there would be a reloc for these, but I've
86b1cc60 1128 seen it happen - DJ */
252b5132
RH
1129 if (s->output_section == &bfd_abs_section)
1130 continue;
1131
1132 if (s->output_section->vma == 0)
1133 {
86b1cc60 1134 /* Huh? Shouldn't happen, but punt if it does. */
252b5132
RH
1135 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1136 s->output_section->name, s->output_section->index,
1137 s->output_section->flags);
1138 continue;
1139 }
1140
1141 symsize = bfd_get_symtab_upper_bound (b);
1142 symbols = (asymbol **) xmalloc (symsize);
1143 nsyms = bfd_canonicalize_symtab (b, symbols);
1144
1145 relsize = bfd_get_reloc_upper_bound (b, s);
1146 relocs = (arelent **) xmalloc ((size_t) relsize);
1147 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1148
1149 for (i = 0; i < nrelocs; i++)
1150 {
b044cda1 1151 if (pe_dll_extra_pe_debug)
b7a26f91 1152 {
b044cda1 1153 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
b7a26f91 1154 printf ("rel: %s\n", sym->name);
b044cda1 1155 }
252b5132 1156 if (!relocs[i]->howto->pc_relative
c6c37250 1157 && relocs[i]->howto->type != pe_details->imagebase_reloc)
252b5132 1158 {
c6c37250
DD
1159 bfd_vma sym_vma;
1160 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
775cabad 1161
c6c37250
DD
1162 sym_vma = (relocs[i]->addend
1163 + sym->value
1164 + sym->section->vma
1165 + sym->section->output_offset
1166 + sym->section->output_section->vma);
1167 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
5cc18311 1168
344a211f 1169#define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
5cc18311 1170
344a211f
NC
1171 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1172 relocs[i]->howto->rightshift)
252b5132 1173 {
344a211f 1174 case BITS_AND_SHIFT (32, 0):
c6c37250
DD
1175 reloc_data[total_relocs].type = 3;
1176 total_relocs++;
252b5132 1177 break;
344a211f
NC
1178 case BITS_AND_SHIFT (16, 0):
1179 reloc_data[total_relocs].type = 2;
1180 total_relocs++;
1181 break;
1182 case BITS_AND_SHIFT (16, 16):
1183 reloc_data[total_relocs].type = 4;
86b1cc60
KH
1184 /* FIXME: we can't know the symbol's right value
1185 yet, but we probably can safely assume that
1186 CE will relocate us in 64k blocks, so leaving
1187 it zero is safe. */
344a211f
NC
1188 reloc_data[total_relocs].extra = 0;
1189 total_relocs++;
1190 break;
1191 case BITS_AND_SHIFT (26, 2):
1192 reloc_data[total_relocs].type = 5;
1193 total_relocs++;
1194 break;
252b5132
RH
1195 default:
1196 /* xgettext:c-format */
1197 einfo (_("%XError: %d-bit reloc in dll\n"),
1198 relocs[i]->howto->bitsize);
1199 break;
1200 }
1201 }
1202 }
1203 free (relocs);
86b1cc60
KH
1204 /* Warning: the allocated symbols are remembered in BFD and
1205 reused later, so don't free them! */
7bfd51a3
KH
1206#if 0
1207 free (symbol);
1208#endif
252b5132
RH
1209 }
1210 }
1211
1212 /* At this point, we have total_relocs relocation addresses in
1213 reloc_addresses, which are all suitable for the .reloc section.
5cc18311 1214 We must now create the new sections. */
c6c37250 1215 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
252b5132
RH
1216
1217 for (i = 0; i < total_relocs; i++)
1218 {
c6c37250 1219 unsigned long this_page = (reloc_data[i].vma >> 12);
5cc18311 1220
252b5132
RH
1221 if (this_page != sec_page)
1222 {
775cabad 1223 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
252b5132
RH
1224 reloc_sz += 8;
1225 sec_page = this_page;
1226 }
5cc18311 1227
252b5132 1228 reloc_sz += 2;
5cc18311 1229
344a211f
NC
1230 if (reloc_data[i].type == 4)
1231 reloc_sz += 2;
252b5132 1232 }
b7a26f91 1233
775cabad 1234 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
252b5132 1235 reloc_d = (unsigned char *) xmalloc (reloc_sz);
252b5132
RH
1236 sec_page = (unsigned long) (-1);
1237 reloc_sz = 0;
1238 page_ptr = (unsigned long) (-1);
1239 page_count = 0;
775cabad 1240
252b5132
RH
1241 for (i = 0; i < total_relocs; i++)
1242 {
c6c37250 1243 unsigned long rva = reloc_data[i].vma - image_base;
252b5132 1244 unsigned long this_page = (rva & ~0xfff);
775cabad 1245
252b5132
RH
1246 if (this_page != sec_page)
1247 {
1248 while (reloc_sz & 3)
1249 reloc_d[reloc_sz++] = 0;
775cabad 1250
252b5132
RH
1251 if (page_ptr != (unsigned long) (-1))
1252 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1253
252b5132
RH
1254 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1255 page_ptr = reloc_sz;
1256 reloc_sz += 8;
1257 sec_page = this_page;
1258 page_count = 0;
1259 }
775cabad 1260
d643799d 1261 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
c6c37250 1262 reloc_d + reloc_sz);
252b5132 1263 reloc_sz += 2;
775cabad 1264
c6c37250
DD
1265 if (reloc_data[i].type == 4)
1266 {
1267 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1268 reloc_sz += 2;
1269 }
775cabad 1270
252b5132
RH
1271 page_count++;
1272 }
775cabad 1273
252b5132
RH
1274 while (reloc_sz & 3)
1275 reloc_d[reloc_sz++] = 0;
775cabad 1276
252b5132
RH
1277 if (page_ptr != (unsigned long) (-1))
1278 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
775cabad 1279
252b5132
RH
1280 while (reloc_sz < reloc_s->_raw_size)
1281 reloc_d[reloc_sz++] = 0;
1282}
1283
775cabad
NC
1284/* Given the exiting def_file structure, print out a .DEF file that
1285 corresponds to it. */
252b5132
RH
1286
1287static void
1288quoteput (s, f, needs_quotes)
1289 char *s;
d643799d 1290 FILE *f;
252b5132
RH
1291 int needs_quotes;
1292{
1293 char *cp;
775cabad 1294
252b5132
RH
1295 for (cp = s; *cp; cp++)
1296 if (*cp == '\''
1297 || *cp == '"'
1298 || *cp == '\\'
3882b010 1299 || ISSPACE (*cp)
252b5132
RH
1300 || *cp == ','
1301 || *cp == ';')
1302 needs_quotes = 1;
775cabad 1303
252b5132
RH
1304 if (needs_quotes)
1305 {
1306 putc ('"', f);
775cabad 1307
252b5132
RH
1308 while (*s)
1309 {
1310 if (*s == '"' || *s == '\\')
1311 putc ('\\', f);
775cabad 1312
252b5132
RH
1313 putc (*s, f);
1314 s++;
1315 }
775cabad 1316
252b5132
RH
1317 putc ('"', f);
1318 }
1319 else
1320 fputs (s, f);
1321}
1322
1323void
1324pe_dll_generate_def_file (pe_out_def_filename)
1069dd8d 1325 const char *pe_out_def_filename;
252b5132
RH
1326{
1327 int i;
1328 FILE *out = fopen (pe_out_def_filename, "w");
775cabad 1329
252b5132 1330 if (out == NULL)
775cabad
NC
1331 /* xgettext:c-format */
1332 einfo (_("%s: Can't open output def file %s\n"),
1333 program_name, pe_out_def_filename);
252b5132
RH
1334
1335 if (pe_def_file)
1336 {
1337 if (pe_def_file->name)
1338 {
1339 if (pe_def_file->is_dll)
1340 fprintf (out, "LIBRARY ");
1341 else
1342 fprintf (out, "NAME ");
775cabad 1343
252b5132 1344 quoteput (pe_def_file->name, out, 1);
775cabad 1345
252b5132
RH
1346 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1347 fprintf (out, " BASE=0x%lx",
1348 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1349 fprintf (out, "\n");
1350 }
1351
1352 if (pe_def_file->description)
1353 {
1354 fprintf (out, "DESCRIPTION ");
1355 quoteput (pe_def_file->description, out, 1);
1356 fprintf (out, "\n");
1357 }
1358
1359 if (pe_def_file->version_minor != -1)
1360 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1361 pe_def_file->version_minor);
1362 else if (pe_def_file->version_major != -1)
1363 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1364
1365 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1366 fprintf (out, "\n");
1367
1368 if (pe_def_file->stack_commit != -1)
1369 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1370 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1371 else if (pe_def_file->stack_reserve != -1)
1372 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
775cabad 1373
252b5132
RH
1374 if (pe_def_file->heap_commit != -1)
1375 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1376 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1377 else if (pe_def_file->heap_reserve != -1)
1378 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1379
1380 if (pe_def_file->num_section_defs > 0)
1381 {
1382 fprintf (out, "\nSECTIONS\n\n");
775cabad 1383
252b5132
RH
1384 for (i = 0; i < pe_def_file->num_section_defs; i++)
1385 {
1386 fprintf (out, " ");
1387 quoteput (pe_def_file->section_defs[i].name, out, 0);
775cabad 1388
252b5132
RH
1389 if (pe_def_file->section_defs[i].class)
1390 {
1391 fprintf (out, " CLASS ");
1392 quoteput (pe_def_file->section_defs[i].class, out, 0);
1393 }
775cabad 1394
252b5132
RH
1395 if (pe_def_file->section_defs[i].flag_read)
1396 fprintf (out, " READ");
775cabad 1397
252b5132
RH
1398 if (pe_def_file->section_defs[i].flag_write)
1399 fprintf (out, " WRITE");
775cabad 1400
252b5132
RH
1401 if (pe_def_file->section_defs[i].flag_execute)
1402 fprintf (out, " EXECUTE");
775cabad 1403
252b5132
RH
1404 if (pe_def_file->section_defs[i].flag_shared)
1405 fprintf (out, " SHARED");
775cabad 1406
252b5132
RH
1407 fprintf (out, "\n");
1408 }
1409 }
1410
1411 if (pe_def_file->num_exports > 0)
1412 {
b044cda1 1413 fprintf (out, "EXPORTS\n");
775cabad 1414
252b5132
RH
1415 for (i = 0; i < pe_def_file->num_exports; i++)
1416 {
1417 def_file_export *e = pe_def_file->exports + i;
1418 fprintf (out, " ");
1419 quoteput (e->name, out, 0);
775cabad 1420
252b5132
RH
1421 if (e->internal_name && strcmp (e->internal_name, e->name))
1422 {
1423 fprintf (out, " = ");
1424 quoteput (e->internal_name, out, 0);
1425 }
775cabad 1426
252b5132
RH
1427 if (e->ordinal != -1)
1428 fprintf (out, " @%d", e->ordinal);
775cabad 1429
252b5132
RH
1430 if (e->flag_private)
1431 fprintf (out, " PRIVATE");
775cabad 1432
252b5132
RH
1433 if (e->flag_constant)
1434 fprintf (out, " CONSTANT");
775cabad 1435
252b5132
RH
1436 if (e->flag_noname)
1437 fprintf (out, " NONAME");
775cabad 1438
252b5132
RH
1439 if (e->flag_data)
1440 fprintf (out, " DATA");
1441
1442 fprintf (out, "\n");
1443 }
1444 }
1445
1446 if (pe_def_file->num_imports > 0)
1447 {
1448 fprintf (out, "\nIMPORTS\n\n");
775cabad 1449
252b5132
RH
1450 for (i = 0; i < pe_def_file->num_imports; i++)
1451 {
1452 def_file_import *im = pe_def_file->imports + i;
1453 fprintf (out, " ");
775cabad 1454
252b5132
RH
1455 if (im->internal_name
1456 && (!im->name || strcmp (im->internal_name, im->name)))
1457 {
1458 quoteput (im->internal_name, out, 0);
1459 fprintf (out, " = ");
1460 }
775cabad 1461
252b5132
RH
1462 quoteput (im->module->name, out, 0);
1463 fprintf (out, ".");
775cabad 1464
252b5132
RH
1465 if (im->name)
1466 quoteput (im->name, out, 0);
1467 else
1468 fprintf (out, "%d", im->ordinal);
775cabad 1469
252b5132
RH
1470 fprintf (out, "\n");
1471 }
1472 }
1473 }
1474 else
1475 fprintf (out, _("; no contents available\n"));
1476
1477 if (fclose (out) == EOF)
775cabad
NC
1478 /* xgettext:c-format */
1479 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
252b5132
RH
1480}
1481
775cabad 1482/* Generate the import library. */
252b5132
RH
1483
1484static asymbol **symtab;
1485static int symptr;
1486static int tmp_seq;
1487static const char *dll_filename;
1488static char *dll_symname;
1489
1490#define UNDSEC (asection *) &bfd_und_section
1491
1492static asection *
d643799d 1493quick_section (abfd, name, flags, align)
252b5132
RH
1494 bfd *abfd;
1495 const char *name;
1496 int flags;
1497 int align;
1498{
1499 asection *sec;
1500 asymbol *sym;
1501
1502 sec = bfd_make_section_old_way (abfd, name);
86b1cc60 1503 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
252b5132 1504 bfd_set_section_alignment (abfd, sec, align);
86b1cc60 1505 /* Remember to undo this before trying to link internally! */
252b5132
RH
1506 sec->output_section = sec;
1507
1508 sym = bfd_make_empty_symbol (abfd);
1509 symtab[symptr++] = sym;
1510 sym->name = sec->name;
1511 sym->section = sec;
1512 sym->flags = BSF_LOCAL;
1513 sym->value = 0;
1514
1515 return sec;
1516}
1517
1518static void
1519quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1520 bfd *abfd;
db09f25b
AM
1521 const char *n1;
1522 const char *n2;
1523 const char *n3;
252b5132
RH
1524 asection *sec;
1525 int flags;
1526 int addr;
1527{
1528 asymbol *sym;
1529 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
775cabad 1530
252b5132
RH
1531 strcpy (name, n1);
1532 strcat (name, n2);
1533 strcat (name, n3);
1534 sym = bfd_make_empty_symbol (abfd);
1535 sym->name = name;
1536 sym->section = sec;
1537 sym->flags = flags;
1538 sym->value = addr;
1539 symtab[symptr++] = sym;
1540}
1541
1542static arelent *reltab = 0;
1543static int relcount = 0, relsize = 0;
1544
1545static void
1546quick_reloc (abfd, address, which_howto, symidx)
1547 bfd *abfd;
1548 int address;
1549 int which_howto;
1550 int symidx;
1551{
d643799d 1552 if (relcount >= (relsize - 1))
252b5132
RH
1553 {
1554 relsize += 10;
1555 if (reltab)
1556 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1557 else
1558 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1559 }
1560 reltab[relcount].address = address;
1561 reltab[relcount].addend = 0;
1562 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1563 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1564 relcount++;
1565}
1566
1567static void
1568save_relocs (asection *sec)
1569{
1570 int i;
775cabad 1571
252b5132
RH
1572 sec->relocation = reltab;
1573 sec->reloc_count = relcount;
d643799d
KH
1574 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1575 for (i = 0; i < relcount; i++)
252b5132
RH
1576 sec->orelocation[i] = sec->relocation + i;
1577 sec->orelocation[relcount] = 0;
1578 sec->flags |= SEC_RELOC;
1579 reltab = 0;
1580 relcount = relsize = 0;
1581}
1582
775cabad
NC
1583/* .section .idata$2
1584 .global __head_my_dll
1585 __head_my_dll:
1586 .rva hname
1587 .long 0
1588 .long 0
1589 .rva __my_dll_iname
1590 .rva fthunk
b7a26f91 1591
775cabad
NC
1592 .section .idata$5
1593 .long 0
1594 fthunk:
b7a26f91 1595
775cabad
NC
1596 .section .idata$4
1597 .long 0
1598 hname: */
252b5132
RH
1599
1600static bfd *
1601make_head (parent)
1602 bfd *parent;
1603{
1604 asection *id2, *id5, *id4;
1605 unsigned char *d2, *d5, *d4;
1606 char *oname;
1607 bfd *abfd;
1608
1609 oname = (char *) xmalloc (20);
1610 sprintf (oname, "d%06d.o", tmp_seq);
1611 tmp_seq++;
1612
1613 abfd = bfd_create (oname, parent);
c6c37250 1614 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1615 bfd_make_writable (abfd);
1616
1617 bfd_set_format (abfd, bfd_object);
c6c37250 1618 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1619
1620 symptr = 0;
1621 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1622 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1623 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1624 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
d643799d
KH
1625 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1626 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
c6c37250
DD
1627
1628 /* OK, pay attention here. I got confused myself looking back at
1629 it. We create a four-byte section to mark the beginning of the
1630 list, and we include an offset of 4 in the section, so that the
1631 pointer to the list points to the *end* of this section, which is
5cc18311 1632 the start of the list of sections from other objects. */
252b5132
RH
1633
1634 bfd_set_section_size (abfd, id2, 20);
1635 d2 = (unsigned char *) xmalloc (20);
1636 id2->contents = d2;
1637 memset (d2, 0, 20);
775cabad 1638 d2[0] = d2[16] = 4; /* Reloc addend. */
252b5132
RH
1639 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1640 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1641 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1642 save_relocs (id2);
1643
1644 bfd_set_section_size (abfd, id5, 4);
1645 d5 = (unsigned char *) xmalloc (4);
1646 id5->contents = d5;
1647 memset (d5, 0, 4);
1648
1649 bfd_set_section_size (abfd, id4, 4);
1650 d4 = (unsigned char *) xmalloc (4);
1651 id4->contents = d4;
1652 memset (d4, 0, 4);
1653
1654 bfd_set_symtab (abfd, symtab, symptr);
1655
1656 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1657 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1658 bfd_set_section_contents (abfd, id4, d4, 0, 4);
5cc18311 1659
252b5132
RH
1660 bfd_make_readable (abfd);
1661 return abfd;
1662}
1663
775cabad
NC
1664/* .section .idata$4
1665 .long 0
1666 .section .idata$5
1667 .long 0
1668 .section idata$7
1669 .global __my_dll_iname
1670 __my_dll_iname:
1671 .asciz "my.dll" */
252b5132
RH
1672
1673static bfd *
1674make_tail (parent)
1675 bfd *parent;
1676{
1677 asection *id4, *id5, *id7;
1678 unsigned char *d4, *d5, *d7;
1679 int len;
1680 char *oname;
1681 bfd *abfd;
1682
1683 oname = (char *) xmalloc (20);
1684 sprintf (oname, "d%06d.o", tmp_seq);
1685 tmp_seq++;
1686
1687 abfd = bfd_create (oname, parent);
c6c37250 1688 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1689 bfd_make_writable (abfd);
1690
1691 bfd_set_format (abfd, bfd_object);
c6c37250 1692 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1693
1694 symptr = 0;
1695 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1696 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1697 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1698 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
d643799d 1699 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
252b5132
RH
1700
1701 bfd_set_section_size (abfd, id4, 4);
1702 d4 = (unsigned char *) xmalloc (4);
1703 id4->contents = d4;
1704 memset (d4, 0, 4);
1705
1706 bfd_set_section_size (abfd, id5, 4);
1707 d5 = (unsigned char *) xmalloc (4);
1708 id5->contents = d5;
1709 memset (d5, 0, 4);
1710
d643799d 1711 len = strlen (dll_filename) + 1;
252b5132 1712 if (len & 1)
d643799d 1713 len++;
252b5132
RH
1714 bfd_set_section_size (abfd, id7, len);
1715 d7 = (unsigned char *) xmalloc (len);
1716 id7->contents = d7;
1717 strcpy (d7, dll_filename);
1718
1719 bfd_set_symtab (abfd, symtab, symptr);
1720
1721 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1722 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1723 bfd_set_section_contents (abfd, id7, d7, 0, len);
1724
1725 bfd_make_readable (abfd);
1726 return abfd;
1727}
1728
775cabad
NC
1729/* .text
1730 .global _function
1731 .global ___imp_function
1732 .global __imp__function
1733 _function:
1734 jmp *__imp__function:
b7a26f91 1735
775cabad
NC
1736 .section idata$7
1737 .long __head_my_dll
b7a26f91 1738
775cabad
NC
1739 .section .idata$5
1740 ___imp_function:
1741 __imp__function:
1742 iat?
1743 .section .idata$4
1744 iat?
1745 .section .idata$6
1746 ID<ordinal>:
1747 .short <hint>
1748 .asciz "function" xlate? (add underscore, kill at) */
1749
1750static unsigned char jmp_ix86_bytes[] =
1751{
252b5132
RH
1752 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1753};
1754
775cabad
NC
1755/* _function:
1756 mov.l ip+8,r0
1757 mov.l @r0,r0
1758 jmp @r0
1759 nop
1760 .dw __imp_function */
344a211f 1761
775cabad
NC
1762static unsigned char jmp_sh_bytes[] =
1763{
344a211f
NC
1764 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1765};
1766
775cabad
NC
1767/* _function:
1768 lui $t0,<high:__imp_function>
1769 lw $t0,<low:__imp_function>
1770 jr $t0
1771 nop */
344a211f 1772
775cabad
NC
1773static unsigned char jmp_mips_bytes[] =
1774{
344a211f
NC
1775 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1776 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1777};
252b5132
RH
1778
1779static bfd *
1780make_one (exp, parent)
1781 def_file_export *exp;
1782 bfd *parent;
1783{
1784 asection *tx, *id7, *id5, *id4, *id6;
23a87948 1785 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
252b5132
RH
1786 int len;
1787 char *oname;
1788 bfd *abfd;
f0c87f88
NC
1789 unsigned char *jmp_bytes = NULL;
1790 int jmp_byte_count = 0;
c6c37250
DD
1791
1792 switch (pe_details->pe_arch)
1793 {
1794 case PE_ARCH_i386:
1795 jmp_bytes = jmp_ix86_bytes;
1796 jmp_byte_count = sizeof (jmp_ix86_bytes);
1797 break;
344a211f
NC
1798 case PE_ARCH_sh:
1799 jmp_bytes = jmp_sh_bytes;
1800 jmp_byte_count = sizeof (jmp_sh_bytes);
1801 break;
1802 case PE_ARCH_mips:
1803 jmp_bytes = jmp_mips_bytes;
1804 jmp_byte_count = sizeof (jmp_mips_bytes);
1805 break;
775cabad
NC
1806 default:
1807 abort ();
c6c37250 1808 }
252b5132
RH
1809
1810 oname = (char *) xmalloc (20);
1811 sprintf (oname, "d%06d.o", tmp_seq);
1812 tmp_seq++;
1813
1814 abfd = bfd_create (oname, parent);
c6c37250 1815 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1816 bfd_make_writable (abfd);
1817
1818 bfd_set_format (abfd, bfd_object);
c6c37250 1819 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1820
1821 symptr = 0;
b044cda1 1822 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
252b5132
RH
1823 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1824 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1825 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1826 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1827 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
b34976b6 1828
c9e38879
NC
1829 if (*exp->internal_name == '@')
1830 {
1831 if (! exp->flag_data)
1832 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1833 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1834 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1835 /* Fastcall applies only to functions,
1836 so no need for auto-import symbol. */
1837 }
1838 else
1839 {
1840 if (! exp->flag_data)
1841 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1842 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1843 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1844 /* Symbol to reference ord/name of imported
1845 data symbol, used to implement auto-import. */
1846 if (exp->flag_data)
1847 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
1848 }
870df5dc 1849 if (pe_dll_compat_implib)
d643799d
KH
1850 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1851 id5, BSF_GLOBAL, 0);
252b5132 1852
23a87948 1853 if (! exp->flag_data)
775cabad
NC
1854 {
1855 bfd_set_section_size (abfd, tx, jmp_byte_count);
1856 td = (unsigned char *) xmalloc (jmp_byte_count);
1857 tx->contents = td;
1858 memcpy (td, jmp_bytes, jmp_byte_count);
1859
1860 switch (pe_details->pe_arch)
1861 {
1862 case PE_ARCH_i386:
1863 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1864 break;
1865 case PE_ARCH_sh:
1866 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1867 break;
1868 case PE_ARCH_mips:
1869 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1870 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1871 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1872 break;
1873 default:
1874 abort ();
1875 }
1876 save_relocs (tx);
1877 }
252b5132
RH
1878
1879 bfd_set_section_size (abfd, id7, 4);
1880 d7 = (unsigned char *) xmalloc (4);
1881 id7->contents = d7;
1882 memset (d7, 0, 4);
1883 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1884 save_relocs (id7);
1885
1886 bfd_set_section_size (abfd, id5, 4);
1887 d5 = (unsigned char *) xmalloc (4);
1888 id5->contents = d5;
1889 memset (d5, 0, 4);
775cabad 1890
252b5132
RH
1891 if (exp->flag_noname)
1892 {
1893 d5[0] = exp->ordinal;
1894 d5[1] = exp->ordinal >> 8;
1895 d5[3] = 0x80;
1896 }
1897 else
1898 {
1899 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1900 save_relocs (id5);
1901 }
1902
1903 bfd_set_section_size (abfd, id4, 4);
1904 d4 = (unsigned char *) xmalloc (4);
1905 id4->contents = d4;
1906 memset (d4, 0, 4);
775cabad 1907
252b5132
RH
1908 if (exp->flag_noname)
1909 {
c2a94a7a
DD
1910 d4[0] = exp->ordinal;
1911 d4[1] = exp->ordinal >> 8;
1912 d4[3] = 0x80;
252b5132
RH
1913 }
1914 else
1915 {
1916 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1917 save_relocs (id4);
1918 }
1919
1920 if (exp->flag_noname)
1921 {
1922 len = 0;
1923 bfd_set_section_size (abfd, id6, 0);
1924 }
1925 else
1926 {
1927 len = strlen (exp->name) + 3;
1928 if (len & 1)
1929 len++;
1930 bfd_set_section_size (abfd, id6, len);
1931 d6 = (unsigned char *) xmalloc (len);
1932 id6->contents = d6;
1933 memset (d6, 0, len);
1934 d6[0] = exp->hint & 0xff;
1935 d6[1] = exp->hint >> 8;
d643799d 1936 strcpy (d6 + 2, exp->name);
252b5132
RH
1937 }
1938
1939 bfd_set_symtab (abfd, symtab, symptr);
1940
c6c37250 1941 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
252b5132
RH
1942 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1943 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1944 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1945 if (!exp->flag_noname)
1946 bfd_set_section_contents (abfd, id6, d6, 0, len);
1947
1948 bfd_make_readable (abfd);
1949 return abfd;
1950}
1951
b044cda1
CW
1952static bfd *
1953make_singleton_name_thunk (import, parent)
db09f25b 1954 const char *import;
b044cda1
CW
1955 bfd *parent;
1956{
775cabad 1957 /* Name thunks go to idata$4. */
b044cda1
CW
1958 asection *id4;
1959 unsigned char *d4;
1960 char *oname;
1961 bfd *abfd;
1962
1963 oname = (char *) xmalloc (20);
1964 sprintf (oname, "nmth%06d.o", tmp_seq);
1965 tmp_seq++;
1966
1967 abfd = bfd_create (oname, parent);
1968 bfd_find_target (pe_details->object_target, abfd);
1969 bfd_make_writable (abfd);
1970
1971 bfd_set_format (abfd, bfd_object);
1972 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1973
1974 symptr = 0;
1975 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1976 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1977 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1978 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1979
1980 bfd_set_section_size (abfd, id4, 8);
1981 d4 = (unsigned char *) xmalloc (4);
1982 id4->contents = d4;
1983 memset (d4, 0, 8);
1984 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1985 save_relocs (id4);
1986
1987 bfd_set_symtab (abfd, symtab, symptr);
1988
1989 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1990
1991 bfd_make_readable (abfd);
1992 return abfd;
1993}
1994
1995static char *
1996make_import_fixup_mark (rel)
1997 arelent *rel;
1998{
775cabad 1999 /* We convert reloc to symbol, for later reference. */
b044cda1
CW
2000 static int counter;
2001 static char *fixup_name = NULL;
db09f25b 2002 static size_t buffer_len = 0;
b7a26f91 2003
b044cda1 2004 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
b7a26f91 2005
b044cda1 2006 bfd *abfd = bfd_asymbol_bfd (sym);
fe213ce2 2007 struct bfd_link_hash_entry *bh;
b044cda1
CW
2008
2009 if (!fixup_name)
2010 {
2011 fixup_name = (char *) xmalloc (384);
2012 buffer_len = 384;
2013 }
2014
2015 if (strlen (sym->name) + 25 > buffer_len)
b7a26f91 2016 /* Assume 25 chars for "__fu" + counter + "_". If counter is
b044cda1 2017 bigger than 20 digits long, we've got worse problems than
775cabad 2018 overflowing this buffer... */
b044cda1
CW
2019 {
2020 free (fixup_name);
775cabad
NC
2021 /* New buffer size is length of symbol, plus 25, but then
2022 rounded up to the nearest multiple of 128. */
b044cda1
CW
2023 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2024 fixup_name = (char *) xmalloc (buffer_len);
2025 }
b7a26f91 2026
b044cda1
CW
2027 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2028
fe213ce2 2029 bh = NULL;
b7a26f91 2030 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
b044cda1 2031 current_sec, /* sym->section, */
b34976b6 2032 rel->address, NULL, TRUE, FALSE, &bh);
fe213ce2
AM
2033
2034 if (0)
2035 {
2036 struct coff_link_hash_entry *myh;
2037
2038 myh = (struct coff_link_hash_entry *) bh;
2039 printf ("type:%d\n", myh->type);
2040 printf ("%s\n", myh->root.u.def.section->name);
2041 }
b044cda1 2042
b044cda1
CW
2043 return fixup_name;
2044}
2045
775cabad
NC
2046/* .section .idata$3
2047 .rva __nm_thnk_SYM (singleton thunk with name of func)
2048 .long 0
2049 .long 0
2050 .rva __my_dll_iname (name of dll)
2051 .rva __fuNN_SYM (pointer to reference (address) in text) */
b044cda1
CW
2052
2053static bfd *
b7a26f91 2054make_import_fixup_entry (name, fixup_name, dll_symname, parent)
db09f25b
AM
2055 const char *name;
2056 const char *fixup_name;
2057 const char *dll_symname;
b044cda1
CW
2058 bfd *parent;
2059{
2060 asection *id3;
2061 unsigned char *d3;
2062 char *oname;
2063 bfd *abfd;
2064
2065 oname = (char *) xmalloc (20);
2066 sprintf (oname, "fu%06d.o", tmp_seq);
2067 tmp_seq++;
2068
2069 abfd = bfd_create (oname, parent);
2070 bfd_find_target (pe_details->object_target, abfd);
2071 bfd_make_writable (abfd);
2072
2073 bfd_set_format (abfd, bfd_object);
2074 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2075
2076 symptr = 0;
2077 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2078 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
775cabad 2079
b7a26f91
KH
2080#if 0
2081 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
775cabad 2082#endif
b044cda1
CW
2083 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2084 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2085 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2086
2087 bfd_set_section_size (abfd, id3, 20);
2088 d3 = (unsigned char *) xmalloc (20);
2089 id3->contents = d3;
2090 memset (d3, 0, 20);
2091
2092 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2093 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2094 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2095 save_relocs (id3);
2096
2097 bfd_set_symtab (abfd, symtab, symptr);
2098
2099 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2100
2101 bfd_make_readable (abfd);
2102 return abfd;
2103}
2104
2fa9fc65
NC
2105/* .section .rdata_runtime_pseudo_reloc
2106 .long addend
2107 .rva __fuNN_SYM (pointer to reference (address) in text) */
2108
2109static bfd *
2110make_runtime_pseudo_reloc (name, fixup_name, addend, parent)
2111 const char *name ATTRIBUTE_UNUSED;
2112 const char *fixup_name;
2113 int addend;
2114 bfd *parent;
2115{
2116 asection *rt_rel;
2117 unsigned char *rt_rel_d;
2118 char *oname;
2119 bfd *abfd;
2120
2121 oname = (char *) xmalloc (20);
2122 sprintf (oname, "rtr%06d.o", tmp_seq);
2123 tmp_seq++;
2124
2125 abfd = bfd_create (oname, parent);
2126 bfd_find_target (pe_details->object_target, abfd);
2127 bfd_make_writable (abfd);
2128
2129 bfd_set_format (abfd, bfd_object);
2130 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2131
2132 symptr = 0;
2133 symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
2134 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2135
2136 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2137
2138 bfd_set_section_size (abfd, rt_rel, 8);
2139 rt_rel_d = (unsigned char *) xmalloc (8);
2140 rt_rel->contents = rt_rel_d;
2141 memset (rt_rel_d, 0, 8);
2142 bfd_put_32 (abfd, addend, rt_rel_d);
2143
2144 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2145 save_relocs (rt_rel);
2146
2147 bfd_set_symtab (abfd, symtab, symptr);
2148
2149 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2150
2151 bfd_make_readable (abfd);
2152 return abfd;
2153}
2154
2155/* .section .rdata
2156 .rva __pei386_runtime_relocator */
2157
2158static bfd *
2159pe_create_runtime_relocator_reference (parent)
2160 bfd *parent;
2161{
2162 asection *extern_rt_rel;
2163 unsigned char *extern_rt_rel_d;
2164 char *oname;
2165 bfd *abfd;
2166
2167 oname = (char *) xmalloc (20);
2168 sprintf (oname, "ertr%06d.o", tmp_seq);
2169 tmp_seq++;
2170
2171 abfd = bfd_create (oname, parent);
2172 bfd_find_target (pe_details->object_target, abfd);
2173 bfd_make_writable (abfd);
2174
2175 bfd_set_format (abfd, bfd_object);
2176 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2177
2178 symptr = 0;
2179 symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
2180 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2181
2182 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, BSF_NO_FLAGS, 0);
2183
2184 bfd_set_section_size (abfd, extern_rt_rel, 4);
2185 extern_rt_rel_d = (unsigned char *) xmalloc (4);
2186 extern_rt_rel->contents = extern_rt_rel_d;
2187
2188 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2189 save_relocs (extern_rt_rel);
2190
2191 bfd_set_symtab (abfd, symtab, symptr);
2192
2193 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2194
2195 bfd_make_readable (abfd);
2196 return abfd;
2197}
2198
b044cda1 2199void
2fa9fc65 2200pe_create_import_fixup (rel, s, addend)
b044cda1 2201 arelent *rel;
2fa9fc65
NC
2202 asection *s;
2203 int addend;
b044cda1
CW
2204{
2205 char buf[300];
2206 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2207 struct bfd_link_hash_entry *name_thunk_sym;
db09f25b 2208 const char *name = sym->name;
b044cda1 2209 char *fixup_name = make_import_fixup_mark (rel);
2fa9fc65 2210 bfd *b;
b044cda1
CW
2211
2212 sprintf (buf, U ("_nm_thnk_%s"), name);
2213
2214 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2215
2216 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2217 {
2218 bfd *b = make_singleton_name_thunk (name, output_bfd);
2219 add_bfd_to_link (b, b->filename, &link_info);
2220
775cabad 2221 /* If we ever use autoimport, we have to cast text section writable. */
b34976b6 2222 config.text_read_only = FALSE;
b044cda1
CW
2223 }
2224
2fa9fc65
NC
2225 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2226 {
2227 extern char * pe_data_import_dll;
2228 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
aa3d9aba 2229
2fa9fc65
NC
2230 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2231 add_bfd_to_link (b, b->filename, &link_info);
2232 }
2233
2234 if (addend != 0)
2235 {
2236 if (link_info.pei386_runtime_pseudo_reloc)
2237 {
2238 if (pe_dll_extra_pe_debug)
2239 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2240 fixup_name, addend);
2241 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2242 add_bfd_to_link (b, b->filename, &link_info);
2243
2244 if (runtime_pseudo_relocs_created == 0)
2245 {
2246 b = pe_create_runtime_relocator_reference (output_bfd);
2247 add_bfd_to_link (b, b->filename, &link_info);
2248 }
2249 runtime_pseudo_relocs_created++;
b34976b6 2250 }
2fa9fc65
NC
2251 else
2252 {
2253 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2254 s->owner, s, rel->address, sym->name);
2255 einfo ("%X");
2256 }
2257 }
b044cda1
CW
2258}
2259
2260
252b5132
RH
2261void
2262pe_dll_generate_implib (def, impfilename)
2263 def_file *def;
1069dd8d 2264 const char *impfilename;
252b5132
RH
2265{
2266 int i;
2267 bfd *ar_head;
2268 bfd *ar_tail;
2269 bfd *outarch;
2270 bfd *head = 0;
2271
5aaace27 2272 dll_filename = (def->name) ? def->name : dll_name;
252b5132 2273 dll_symname = xstrdup (dll_filename);
d643799d 2274 for (i = 0; dll_symname[i]; i++)
3882b010 2275 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2276 dll_symname[i] = '_';
2277
2278 unlink (impfilename);
2279
2280 outarch = bfd_openw (impfilename, 0);
2281
2282 if (!outarch)
2283 {
2284 /* xgettext:c-format */
2285 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2286 return;
2287 }
2288
2289 /* xgettext:c-format */
2290 einfo (_("Creating library file: %s\n"), impfilename);
5cc18311 2291
252b5132
RH
2292 bfd_set_format (outarch, bfd_archive);
2293 outarch->has_armap = 1;
2294
5cc18311 2295 /* Work out a reasonable size of things to put onto one line. */
252b5132 2296 ar_head = make_head (outarch);
252b5132 2297
d643799d 2298 for (i = 0; i < def->num_exports; i++)
252b5132 2299 {
86b1cc60 2300 /* The import library doesn't know about the internal name. */
252b5132
RH
2301 char *internal = def->exports[i].internal_name;
2302 bfd *n;
775cabad 2303
252b5132 2304 def->exports[i].internal_name = def->exports[i].name;
d643799d 2305 n = make_one (def->exports + i, outarch);
252b5132
RH
2306 n->next = head;
2307 head = n;
2308 def->exports[i].internal_name = internal;
2309 }
2310
c6c37250
DD
2311 ar_tail = make_tail (outarch);
2312
2313 if (ar_head == NULL || ar_tail == NULL)
2314 return;
2315
86b1cc60 2316 /* Now stick them all into the archive. */
252b5132
RH
2317 ar_head->next = head;
2318 ar_tail->next = ar_head;
2319 head = ar_tail;
2320
2321 if (! bfd_set_archive_head (outarch, head))
2322 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
5cc18311 2323
252b5132
RH
2324 if (! bfd_close (outarch))
2325 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2326
2327 while (head != NULL)
2328 {
2329 bfd *n = head->next;
2330 bfd_close (head);
2331 head = n;
2332 }
2333}
2334
2335static void
2336add_bfd_to_link (abfd, name, link_info)
2337 bfd *abfd;
db09f25b 2338 const char *name;
252b5132
RH
2339 struct bfd_link_info *link_info;
2340{
2341 lang_input_statement_type *fake_file;
775cabad 2342
252b5132
RH
2343 fake_file = lang_add_input_file (name,
2344 lang_input_file_is_fake_enum,
2345 NULL);
2346 fake_file->the_bfd = abfd;
2347 ldlang_add_file (fake_file);
775cabad 2348
252b5132
RH
2349 if (!bfd_link_add_symbols (abfd, link_info))
2350 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2351}
2352
2353void
2354pe_process_import_defs (output_bfd, link_info)
2355 bfd *output_bfd;
2356 struct bfd_link_info *link_info;
2357{
2358 def_file_module *module;
775cabad 2359
d643799d 2360 pe_dll_id_target (bfd_get_target (output_bfd));
252b5132
RH
2361
2362 if (!pe_def_file)
2363 return;
2364
2365 for (module = pe_def_file->modules; module; module = module->next)
2366 {
2367 int i, do_this_dll;
2368
2369 dll_filename = module->name;
2370 dll_symname = xstrdup (module->name);
d643799d 2371 for (i = 0; dll_symname[i]; i++)
3882b010 2372 if (!ISALNUM (dll_symname[i]))
252b5132
RH
2373 dll_symname[i] = '_';
2374
2375 do_this_dll = 0;
2376
d643799d 2377 for (i = 0; i < pe_def_file->num_imports; i++)
252b5132
RH
2378 if (pe_def_file->imports[i].module == module)
2379 {
2380 def_file_export exp;
2381 struct bfd_link_hash_entry *blhe;
b34976b6 2382 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
86b1cc60 2383 /* See if we need this import. */
874c8c99 2384 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
c9e38879
NC
2385
2386 if (lead_at)
2387 sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
2388 else
2389 sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
2390
252b5132 2391 blhe = bfd_link_hash_lookup (link_info->hash, name,
b34976b6 2392 FALSE, FALSE, FALSE);
c9e38879 2393
874c8c99
DD
2394 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2395 {
c9e38879
NC
2396 if (lead_at)
2397 sprintf (name, "%s%s", U ("_imp_"),
2398 pe_def_file->imports[i].internal_name);
2399 else
2400 sprintf (name, "%s%s", U ("_imp__"),
2401 pe_def_file->imports[i].internal_name);
2402
874c8c99 2403 blhe = bfd_link_hash_lookup (link_info->hash, name,
b34976b6 2404 FALSE, FALSE, FALSE);
874c8c99 2405 }
252b5132 2406 free (name);
c9e38879 2407
252b5132
RH
2408 if (blhe && blhe->type == bfd_link_hash_undefined)
2409 {
2410 bfd *one;
86b1cc60 2411 /* We do. */
252b5132
RH
2412 if (!do_this_dll)
2413 {
2414 bfd *ar_head = make_head (output_bfd);
2415 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2416 do_this_dll = 1;
2417 }
2418 exp.internal_name = pe_def_file->imports[i].internal_name;
2419 exp.name = pe_def_file->imports[i].name;
2420 exp.ordinal = pe_def_file->imports[i].ordinal;
2421 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2422 exp.flag_private = 0;
2423 exp.flag_constant = 0;
939ba9d0 2424 exp.flag_data = pe_def_file->imports[i].data;
252b5132
RH
2425 exp.flag_noname = exp.name ? 0 : 1;
2426 one = make_one (&exp, output_bfd);
2427 add_bfd_to_link (one, one->filename, link_info);
2428 }
2429 }
2430 if (do_this_dll)
2431 {
2432 bfd *ar_tail = make_tail (output_bfd);
2433 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2434 }
2435
2436 free (dll_symname);
2437 }
2438}
2439
775cabad 2440/* We were handed a *.DLL file. Parse it and turn it into a set of
b34976b6
AM
2441 IMPORTS directives in the def file. Return TRUE if the file was
2442 handled, FALSE if not. */
252b5132
RH
2443
2444static unsigned int
2445pe_get16 (abfd, where)
2446 bfd *abfd;
2447 int where;
2448{
2449 unsigned char b[2];
775cabad 2450
db09f25b
AM
2451 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2452 bfd_bread (b, (bfd_size_type) 2, abfd);
d643799d 2453 return b[0] + (b[1] << 8);
252b5132
RH
2454}
2455
2456static unsigned int
2457pe_get32 (abfd, where)
2458 bfd *abfd;
2459 int where;
2460{
2461 unsigned char b[4];
775cabad 2462
db09f25b
AM
2463 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2464 bfd_bread (b, (bfd_size_type) 4, abfd);
d643799d 2465 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2466}
2467
2468#if 0 /* This is not currently used. */
2469
2470static unsigned int
2471pe_as16 (ptr)
2472 void *ptr;
2473{
2474 unsigned char *b = ptr;
775cabad 2475
d643799d 2476 return b[0] + (b[1] << 8);
252b5132
RH
2477}
2478
2479#endif
2480
2481static unsigned int
2482pe_as32 (ptr)
2483 void *ptr;
2484{
2485 unsigned char *b = ptr;
775cabad 2486
d643799d 2487 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
252b5132
RH
2488}
2489
b34976b6 2490bfd_boolean
252b5132 2491pe_implied_import_dll (filename)
1069dd8d 2492 const char *filename;
252b5132
RH
2493{
2494 bfd *dll;
2495 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2496 unsigned long export_rva, export_size, nsections, secptr, expptr;
939ba9d0 2497 unsigned long exp_funcbase;
252b5132
RH
2498 unsigned char *expdata, *erva;
2499 unsigned long name_rvas, ordinals, nexp, ordbase;
1069dd8d 2500 const char *dll_name;
939ba9d0
NC
2501 /* Initialization with start > end guarantees that is_data
2502 will not be set by mistake, and avoids compiler warning. */
2503 unsigned long data_start = 1;
2504 unsigned long data_end = 0;
2505 unsigned long bss_start = 1;
2506 unsigned long bss_end = 0;
252b5132
RH
2507
2508 /* No, I can't use bfd here. kernel32.dll puts its export table in
5cc18311 2509 the middle of the .rdata section. */
c6c37250 2510 dll = bfd_openr (filename, pe_details->target_name);
252b5132
RH
2511 if (!dll)
2512 {
2513 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
b34976b6 2514 return FALSE;
252b5132 2515 }
775cabad 2516
86b1cc60 2517 /* PEI dlls seem to be bfd_objects. */
252b5132
RH
2518 if (!bfd_check_format (dll, bfd_object))
2519 {
2520 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
b34976b6 2521 return FALSE;
252b5132
RH
2522 }
2523
939ba9d0 2524 /* Get pe_header, optional header and numbers of export entries. */
252b5132
RH
2525 pe_header_offset = pe_get32 (dll, 0x3c);
2526 opthdr_ofs = pe_header_offset + 4 + 20;
2527 num_entries = pe_get32 (dll, opthdr_ofs + 92);
775cabad
NC
2528
2529 if (num_entries < 1) /* No exports. */
b34976b6 2530 return FALSE;
775cabad 2531
252b5132
RH
2532 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2533 export_size = pe_get32 (dll, opthdr_ofs + 100);
2534 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2535 secptr = (pe_header_offset + 4 + 20 +
2536 pe_get16 (dll, pe_header_offset + 4 + 16));
2537 expptr = 0;
775cabad 2538
939ba9d0 2539 /* Get the rva and size of the export section. */
d643799d 2540 for (i = 0; i < nsections; i++)
252b5132
RH
2541 {
2542 char sname[8];
2543 unsigned long secptr1 = secptr + 40 * i;
2544 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2545 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2546 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
775cabad 2547
db09f25b
AM
2548 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2549 bfd_bread (sname, (bfd_size_type) 8, dll);
775cabad 2550
d643799d 2551 if (vaddr <= export_rva && vaddr + vsize > export_rva)
252b5132
RH
2552 {
2553 expptr = fptr + (export_rva - vaddr);
2554 if (export_rva + export_size > vaddr + vsize)
2555 export_size = vsize - (export_rva - vaddr);
2556 break;
2557 }
2558 }
2559
939ba9d0
NC
2560 /* Scan sections and store the base and size of the
2561 data and bss segments in data/base_start/end. */
2562 for (i = 0; i < nsections; i++)
2563 {
2564 unsigned long secptr1 = secptr + 40 * i;
2565 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2566 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2567 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2568 char sec_name[9];
2569
2570 sec_name[8] = '\0';
2571 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2572 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2573
2574 if (strcmp(sec_name,".data") == 0)
2575 {
2576 data_start = vaddr;
2577 data_end = vaddr + vsize;
2578
2579 if (pe_dll_extra_pe_debug)
2580 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2581 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2582 }
2583 else if (strcmp (sec_name,".bss") == 0)
2584 {
2585 bss_start = vaddr;
2586 bss_end = vaddr + vsize;
2587
2588 if (pe_dll_extra_pe_debug)
2589 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2590 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2591 }
2592 }
2593
252b5132 2594 expdata = (unsigned char *) xmalloc (export_size);
db09f25b
AM
2595 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2596 bfd_bread (expdata, (bfd_size_type) export_size, dll);
252b5132
RH
2597 erva = expdata - export_rva;
2598
2599 if (pe_def_file == 0)
d643799d 2600 pe_def_file = def_file_empty ();
252b5132 2601
d643799d
KH
2602 nexp = pe_as32 (expdata + 24);
2603 name_rvas = pe_as32 (expdata + 32);
2604 ordinals = pe_as32 (expdata + 36);
2605 ordbase = pe_as32 (expdata + 16);
939ba9d0 2606 exp_funcbase = pe_as32 (expdata + 28);
775cabad 2607
939ba9d0
NC
2608 /* Use internal dll name instead of filename
2609 to enable symbolic dll linking. */
2610 dll_name = pe_as32 (expdata + 12) + erva;
2611
2612 /* Iterate through the list of symbols. */
d643799d 2613 for (i = 0; i < nexp; i++)
252b5132 2614 {
939ba9d0 2615 /* Pointer to the names vector. */
d643799d 2616 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
252b5132 2617 def_file_import *imp;
939ba9d0
NC
2618 /* Pointer to the function address vector. */
2619 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2620 int is_data = 0;
2621
2622 /* Skip unwanted symbols, which are
2623 exported in buggy auto-import releases. */
2624 if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2625 {
2626 /* is_data is true if the address is in the data or bss segment. */
2627 is_data =
2628 (func_rva >= data_start && func_rva < data_end)
2629 || (func_rva >= bss_start && func_rva < bss_end);
2630
2631 imp = def_file_add_import (pe_def_file, erva + name_rva,
2632 dll_name, i, 0);
396a2467 2633 /* Mark symbol type. */
939ba9d0
NC
2634 imp->data = is_data;
2635
2636 if (pe_dll_extra_pe_debug)
2637 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2638 __FUNCTION__, dll_name, erva + name_rva,
2639 func_rva, is_data ? "(data)" : "");
2640 }
252b5132
RH
2641 }
2642
b34976b6 2643 return TRUE;
252b5132
RH
2644}
2645
775cabad
NC
2646/* These are the main functions, called from the emulation. The first
2647 is called after the bfds are read, so we can guess at how much space
2648 we need. The second is called after everything is placed, so we
2649 can put the right values in place. */
252b5132
RH
2650
2651void
2652pe_dll_build_sections (abfd, info)
2653 bfd *abfd;
2654 struct bfd_link_info *info;
2655{
c6c37250 2656 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
2657 process_def_file (abfd, info);
2658
2659 generate_edata (abfd, info);
c6c37250
DD
2660 build_filler_bfd (1);
2661}
2662
2663void
2664pe_exe_build_sections (abfd, info)
2665 bfd *abfd;
1069dd8d 2666 struct bfd_link_info *info ATTRIBUTE_UNUSED;
c6c37250
DD
2667{
2668 pe_dll_id_target (bfd_get_target (abfd));
2669 build_filler_bfd (0);
252b5132
RH
2670}
2671
2672void
2673pe_dll_fill_sections (abfd, info)
2674 bfd *abfd;
2675 struct bfd_link_info *info;
2676{
c6c37250 2677 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
2678 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2679
2680 generate_reloc (abfd, info);
2681 if (reloc_sz > 0)
2682 {
2683 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2684
2685 /* Resize the sections. */
2686 lang_size_sections (stat_ptr->head, abs_output_section,
ae7fb08f 2687 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
252b5132
RH
2688
2689 /* Redo special stuff. */
2690 ldemul_after_allocation ();
2691
2692 /* Do the assignments again. */
2693 lang_do_assignments (stat_ptr->head,
2694 abs_output_section,
2c382fb6 2695 (fill_type *) 0, (bfd_vma) 0);
252b5132
RH
2696 }
2697
2698 fill_edata (abfd, info);
2699
2700 pe_data (abfd)->dll = 1;
2701
2702 edata_s->contents = edata_d;
2703 reloc_s->contents = reloc_d;
2704}
c6c37250
DD
2705
2706void
2707pe_exe_fill_sections (abfd, info)
2708 bfd *abfd;
2709 struct bfd_link_info *info;
2710{
2711 pe_dll_id_target (bfd_get_target (abfd));
2712 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2713
2714 generate_reloc (abfd, info);
2715 if (reloc_sz > 0)
2716 {
2717 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2718
2719 /* Resize the sections. */
2720 lang_size_sections (stat_ptr->head, abs_output_section,
ae7fb08f 2721 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
c6c37250
DD
2722
2723 /* Redo special stuff. */
2724 ldemul_after_allocation ();
2725
2726 /* Do the assignments again. */
2727 lang_do_assignments (stat_ptr->head,
2728 abs_output_section,
2c382fb6 2729 (fill_type *) 0, (bfd_vma) 0);
c6c37250
DD
2730 }
2731 reloc_s->contents = reloc_d;
2732}