* Makefile.am: Run "make dep-am".
[binutils.git] / ld / pe-dll.c
blob10d636e544c50034731f3ef1bfc3bef1b25fd24b
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of GLD, the Gnu Linker.
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.
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.
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. */
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "bfdlink.h"
26 #include "libiberty.h"
27 #include "safe-ctype.h"
29 #include <stdint.h>
30 #include <time.h>
32 #include "ld.h"
33 #include "ldexp.h"
34 #include "ldlang.h"
35 #include "ldwrite.h"
36 #include "ldmisc.h"
37 #include <ldgram.h>
38 #include "ldmain.h"
39 #include "ldfile.h"
40 #include "ldemul.h"
41 #include "coff/internal.h"
42 #include "../bfd/libcoff.h"
43 #include "deffile.h"
44 #include "pe-dll.h"
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.
53 See also: ld/emultempl/pe.em. */
55 /* Auto-import feature by Paul Sokolovsky
57 Quick facts:
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).
63 2. This is done completely in bounds of the PE specification (to be fair,
64 there's a place where it pokes nose out of, but in practice it works).
65 So, resulting module can be used with any other PE compiler/linker.
67 3. Auto-import is fully compatible with standard import method and they
68 can be mixed together.
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).
75 Idea
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.,
79 whenever client contains something like
81 mov dll_var,%eax,
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
87 to two other parallel vectors: one holding imported names, and one which
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, ;-) .
94 Implementation
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
109 this, since FirstThunk points directly into machine code. But in practice,
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
120 not, prohibiting that (detecting violation) would require more work on
121 behalf of loader than not doing it.
123 See also: ld/emultempl/pe.em. */
125 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
127 /* For emultempl/pe.em. */
129 def_file * pe_def_file = 0;
130 int pe_dll_export_everything = 0;
131 int pe_dll_do_default_excludes = 1;
132 int pe_dll_kill_ats = 0;
133 int pe_dll_stdcall_aliases = 0;
134 int pe_dll_warn_dup_exports = 0;
135 int pe_dll_compat_implib = 0;
136 int pe_dll_extra_pe_debug = 0;
138 /* Static variables and types. */
140 static bfd_vma image_base;
141 static bfd *filler_bfd;
142 static struct bfd_section *edata_s, *reloc_s;
143 static unsigned char *edata_d, *reloc_d;
144 static size_t edata_sz, reloc_sz;
145 static int runtime_pseudo_relocs_created = 0;
147 typedef struct
149 char *target_name;
150 char *object_target;
151 unsigned int imagebase_reloc;
152 int pe_arch;
153 int bfd_arch;
154 int underscored;
156 pe_details_type;
158 typedef struct
160 char *name;
161 int len;
163 autofilter_entry_type;
165 #define PE_ARCH_i386 1
166 #define PE_ARCH_sh 2
167 #define PE_ARCH_mips 3
168 #define PE_ARCH_arm 4
169 #define PE_ARCH_arm_epoc 5
171 static pe_details_type pe_detail_list[] =
174 "pei-i386",
175 "pe-i386",
176 7 /* R_IMAGEBASE */,
177 PE_ARCH_i386,
178 bfd_arch_i386,
182 "pei-shl",
183 "pe-shl",
184 16 /* R_SH_IMAGEBASE */,
185 PE_ARCH_sh,
186 bfd_arch_sh,
190 "pei-mips",
191 "pe-mips",
192 34 /* MIPS_R_RVA */,
193 PE_ARCH_mips,
194 bfd_arch_mips,
198 "pei-arm-little",
199 "pe-arm-little",
200 11 /* ARM_RVA32 */,
201 PE_ARCH_arm,
202 bfd_arch_arm,
206 "epoc-pei-arm-little",
207 "epoc-pe-arm-little",
208 11 /* ARM_RVA32 */,
209 PE_ARCH_arm_epoc,
210 bfd_arch_arm,
213 { NULL, NULL, 0, 0, 0, 0 }
216 static pe_details_type *pe_details;
218 static autofilter_entry_type autofilter_symbollist[] =
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 },
227 { "_pei386_runtime_relocator", 25 },
228 { "do_pseudo_reloc", 15 },
229 { "cygwin_crt0", 11 },
230 { NULL, 0 }
233 /* Do not specify library suffix explicitly, to allow for dllized versions. */
234 static autofilter_entry_type autofilter_liblist[] =
236 { "libcygwin", 9 },
237 { "libgcc", 6 },
238 { "libstdc++", 9 },
239 { "libmingw32", 10 },
240 { "libmingwex", 10 },
241 { "libg2c", 6 },
242 { "libsupc++", 9 },
243 { "libobjc", 7 },
244 { "libgcj", 6 },
245 { NULL, 0 }
248 static autofilter_entry_type autofilter_objlist[] =
250 { "crt0.o", 6 },
251 { "crt1.o", 6 },
252 { "crt2.o", 6 },
253 { "dllcrt1.o", 9 },
254 { "dllcrt2.o", 9 },
255 { "gcrt0.o", 7 },
256 { "gcrt1.o", 7 },
257 { "gcrt2.o", 7 },
258 { "crtbegin.o", 10 },
259 { "crtend.o", 8 },
260 { NULL, 0 }
263 static autofilter_entry_type autofilter_symbolprefixlist[] =
265 /* { "__imp_", 6 }, */
266 /* Do __imp_ explicitly to save time. */
267 { "__rtti_", 7 },
268 /* Don't re-export auto-imported symbols. */
269 { "_nm_", 4 },
270 { "__builtin_", 10 },
271 /* Don't export symbols specifying internal DLL layout. */
272 { "_head_", 6 },
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 }
284 static autofilter_entry_type autofilter_symbolsuffixlist[] =
286 { "_iname", 6 },
287 { NULL, 0 }
290 #define U(str) (pe_details->underscored ? "_" str : str)
292 void
293 pe_dll_id_target (const char *target)
295 int i;
297 for (i = 0; pe_detail_list[i].target_name; i++)
298 if (strcmp (pe_detail_list[i].target_name, target) == 0
299 || strcmp (pe_detail_list[i].object_target, target) == 0)
301 pe_details = pe_detail_list + i;
302 return;
304 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
305 exit (1);
308 /* Helper functions for qsort. Relocs must be sorted so that we can write
309 them out by pages. */
311 typedef struct
313 bfd_vma vma;
314 char type;
315 short extra;
317 reloc_data_type;
319 static int
320 reloc_sort (const void *va, const void *vb)
322 bfd_vma a = ((const reloc_data_type *) va)->vma;
323 bfd_vma b = ((const reloc_data_type *) vb)->vma;
325 return (a > b) ? 1 : ((a < b) ? -1 : 0);
328 static int
329 pe_export_sort (const void *va, const void *vb)
331 const def_file_export *a = va;
332 const def_file_export *b = vb;
334 return strcmp (a->name, b->name);
337 /* Read and process the .DEF file. */
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
341 defined, since we can't export symbols we don't have. */
343 static bfd_vma *exported_symbol_offsets;
344 static struct bfd_section **exported_symbol_sections;
345 static int export_table_size;
346 static int count_exported;
347 static int count_exported_byname;
348 static int count_with_ordinals;
349 static const char *dll_name;
350 static int min_ordinal, max_ordinal;
351 static int *exported_symbols;
353 typedef struct exclude_list_struct
355 char *string;
356 struct exclude_list_struct *next;
357 int type;
359 exclude_list_struct;
361 static struct exclude_list_struct *excludes = 0;
363 void
364 pe_dll_add_excludes (const char *new_excludes, const int type)
366 char *local_copy;
367 char *exclude_string;
369 local_copy = xstrdup (new_excludes);
371 exclude_string = strtok (local_copy, ",:");
372 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
374 struct exclude_list_struct *new_exclude;
376 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
377 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
378 strcpy (new_exclude->string, exclude_string);
379 new_exclude->type = type;
380 new_exclude->next = excludes;
381 excludes = new_exclude;
384 free (local_copy);
388 /* abfd is a bfd containing n (or NULL)
389 It can be used for contextual checks. */
391 static int
392 auto_export (bfd *abfd, def_file *d, const char *n)
394 int i;
395 struct exclude_list_struct *ex;
396 autofilter_entry_type *afptr;
397 const char * libname = 0;
398 if (abfd && abfd->my_archive)
399 libname = lbasename (abfd->my_archive->filename);
401 /* We should not re-export imported stuff. */
402 if (strncmp (n, "_imp__", 6) == 0)
403 return 0;
405 for (i = 0; i < d->num_exports; i++)
406 if (strcmp (d->exports[i].name, n) == 0)
407 return 0;
409 if (pe_dll_do_default_excludes)
411 const char * p;
412 int len;
414 if (pe_dll_extra_pe_debug)
415 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
416 n, abfd, abfd->my_archive);
418 /* First of all, make context checks:
419 Don't export anything from standard libs. */
420 if (libname)
422 afptr = autofilter_liblist;
424 while (afptr->name)
426 if (strncmp (libname, afptr->name, afptr->len) == 0 )
427 return 0;
428 afptr++;
432 /* Next, exclude symbols from certain startup objects. */
434 if (abfd && (p = lbasename (abfd->filename)))
436 afptr = autofilter_objlist;
437 while (afptr->name)
439 if (strcmp (p, afptr->name) == 0)
440 return 0;
441 afptr++;
445 /* Don't try to blindly exclude all symbols
446 that begin with '__'; this was tried and
447 it is too restrictive. */
449 /* Then, exclude specific symbols. */
450 afptr = autofilter_symbollist;
451 while (afptr->name)
453 if (strcmp (n, afptr->name) == 0)
454 return 0;
456 afptr++;
459 /* Next, exclude symbols starting with ... */
460 afptr = autofilter_symbolprefixlist;
461 while (afptr->name)
463 if (strncmp (n, afptr->name, afptr->len) == 0)
464 return 0;
466 afptr++;
469 /* Finally, exclude symbols ending with ... */
470 len = strlen (n);
471 afptr = autofilter_symbolsuffixlist;
472 while (afptr->name)
474 if ((len >= afptr->len)
475 /* Add 1 to insure match with trailing '\0'. */
476 && strncmp (n + len - afptr->len, afptr->name,
477 afptr->len + 1) == 0)
478 return 0;
480 afptr++;
484 for (ex = excludes; ex; ex = ex->next)
486 if (ex->type == 1) /* exclude-libs */
488 if (libname
489 && ((strcmp (libname, ex->string) == 0)
490 || (strcasecmp ("ALL", ex->string) == 0)))
491 return 0;
493 else if (strcmp (n, ex->string) == 0)
494 return 0;
497 return 1;
500 static void
501 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
503 int i, j;
504 struct bfd_link_hash_entry *blhe;
505 bfd *b;
506 struct bfd_section *s;
507 def_file_export *e = 0;
509 if (!pe_def_file)
510 pe_def_file = def_file_empty ();
512 /* First, run around to all the objects looking for the .drectve
513 sections, and push those into the def file too. */
514 for (b = info->input_bfds; b; b = b->link_next)
516 s = bfd_get_section_by_name (b, ".drectve");
517 if (s)
519 int size = bfd_get_section_size_before_reloc (s);
520 char *buf = xmalloc (size);
522 bfd_get_section_contents (b, s, buf, 0, size);
523 def_file_add_directive (pe_def_file, buf, size);
524 free (buf);
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
531 && !info->shared)
532 return;
534 /* Now, maybe export everything else the default way. */
535 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
537 for (b = info->input_bfds; b; b = b->link_next)
539 asymbol **symbols;
540 int nsyms, symsize;
542 symsize = bfd_get_symtab_upper_bound (b);
543 symbols = xmalloc (symsize);
544 nsyms = bfd_canonicalize_symtab (b, symbols);
546 for (j = 0; j < nsyms; j++)
548 /* We should export symbols which are either global or not
549 anything at all. (.bss data is the latter)
550 We should not export undefined symbols. */
551 if (symbols[j]->section != &bfd_und_section
552 && ((symbols[j]->flags & BSF_GLOBAL)
553 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
555 const char *sn = symbols[j]->name;
557 /* We should not re-export imported stuff. */
559 char *name = xmalloc (strlen (sn) + 2 + 6);
560 sprintf (name, "%s%s", U("_imp_"), sn);
562 blhe = bfd_link_hash_lookup (info->hash, name,
563 FALSE, FALSE, FALSE);
564 free (name);
566 if (blhe && blhe->type == bfd_link_hash_defined)
567 continue;
570 if (*sn == '_')
571 sn++;
573 if (auto_export (b, pe_def_file, sn))
575 def_file_export *p;
576 p=def_file_add_export (pe_def_file, sn, 0, -1);
577 /* Fill data flag properly, from dlltool.c. */
578 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
585 #undef NE
586 #define NE pe_def_file->num_exports
588 /* Canonicalize the export list. */
589 if (pe_dll_kill_ats)
591 for (i = 0; i < NE; i++)
593 if (strchr (pe_def_file->exports[i].name, '@'))
595 /* This will preserve internal_name, which may have been
596 pointing to the same memory as name, or might not
597 have. */
598 int lead_at = (*pe_def_file->exports[i].name == '@');
599 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
601 *(strchr (tmp, '@')) = 0;
602 pe_def_file->exports[i].name = tmp;
607 if (pe_dll_stdcall_aliases)
609 for (i = 0; i < NE; i++)
611 if (strchr (pe_def_file->exports[i].name, '@'))
613 int lead_at = (*pe_def_file->exports[i].name == '@');
614 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
616 *(strchr (tmp, '@')) = 0;
617 if (auto_export (NULL, pe_def_file, tmp))
618 def_file_add_export (pe_def_file, tmp,
619 pe_def_file->exports[i].internal_name,
620 -1);
621 else
622 free (tmp);
627 /* Convenience, but watch out for it changing. */
628 e = pe_def_file->exports;
630 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
631 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
633 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
634 max_ordinal = 0;
635 min_ordinal = 65536;
636 count_exported = 0;
637 count_exported_byname = 0;
638 count_with_ordinals = 0;
640 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
641 pe_export_sort);
642 for (i = 0, j = 0; i < NE; i++)
644 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
646 /* This is a duplicate. */
647 if (e[j - 1].ordinal != -1
648 && e[i].ordinal != -1
649 && e[j - 1].ordinal != e[i].ordinal)
651 if (pe_dll_warn_dup_exports)
652 /* xgettext:c-format */
653 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
654 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
656 else
658 if (pe_dll_warn_dup_exports)
659 /* xgettext:c-format */
660 einfo (_("Warning, duplicate EXPORT: %s\n"),
661 e[j - 1].name);
664 if (e[i].ordinal != -1)
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;
671 else
673 if (i != j)
674 e[j] = e[i];
675 j++;
678 pe_def_file->num_exports = j; /* == NE */
680 for (i = 0; i < NE; i++)
682 char *name;
684 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
685 if (pe_details->underscored
686 && (*pe_def_file->exports[i].internal_name != '@'))
688 *name = '_';
689 strcpy (name + 1, pe_def_file->exports[i].internal_name);
691 else
692 strcpy (name, pe_def_file->exports[i].internal_name);
694 blhe = bfd_link_hash_lookup (info->hash,
695 name,
696 FALSE, FALSE, TRUE);
698 if (blhe
699 && (blhe->type == bfd_link_hash_defined
700 || (blhe->type == bfd_link_hash_common)))
702 count_exported++;
703 if (!pe_def_file->exports[i].flag_noname)
704 count_exported_byname++;
706 /* Only fill in the sections. The actual offsets are computed
707 in fill_exported_offsets() after common symbols are laid
708 out. */
709 if (blhe->type == bfd_link_hash_defined)
710 exported_symbol_sections[i] = blhe->u.def.section;
711 else
712 exported_symbol_sections[i] = blhe->u.c.p->section;
714 if (pe_def_file->exports[i].ordinal != -1)
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++;
723 else if (blhe && blhe->type == bfd_link_hash_undefined)
725 /* xgettext:c-format */
726 einfo (_("%XCannot export %s: symbol not defined\n"),
727 pe_def_file->exports[i].internal_name);
729 else if (blhe)
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);
736 else
738 /* xgettext:c-format */
739 einfo (_("%XCannot export %s: symbol not found\n"),
740 pe_def_file->exports[i].internal_name);
742 free (name);
746 /* Build the bfd that will contain .edata and .reloc sections. */
748 static void
749 build_filler_bfd (int include_edata)
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)))
761 einfo ("%X%P: can not create BFD %E\n");
762 return;
765 if (include_edata)
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)))
776 einfo ("%X%P: can not create .edata section: %E\n");
777 return;
779 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
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)))
791 einfo ("%X%P: can not create .reloc section: %E\n");
792 return;
795 bfd_set_section_size (filler_bfd, reloc_s, 0);
797 ldlang_add_file (filler_file);
800 /* Gather all the exported symbols and build the .edata section. */
802 static void
803 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
805 int i, next_ordinal;
806 int name_table_size = 0;
807 const char *dlnp;
809 /* First, we need to know how many exported symbols there are,
810 and what the range of ordinals is. */
811 if (pe_def_file->name)
812 dll_name = pe_def_file->name;
813 else
815 dll_name = abfd->filename;
817 for (dlnp = dll_name; *dlnp; dlnp++)
818 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
819 dll_name = dlnp + 1;
822 if (count_with_ordinals && max_ordinal > count_exported)
824 if (min_ordinal > max_ordinal - count_exported + 1)
825 min_ordinal = max_ordinal - count_exported + 1;
827 else
829 min_ordinal = 1;
830 max_ordinal = count_exported;
833 export_table_size = max_ordinal - min_ordinal + 1;
834 exported_symbols = xmalloc (export_table_size * sizeof (int));
835 for (i = 0; i < export_table_size; i++)
836 exported_symbols[i] = -1;
838 /* Now we need to assign ordinals to those that don't have them. */
839 for (i = 0; i < NE; i++)
841 if (exported_symbol_sections[i])
843 if (pe_def_file->exports[i].ordinal != -1)
845 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
846 int pi = exported_symbols[ei];
848 if (pi != -1)
850 /* xgettext:c-format */
851 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
852 pe_def_file->exports[i].ordinal,
853 pe_def_file->exports[i].name,
854 pe_def_file->exports[pi].name);
856 exported_symbols[ei] = i;
858 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
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)
867 while (exported_symbols[next_ordinal - min_ordinal] != -1)
868 next_ordinal++;
870 exported_symbols[next_ordinal - min_ordinal] = i;
871 pe_def_file->exports[i].ordinal = next_ordinal;
874 /* OK, now we can allocate some memory. */
875 edata_sz = (40 /* directory */
876 + 4 * export_table_size /* addresses */
877 + 4 * count_exported_byname /* name ptrs */
878 + 2 * count_exported_byname /* ordinals */
879 + name_table_size + strlen (dll_name) + 1);
882 /* Fill the exported symbol offsets. The preliminary work has already
883 been done in process_def_file(). */
885 static void
886 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
888 int i;
889 struct bfd_link_hash_entry *blhe;
891 for (i = 0; i < pe_def_file->num_exports; i++)
893 char *name;
895 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
896 if (pe_details->underscored
897 && *pe_def_file->exports[i].internal_name != '@')
899 *name = '_';
900 strcpy (name + 1, pe_def_file->exports[i].internal_name);
902 else
903 strcpy (name, pe_def_file->exports[i].internal_name);
905 blhe = bfd_link_hash_lookup (info->hash,
906 name,
907 FALSE, FALSE, TRUE);
909 if (blhe && blhe->type == bfd_link_hash_defined)
910 exported_symbol_offsets[i] = blhe->u.def.value;
912 free (name);
916 static void
917 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
919 int s, hint;
920 unsigned char *edirectory;
921 uint32_t *eaddresses;
922 uint32_t *enameptrs;
923 unsigned short *eordinals;
924 unsigned char *enamestr;
925 time_t now;
927 time (&now);
929 edata_d = xmalloc (edata_sz);
931 /* Note use of array pointer math here. */
932 edirectory = edata_d;
933 eaddresses = (uint32_t *) (edata_d + 40);
934 enameptrs = eaddresses + export_table_size;
935 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
936 enamestr = (char *) (eordinals + count_exported_byname);
938 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
939 + edata_s->output_section->vma - image_base)
941 memset (edata_d, 0, edata_sz);
942 bfd_put_32 (abfd, now, edata_d + 4);
943 if (pe_def_file->version_major != -1)
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);
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);
959 fill_exported_offsets (abfd, info);
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
966 for more information. */
967 hint = 0;
968 for (s = 0; s < NE; s++)
970 struct bfd_section *ssec = exported_symbol_sections[s];
971 if (ssec && pe_def_file->exports[s].ordinal != -1)
973 unsigned long srva = (exported_symbol_offsets[s]
974 + ssec->output_section->vma
975 + ssec->output_offset);
976 int ord = pe_def_file->exports[s].ordinal;
978 bfd_put_32 (abfd, srva - image_base,
979 (void *) (eaddresses + ord - min_ordinal));
981 if (!pe_def_file->exports[s].flag_noname)
983 char *ename = pe_def_file->exports[s].name;
985 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
986 enameptrs++;
987 strcpy (enamestr, ename);
988 enamestr += strlen (enamestr) + 1;
989 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
990 eordinals++;
991 pe_def_file->exports[s].hint = hint++;
998 static struct bfd_section *current_sec;
1000 void
1001 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1002 const char *name,
1003 int (*cb) (arelent *, asection *))
1005 bfd *b;
1006 asection *s;
1008 for (b = info->input_bfds; b; b = b->link_next)
1010 asymbol **symbols;
1011 int nsyms, symsize;
1013 symsize = bfd_get_symtab_upper_bound (b);
1014 symbols = xmalloc (symsize);
1015 nsyms = bfd_canonicalize_symtab (b, symbols);
1017 for (s = b->sections; s; s = s->next)
1019 arelent **relocs;
1020 int relsize, nrelocs, i;
1021 int flags = bfd_get_section_flags (b, s);
1023 /* Skip discarded linkonce sections. */
1024 if (flags & SEC_LINK_ONCE
1025 && s->output_section == bfd_abs_section_ptr)
1026 continue;
1028 current_sec = s;
1030 relsize = bfd_get_reloc_upper_bound (b, s);
1031 relocs = xmalloc (relsize);
1032 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1034 for (i = 0; i < nrelocs; i++)
1036 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1038 if (!strcmp (name, sym->name))
1039 cb (relocs[i], s);
1042 free (relocs);
1044 /* Warning: the allocated symbols are remembered in BFD and reused
1045 later, so don't free them! */
1046 /* free (symbols); */
1051 /* Gather all the relocations and build the .reloc section. */
1053 static void
1054 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1057 /* For .reloc stuff. */
1058 reloc_data_type *reloc_data;
1059 int total_relocs = 0;
1060 int i;
1061 unsigned long sec_page = (unsigned long) -1;
1062 unsigned long page_ptr, page_count;
1063 int bi;
1064 bfd *b;
1065 struct bfd_section *s;
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;
1072 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1074 total_relocs = 0;
1075 bi = 0;
1076 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1078 arelent **relocs;
1079 int relsize, nrelocs, i;
1081 for (s = b->sections; s; s = s->next)
1083 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1084 asymbol **symbols;
1085 int nsyms, symsize;
1087 /* If it's not loaded, we don't need to relocate it this way. */
1088 if (!(s->output_section->flags & SEC_LOAD))
1089 continue;
1091 /* I don't know why there would be a reloc for these, but I've
1092 seen it happen - DJ */
1093 if (s->output_section == &bfd_abs_section)
1094 continue;
1096 if (s->output_section->vma == 0)
1098 /* Huh? Shouldn't happen, but punt if it does. */
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;
1105 symsize = bfd_get_symtab_upper_bound (b);
1106 symbols = xmalloc (symsize);
1107 nsyms = bfd_canonicalize_symtab (b, symbols);
1109 relsize = bfd_get_reloc_upper_bound (b, s);
1110 relocs = xmalloc (relsize);
1111 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1113 for (i = 0; i < nrelocs; i++)
1115 if (pe_dll_extra_pe_debug)
1117 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1118 printf ("rel: %s\n", sym->name);
1120 if (!relocs[i]->howto->pc_relative
1121 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1123 bfd_vma sym_vma;
1124 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
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;
1133 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1135 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1136 relocs[i]->howto->rightshift)
1138 case BITS_AND_SHIFT (32, 0):
1139 reloc_data[total_relocs].type = 3;
1140 total_relocs++;
1141 break;
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;
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. */
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;
1159 case BITS_AND_SHIFT (24, 2):
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)
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. */
1171 default:
1172 /* xgettext:c-format */
1173 einfo (_("%XError: %d-bit reloc in dll\n"),
1174 relocs[i]->howto->bitsize);
1175 break;
1179 free (relocs);
1180 /* Warning: the allocated symbols are remembered in BFD and
1181 reused later, so don't free them! */
1182 #if 0
1183 free (symbol);
1184 #endif
1188 /* At this point, we have total_relocs relocation addresses in
1189 reloc_addresses, which are all suitable for the .reloc section.
1190 We must now create the new sections. */
1191 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1193 for (i = 0; i < total_relocs; i++)
1195 unsigned long this_page = (reloc_data[i].vma >> 12);
1197 if (this_page != sec_page)
1199 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1200 reloc_sz += 8;
1201 sec_page = this_page;
1204 reloc_sz += 2;
1206 if (reloc_data[i].type == 4)
1207 reloc_sz += 2;
1210 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1211 reloc_d = xmalloc (reloc_sz);
1212 sec_page = (unsigned long) -1;
1213 reloc_sz = 0;
1214 page_ptr = (unsigned long) -1;
1215 page_count = 0;
1217 for (i = 0; i < total_relocs; i++)
1219 unsigned long rva = reloc_data[i].vma - image_base;
1220 unsigned long this_page = (rva & ~0xfff);
1222 if (this_page != sec_page)
1224 while (reloc_sz & 3)
1225 reloc_d[reloc_sz++] = 0;
1227 if (page_ptr != (unsigned long) -1)
1228 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
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;
1237 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1238 reloc_d + reloc_sz);
1239 reloc_sz += 2;
1241 if (reloc_data[i].type == 4)
1243 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1244 reloc_sz += 2;
1247 page_count++;
1250 while (reloc_sz & 3)
1251 reloc_d[reloc_sz++] = 0;
1253 if (page_ptr != (unsigned long) -1)
1254 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1256 while (reloc_sz < reloc_s->_raw_size)
1257 reloc_d[reloc_sz++] = 0;
1260 /* Given the exiting def_file structure, print out a .DEF file that
1261 corresponds to it. */
1263 static void
1264 quoteput (char *s, FILE *f, int needs_quotes)
1266 char *cp;
1268 for (cp = s; *cp; cp++)
1269 if (*cp == '\''
1270 || *cp == '"'
1271 || *cp == '\\'
1272 || ISSPACE (*cp)
1273 || *cp == ','
1274 || *cp == ';')
1275 needs_quotes = 1;
1277 if (needs_quotes)
1279 putc ('"', f);
1281 while (*s)
1283 if (*s == '"' || *s == '\\')
1284 putc ('\\', f);
1286 putc (*s, f);
1287 s++;
1290 putc ('"', f);
1292 else
1293 fputs (s, f);
1296 void
1297 pe_dll_generate_def_file (const char *pe_out_def_filename)
1299 int i;
1300 FILE *out = fopen (pe_out_def_filename, "w");
1302 if (out == NULL)
1303 /* xgettext:c-format */
1304 einfo (_("%s: Can't open output def file %s\n"),
1305 program_name, pe_out_def_filename);
1307 if (pe_def_file)
1309 if (pe_def_file->name)
1311 if (pe_def_file->is_dll)
1312 fprintf (out, "LIBRARY ");
1313 else
1314 fprintf (out, "NAME ");
1316 quoteput (pe_def_file->name, out, 1);
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");
1324 if (pe_def_file->description)
1326 fprintf (out, "DESCRIPTION ");
1327 quoteput (pe_def_file->description, out, 1);
1328 fprintf (out, "\n");
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);
1337 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1338 fprintf (out, "\n");
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);
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);
1352 if (pe_def_file->num_section_defs > 0)
1354 fprintf (out, "\nSECTIONS\n\n");
1356 for (i = 0; i < pe_def_file->num_section_defs; i++)
1358 fprintf (out, " ");
1359 quoteput (pe_def_file->section_defs[i].name, out, 0);
1361 if (pe_def_file->section_defs[i].class)
1363 fprintf (out, " CLASS ");
1364 quoteput (pe_def_file->section_defs[i].class, out, 0);
1367 if (pe_def_file->section_defs[i].flag_read)
1368 fprintf (out, " READ");
1370 if (pe_def_file->section_defs[i].flag_write)
1371 fprintf (out, " WRITE");
1373 if (pe_def_file->section_defs[i].flag_execute)
1374 fprintf (out, " EXECUTE");
1376 if (pe_def_file->section_defs[i].flag_shared)
1377 fprintf (out, " SHARED");
1379 fprintf (out, "\n");
1383 if (pe_def_file->num_exports > 0)
1385 fprintf (out, "EXPORTS\n");
1387 for (i = 0; i < pe_def_file->num_exports; i++)
1389 def_file_export *e = pe_def_file->exports + i;
1390 fprintf (out, " ");
1391 quoteput (e->name, out, 0);
1393 if (e->internal_name && strcmp (e->internal_name, e->name))
1395 fprintf (out, " = ");
1396 quoteput (e->internal_name, out, 0);
1399 if (e->ordinal != -1)
1400 fprintf (out, " @%d", e->ordinal);
1402 if (e->flag_private)
1403 fprintf (out, " PRIVATE");
1405 if (e->flag_constant)
1406 fprintf (out, " CONSTANT");
1408 if (e->flag_noname)
1409 fprintf (out, " NONAME");
1411 if (e->flag_data)
1412 fprintf (out, " DATA");
1414 fprintf (out, "\n");
1418 if (pe_def_file->num_imports > 0)
1420 fprintf (out, "\nIMPORTS\n\n");
1422 for (i = 0; i < pe_def_file->num_imports; i++)
1424 def_file_import *im = pe_def_file->imports + i;
1425 fprintf (out, " ");
1427 if (im->internal_name
1428 && (!im->name || strcmp (im->internal_name, im->name)))
1430 quoteput (im->internal_name, out, 0);
1431 fprintf (out, " = ");
1434 quoteput (im->module->name, out, 0);
1435 fprintf (out, ".");
1437 if (im->name)
1438 quoteput (im->name, out, 0);
1439 else
1440 fprintf (out, "%d", im->ordinal);
1442 fprintf (out, "\n");
1446 else
1447 fprintf (out, _("; no contents available\n"));
1449 if (fclose (out) == EOF)
1450 /* xgettext:c-format */
1451 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1454 /* Generate the import library. */
1456 static asymbol **symtab;
1457 static int symptr;
1458 static int tmp_seq;
1459 static const char *dll_filename;
1460 static char *dll_symname;
1462 #define UNDSEC (asection *) &bfd_und_section
1464 static asection *
1465 quick_section (bfd *abfd, const char *name, int flags, int align)
1467 asection *sec;
1468 asymbol *sym;
1470 sec = bfd_make_section_old_way (abfd, name);
1471 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1472 bfd_set_section_alignment (abfd, sec, align);
1473 /* Remember to undo this before trying to link internally! */
1474 sec->output_section = sec;
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;
1483 return sec;
1486 static void
1487 quick_symbol (bfd *abfd,
1488 const char *n1,
1489 const char *n2,
1490 const char *n3,
1491 asection *sec,
1492 int flags,
1493 int addr)
1495 asymbol *sym;
1496 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
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;
1509 static arelent *reltab = 0;
1510 static int relcount = 0, relsize = 0;
1512 static void
1513 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1515 if (relcount >= relsize - 1)
1517 relsize += 10;
1518 if (reltab)
1519 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1520 else
1521 reltab = xmalloc (relsize * sizeof (arelent));
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++;
1530 static void
1531 save_relocs (asection *sec)
1533 int i;
1535 sec->relocation = reltab;
1536 sec->reloc_count = relcount;
1537 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1538 for (i = 0; i < relcount; i++)
1539 sec->orelocation[i] = sec->relocation + i;
1540 sec->orelocation[relcount] = 0;
1541 sec->flags |= SEC_RELOC;
1542 reltab = 0;
1543 relcount = relsize = 0;
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
1555 .section .idata$5
1556 .long 0
1557 fthunk:
1559 .section .idata$4
1560 .long 0
1561 hname: */
1563 static bfd *
1564 make_head (bfd *parent)
1566 asection *id2, *id5, *id4;
1567 unsigned char *d2, *d5, *d4;
1568 char *oname;
1569 bfd *abfd;
1571 oname = xmalloc (20);
1572 sprintf (oname, "d%06d.o", tmp_seq);
1573 tmp_seq++;
1575 abfd = bfd_create (oname, parent);
1576 bfd_find_target (pe_details->object_target, abfd);
1577 bfd_make_writable (abfd);
1579 bfd_set_format (abfd, bfd_object);
1580 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1582 symptr = 0;
1583 symtab = xmalloc (6 * sizeof (asymbol *));
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);
1587 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1588 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
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
1594 the start of the list of sections from other objects. */
1596 bfd_set_section_size (abfd, id2, 20);
1597 d2 = xmalloc (20);
1598 id2->contents = d2;
1599 memset (d2, 0, 20);
1600 d2[0] = d2[16] = 4; /* Reloc addend. */
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);
1606 bfd_set_section_size (abfd, id5, 4);
1607 d5 = xmalloc (4);
1608 id5->contents = d5;
1609 memset (d5, 0, 4);
1611 bfd_set_section_size (abfd, id4, 4);
1612 d4 = xmalloc (4);
1613 id4->contents = d4;
1614 memset (d4, 0, 4);
1616 bfd_set_symtab (abfd, symtab, symptr);
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);
1622 bfd_make_readable (abfd);
1623 return abfd;
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" */
1635 static bfd *
1636 make_tail (bfd *parent)
1638 asection *id4, *id5, *id7;
1639 unsigned char *d4, *d5, *d7;
1640 int len;
1641 char *oname;
1642 bfd *abfd;
1644 oname = xmalloc (20);
1645 sprintf (oname, "d%06d.o", tmp_seq);
1646 tmp_seq++;
1648 abfd = bfd_create (oname, parent);
1649 bfd_find_target (pe_details->object_target, abfd);
1650 bfd_make_writable (abfd);
1652 bfd_set_format (abfd, bfd_object);
1653 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1655 symptr = 0;
1656 symtab = xmalloc (5 * sizeof (asymbol *));
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);
1660 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1662 bfd_set_section_size (abfd, id4, 4);
1663 d4 = xmalloc (4);
1664 id4->contents = d4;
1665 memset (d4, 0, 4);
1667 bfd_set_section_size (abfd, id5, 4);
1668 d5 = xmalloc (4);
1669 id5->contents = d5;
1670 memset (d5, 0, 4);
1672 len = strlen (dll_filename) + 1;
1673 if (len & 1)
1674 len++;
1675 bfd_set_section_size (abfd, id7, len);
1676 d7 = xmalloc (len);
1677 id7->contents = d7;
1678 strcpy (d7, dll_filename);
1680 bfd_set_symtab (abfd, symtab, symptr);
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);
1686 bfd_make_readable (abfd);
1687 return abfd;
1690 /* .text
1691 .global _function
1692 .global ___imp_function
1693 .global __imp__function
1694 _function:
1695 jmp *__imp__function:
1697 .section idata$7
1698 .long __head_my_dll
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) */
1711 static unsigned char jmp_ix86_bytes[] =
1713 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1716 /* _function:
1717 mov.l ip+8,r0
1718 mov.l @r0,r0
1719 jmp @r0
1721 .dw __imp_function */
1723 static unsigned char jmp_sh_bytes[] =
1725 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1728 /* _function:
1729 lui $t0,<high:__imp_function>
1730 lw $t0,<low:__imp_function>
1731 jr $t0
1732 nop */
1734 static unsigned char jmp_mips_bytes[] =
1736 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1737 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1740 static bfd *
1741 make_one (def_file_export *exp, bfd *parent)
1743 asection *tx, *id7, *id5, *id4, *id6;
1744 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1745 int len;
1746 char *oname;
1747 bfd *abfd;
1748 unsigned char *jmp_bytes = NULL;
1749 int jmp_byte_count = 0;
1751 switch (pe_details->pe_arch)
1753 case PE_ARCH_i386:
1754 jmp_bytes = jmp_ix86_bytes;
1755 jmp_byte_count = sizeof (jmp_ix86_bytes);
1756 break;
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;
1765 default:
1766 abort ();
1769 oname = xmalloc (20);
1770 sprintf (oname, "d%06d.o", tmp_seq);
1771 tmp_seq++;
1773 abfd = bfd_create (oname, parent);
1774 bfd_find_target (pe_details->object_target, abfd);
1775 bfd_make_writable (abfd);
1777 bfd_set_format (abfd, bfd_object);
1778 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1780 symptr = 0;
1781 symtab = xmalloc (11 * sizeof (asymbol *));
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);
1788 if (*exp->internal_name == '@')
1790 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1791 BSF_GLOBAL, 0);
1792 if (! exp->flag_data)
1793 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1794 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1795 BSF_GLOBAL, 0);
1796 /* Fastcall applies only to functions,
1797 so no need for auto-import symbol. */
1799 else
1801 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1802 BSF_GLOBAL, 0);
1803 if (! exp->flag_data)
1804 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1805 BSF_GLOBAL, 0);
1806 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1807 BSF_GLOBAL, 0);
1808 /* Symbol to reference ord/name of imported
1809 data symbol, used to implement auto-import. */
1810 if (exp->flag_data)
1811 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1812 BSF_GLOBAL,0);
1814 if (pe_dll_compat_implib)
1815 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1816 BSF_GLOBAL, 0);
1818 if (! exp->flag_data)
1820 bfd_set_section_size (abfd, tx, jmp_byte_count);
1821 td = xmalloc (jmp_byte_count);
1822 tx->contents = td;
1823 memcpy (td, jmp_bytes, jmp_byte_count);
1825 switch (pe_details->pe_arch)
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 ();
1841 save_relocs (tx);
1844 bfd_set_section_size (abfd, id7, 4);
1845 d7 = xmalloc (4);
1846 id7->contents = d7;
1847 memset (d7, 0, 4);
1848 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1849 save_relocs (id7);
1851 bfd_set_section_size (abfd, id5, 4);
1852 d5 = xmalloc (4);
1853 id5->contents = d5;
1854 memset (d5, 0, 4);
1856 if (exp->flag_noname)
1858 d5[0] = exp->ordinal;
1859 d5[1] = exp->ordinal >> 8;
1860 d5[3] = 0x80;
1862 else
1864 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1865 save_relocs (id5);
1868 bfd_set_section_size (abfd, id4, 4);
1869 d4 = xmalloc (4);
1870 id4->contents = d4;
1871 memset (d4, 0, 4);
1873 if (exp->flag_noname)
1875 d4[0] = exp->ordinal;
1876 d4[1] = exp->ordinal >> 8;
1877 d4[3] = 0x80;
1879 else
1881 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1882 save_relocs (id4);
1885 if (exp->flag_noname)
1887 len = 0;
1888 bfd_set_section_size (abfd, id6, 0);
1890 else
1892 len = strlen (exp->name) + 3;
1893 if (len & 1)
1894 len++;
1895 bfd_set_section_size (abfd, id6, len);
1896 d6 = xmalloc (len);
1897 id6->contents = d6;
1898 memset (d6, 0, len);
1899 d6[0] = exp->hint & 0xff;
1900 d6[1] = exp->hint >> 8;
1901 strcpy (d6 + 2, exp->name);
1904 bfd_set_symtab (abfd, symtab, symptr);
1906 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
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);
1913 bfd_make_readable (abfd);
1914 return abfd;
1917 static bfd *
1918 make_singleton_name_thunk (const char *import, bfd *parent)
1920 /* Name thunks go to idata$4. */
1921 asection *id4;
1922 unsigned char *d4;
1923 char *oname;
1924 bfd *abfd;
1926 oname = xmalloc (20);
1927 sprintf (oname, "nmth%06d.o", tmp_seq);
1928 tmp_seq++;
1930 abfd = bfd_create (oname, parent);
1931 bfd_find_target (pe_details->object_target, abfd);
1932 bfd_make_writable (abfd);
1934 bfd_set_format (abfd, bfd_object);
1935 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1937 symptr = 0;
1938 symtab = xmalloc (3 * sizeof (asymbol *));
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);
1943 bfd_set_section_size (abfd, id4, 8);
1944 d4 = xmalloc (4);
1945 id4->contents = d4;
1946 memset (d4, 0, 8);
1947 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1948 save_relocs (id4);
1950 bfd_set_symtab (abfd, symtab, symptr);
1952 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1954 bfd_make_readable (abfd);
1955 return abfd;
1958 static char *
1959 make_import_fixup_mark (arelent *rel)
1961 /* We convert reloc to symbol, for later reference. */
1962 static int counter;
1963 static char *fixup_name = NULL;
1964 static size_t buffer_len = 0;
1966 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
1968 bfd *abfd = bfd_asymbol_bfd (sym);
1969 struct bfd_link_hash_entry *bh;
1971 if (!fixup_name)
1973 fixup_name = xmalloc (384);
1974 buffer_len = 384;
1977 if (strlen (sym->name) + 25 > buffer_len)
1978 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1979 bigger than 20 digits long, we've got worse problems than
1980 overflowing this buffer... */
1982 free (fixup_name);
1983 /* New buffer size is length of symbol, plus 25, but
1984 then rounded up to the nearest multiple of 128. */
1985 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1986 fixup_name = xmalloc (buffer_len);
1989 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
1991 bh = NULL;
1992 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
1993 current_sec, /* sym->section, */
1994 rel->address, NULL, TRUE, FALSE, &bh);
1996 if (0)
1998 struct coff_link_hash_entry *myh;
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);
2005 return fixup_name;
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) */
2015 static bfd *
2016 make_import_fixup_entry (const char *name,
2017 const char *fixup_name,
2018 const char *dll_symname,
2019 bfd *parent)
2021 asection *id3;
2022 unsigned char *d3;
2023 char *oname;
2024 bfd *abfd;
2026 oname = xmalloc (20);
2027 sprintf (oname, "fu%06d.o", tmp_seq);
2028 tmp_seq++;
2030 abfd = bfd_create (oname, parent);
2031 bfd_find_target (pe_details->object_target, abfd);
2032 bfd_make_writable (abfd);
2034 bfd_set_format (abfd, bfd_object);
2035 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2037 symptr = 0;
2038 symtab = xmalloc (6 * sizeof (asymbol *));
2039 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2041 #if 0
2042 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2043 #endif
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);
2048 bfd_set_section_size (abfd, id3, 20);
2049 d3 = xmalloc (20);
2050 id3->contents = d3;
2051 memset (d3, 0, 20);
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);
2058 bfd_set_symtab (abfd, symtab, symptr);
2060 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2062 bfd_make_readable (abfd);
2063 return abfd;
2066 /* .section .rdata_runtime_pseudo_reloc
2067 .long addend
2068 .rva __fuNN_SYM (pointer to reference (address) in text) */
2070 static bfd *
2071 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2072 const char *fixup_name,
2073 int addend,
2074 bfd *parent)
2076 asection *rt_rel;
2077 unsigned char *rt_rel_d;
2078 char *oname;
2079 bfd *abfd;
2081 oname = xmalloc (20);
2082 sprintf (oname, "rtr%06d.o", tmp_seq);
2083 tmp_seq++;
2085 abfd = bfd_create (oname, parent);
2086 bfd_find_target (pe_details->object_target, abfd);
2087 bfd_make_writable (abfd);
2089 bfd_set_format (abfd, bfd_object);
2090 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2092 symptr = 0;
2093 symtab = xmalloc (2 * sizeof (asymbol *));
2094 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2095 SEC_HAS_CONTENTS, 2);
2097 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2099 bfd_set_section_size (abfd, rt_rel, 8);
2100 rt_rel_d = xmalloc (8);
2101 rt_rel->contents = rt_rel_d;
2102 memset (rt_rel_d, 0, 8);
2103 bfd_put_32 (abfd, addend, rt_rel_d);
2105 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2106 save_relocs (rt_rel);
2108 bfd_set_symtab (abfd, symtab, symptr);
2110 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2112 bfd_make_readable (abfd);
2113 return abfd;
2116 /* .section .rdata
2117 .rva __pei386_runtime_relocator */
2119 static bfd *
2120 pe_create_runtime_relocator_reference (bfd *parent)
2122 asection *extern_rt_rel;
2123 unsigned char *extern_rt_rel_d;
2124 char *oname;
2125 bfd *abfd;
2127 oname = xmalloc (20);
2128 sprintf (oname, "ertr%06d.o", tmp_seq);
2129 tmp_seq++;
2131 abfd = bfd_create (oname, parent);
2132 bfd_find_target (pe_details->object_target, abfd);
2133 bfd_make_writable (abfd);
2135 bfd_set_format (abfd, bfd_object);
2136 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2138 symptr = 0;
2139 symtab = xmalloc (2 * sizeof (asymbol *));
2140 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2142 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2143 BSF_NO_FLAGS, 0);
2145 bfd_set_section_size (abfd, extern_rt_rel, 4);
2146 extern_rt_rel_d = xmalloc (4);
2147 extern_rt_rel->contents = extern_rt_rel_d;
2149 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2150 save_relocs (extern_rt_rel);
2152 bfd_set_symtab (abfd, symtab, symptr);
2154 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2156 bfd_make_readable (abfd);
2157 return abfd;
2160 void
2161 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2163 char buf[300];
2164 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2165 struct bfd_link_hash_entry *name_thunk_sym;
2166 const char *name = sym->name;
2167 char *fixup_name = make_import_fixup_mark (rel);
2168 bfd *b;
2170 sprintf (buf, U ("_nm_thnk_%s"), name);
2172 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2174 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2176 bfd *b = make_singleton_name_thunk (name, output_bfd);
2177 add_bfd_to_link (b, b->filename, &link_info);
2179 /* If we ever use autoimport, we have to cast text section writable. */
2180 config.text_read_only = FALSE;
2181 output_bfd->flags &= ~WP_TEXT;
2184 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2186 extern char * pe_data_import_dll;
2187 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2189 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2190 add_bfd_to_link (b, b->filename, &link_info);
2193 if (addend != 0)
2195 if (link_info.pei386_runtime_pseudo_reloc)
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);
2203 if (runtime_pseudo_relocs_created == 0)
2205 b = pe_create_runtime_relocator_reference (output_bfd);
2206 add_bfd_to_link (b, b->filename, &link_info);
2208 runtime_pseudo_relocs_created++;
2210 else
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");
2220 void
2221 pe_dll_generate_implib (def_file *def, const char *impfilename)
2223 int i;
2224 bfd *ar_head;
2225 bfd *ar_tail;
2226 bfd *outarch;
2227 bfd *head = 0;
2229 dll_filename = (def->name) ? def->name : dll_name;
2230 dll_symname = xstrdup (dll_filename);
2231 for (i = 0; dll_symname[i]; i++)
2232 if (!ISALNUM (dll_symname[i]))
2233 dll_symname[i] = '_';
2235 unlink (impfilename);
2237 outarch = bfd_openw (impfilename, 0);
2239 if (!outarch)
2241 /* xgettext:c-format */
2242 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2243 return;
2246 /* xgettext:c-format */
2247 einfo (_("Creating library file: %s\n"), impfilename);
2249 bfd_set_format (outarch, bfd_archive);
2250 outarch->has_armap = 1;
2252 /* Work out a reasonable size of things to put onto one line. */
2253 ar_head = make_head (outarch);
2255 for (i = 0; i < def->num_exports; i++)
2257 /* The import library doesn't know about the internal name. */
2258 char *internal = def->exports[i].internal_name;
2259 bfd *n;
2261 /* Don't add PRIVATE entries to import lib. */
2262 if (pe_def_file->exports[i].flag_private)
2263 continue;
2264 def->exports[i].internal_name = def->exports[i].name;
2265 n = make_one (def->exports + i, outarch);
2266 n->next = head;
2267 head = n;
2268 def->exports[i].internal_name = internal;
2271 ar_tail = make_tail (outarch);
2273 if (ar_head == NULL || ar_tail == NULL)
2274 return;
2276 /* Now stick them all into the archive. */
2277 ar_head->next = head;
2278 ar_tail->next = ar_head;
2279 head = ar_tail;
2281 if (! bfd_set_archive_head (outarch, head))
2282 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2284 if (! bfd_close (outarch))
2285 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2287 while (head != NULL)
2289 bfd *n = head->next;
2290 bfd_close (head);
2291 head = n;
2295 static void
2296 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2298 lang_input_statement_type *fake_file;
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);
2306 if (!bfd_link_add_symbols (abfd, link_info))
2307 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2310 void
2311 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2313 def_file_module *module;
2315 pe_dll_id_target (bfd_get_target (output_bfd));
2317 if (!pe_def_file)
2318 return;
2320 for (module = pe_def_file->modules; module; module = module->next)
2322 int i, do_this_dll;
2324 dll_filename = module->name;
2325 dll_symname = xstrdup (module->name);
2326 for (i = 0; dll_symname[i]; i++)
2327 if (!ISALNUM (dll_symname[i]))
2328 dll_symname[i] = '_';
2330 do_this_dll = 0;
2332 for (i = 0; i < pe_def_file->num_imports; i++)
2333 if (pe_def_file->imports[i].module == module)
2335 def_file_export exp;
2336 struct bfd_link_hash_entry *blhe;
2337 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2338 /* See if we need this import. */
2339 size_t len = strlen (pe_def_file->imports[i].internal_name);
2340 char *name = xmalloc (len + 2 + 6);
2342 if (lead_at)
2343 sprintf (name, "%s%s", "",
2344 pe_def_file->imports[i].internal_name);
2345 else
2346 sprintf (name, "%s%s",U (""),
2347 pe_def_file->imports[i].internal_name);
2349 blhe = bfd_link_hash_lookup (link_info->hash, name,
2350 FALSE, FALSE, FALSE);
2352 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
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);
2361 blhe = bfd_link_hash_lookup (link_info->hash, name,
2362 FALSE, FALSE, FALSE);
2364 free (name);
2366 if (blhe && blhe->type == bfd_link_hash_undefined)
2368 bfd *one;
2369 /* We do. */
2370 if (!do_this_dll)
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;
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;
2382 exp.flag_data = pe_def_file->imports[i].data;
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);
2388 if (do_this_dll)
2390 bfd *ar_tail = make_tail (output_bfd);
2391 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2394 free (dll_symname);
2398 /* We were handed a *.DLL file. Parse it and turn it into a set of
2399 IMPORTS directives in the def file. Return TRUE if the file was
2400 handled, FALSE if not. */
2402 static unsigned int
2403 pe_get16 (bfd *abfd, int where)
2405 unsigned char b[2];
2407 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2408 bfd_bread (b, (bfd_size_type) 2, abfd);
2409 return b[0] + (b[1] << 8);
2412 static unsigned int
2413 pe_get32 (bfd *abfd, int where)
2415 unsigned char b[4];
2417 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2418 bfd_bread (b, (bfd_size_type) 4, abfd);
2419 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2422 #if 0 /* This is not currently used. */
2424 static unsigned int
2425 pe_as16 (void *ptr)
2427 unsigned char *b = ptr;
2429 return b[0] + (b[1] << 8);
2432 #endif
2434 static unsigned int
2435 pe_as32 (void *ptr)
2437 unsigned char *b = ptr;
2439 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2442 bfd_boolean
2443 pe_implied_import_dll (const char *filename)
2445 bfd *dll;
2446 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2447 unsigned long export_rva, export_size, nsections, secptr, expptr;
2448 unsigned long exp_funcbase;
2449 unsigned char *expdata, *erva;
2450 unsigned long name_rvas, ordinals, nexp, ordbase;
2451 const char *dll_name;
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;
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;
2461 /* No, I can't use bfd here. kernel32.dll puts its export table in
2462 the middle of the .rdata section. */
2463 dll = bfd_openr (filename, pe_details->target_name);
2464 if (!dll)
2466 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2467 return FALSE;
2470 /* PEI dlls seem to be bfd_objects. */
2471 if (!bfd_check_format (dll, bfd_object))
2473 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2474 return FALSE;
2477 /* Get pe_header, optional header and numbers of export entries. */
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);
2482 if (num_entries < 1) /* No exports. */
2483 return FALSE;
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;
2492 /* Get the rva and size of the export section. */
2493 for (i = 0; i < nsections; i++)
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);
2501 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2502 bfd_bread (sname, (bfd_size_type) 8, dll);
2504 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2506 expptr = fptr + (export_rva - vaddr);
2507 if (export_rva + export_size > vaddr + vsize)
2508 export_size = vsize - (export_rva - vaddr);
2509 break;
2513 /* Scan sections and store the base and size of the
2514 data and bss segments in data/base_start/end. */
2515 for (i = 0; i < nsections; i++)
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];
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);
2527 if (strcmp(sec_name,".data") == 0)
2529 data_start = vaddr;
2530 data_end = vaddr + vsize;
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);
2536 else if (strcmp(sec_name,".rdata") == 0)
2538 rdata_start = vaddr;
2539 rdata_end = vaddr + vsize;
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);
2545 else if (strcmp (sec_name,".bss") == 0)
2547 bss_start = vaddr;
2548 bss_end = vaddr + vsize;
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);
2556 expdata = xmalloc (export_size);
2557 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2558 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2559 erva = expdata - export_rva;
2561 if (pe_def_file == 0)
2562 pe_def_file = def_file_empty ();
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);
2568 exp_funcbase = pe_as32 (expdata + 28);
2570 /* Use internal dll name instead of filename
2571 to enable symbolic dll linking. */
2572 dll_name = pe_as32 (expdata + 12) + erva;
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))
2579 if (pe_dll_extra_pe_debug)
2580 printf ("%s is already loaded\n", dll_name);
2581 return TRUE;
2584 /* Iterate through the list of symbols. */
2585 for (i = 0; i < nexp; i++)
2587 /* Pointer to the names vector. */
2588 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2589 def_file_import *imp;
2590 /* Pointer to the function address vector. */
2591 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2592 int is_data = 0;
2594 /* Skip unwanted symbols, which are
2595 exported in buggy auto-import releases. */
2596 if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2598 /* is_data is true if the address is in the data, rdata or bss
2599 segment. */
2600 is_data =
2601 (func_rva >= data_start && func_rva < data_end)
2602 || (func_rva >= rdata_start && func_rva < rdata_end)
2603 || (func_rva >= bss_start && func_rva < bss_end);
2605 imp = def_file_add_import (pe_def_file, erva + name_rva,
2606 dll_name, i, 0);
2607 /* Mark symbol type. */
2608 imp->data = is_data;
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)" : "");
2617 return TRUE;
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. */
2625 void
2626 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2628 pe_dll_id_target (bfd_get_target (abfd));
2629 process_def_file (abfd, info);
2631 if (pe_def_file->num_exports == 0 && !info->shared)
2632 return;
2634 generate_edata (abfd, info);
2635 build_filler_bfd (1);
2638 void
2639 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2641 pe_dll_id_target (bfd_get_target (abfd));
2642 build_filler_bfd (0);
2645 void
2646 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2648 pe_dll_id_target (bfd_get_target (abfd));
2649 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2651 generate_reloc (abfd, info);
2652 if (reloc_sz > 0)
2654 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2656 /* Resize the sections. */
2657 lang_size_sections (stat_ptr->head, abs_output_section,
2658 &stat_ptr->head, 0, 0, NULL, TRUE);
2660 /* Redo special stuff. */
2661 ldemul_after_allocation ();
2663 /* Do the assignments again. */
2664 lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0);
2667 fill_edata (abfd, info);
2669 if (info->shared)
2670 pe_data (abfd)->dll = 1;
2672 edata_s->contents = edata_d;
2673 reloc_s->contents = reloc_d;
2676 void
2677 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2679 pe_dll_id_target (bfd_get_target (abfd));
2680 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2682 generate_reloc (abfd, info);
2683 if (reloc_sz > 0)
2685 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2687 /* Resize the sections. */
2688 lang_size_sections (stat_ptr->head, abs_output_section,
2689 &stat_ptr->head, 0, 0, NULL, TRUE);
2691 /* Redo special stuff. */
2692 ldemul_after_allocation ();
2694 /* Do the assignments again. */
2695 lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0);
2697 reloc_s->contents = reloc_d;