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