1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of GLD, the Gnu Linker.
7 GLD is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GLD is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25 #include "libiberty.h"
26 #include "safe-ctype.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
44 /* This file turns a regular Windows PE image into a DLL. Because of
45 the complexity of this operation, it has been broken down into a
46 number of separate modules which are all called by the main function
47 at the end of this file. This function is not re-entrant and is
48 normally only called once, so static variables are used to reduce
49 the number of parameters and return values required.
51 See also: ld/emultempl/pe.em. */
53 /* Auto-import feature by Paul Sokolovsky
57 1. With this feature on, DLL clients can import variables from DLL
58 without any concern from their side (for example, without any source
61 2. This is done completely in bounds of the PE specification (to be fair,
62 there's a place where it pokes nose out of, but in practise it works).
63 So, resulting module can be used with any other PE compiler/linker.
65 3. Auto-import is fully compatible with standard import method and they
66 can be mixed together.
68 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
69 reference to it; load time: negligible; virtual/physical memory: should be
70 less than effect of DLL relocation, and I sincerely hope it doesn't affect
71 DLL sharability (too much).
75 The obvious and only way to get rid of dllimport insanity is to make client
76 access variable directly in the DLL, bypassing extra dereference. I.e.,
77 whenever client contains someting like
81 address of dll_var in the command should be relocated to point into loaded
82 DLL. The aim is to make OS loader do so, and than make ld help with that.
83 Import section of PE made following way: there's a vector of structures
84 each describing imports from particular DLL. Each such structure points
85 to two other parellel vectors: one holding imported names, and one which
86 will hold address of corresponding imported name. So, the solution is
87 de-vectorize these structures, making import locations be sparse and
88 pointing directly into code. Before continuing, it is worth a note that,
89 while authors strives to make PE act ELF-like, there're some other people
90 make ELF act PE-like: elfvector, ;-) .
94 For each reference of data symbol to be imported from DLL (to set of which
95 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
96 import fixup entry is generated. That entry is of type
97 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
98 fixup entry contains pointer to symbol's address within .text section
99 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
100 (so, DLL name is referenced by multiple entries), and pointer to symbol
101 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
102 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
103 containing imported name. Here comes that "om the edge" problem mentioned
104 above: PE specification rambles that name vector (OriginalFirstThunk)
105 should run in parallel with addresses vector (FirstThunk), i.e. that they
106 should have same number of elements and terminated with zero. We violate
107 this, since FirstThunk points directly into machine code. But in practise,
108 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
109 puts addresses to FirstThunk, not something else. It once again should be
110 noted that dll and symbol name structures are reused across fixup entries
111 and should be there anyway to support standard import stuff, so sustained
112 overhead is 20 bytes per reference. Other question is whether having several
113 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
114 done even by native compiler/linker (libth32's functions are in fact reside
115 in windows9x kernel32.dll, so if you use it, you have two
116 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
117 referencing the same PE structures several times is valid. The answer is why
118 not, prohibitting that (detecting violation) would require more work on
119 behalf of loader than not doing it.
121 See also: ld/emultempl/pe.em. */
124 add_bfd_to_link PARAMS ((bfd *, const char *, struct bfd_link_info *));
126 /* For emultempl/pe.em. */
128 def_file * pe_def_file = 0;
129 int pe_dll_export_everything = 0;
130 int pe_dll_do_default_excludes = 1;
131 int pe_dll_kill_ats = 0;
132 int pe_dll_stdcall_aliases = 0;
133 int pe_dll_warn_dup_exports = 0;
134 int pe_dll_compat_implib = 0;
135 int pe_dll_extra_pe_debug = 0;
137 /* Static variables and types. */
139 static bfd_vma image_base;
140 static bfd *filler_bfd;
141 static struct sec *edata_s, *reloc_s;
142 static unsigned char *edata_d, *reloc_d;
143 static size_t edata_sz, reloc_sz;
149 unsigned int imagebase_reloc;
161 autofilter_entry_type;
163 #define PE_ARCH_i386 1
165 #define PE_ARCH_mips 3
166 #define PE_ARCH_arm 4
167 #define PE_ARCH_arm_epoc 5
169 static pe_details_type pe_detail_list[] =
182 16 /* R_SH_IMAGEBASE */,
204 "epoc-pei-arm-little",
205 "epoc-pe-arm-little",
211 { NULL, NULL, 0, 0, 0, 0 }
214 static pe_details_type *pe_details;
216 static autofilter_entry_type autofilter_symbollist[] =
218 { "DllMain@12", 10 },
219 { "DllEntryPoint@0", 15 },
220 { "DllMainCRTStartup@12", 20 },
221 { "_cygwin_dll_entry@12", 20 },
222 { "_cygwin_crt0_common@8", 21 },
223 { "_cygwin_noncygwin_dll_entry@12", 30 },
224 { "impure_ptr", 10 },
228 /* Do not specify library suffix explicitly, to allow for dllized versions. */
229 static autofilter_entry_type autofilter_liblist[] =
233 { "libmingw32", 10 },
234 { "libmingwex", 10 },
242 static autofilter_entry_type autofilter_objlist[] =
252 { "crtbegin.o", 10 },
257 static autofilter_entry_type autofilter_symbolprefixlist[] =
259 /* { "__imp_", 6 }, */
260 /* Do __imp_ explicitly to save time. */
262 /* Don't re-export auto-imported symbols. */
264 { "__builtin_", 10 },
265 /* Don't export symbols specifying internal DLL layout. */
268 { "_impure_ptr", 11 },
269 { "cygwin_attach_dll", 17 },
270 { "cygwin_premain0", 15 },
271 { "cygwin_premain1", 15 },
272 { "cygwin_premain2", 15 },
273 { "cygwin_premain3", 15 },
278 static autofilter_entry_type autofilter_symbolsuffixlist[] =
284 #define U(str) (pe_details->underscored ? "_" str : str)
286 static int reloc_sort PARAMS ((const void *, const void *));
287 static int pe_export_sort PARAMS ((const void *, const void *));
288 static int auto_export PARAMS ((bfd *, def_file *, const char *));
289 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
290 static void build_filler_bfd PARAMS ((int));
291 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
292 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
293 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
294 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
295 static void quoteput PARAMS ((char *, FILE *, int));
296 static asection *quick_section PARAMS ((bfd *, const char *, int, int));
297 static void quick_symbol
298 PARAMS ((bfd *, const char *, const char *, const char *,
299 asection *, int, int));
300 static void quick_reloc PARAMS ((bfd *, int, int, int));
301 static bfd *make_head PARAMS ((bfd *));
302 static bfd *make_tail PARAMS ((bfd *));
303 static bfd *make_one PARAMS ((def_file_export *, bfd *));
304 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
305 static char *make_import_fixup_mark PARAMS ((arelent *));
306 static bfd *make_import_fixup_entry
307 PARAMS ((const char *, const char *, const char *, bfd *));
308 static unsigned int pe_get16 PARAMS ((bfd *, int));
309 static unsigned int pe_get32 PARAMS ((bfd *, int));
310 static unsigned int pe_as32 PARAMS ((void *));
313 pe_dll_id_target (target)
318 for (i = 0; pe_detail_list[i].target_name; i++)
319 if (strcmp (pe_detail_list[i].target_name, target) == 0
320 || strcmp (pe_detail_list[i].object_target, target) == 0)
322 pe_details = pe_detail_list + i;
325 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
329 /* Helper functions for qsort. Relocs must be sorted so that we can write
330 them out by pages. */
344 bfd_vma a = ((reloc_data_type *) va)->vma;
345 bfd_vma b = ((reloc_data_type *) vb)->vma;
347 return (a > b) ? 1 : ((a < b) ? -1 : 0);
351 pe_export_sort (va, vb)
354 def_file_export *a = (def_file_export *) va;
355 def_file_export *b = (def_file_export *) vb;
357 return strcmp (a->name, b->name);
360 /* Read and process the .DEF file. */
362 /* These correspond to the entries in pe_def_file->exports[]. I use
363 exported_symbol_sections[i] to tag whether or not the symbol was
364 defined, since we can't export symbols we don't have. */
366 static bfd_vma *exported_symbol_offsets;
367 static struct sec **exported_symbol_sections;
368 static int export_table_size;
369 static int count_exported;
370 static int count_exported_byname;
371 static int count_with_ordinals;
372 static const char *dll_name;
373 static int min_ordinal, max_ordinal;
374 static int *exported_symbols;
376 typedef struct exclude_list_struct
379 struct exclude_list_struct *next;
384 static struct exclude_list_struct *excludes = 0;
387 pe_dll_add_excludes (new_excludes, type)
388 const char *new_excludes;
392 char *exclude_string;
394 local_copy = xstrdup (new_excludes);
396 exclude_string = strtok (local_copy, ",:");
397 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
399 struct exclude_list_struct *new_exclude;
401 new_exclude = ((struct exclude_list_struct *)
402 xmalloc (sizeof (struct exclude_list_struct)));
403 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
404 strcpy (new_exclude->string, exclude_string);
405 new_exclude->type = type;
406 new_exclude->next = excludes;
407 excludes = new_exclude;
414 /* abfd is a bfd containing n (or NULL)
415 It can be used for contextual checks. */
418 auto_export (abfd, d, n)
424 struct exclude_list_struct *ex;
425 autofilter_entry_type *afptr;
426 const char * libname = 0;
427 if (abfd && abfd->my_archive)
428 libname = lbasename (abfd->my_archive->filename);
430 /* We should not re-export imported stuff. */
431 if (strncmp (n, "_imp__", 6) == 0)
434 for (i = 0; i < d->num_exports; i++)
435 if (strcmp (d->exports[i].name, n) == 0)
438 if (pe_dll_do_default_excludes)
443 if (pe_dll_extra_pe_debug)
444 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
445 n, abfd, abfd->my_archive);
447 /* First of all, make context checks:
448 Don't export anything from standard libs. */
451 afptr = autofilter_liblist;
455 if (strncmp (libname, afptr->name, afptr->len) == 0 )
461 /* Next, exclude symbols from certain startup objects. */
463 if (abfd && (p = lbasename (abfd->filename)))
465 afptr = autofilter_objlist;
468 if (strcmp (p, afptr->name) == 0)
474 /* Don't try to blindly exclude all symbols
475 that begin with '__'; this was tried and
476 it is too restrictive. */
478 /* Then, exclude specific symbols. */
479 afptr = autofilter_symbollist;
482 if (strcmp (n, afptr->name) == 0)
488 /* Next, exclude symbols starting with ... */
489 afptr = autofilter_symbolprefixlist;
492 if (strncmp (n, afptr->name, afptr->len) == 0)
498 /* Finally, exclude symbols ending with ... */
500 afptr = autofilter_symbolsuffixlist;
503 if ((len >= afptr->len)
504 /* Add 1 to insure match with trailing '\0'. */
505 && strncmp (n + len - afptr->len, afptr->name,
506 afptr->len + 1) == 0)
513 for (ex = excludes; ex; ex = ex->next)
515 if (ex->type == 1) /* exclude-libs */
518 && ((strcmp (libname, ex->string) == 0)
519 || (strcasecmp ("ALL", ex->string) == 0)))
522 else if (strcmp (n, ex->string) == 0)
530 process_def_file (abfd, info)
531 bfd *abfd ATTRIBUTE_UNUSED;
532 struct bfd_link_info *info;
535 struct bfd_link_hash_entry *blhe;
538 def_file_export *e = 0;
541 pe_def_file = def_file_empty ();
543 /* First, run around to all the objects looking for the .drectve
544 sections, and push those into the def file too. */
545 for (b = info->input_bfds; b; b = b->link_next)
547 s = bfd_get_section_by_name (b, ".drectve");
550 int size = bfd_get_section_size_before_reloc (s);
551 char *buf = xmalloc (size);
553 bfd_get_section_contents (b, s, buf, 0, size);
554 def_file_add_directive (pe_def_file, buf, size);
559 /* Now, maybe export everything else the default way. */
560 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
562 for (b = info->input_bfds; b; b = b->link_next)
567 symsize = bfd_get_symtab_upper_bound (b);
568 symbols = (asymbol **) xmalloc (symsize);
569 nsyms = bfd_canonicalize_symtab (b, symbols);
571 for (j = 0; j < nsyms; j++)
573 /* We should export symbols which are either global or not
574 anything at all. (.bss data is the latter)
575 We should not export undefined symbols. */
576 if (symbols[j]->section != &bfd_und_section
577 && ((symbols[j]->flags & BSF_GLOBAL)
578 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
580 const char *sn = symbols[j]->name;
582 /* We should not re-export imported stuff. */
584 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
585 sprintf (name, "%s%s", U("_imp_"), sn);
587 blhe = bfd_link_hash_lookup (info->hash, name,
588 false, false, false);
591 if (blhe && blhe->type == bfd_link_hash_defined)
598 if (auto_export (b, pe_def_file, sn))
601 p=def_file_add_export (pe_def_file, sn, 0, -1);
602 /* Fill data flag properly, from dlltool.c. */
603 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
611 #define NE pe_def_file->num_exports
613 /* Canonicalize the export list. */
616 for (i = 0; i < NE; i++)
618 if (strchr (pe_def_file->exports[i].name, '@'))
620 /* This will preserve internal_name, which may have been
621 pointing to the same memory as name, or might not
623 int lead_at = (*pe_def_file->exports[i].name =='@');
624 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
626 *(strchr (tmp, '@')) = 0;
627 pe_def_file->exports[i].name = tmp;
632 if (pe_dll_stdcall_aliases)
634 for (i = 0; i < NE; i++)
636 if (strchr (pe_def_file->exports[i].name, '@'))
638 int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
639 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
641 *(strchr (tmp, '@')) = 0;
642 if (auto_export (NULL, pe_def_file, tmp))
643 def_file_add_export (pe_def_file, tmp,
644 pe_def_file->exports[i].internal_name,
652 /* Convenience, but watch out for it changing. */
653 e = pe_def_file->exports;
655 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
656 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
658 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
662 count_exported_byname = 0;
663 count_with_ordinals = 0;
665 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
666 for (i = 0, j = 0; i < NE; i++)
668 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
670 /* This is a duplicate. */
671 if (e[j - 1].ordinal != -1
672 && e[i].ordinal != -1
673 && e[j - 1].ordinal != e[i].ordinal)
675 if (pe_dll_warn_dup_exports)
676 /* xgettext:c-format */
677 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
678 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
682 if (pe_dll_warn_dup_exports)
683 /* xgettext:c-format */
684 einfo (_("Warning, duplicate EXPORT: %s\n"),
688 if (e[i].ordinal != -1)
689 e[j - 1].ordinal = e[i].ordinal;
690 e[j - 1].flag_private |= e[i].flag_private;
691 e[j - 1].flag_constant |= e[i].flag_constant;
692 e[j - 1].flag_noname |= e[i].flag_noname;
693 e[j - 1].flag_data |= e[i].flag_data;
702 pe_def_file->num_exports = j; /* == NE */
704 for (i = 0; i < NE; i++)
706 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
708 if (pe_details->underscored
709 && (*pe_def_file->exports[i].internal_name != '@'))
712 strcpy (name + 1, pe_def_file->exports[i].internal_name);
715 strcpy (name, pe_def_file->exports[i].internal_name);
717 blhe = bfd_link_hash_lookup (info->hash,
722 && (blhe->type == bfd_link_hash_defined
723 || (blhe->type == bfd_link_hash_common)))
726 if (!pe_def_file->exports[i].flag_noname)
727 count_exported_byname++;
729 /* Only fill in the sections. The actual offsets are computed
730 in fill_exported_offsets() after common symbols are laid
732 if (blhe->type == bfd_link_hash_defined)
733 exported_symbol_sections[i] = blhe->u.def.section;
735 exported_symbol_sections[i] = blhe->u.c.p->section;
737 if (pe_def_file->exports[i].ordinal != -1)
739 if (max_ordinal < pe_def_file->exports[i].ordinal)
740 max_ordinal = pe_def_file->exports[i].ordinal;
741 if (min_ordinal > pe_def_file->exports[i].ordinal)
742 min_ordinal = pe_def_file->exports[i].ordinal;
743 count_with_ordinals++;
746 else if (blhe && blhe->type == bfd_link_hash_undefined)
748 /* xgettext:c-format */
749 einfo (_("%XCannot export %s: symbol not defined\n"),
750 pe_def_file->exports[i].internal_name);
754 /* xgettext:c-format */
755 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
756 pe_def_file->exports[i].internal_name,
757 blhe->type, bfd_link_hash_defined);
761 /* xgettext:c-format */
762 einfo (_("%XCannot export %s: symbol not found\n"),
763 pe_def_file->exports[i].internal_name);
769 /* Build the bfd that will contain .edata and .reloc sections. */
772 build_filler_bfd (include_edata)
775 lang_input_statement_type *filler_file;
776 filler_file = lang_add_input_file ("dll stuff",
777 lang_input_file_is_fake_enum,
779 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
780 if (filler_bfd == NULL
781 || !bfd_set_arch_mach (filler_bfd,
782 bfd_get_arch (output_bfd),
783 bfd_get_mach (output_bfd)))
785 einfo ("%X%P: can not create BFD %E\n");
791 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
793 || !bfd_set_section_flags (filler_bfd, edata_s,
800 einfo ("%X%P: can not create .edata section: %E\n");
803 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
806 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
808 || !bfd_set_section_flags (filler_bfd, reloc_s,
815 einfo ("%X%P: can not create .reloc section: %E\n");
819 bfd_set_section_size (filler_bfd, reloc_s, 0);
821 ldlang_add_file (filler_file);
824 /* Gather all the exported symbols and build the .edata section. */
827 generate_edata (abfd, info)
829 struct bfd_link_info *info ATTRIBUTE_UNUSED;
832 int name_table_size = 0;
835 /* First, we need to know how many exported symbols there are,
836 and what the range of ordinals is. */
837 if (pe_def_file->name)
838 dll_name = pe_def_file->name;
841 dll_name = abfd->filename;
843 for (dlnp = dll_name; *dlnp; dlnp++)
844 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
848 if (count_with_ordinals && max_ordinal > count_exported)
850 if (min_ordinal > max_ordinal - count_exported + 1)
851 min_ordinal = max_ordinal - count_exported + 1;
856 max_ordinal = count_exported;
859 export_table_size = max_ordinal - min_ordinal + 1;
860 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
861 for (i = 0; i < export_table_size; i++)
862 exported_symbols[i] = -1;
864 /* Now we need to assign ordinals to those that don't have them. */
865 for (i = 0; i < NE; i++)
867 if (exported_symbol_sections[i])
869 if (pe_def_file->exports[i].ordinal != -1)
871 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
872 int pi = exported_symbols[ei];
876 /* xgettext:c-format */
877 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
878 pe_def_file->exports[i].ordinal,
879 pe_def_file->exports[i].name,
880 pe_def_file->exports[pi].name);
882 exported_symbols[ei] = i;
884 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
888 next_ordinal = min_ordinal;
889 for (i = 0; i < NE; i++)
890 if (exported_symbol_sections[i])
891 if (pe_def_file->exports[i].ordinal == -1)
893 while (exported_symbols[next_ordinal - min_ordinal] != -1)
896 exported_symbols[next_ordinal - min_ordinal] = i;
897 pe_def_file->exports[i].ordinal = next_ordinal;
900 /* OK, now we can allocate some memory. */
901 edata_sz = (40 /* directory */
902 + 4 * export_table_size /* addresses */
903 + 4 * count_exported_byname /* name ptrs */
904 + 2 * count_exported_byname /* ordinals */
905 + name_table_size + strlen (dll_name) + 1);
908 /* Fill the exported symbol offsets. The preliminary work has already
909 been done in process_def_file(). */
912 fill_exported_offsets (abfd, info)
913 bfd *abfd ATTRIBUTE_UNUSED;
914 struct bfd_link_info *info;
917 struct bfd_link_hash_entry *blhe;
919 for (i = 0; i < pe_def_file->num_exports; i++)
921 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
923 if (pe_details->underscored
924 && (*pe_def_file->exports[i].internal_name != '@'))
927 strcpy (name + 1, pe_def_file->exports[i].internal_name);
930 strcpy (name, pe_def_file->exports[i].internal_name);
932 blhe = bfd_link_hash_lookup (info->hash,
936 if (blhe && (blhe->type == bfd_link_hash_defined))
937 exported_symbol_offsets[i] = blhe->u.def.value;
944 fill_edata (abfd, info)
946 struct bfd_link_info *info ATTRIBUTE_UNUSED;
949 unsigned char *edirectory;
950 unsigned long *eaddresses;
951 unsigned long *enameptrs;
952 unsigned short *eordinals;
953 unsigned char *enamestr;
958 edata_d = (unsigned char *) xmalloc (edata_sz);
960 /* Note use of array pointer math here. */
961 edirectory = edata_d;
962 eaddresses = (unsigned long *) (edata_d + 40);
963 enameptrs = eaddresses + export_table_size;
964 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
965 enamestr = (char *) (eordinals + count_exported_byname);
967 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
969 memset (edata_d, 0, edata_sz);
970 bfd_put_32 (abfd, now, edata_d + 4);
971 if (pe_def_file->version_major != -1)
973 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
974 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
977 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
978 strcpy (enamestr, dll_name);
979 enamestr += strlen (enamestr) + 1;
980 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
981 bfd_put_32 (abfd, export_table_size, edata_d + 20);
982 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
983 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
984 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
985 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
987 fill_exported_offsets (abfd, info);
989 /* Ok, now for the filling in part. */
991 for (i = 0; i < export_table_size; i++)
993 int s = exported_symbols[i];
997 struct sec *ssec = exported_symbol_sections[s];
998 unsigned long srva = (exported_symbol_offsets[s]
999 + ssec->output_section->vma
1000 + ssec->output_offset);
1001 int ord = pe_def_file->exports[s].ordinal;
1003 bfd_put_32 (abfd, srva - image_base,
1004 (void *) (eaddresses + ord - min_ordinal));
1006 if (!pe_def_file->exports[s].flag_noname)
1008 char *ename = pe_def_file->exports[s].name;
1009 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
1011 strcpy (enamestr, ename);
1012 enamestr += strlen (enamestr) + 1;
1013 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
1015 pe_def_file->exports[s].hint = hint++;
1022 static struct sec *current_sec;
1025 pe_walk_relocs_of_symbol (info, name, cb)
1026 struct bfd_link_info *info;
1028 int (*cb) (arelent *, asection *);
1033 for (b = info->input_bfds; b; b = b->link_next)
1038 symsize = bfd_get_symtab_upper_bound (b);
1039 symbols = (asymbol **) xmalloc (symsize);
1040 nsyms = bfd_canonicalize_symtab (b, symbols);
1042 for (s = b->sections; s; s = s->next)
1045 int relsize, nrelocs, i;
1046 int flags = bfd_get_section_flags (b, s);
1048 /* Skip discarded linkonce sections. */
1049 if (flags & SEC_LINK_ONCE
1050 && s->output_section == bfd_abs_section_ptr)
1055 relsize = bfd_get_reloc_upper_bound (b, s);
1056 relocs = (arelent **) xmalloc ((size_t) relsize);
1057 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1059 for (i = 0; i < nrelocs; i++)
1061 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1063 if (!strcmp (name, sym->name))
1069 /* Warning: the allocated symbols are remembered in BFD and reused
1070 later, so don't free them! */
1071 /* free (symbols); */
1076 /* Gather all the relocations and build the .reloc section. */
1079 generate_reloc (abfd, info)
1081 struct bfd_link_info *info;
1084 /* For .reloc stuff. */
1085 reloc_data_type *reloc_data;
1086 int total_relocs = 0;
1088 unsigned long sec_page = (unsigned long) (-1);
1089 unsigned long page_ptr, page_count;
1095 for (b = info->input_bfds; b; b = b->link_next)
1096 for (s = b->sections; s; s = s->next)
1097 total_relocs += s->reloc_count;
1100 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1104 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1107 int relsize, nrelocs, i;
1109 for (s = b->sections; s; s = s->next)
1111 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1115 /* If it's not loaded, we don't need to relocate it this way. */
1116 if (!(s->output_section->flags & SEC_LOAD))
1119 /* I don't know why there would be a reloc for these, but I've
1120 seen it happen - DJ */
1121 if (s->output_section == &bfd_abs_section)
1124 if (s->output_section->vma == 0)
1126 /* Huh? Shouldn't happen, but punt if it does. */
1127 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1128 s->output_section->name, s->output_section->index,
1129 s->output_section->flags);
1133 symsize = bfd_get_symtab_upper_bound (b);
1134 symbols = (asymbol **) xmalloc (symsize);
1135 nsyms = bfd_canonicalize_symtab (b, symbols);
1137 relsize = bfd_get_reloc_upper_bound (b, s);
1138 relocs = (arelent **) xmalloc ((size_t) relsize);
1139 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1141 for (i = 0; i < nrelocs; i++)
1143 if (pe_dll_extra_pe_debug)
1145 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1146 printf ("rel: %s\n", sym->name);
1148 if (!relocs[i]->howto->pc_relative
1149 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1152 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1154 sym_vma = (relocs[i]->addend
1157 + sym->section->output_offset
1158 + sym->section->output_section->vma);
1159 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1161 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1163 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1164 relocs[i]->howto->rightshift)
1166 case BITS_AND_SHIFT (32, 0):
1167 reloc_data[total_relocs].type = 3;
1170 case BITS_AND_SHIFT (16, 0):
1171 reloc_data[total_relocs].type = 2;
1174 case BITS_AND_SHIFT (16, 16):
1175 reloc_data[total_relocs].type = 4;
1176 /* FIXME: we can't know the symbol's right value
1177 yet, but we probably can safely assume that
1178 CE will relocate us in 64k blocks, so leaving
1180 reloc_data[total_relocs].extra = 0;
1183 case BITS_AND_SHIFT (26, 2):
1184 reloc_data[total_relocs].type = 5;
1188 /* xgettext:c-format */
1189 einfo (_("%XError: %d-bit reloc in dll\n"),
1190 relocs[i]->howto->bitsize);
1196 /* Warning: the allocated symbols are remembered in BFD and
1197 reused later, so don't free them! */
1204 /* At this point, we have total_relocs relocation addresses in
1205 reloc_addresses, which are all suitable for the .reloc section.
1206 We must now create the new sections. */
1207 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1209 for (i = 0; i < total_relocs; i++)
1211 unsigned long this_page = (reloc_data[i].vma >> 12);
1213 if (this_page != sec_page)
1215 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1217 sec_page = this_page;
1222 if (reloc_data[i].type == 4)
1226 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1227 reloc_d = (unsigned char *) xmalloc (reloc_sz);
1228 sec_page = (unsigned long) (-1);
1230 page_ptr = (unsigned long) (-1);
1233 for (i = 0; i < total_relocs; i++)
1235 unsigned long rva = reloc_data[i].vma - image_base;
1236 unsigned long this_page = (rva & ~0xfff);
1238 if (this_page != sec_page)
1240 while (reloc_sz & 3)
1241 reloc_d[reloc_sz++] = 0;
1243 if (page_ptr != (unsigned long) (-1))
1244 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1246 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1247 page_ptr = reloc_sz;
1249 sec_page = this_page;
1253 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1254 reloc_d + reloc_sz);
1257 if (reloc_data[i].type == 4)
1259 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1266 while (reloc_sz & 3)
1267 reloc_d[reloc_sz++] = 0;
1269 if (page_ptr != (unsigned long) (-1))
1270 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1272 while (reloc_sz < reloc_s->_raw_size)
1273 reloc_d[reloc_sz++] = 0;
1276 /* Given the exiting def_file structure, print out a .DEF file that
1277 corresponds to it. */
1280 quoteput (s, f, needs_quotes)
1287 for (cp = s; *cp; cp++)
1302 if (*s == '"' || *s == '\\')
1316 pe_dll_generate_def_file (pe_out_def_filename)
1317 const char *pe_out_def_filename;
1320 FILE *out = fopen (pe_out_def_filename, "w");
1323 /* xgettext:c-format */
1324 einfo (_("%s: Can't open output def file %s\n"),
1325 program_name, pe_out_def_filename);
1329 if (pe_def_file->name)
1331 if (pe_def_file->is_dll)
1332 fprintf (out, "LIBRARY ");
1334 fprintf (out, "NAME ");
1336 quoteput (pe_def_file->name, out, 1);
1338 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1339 fprintf (out, " BASE=0x%lx",
1340 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1341 fprintf (out, "\n");
1344 if (pe_def_file->description)
1346 fprintf (out, "DESCRIPTION ");
1347 quoteput (pe_def_file->description, out, 1);
1348 fprintf (out, "\n");
1351 if (pe_def_file->version_minor != -1)
1352 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1353 pe_def_file->version_minor);
1354 else if (pe_def_file->version_major != -1)
1355 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1357 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1358 fprintf (out, "\n");
1360 if (pe_def_file->stack_commit != -1)
1361 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1362 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1363 else if (pe_def_file->stack_reserve != -1)
1364 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1366 if (pe_def_file->heap_commit != -1)
1367 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1368 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1369 else if (pe_def_file->heap_reserve != -1)
1370 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1372 if (pe_def_file->num_section_defs > 0)
1374 fprintf (out, "\nSECTIONS\n\n");
1376 for (i = 0; i < pe_def_file->num_section_defs; i++)
1379 quoteput (pe_def_file->section_defs[i].name, out, 0);
1381 if (pe_def_file->section_defs[i].class)
1383 fprintf (out, " CLASS ");
1384 quoteput (pe_def_file->section_defs[i].class, out, 0);
1387 if (pe_def_file->section_defs[i].flag_read)
1388 fprintf (out, " READ");
1390 if (pe_def_file->section_defs[i].flag_write)
1391 fprintf (out, " WRITE");
1393 if (pe_def_file->section_defs[i].flag_execute)
1394 fprintf (out, " EXECUTE");
1396 if (pe_def_file->section_defs[i].flag_shared)
1397 fprintf (out, " SHARED");
1399 fprintf (out, "\n");
1403 if (pe_def_file->num_exports > 0)
1405 fprintf (out, "EXPORTS\n");
1407 for (i = 0; i < pe_def_file->num_exports; i++)
1409 def_file_export *e = pe_def_file->exports + i;
1411 quoteput (e->name, out, 0);
1413 if (e->internal_name && strcmp (e->internal_name, e->name))
1415 fprintf (out, " = ");
1416 quoteput (e->internal_name, out, 0);
1419 if (e->ordinal != -1)
1420 fprintf (out, " @%d", e->ordinal);
1422 if (e->flag_private)
1423 fprintf (out, " PRIVATE");
1425 if (e->flag_constant)
1426 fprintf (out, " CONSTANT");
1429 fprintf (out, " NONAME");
1432 fprintf (out, " DATA");
1434 fprintf (out, "\n");
1438 if (pe_def_file->num_imports > 0)
1440 fprintf (out, "\nIMPORTS\n\n");
1442 for (i = 0; i < pe_def_file->num_imports; i++)
1444 def_file_import *im = pe_def_file->imports + i;
1447 if (im->internal_name
1448 && (!im->name || strcmp (im->internal_name, im->name)))
1450 quoteput (im->internal_name, out, 0);
1451 fprintf (out, " = ");
1454 quoteput (im->module->name, out, 0);
1458 quoteput (im->name, out, 0);
1460 fprintf (out, "%d", im->ordinal);
1462 fprintf (out, "\n");
1467 fprintf (out, _("; no contents available\n"));
1469 if (fclose (out) == EOF)
1470 /* xgettext:c-format */
1471 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1474 /* Generate the import library. */
1476 static asymbol **symtab;
1479 static const char *dll_filename;
1480 static char *dll_symname;
1482 #define UNDSEC (asection *) &bfd_und_section
1485 quick_section (abfd, name, flags, align)
1494 sec = bfd_make_section_old_way (abfd, name);
1495 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1496 bfd_set_section_alignment (abfd, sec, align);
1497 /* Remember to undo this before trying to link internally! */
1498 sec->output_section = sec;
1500 sym = bfd_make_empty_symbol (abfd);
1501 symtab[symptr++] = sym;
1502 sym->name = sec->name;
1504 sym->flags = BSF_LOCAL;
1511 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1521 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1526 sym = bfd_make_empty_symbol (abfd);
1531 symtab[symptr++] = sym;
1534 static arelent *reltab = 0;
1535 static int relcount = 0, relsize = 0;
1538 quick_reloc (abfd, address, which_howto, symidx)
1544 if (relcount >= (relsize - 1))
1548 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1550 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1552 reltab[relcount].address = address;
1553 reltab[relcount].addend = 0;
1554 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1555 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1560 save_relocs (asection *sec)
1564 sec->relocation = reltab;
1565 sec->reloc_count = relcount;
1566 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1567 for (i = 0; i < relcount; i++)
1568 sec->orelocation[i] = sec->relocation + i;
1569 sec->orelocation[relcount] = 0;
1570 sec->flags |= SEC_RELOC;
1572 relcount = relsize = 0;
1575 /* .section .idata$2
1576 .global __head_my_dll
1596 asection *id2, *id5, *id4;
1597 unsigned char *d2, *d5, *d4;
1601 oname = (char *) xmalloc (20);
1602 sprintf (oname, "d%06d.o", tmp_seq);
1605 abfd = bfd_create (oname, parent);
1606 bfd_find_target (pe_details->object_target, abfd);
1607 bfd_make_writable (abfd);
1609 bfd_set_format (abfd, bfd_object);
1610 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1613 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1614 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1615 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1616 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1617 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1618 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1620 /* OK, pay attention here. I got confused myself looking back at
1621 it. We create a four-byte section to mark the beginning of the
1622 list, and we include an offset of 4 in the section, so that the
1623 pointer to the list points to the *end* of this section, which is
1624 the start of the list of sections from other objects. */
1626 bfd_set_section_size (abfd, id2, 20);
1627 d2 = (unsigned char *) xmalloc (20);
1630 d2[0] = d2[16] = 4; /* Reloc addend. */
1631 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1632 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1633 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1636 bfd_set_section_size (abfd, id5, 4);
1637 d5 = (unsigned char *) xmalloc (4);
1641 bfd_set_section_size (abfd, id4, 4);
1642 d4 = (unsigned char *) xmalloc (4);
1646 bfd_set_symtab (abfd, symtab, symptr);
1648 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1649 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1650 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1652 bfd_make_readable (abfd);
1656 /* .section .idata$4
1661 .global __my_dll_iname
1669 asection *id4, *id5, *id7;
1670 unsigned char *d4, *d5, *d7;
1675 oname = (char *) xmalloc (20);
1676 sprintf (oname, "d%06d.o", tmp_seq);
1679 abfd = bfd_create (oname, parent);
1680 bfd_find_target (pe_details->object_target, abfd);
1681 bfd_make_writable (abfd);
1683 bfd_set_format (abfd, bfd_object);
1684 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1687 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1688 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1689 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1690 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1691 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1693 bfd_set_section_size (abfd, id4, 4);
1694 d4 = (unsigned char *) xmalloc (4);
1698 bfd_set_section_size (abfd, id5, 4);
1699 d5 = (unsigned char *) xmalloc (4);
1703 len = strlen (dll_filename) + 1;
1706 bfd_set_section_size (abfd, id7, len);
1707 d7 = (unsigned char *) xmalloc (len);
1709 strcpy (d7, dll_filename);
1711 bfd_set_symtab (abfd, symtab, symptr);
1713 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1714 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1715 bfd_set_section_contents (abfd, id7, d7, 0, len);
1717 bfd_make_readable (abfd);
1723 .global ___imp_function
1724 .global __imp__function
1726 jmp *__imp__function:
1740 .asciz "function" xlate? (add underscore, kill at) */
1742 static unsigned char jmp_ix86_bytes[] =
1744 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1752 .dw __imp_function */
1754 static unsigned char jmp_sh_bytes[] =
1756 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1760 lui $t0,<high:__imp_function>
1761 lw $t0,<low:__imp_function>
1765 static unsigned char jmp_mips_bytes[] =
1767 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1768 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1772 make_one (exp, parent)
1773 def_file_export *exp;
1776 asection *tx, *id7, *id5, *id4, *id6;
1777 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1781 unsigned char *jmp_bytes = NULL;
1782 int jmp_byte_count = 0;
1784 switch (pe_details->pe_arch)
1787 jmp_bytes = jmp_ix86_bytes;
1788 jmp_byte_count = sizeof (jmp_ix86_bytes);
1791 jmp_bytes = jmp_sh_bytes;
1792 jmp_byte_count = sizeof (jmp_sh_bytes);
1795 jmp_bytes = jmp_mips_bytes;
1796 jmp_byte_count = sizeof (jmp_mips_bytes);
1802 oname = (char *) xmalloc (20);
1803 sprintf (oname, "d%06d.o", tmp_seq);
1806 abfd = bfd_create (oname, parent);
1807 bfd_find_target (pe_details->object_target, abfd);
1808 bfd_make_writable (abfd);
1810 bfd_set_format (abfd, bfd_object);
1811 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1814 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1815 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1816 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1817 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1818 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1819 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1821 if (*exp->internal_name == '@')
1823 if (! exp->flag_data)
1824 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1825 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1826 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1827 /* Fastcall applies only to functions,
1828 so no need for auto-import symbol. */
1832 if (! exp->flag_data)
1833 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1834 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1835 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1836 /* Symbol to reference ord/name of imported
1837 data symbol, used to implement auto-import. */
1839 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
1841 if (pe_dll_compat_implib)
1842 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1843 id5, BSF_GLOBAL, 0);
1845 if (! exp->flag_data)
1847 bfd_set_section_size (abfd, tx, jmp_byte_count);
1848 td = (unsigned char *) xmalloc (jmp_byte_count);
1850 memcpy (td, jmp_bytes, jmp_byte_count);
1852 switch (pe_details->pe_arch)
1855 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1858 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1861 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1862 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1863 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1871 bfd_set_section_size (abfd, id7, 4);
1872 d7 = (unsigned char *) xmalloc (4);
1875 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1878 bfd_set_section_size (abfd, id5, 4);
1879 d5 = (unsigned char *) xmalloc (4);
1883 if (exp->flag_noname)
1885 d5[0] = exp->ordinal;
1886 d5[1] = exp->ordinal >> 8;
1891 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1895 bfd_set_section_size (abfd, id4, 4);
1896 d4 = (unsigned char *) xmalloc (4);
1900 if (exp->flag_noname)
1902 d4[0] = exp->ordinal;
1903 d4[1] = exp->ordinal >> 8;
1908 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1912 if (exp->flag_noname)
1915 bfd_set_section_size (abfd, id6, 0);
1919 len = strlen (exp->name) + 3;
1922 bfd_set_section_size (abfd, id6, len);
1923 d6 = (unsigned char *) xmalloc (len);
1925 memset (d6, 0, len);
1926 d6[0] = exp->hint & 0xff;
1927 d6[1] = exp->hint >> 8;
1928 strcpy (d6 + 2, exp->name);
1931 bfd_set_symtab (abfd, symtab, symptr);
1933 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1934 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1935 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1936 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1937 if (!exp->flag_noname)
1938 bfd_set_section_contents (abfd, id6, d6, 0, len);
1940 bfd_make_readable (abfd);
1945 make_singleton_name_thunk (import, parent)
1949 /* Name thunks go to idata$4. */
1955 oname = (char *) xmalloc (20);
1956 sprintf (oname, "nmth%06d.o", tmp_seq);
1959 abfd = bfd_create (oname, parent);
1960 bfd_find_target (pe_details->object_target, abfd);
1961 bfd_make_writable (abfd);
1963 bfd_set_format (abfd, bfd_object);
1964 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1967 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1968 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1969 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1970 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1972 bfd_set_section_size (abfd, id4, 8);
1973 d4 = (unsigned char *) xmalloc (4);
1976 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1979 bfd_set_symtab (abfd, symtab, symptr);
1981 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1983 bfd_make_readable (abfd);
1988 make_import_fixup_mark (rel)
1991 /* We convert reloc to symbol, for later reference. */
1993 static char *fixup_name = NULL;
1994 static size_t buffer_len = 0;
1996 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
1998 bfd *abfd = bfd_asymbol_bfd (sym);
1999 struct bfd_link_hash_entry *bh;
2003 fixup_name = (char *) xmalloc (384);
2007 if (strlen (sym->name) + 25 > buffer_len)
2008 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2009 bigger than 20 digits long, we've got worse problems than
2010 overflowing this buffer... */
2013 /* New buffer size is length of symbol, plus 25, but then
2014 rounded up to the nearest multiple of 128. */
2015 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2016 fixup_name = (char *) xmalloc (buffer_len);
2019 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2022 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2023 current_sec, /* sym->section, */
2024 rel->address, NULL, true, false, &bh);
2028 struct coff_link_hash_entry *myh;
2030 myh = (struct coff_link_hash_entry *) bh;
2031 printf ("type:%d\n", myh->type);
2032 printf ("%s\n", myh->root.u.def.section->name);
2038 /* .section .idata$3
2039 .rva __nm_thnk_SYM (singleton thunk with name of func)
2042 .rva __my_dll_iname (name of dll)
2043 .rva __fuNN_SYM (pointer to reference (address) in text) */
2046 make_import_fixup_entry (name, fixup_name, dll_symname, parent)
2048 const char *fixup_name;
2049 const char *dll_symname;
2057 oname = (char *) xmalloc (20);
2058 sprintf (oname, "fu%06d.o", tmp_seq);
2061 abfd = bfd_create (oname, parent);
2062 bfd_find_target (pe_details->object_target, abfd);
2063 bfd_make_writable (abfd);
2065 bfd_set_format (abfd, bfd_object);
2066 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2069 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2070 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2073 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2075 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2076 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2077 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2079 bfd_set_section_size (abfd, id3, 20);
2080 d3 = (unsigned char *) xmalloc (20);
2084 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2085 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2086 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2089 bfd_set_symtab (abfd, symtab, symptr);
2091 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2093 bfd_make_readable (abfd);
2098 pe_create_import_fixup (rel)
2102 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2103 struct bfd_link_hash_entry *name_thunk_sym;
2104 const char *name = sym->name;
2105 char *fixup_name = make_import_fixup_mark (rel);
2107 sprintf (buf, U ("_nm_thnk_%s"), name);
2109 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2111 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2113 bfd *b = make_singleton_name_thunk (name, output_bfd);
2114 add_bfd_to_link (b, b->filename, &link_info);
2116 /* If we ever use autoimport, we have to cast text section writable. */
2117 config.text_read_only = false;
2121 extern char * pe_data_import_dll;
2122 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2124 bfd *b = make_import_fixup_entry (name, fixup_name, dll_symname,
2126 add_bfd_to_link (b, b->filename, &link_info);
2132 pe_dll_generate_implib (def, impfilename)
2134 const char *impfilename;
2142 dll_filename = (def->name) ? def->name : dll_name;
2143 dll_symname = xstrdup (dll_filename);
2144 for (i = 0; dll_symname[i]; i++)
2145 if (!ISALNUM (dll_symname[i]))
2146 dll_symname[i] = '_';
2148 unlink (impfilename);
2150 outarch = bfd_openw (impfilename, 0);
2154 /* xgettext:c-format */
2155 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2159 /* xgettext:c-format */
2160 einfo (_("Creating library file: %s\n"), impfilename);
2162 bfd_set_format (outarch, bfd_archive);
2163 outarch->has_armap = 1;
2165 /* Work out a reasonable size of things to put onto one line. */
2166 ar_head = make_head (outarch);
2168 for (i = 0; i < def->num_exports; i++)
2170 /* The import library doesn't know about the internal name. */
2171 char *internal = def->exports[i].internal_name;
2174 def->exports[i].internal_name = def->exports[i].name;
2175 n = make_one (def->exports + i, outarch);
2178 def->exports[i].internal_name = internal;
2181 ar_tail = make_tail (outarch);
2183 if (ar_head == NULL || ar_tail == NULL)
2186 /* Now stick them all into the archive. */
2187 ar_head->next = head;
2188 ar_tail->next = ar_head;
2191 if (! bfd_set_archive_head (outarch, head))
2192 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2194 if (! bfd_close (outarch))
2195 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2197 while (head != NULL)
2199 bfd *n = head->next;
2206 add_bfd_to_link (abfd, name, link_info)
2209 struct bfd_link_info *link_info;
2211 lang_input_statement_type *fake_file;
2213 fake_file = lang_add_input_file (name,
2214 lang_input_file_is_fake_enum,
2216 fake_file->the_bfd = abfd;
2217 ldlang_add_file (fake_file);
2219 if (!bfd_link_add_symbols (abfd, link_info))
2220 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2224 pe_process_import_defs (output_bfd, link_info)
2226 struct bfd_link_info *link_info;
2228 def_file_module *module;
2230 pe_dll_id_target (bfd_get_target (output_bfd));
2235 for (module = pe_def_file->modules; module; module = module->next)
2239 dll_filename = module->name;
2240 dll_symname = xstrdup (module->name);
2241 for (i = 0; dll_symname[i]; i++)
2242 if (!ISALNUM (dll_symname[i]))
2243 dll_symname[i] = '_';
2247 for (i = 0; i < pe_def_file->num_imports; i++)
2248 if (pe_def_file->imports[i].module == module)
2250 def_file_export exp;
2251 struct bfd_link_hash_entry *blhe;
2252 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2253 /* See if we need this import. */
2254 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2257 sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
2259 sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
2261 blhe = bfd_link_hash_lookup (link_info->hash, name,
2262 false, false, false);
2264 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2267 sprintf (name, "%s%s", U ("_imp_"),
2268 pe_def_file->imports[i].internal_name);
2270 sprintf (name, "%s%s", U ("_imp__"),
2271 pe_def_file->imports[i].internal_name);
2273 blhe = bfd_link_hash_lookup (link_info->hash, name,
2274 false, false, false);
2278 if (blhe && blhe->type == bfd_link_hash_undefined)
2284 bfd *ar_head = make_head (output_bfd);
2285 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2288 exp.internal_name = pe_def_file->imports[i].internal_name;
2289 exp.name = pe_def_file->imports[i].name;
2290 exp.ordinal = pe_def_file->imports[i].ordinal;
2291 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2292 exp.flag_private = 0;
2293 exp.flag_constant = 0;
2295 exp.flag_noname = exp.name ? 0 : 1;
2296 one = make_one (&exp, output_bfd);
2297 add_bfd_to_link (one, one->filename, link_info);
2302 bfd *ar_tail = make_tail (output_bfd);
2303 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2310 /* We were handed a *.DLL file. Parse it and turn it into a set of
2311 IMPORTS directives in the def file. Return true if the file was
2312 handled, false if not. */
2315 pe_get16 (abfd, where)
2321 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2322 bfd_bread (b, (bfd_size_type) 2, abfd);
2323 return b[0] + (b[1] << 8);
2327 pe_get32 (abfd, where)
2333 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2334 bfd_bread (b, (bfd_size_type) 4, abfd);
2335 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2338 #if 0 /* This is not currently used. */
2344 unsigned char *b = ptr;
2346 return b[0] + (b[1] << 8);
2355 unsigned char *b = ptr;
2357 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2361 pe_implied_import_dll (filename)
2362 const char *filename;
2365 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2366 unsigned long export_rva, export_size, nsections, secptr, expptr;
2367 unsigned char *expdata, *erva;
2368 unsigned long name_rvas, ordinals, nexp, ordbase;
2369 const char *dll_name;
2371 /* No, I can't use bfd here. kernel32.dll puts its export table in
2372 the middle of the .rdata section. */
2373 dll = bfd_openr (filename, pe_details->target_name);
2376 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2380 /* PEI dlls seem to be bfd_objects. */
2381 if (!bfd_check_format (dll, bfd_object))
2383 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2387 dll_name = filename;
2388 for (i = 0; filename[i]; i++)
2389 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
2390 dll_name = filename + i + 1;
2392 pe_header_offset = pe_get32 (dll, 0x3c);
2393 opthdr_ofs = pe_header_offset + 4 + 20;
2394 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2396 if (num_entries < 1) /* No exports. */
2399 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2400 export_size = pe_get32 (dll, opthdr_ofs + 100);
2401 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2402 secptr = (pe_header_offset + 4 + 20 +
2403 pe_get16 (dll, pe_header_offset + 4 + 16));
2406 for (i = 0; i < nsections; i++)
2409 unsigned long secptr1 = secptr + 40 * i;
2410 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2411 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2412 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2414 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2415 bfd_bread (sname, (bfd_size_type) 8, dll);
2417 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2419 expptr = fptr + (export_rva - vaddr);
2420 if (export_rva + export_size > vaddr + vsize)
2421 export_size = vsize - (export_rva - vaddr);
2426 expdata = (unsigned char *) xmalloc (export_size);
2427 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2428 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2429 erva = expdata - export_rva;
2431 if (pe_def_file == 0)
2432 pe_def_file = def_file_empty ();
2434 nexp = pe_as32 (expdata + 24);
2435 name_rvas = pe_as32 (expdata + 32);
2436 ordinals = pe_as32 (expdata + 36);
2437 ordbase = pe_as32 (expdata + 16);
2439 for (i = 0; i < nexp; i++)
2441 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2442 def_file_import *imp;
2444 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
2451 /* These are the main functions, called from the emulation. The first
2452 is called after the bfds are read, so we can guess at how much space
2453 we need. The second is called after everything is placed, so we
2454 can put the right values in place. */
2457 pe_dll_build_sections (abfd, info)
2459 struct bfd_link_info *info;
2461 pe_dll_id_target (bfd_get_target (abfd));
2462 process_def_file (abfd, info);
2464 generate_edata (abfd, info);
2465 build_filler_bfd (1);
2469 pe_exe_build_sections (abfd, info)
2471 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2473 pe_dll_id_target (bfd_get_target (abfd));
2474 build_filler_bfd (0);
2478 pe_dll_fill_sections (abfd, info)
2480 struct bfd_link_info *info;
2482 pe_dll_id_target (bfd_get_target (abfd));
2483 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2485 generate_reloc (abfd, info);
2488 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2490 /* Resize the sections. */
2491 lang_size_sections (stat_ptr->head, abs_output_section,
2492 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2494 /* Redo special stuff. */
2495 ldemul_after_allocation ();
2497 /* Do the assignments again. */
2498 lang_do_assignments (stat_ptr->head,
2500 (fill_type *) 0, (bfd_vma) 0);
2503 fill_edata (abfd, info);
2505 pe_data (abfd)->dll = 1;
2507 edata_s->contents = edata_d;
2508 reloc_s->contents = reloc_d;
2512 pe_exe_fill_sections (abfd, info)
2514 struct bfd_link_info *info;
2516 pe_dll_id_target (bfd_get_target (abfd));
2517 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2519 generate_reloc (abfd, info);
2522 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2524 /* Resize the sections. */
2525 lang_size_sections (stat_ptr->head, abs_output_section,
2526 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2528 /* Redo special stuff. */
2529 ldemul_after_allocation ();
2531 /* Do the assignments again. */
2532 lang_do_assignments (stat_ptr->head,
2534 (fill_type *) 0, (bfd_vma) 0);
2536 reloc_s->contents = reloc_d;