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