1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
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[] =
232 { "libstdc++.", 10 },
233 { "libmingw32.", 11 },
235 { "libsupc++.", 10 },
240 static autofilter_entry_type autofilter_objlist[] =
250 { "crtbegin.o", 10 },
255 static autofilter_entry_type autofilter_symbolprefixlist[] =
257 /* { "__imp_", 6 }, */
258 /* Do __imp_ explicitly to save time. */
260 /* Don't re-export auto-imported symbols. */
262 { "__builtin_", 10 },
263 /* Don't export symbols specifying internal DLL layout. */
266 { "_impure_ptr", 11 },
267 { "cygwin_attach_dll", 17 },
268 { "cygwin_premain0", 15 },
269 { "cygwin_premain1", 15 },
270 { "cygwin_premain2", 15 },
271 { "cygwin_premain3", 15 },
276 static autofilter_entry_type autofilter_symbolsuffixlist[] =
282 #define U(str) (pe_details->underscored ? "_" str : str)
284 static int reloc_sort PARAMS ((const void *, const void *));
285 static int pe_export_sort PARAMS ((const void *, const void *));
286 static int auto_export PARAMS ((bfd *, def_file *, const char *));
287 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
288 static void build_filler_bfd PARAMS ((int));
289 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
290 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
291 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
292 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
293 static void quoteput PARAMS ((char *, FILE *, int));
294 static asection *quick_section PARAMS ((bfd *, const char *, int, int));
295 static void quick_symbol
296 PARAMS ((bfd *, const char *, const char *, const char *,
297 asection *, int, int));
298 static void quick_reloc PARAMS ((bfd *, int, int, int));
299 static bfd *make_head PARAMS ((bfd *));
300 static bfd *make_tail PARAMS ((bfd *));
301 static bfd *make_one PARAMS ((def_file_export *, bfd *));
302 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
303 static char *make_import_fixup_mark PARAMS ((arelent *));
304 static bfd *make_import_fixup_entry
305 PARAMS ((const char *, const char *, const char *, bfd *));
306 static unsigned int pe_get16 PARAMS ((bfd *, int));
307 static unsigned int pe_get32 PARAMS ((bfd *, int));
308 static unsigned int pe_as32 PARAMS ((void *));
311 pe_dll_id_target (target)
316 for (i = 0; pe_detail_list[i].target_name; i++)
317 if (strcmp (pe_detail_list[i].target_name, target) == 0
318 || strcmp (pe_detail_list[i].object_target, target) == 0)
320 pe_details = pe_detail_list + i;
323 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
327 /* Helper functions for qsort. Relocs must be sorted so that we can write
328 them out by pages. */
342 bfd_vma a = ((reloc_data_type *) va)->vma;
343 bfd_vma b = ((reloc_data_type *) vb)->vma;
345 return (a > b) ? 1 : ((a < b) ? -1 : 0);
349 pe_export_sort (va, vb)
352 def_file_export *a = (def_file_export *) va;
353 def_file_export *b = (def_file_export *) vb;
355 return strcmp (a->name, b->name);
358 /* Read and process the .DEF file. */
360 /* These correspond to the entries in pe_def_file->exports[]. I use
361 exported_symbol_sections[i] to tag whether or not the symbol was
362 defined, since we can't export symbols we don't have. */
364 static bfd_vma *exported_symbol_offsets;
365 static struct sec **exported_symbol_sections;
366 static int export_table_size;
367 static int count_exported;
368 static int count_exported_byname;
369 static int count_with_ordinals;
370 static const char *dll_name;
371 static int min_ordinal, max_ordinal;
372 static int *exported_symbols;
374 typedef struct exclude_list_struct
377 struct exclude_list_struct *next;
382 static struct exclude_list_struct *excludes = 0;
385 pe_dll_add_excludes (new_excludes, type)
386 const char *new_excludes;
390 char *exclude_string;
392 local_copy = xstrdup (new_excludes);
394 exclude_string = strtok (local_copy, ",:");
395 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
397 struct exclude_list_struct *new_exclude;
399 new_exclude = ((struct exclude_list_struct *)
400 xmalloc (sizeof (struct exclude_list_struct)));
401 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
402 strcpy (new_exclude->string, exclude_string);
403 new_exclude->type = type;
404 new_exclude->next = excludes;
405 excludes = new_exclude;
412 /* abfd is a bfd containing n (or NULL)
413 It can be used for contextual checks. */
416 auto_export (abfd, d, n)
422 struct exclude_list_struct *ex;
423 autofilter_entry_type *afptr;
424 const char * libname = 0;
425 if (abfd && abfd->my_archive)
426 libname = lbasename (abfd->my_archive->filename);
428 /* We should not re-export imported stuff. */
429 if (strncmp (n, "_imp__", 6) == 0)
432 for (i = 0; i < d->num_exports; i++)
433 if (strcmp (d->exports[i].name, n) == 0)
436 if (pe_dll_do_default_excludes)
441 if (pe_dll_extra_pe_debug)
442 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
443 n, abfd, abfd->my_archive);
445 /* First of all, make context checks:
446 Don't export anything from standard libs. */
449 afptr = autofilter_liblist;
453 if (strncmp (libname, afptr->name, afptr->len) == 0 )
459 /* Next, exclude symbols from certain startup objects. */
461 if (abfd && (p = lbasename (abfd->filename)))
463 afptr = autofilter_objlist;
466 if (strcmp (p, afptr->name) == 0)
472 /* Don't try to blindly exclude all symbols
473 that begin with '__'; this was tried and
474 it is too restrictive. */
476 /* Then, exclude specific symbols. */
477 afptr = autofilter_symbollist;
480 if (strcmp (n, afptr->name) == 0)
486 /* Next, exclude symbols starting with ... */
487 afptr = autofilter_symbolprefixlist;
490 if (strncmp (n, afptr->name, afptr->len) == 0)
496 /* Finally, exclude symbols ending with ... */
498 afptr = autofilter_symbolsuffixlist;
501 if ((len >= afptr->len)
502 /* Add 1 to insure match with trailing '\0'. */
503 && strncmp (n + len - afptr->len, afptr->name,
504 afptr->len + 1) == 0)
511 for (ex = excludes; ex; ex = ex->next)
513 if (ex->type == 1) /* exclude-libs */
516 && ((strcmp (libname, ex->string) == 0)
517 || (strcasecmp ("ALL", ex->string) == 0)))
520 else if (strcmp (n, ex->string) == 0)
528 process_def_file (abfd, info)
529 bfd *abfd ATTRIBUTE_UNUSED;
530 struct bfd_link_info *info;
533 struct bfd_link_hash_entry *blhe;
536 def_file_export *e = 0;
539 pe_def_file = def_file_empty ();
541 /* First, run around to all the objects looking for the .drectve
542 sections, and push those into the def file too. */
543 for (b = info->input_bfds; b; b = b->link_next)
545 s = bfd_get_section_by_name (b, ".drectve");
548 int size = bfd_get_section_size_before_reloc (s);
549 char *buf = xmalloc (size);
551 bfd_get_section_contents (b, s, buf, 0, size);
552 def_file_add_directive (pe_def_file, buf, size);
557 /* Now, maybe export everything else the default way. */
558 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
560 for (b = info->input_bfds; b; b = b->link_next)
565 symsize = bfd_get_symtab_upper_bound (b);
566 symbols = (asymbol **) xmalloc (symsize);
567 nsyms = bfd_canonicalize_symtab (b, symbols);
569 for (j = 0; j < nsyms; j++)
571 /* We should export symbols which are either global or not
572 anything at all. (.bss data is the latter)
573 We should not export undefined symbols. */
574 if (symbols[j]->section != &bfd_und_section
575 && ((symbols[j]->flags & BSF_GLOBAL)
576 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
578 const char *sn = symbols[j]->name;
580 /* We should not re-export imported stuff. */
582 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
583 sprintf (name, "%s%s", U("_imp_"), sn);
585 blhe = bfd_link_hash_lookup (info->hash, name,
586 false, false, false);
589 if (blhe && blhe->type == bfd_link_hash_defined)
596 if (auto_export (b, pe_def_file, sn))
599 p=def_file_add_export (pe_def_file, sn, 0, -1);
600 /* Fill data flag properly, from dlltool.c. */
601 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
609 #define NE pe_def_file->num_exports
611 /* Canonicalize the export list. */
614 for (i = 0; i < NE; i++)
616 if (strchr (pe_def_file->exports[i].name, '@'))
618 /* This will preserve internal_name, which may have been
619 pointing to the same memory as name, or might not
621 int lead_at = (*pe_def_file->exports[i].name =='@');
622 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
624 *(strchr (tmp, '@')) = 0;
625 pe_def_file->exports[i].name = tmp;
630 if (pe_dll_stdcall_aliases)
632 for (i = 0; i < NE; i++)
634 if (strchr (pe_def_file->exports[i].name, '@'))
636 int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
637 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
639 *(strchr (tmp, '@')) = 0;
640 if (auto_export (NULL, pe_def_file, tmp))
641 def_file_add_export (pe_def_file, tmp,
642 pe_def_file->exports[i].internal_name,
650 /* Convenience, but watch out for it changing. */
651 e = pe_def_file->exports;
653 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
654 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
656 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
660 count_exported_byname = 0;
661 count_with_ordinals = 0;
663 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
664 for (i = 0, j = 0; i < NE; i++)
666 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
668 /* This is a duplicate. */
669 if (e[j - 1].ordinal != -1
670 && e[i].ordinal != -1
671 && e[j - 1].ordinal != e[i].ordinal)
673 if (pe_dll_warn_dup_exports)
674 /* xgettext:c-format */
675 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
676 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
680 if (pe_dll_warn_dup_exports)
681 /* xgettext:c-format */
682 einfo (_("Warning, duplicate EXPORT: %s\n"),
686 if (e[i].ordinal != -1)
687 e[j - 1].ordinal = e[i].ordinal;
688 e[j - 1].flag_private |= e[i].flag_private;
689 e[j - 1].flag_constant |= e[i].flag_constant;
690 e[j - 1].flag_noname |= e[i].flag_noname;
691 e[j - 1].flag_data |= e[i].flag_data;
700 pe_def_file->num_exports = j; /* == NE */
702 for (i = 0; i < NE; i++)
704 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
706 if (pe_details->underscored
707 && (*pe_def_file->exports[i].internal_name != '@'))
710 strcpy (name + 1, pe_def_file->exports[i].internal_name);
713 strcpy (name, pe_def_file->exports[i].internal_name);
715 blhe = bfd_link_hash_lookup (info->hash,
720 && (blhe->type == bfd_link_hash_defined
721 || (blhe->type == bfd_link_hash_common)))
724 if (!pe_def_file->exports[i].flag_noname)
725 count_exported_byname++;
727 /* Only fill in the sections. The actual offsets are computed
728 in fill_exported_offsets() after common symbols are laid
730 if (blhe->type == bfd_link_hash_defined)
731 exported_symbol_sections[i] = blhe->u.def.section;
733 exported_symbol_sections[i] = blhe->u.c.p->section;
735 if (pe_def_file->exports[i].ordinal != -1)
737 if (max_ordinal < pe_def_file->exports[i].ordinal)
738 max_ordinal = pe_def_file->exports[i].ordinal;
739 if (min_ordinal > pe_def_file->exports[i].ordinal)
740 min_ordinal = pe_def_file->exports[i].ordinal;
741 count_with_ordinals++;
744 else if (blhe && blhe->type == bfd_link_hash_undefined)
746 /* xgettext:c-format */
747 einfo (_("%XCannot export %s: symbol not defined\n"),
748 pe_def_file->exports[i].internal_name);
752 /* xgettext:c-format */
753 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
754 pe_def_file->exports[i].internal_name,
755 blhe->type, bfd_link_hash_defined);
759 /* xgettext:c-format */
760 einfo (_("%XCannot export %s: symbol not found\n"),
761 pe_def_file->exports[i].internal_name);
767 /* Build the bfd that will contain .edata and .reloc sections. */
770 build_filler_bfd (include_edata)
773 lang_input_statement_type *filler_file;
774 filler_file = lang_add_input_file ("dll stuff",
775 lang_input_file_is_fake_enum,
777 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
778 if (filler_bfd == NULL
779 || !bfd_set_arch_mach (filler_bfd,
780 bfd_get_arch (output_bfd),
781 bfd_get_mach (output_bfd)))
783 einfo ("%X%P: can not create BFD %E\n");
789 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
791 || !bfd_set_section_flags (filler_bfd, edata_s,
798 einfo ("%X%P: can not create .edata section: %E\n");
801 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
804 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
806 || !bfd_set_section_flags (filler_bfd, reloc_s,
813 einfo ("%X%P: can not create .reloc section: %E\n");
817 bfd_set_section_size (filler_bfd, reloc_s, 0);
819 ldlang_add_file (filler_file);
822 /* Gather all the exported symbols and build the .edata section. */
825 generate_edata (abfd, info)
827 struct bfd_link_info *info ATTRIBUTE_UNUSED;
830 int name_table_size = 0;
833 /* First, we need to know how many exported symbols there are,
834 and what the range of ordinals is. */
835 if (pe_def_file->name)
836 dll_name = pe_def_file->name;
839 dll_name = abfd->filename;
841 for (dlnp = dll_name; *dlnp; dlnp++)
842 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
846 if (count_with_ordinals && max_ordinal > count_exported)
848 if (min_ordinal > max_ordinal - count_exported + 1)
849 min_ordinal = max_ordinal - count_exported + 1;
854 max_ordinal = count_exported;
857 export_table_size = max_ordinal - min_ordinal + 1;
858 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
859 for (i = 0; i < export_table_size; i++)
860 exported_symbols[i] = -1;
862 /* Now we need to assign ordinals to those that don't have them. */
863 for (i = 0; i < NE; i++)
865 if (exported_symbol_sections[i])
867 if (pe_def_file->exports[i].ordinal != -1)
869 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
870 int pi = exported_symbols[ei];
874 /* xgettext:c-format */
875 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
876 pe_def_file->exports[i].ordinal,
877 pe_def_file->exports[i].name,
878 pe_def_file->exports[pi].name);
880 exported_symbols[ei] = i;
882 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
886 next_ordinal = min_ordinal;
887 for (i = 0; i < NE; i++)
888 if (exported_symbol_sections[i])
889 if (pe_def_file->exports[i].ordinal == -1)
891 while (exported_symbols[next_ordinal - min_ordinal] != -1)
894 exported_symbols[next_ordinal - min_ordinal] = i;
895 pe_def_file->exports[i].ordinal = next_ordinal;
898 /* OK, now we can allocate some memory. */
899 edata_sz = (40 /* directory */
900 + 4 * export_table_size /* addresses */
901 + 4 * count_exported_byname /* name ptrs */
902 + 2 * count_exported_byname /* ordinals */
903 + name_table_size + strlen (dll_name) + 1);
906 /* Fill the exported symbol offsets. The preliminary work has already
907 been done in process_def_file(). */
910 fill_exported_offsets (abfd, info)
911 bfd *abfd ATTRIBUTE_UNUSED;
912 struct bfd_link_info *info;
915 struct bfd_link_hash_entry *blhe;
917 for (i = 0; i < pe_def_file->num_exports; i++)
919 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
921 if (pe_details->underscored
922 && (*pe_def_file->exports[i].internal_name != '@'))
925 strcpy (name + 1, pe_def_file->exports[i].internal_name);
928 strcpy (name, pe_def_file->exports[i].internal_name);
930 blhe = bfd_link_hash_lookup (info->hash,
934 if (blhe && (blhe->type == bfd_link_hash_defined))
935 exported_symbol_offsets[i] = blhe->u.def.value;
942 fill_edata (abfd, info)
944 struct bfd_link_info *info ATTRIBUTE_UNUSED;
947 unsigned char *edirectory;
948 unsigned long *eaddresses;
949 unsigned long *enameptrs;
950 unsigned short *eordinals;
951 unsigned char *enamestr;
956 edata_d = (unsigned char *) xmalloc (edata_sz);
958 /* Note use of array pointer math here. */
959 edirectory = edata_d;
960 eaddresses = (unsigned long *) (edata_d + 40);
961 enameptrs = eaddresses + export_table_size;
962 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
963 enamestr = (char *) (eordinals + count_exported_byname);
965 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
967 memset (edata_d, 0, edata_sz);
968 bfd_put_32 (abfd, now, edata_d + 4);
969 if (pe_def_file->version_major != -1)
971 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
972 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
975 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
976 strcpy (enamestr, dll_name);
977 enamestr += strlen (enamestr) + 1;
978 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
979 bfd_put_32 (abfd, export_table_size, edata_d + 20);
980 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
981 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
982 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
983 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
985 fill_exported_offsets (abfd, info);
987 /* Ok, now for the filling in part. */
989 for (i = 0; i < export_table_size; i++)
991 int s = exported_symbols[i];
995 struct sec *ssec = exported_symbol_sections[s];
996 unsigned long srva = (exported_symbol_offsets[s]
997 + ssec->output_section->vma
998 + ssec->output_offset);
999 int ord = pe_def_file->exports[s].ordinal;
1001 bfd_put_32 (abfd, srva - image_base,
1002 (void *) (eaddresses + ord - min_ordinal));
1004 if (!pe_def_file->exports[s].flag_noname)
1006 char *ename = pe_def_file->exports[s].name;
1007 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
1009 strcpy (enamestr, ename);
1010 enamestr += strlen (enamestr) + 1;
1011 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
1013 pe_def_file->exports[s].hint = hint++;
1020 static struct sec *current_sec;
1023 pe_walk_relocs_of_symbol (info, name, cb)
1024 struct bfd_link_info *info;
1026 int (*cb) (arelent *, asection *);
1031 for (b = info->input_bfds; b; b = b->link_next)
1036 symsize = bfd_get_symtab_upper_bound (b);
1037 symbols = (asymbol **) xmalloc (symsize);
1038 nsyms = bfd_canonicalize_symtab (b, symbols);
1040 for (s = b->sections; s; s = s->next)
1043 int relsize, nrelocs, i;
1044 int flags = bfd_get_section_flags (b, s);
1046 /* Skip discarded linkonce sections. */
1047 if (flags & SEC_LINK_ONCE
1048 && s->output_section == bfd_abs_section_ptr)
1053 relsize = bfd_get_reloc_upper_bound (b, s);
1054 relocs = (arelent **) xmalloc ((size_t) relsize);
1055 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1057 for (i = 0; i < nrelocs; i++)
1059 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1061 if (!strcmp (name, sym->name))
1067 /* Warning: the allocated symbols are remembered in BFD and reused
1068 later, so don't free them! */
1069 /* free (symbols); */
1074 /* Gather all the relocations and build the .reloc section. */
1077 generate_reloc (abfd, info)
1079 struct bfd_link_info *info;
1082 /* For .reloc stuff. */
1083 reloc_data_type *reloc_data;
1084 int total_relocs = 0;
1086 unsigned long sec_page = (unsigned long) (-1);
1087 unsigned long page_ptr, page_count;
1093 for (b = info->input_bfds; b; b = b->link_next)
1094 for (s = b->sections; s; s = s->next)
1095 total_relocs += s->reloc_count;
1098 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1102 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1105 int relsize, nrelocs, i;
1107 for (s = b->sections; s; s = s->next)
1109 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1113 /* If it's not loaded, we don't need to relocate it this way. */
1114 if (!(s->output_section->flags & SEC_LOAD))
1117 /* I don't know why there would be a reloc for these, but I've
1118 seen it happen - DJ */
1119 if (s->output_section == &bfd_abs_section)
1122 if (s->output_section->vma == 0)
1124 /* Huh? Shouldn't happen, but punt if it does. */
1125 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1126 s->output_section->name, s->output_section->index,
1127 s->output_section->flags);
1131 symsize = bfd_get_symtab_upper_bound (b);
1132 symbols = (asymbol **) xmalloc (symsize);
1133 nsyms = bfd_canonicalize_symtab (b, symbols);
1135 relsize = bfd_get_reloc_upper_bound (b, s);
1136 relocs = (arelent **) xmalloc ((size_t) relsize);
1137 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1139 for (i = 0; i < nrelocs; i++)
1141 if (pe_dll_extra_pe_debug)
1143 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1144 printf ("rel: %s\n", sym->name);
1146 if (!relocs[i]->howto->pc_relative
1147 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1150 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1152 sym_vma = (relocs[i]->addend
1155 + sym->section->output_offset
1156 + sym->section->output_section->vma);
1157 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1159 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1161 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1162 relocs[i]->howto->rightshift)
1164 case BITS_AND_SHIFT (32, 0):
1165 reloc_data[total_relocs].type = 3;
1168 case BITS_AND_SHIFT (16, 0):
1169 reloc_data[total_relocs].type = 2;
1172 case BITS_AND_SHIFT (16, 16):
1173 reloc_data[total_relocs].type = 4;
1174 /* FIXME: we can't know the symbol's right value
1175 yet, but we probably can safely assume that
1176 CE will relocate us in 64k blocks, so leaving
1178 reloc_data[total_relocs].extra = 0;
1181 case BITS_AND_SHIFT (26, 2):
1182 reloc_data[total_relocs].type = 5;
1186 /* xgettext:c-format */
1187 einfo (_("%XError: %d-bit reloc in dll\n"),
1188 relocs[i]->howto->bitsize);
1194 /* Warning: the allocated symbols are remembered in BFD and
1195 reused later, so don't free them! */
1202 /* At this point, we have total_relocs relocation addresses in
1203 reloc_addresses, which are all suitable for the .reloc section.
1204 We must now create the new sections. */
1205 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1207 for (i = 0; i < total_relocs; i++)
1209 unsigned long this_page = (reloc_data[i].vma >> 12);
1211 if (this_page != sec_page)
1213 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1215 sec_page = this_page;
1220 if (reloc_data[i].type == 4)
1224 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1225 reloc_d = (unsigned char *) xmalloc (reloc_sz);
1226 sec_page = (unsigned long) (-1);
1228 page_ptr = (unsigned long) (-1);
1231 for (i = 0; i < total_relocs; i++)
1233 unsigned long rva = reloc_data[i].vma - image_base;
1234 unsigned long this_page = (rva & ~0xfff);
1236 if (this_page != sec_page)
1238 while (reloc_sz & 3)
1239 reloc_d[reloc_sz++] = 0;
1241 if (page_ptr != (unsigned long) (-1))
1242 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1244 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1245 page_ptr = reloc_sz;
1247 sec_page = this_page;
1251 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1252 reloc_d + reloc_sz);
1255 if (reloc_data[i].type == 4)
1257 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1264 while (reloc_sz & 3)
1265 reloc_d[reloc_sz++] = 0;
1267 if (page_ptr != (unsigned long) (-1))
1268 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1270 while (reloc_sz < reloc_s->_raw_size)
1271 reloc_d[reloc_sz++] = 0;
1274 /* Given the exiting def_file structure, print out a .DEF file that
1275 corresponds to it. */
1278 quoteput (s, f, needs_quotes)
1285 for (cp = s; *cp; cp++)
1300 if (*s == '"' || *s == '\\')
1314 pe_dll_generate_def_file (pe_out_def_filename)
1315 const char *pe_out_def_filename;
1318 FILE *out = fopen (pe_out_def_filename, "w");
1321 /* xgettext:c-format */
1322 einfo (_("%s: Can't open output def file %s\n"),
1323 program_name, pe_out_def_filename);
1327 if (pe_def_file->name)
1329 if (pe_def_file->is_dll)
1330 fprintf (out, "LIBRARY ");
1332 fprintf (out, "NAME ");
1334 quoteput (pe_def_file->name, out, 1);
1336 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1337 fprintf (out, " BASE=0x%lx",
1338 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1339 fprintf (out, "\n");
1342 if (pe_def_file->description)
1344 fprintf (out, "DESCRIPTION ");
1345 quoteput (pe_def_file->description, out, 1);
1346 fprintf (out, "\n");
1349 if (pe_def_file->version_minor != -1)
1350 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1351 pe_def_file->version_minor);
1352 else if (pe_def_file->version_major != -1)
1353 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1355 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1356 fprintf (out, "\n");
1358 if (pe_def_file->stack_commit != -1)
1359 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1360 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1361 else if (pe_def_file->stack_reserve != -1)
1362 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1364 if (pe_def_file->heap_commit != -1)
1365 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1366 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1367 else if (pe_def_file->heap_reserve != -1)
1368 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1370 if (pe_def_file->num_section_defs > 0)
1372 fprintf (out, "\nSECTIONS\n\n");
1374 for (i = 0; i < pe_def_file->num_section_defs; i++)
1377 quoteput (pe_def_file->section_defs[i].name, out, 0);
1379 if (pe_def_file->section_defs[i].class)
1381 fprintf (out, " CLASS ");
1382 quoteput (pe_def_file->section_defs[i].class, out, 0);
1385 if (pe_def_file->section_defs[i].flag_read)
1386 fprintf (out, " READ");
1388 if (pe_def_file->section_defs[i].flag_write)
1389 fprintf (out, " WRITE");
1391 if (pe_def_file->section_defs[i].flag_execute)
1392 fprintf (out, " EXECUTE");
1394 if (pe_def_file->section_defs[i].flag_shared)
1395 fprintf (out, " SHARED");
1397 fprintf (out, "\n");
1401 if (pe_def_file->num_exports > 0)
1403 fprintf (out, "EXPORTS\n");
1405 for (i = 0; i < pe_def_file->num_exports; i++)
1407 def_file_export *e = pe_def_file->exports + i;
1409 quoteput (e->name, out, 0);
1411 if (e->internal_name && strcmp (e->internal_name, e->name))
1413 fprintf (out, " = ");
1414 quoteput (e->internal_name, out, 0);
1417 if (e->ordinal != -1)
1418 fprintf (out, " @%d", e->ordinal);
1420 if (e->flag_private)
1421 fprintf (out, " PRIVATE");
1423 if (e->flag_constant)
1424 fprintf (out, " CONSTANT");
1427 fprintf (out, " NONAME");
1430 fprintf (out, " DATA");
1432 fprintf (out, "\n");
1436 if (pe_def_file->num_imports > 0)
1438 fprintf (out, "\nIMPORTS\n\n");
1440 for (i = 0; i < pe_def_file->num_imports; i++)
1442 def_file_import *im = pe_def_file->imports + i;
1445 if (im->internal_name
1446 && (!im->name || strcmp (im->internal_name, im->name)))
1448 quoteput (im->internal_name, out, 0);
1449 fprintf (out, " = ");
1452 quoteput (im->module->name, out, 0);
1456 quoteput (im->name, out, 0);
1458 fprintf (out, "%d", im->ordinal);
1460 fprintf (out, "\n");
1465 fprintf (out, _("; no contents available\n"));
1467 if (fclose (out) == EOF)
1468 /* xgettext:c-format */
1469 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1472 /* Generate the import library. */
1474 static asymbol **symtab;
1477 static const char *dll_filename;
1478 static char *dll_symname;
1480 #define UNDSEC (asection *) &bfd_und_section
1483 quick_section (abfd, name, flags, align)
1492 sec = bfd_make_section_old_way (abfd, name);
1493 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1494 bfd_set_section_alignment (abfd, sec, align);
1495 /* Remember to undo this before trying to link internally! */
1496 sec->output_section = sec;
1498 sym = bfd_make_empty_symbol (abfd);
1499 symtab[symptr++] = sym;
1500 sym->name = sec->name;
1502 sym->flags = BSF_LOCAL;
1509 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1519 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1524 sym = bfd_make_empty_symbol (abfd);
1529 symtab[symptr++] = sym;
1532 static arelent *reltab = 0;
1533 static int relcount = 0, relsize = 0;
1536 quick_reloc (abfd, address, which_howto, symidx)
1542 if (relcount >= (relsize - 1))
1546 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1548 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1550 reltab[relcount].address = address;
1551 reltab[relcount].addend = 0;
1552 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1553 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1558 save_relocs (asection *sec)
1562 sec->relocation = reltab;
1563 sec->reloc_count = relcount;
1564 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1565 for (i = 0; i < relcount; i++)
1566 sec->orelocation[i] = sec->relocation + i;
1567 sec->orelocation[relcount] = 0;
1568 sec->flags |= SEC_RELOC;
1570 relcount = relsize = 0;
1573 /* .section .idata$2
1574 .global __head_my_dll
1594 asection *id2, *id5, *id4;
1595 unsigned char *d2, *d5, *d4;
1599 oname = (char *) xmalloc (20);
1600 sprintf (oname, "d%06d.o", tmp_seq);
1603 abfd = bfd_create (oname, parent);
1604 bfd_find_target (pe_details->object_target, abfd);
1605 bfd_make_writable (abfd);
1607 bfd_set_format (abfd, bfd_object);
1608 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1611 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1612 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1613 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1614 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1615 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1616 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1618 /* OK, pay attention here. I got confused myself looking back at
1619 it. We create a four-byte section to mark the beginning of the
1620 list, and we include an offset of 4 in the section, so that the
1621 pointer to the list points to the *end* of this section, which is
1622 the start of the list of sections from other objects. */
1624 bfd_set_section_size (abfd, id2, 20);
1625 d2 = (unsigned char *) xmalloc (20);
1628 d2[0] = d2[16] = 4; /* Reloc addend. */
1629 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1630 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1631 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1634 bfd_set_section_size (abfd, id5, 4);
1635 d5 = (unsigned char *) xmalloc (4);
1639 bfd_set_section_size (abfd, id4, 4);
1640 d4 = (unsigned char *) xmalloc (4);
1644 bfd_set_symtab (abfd, symtab, symptr);
1646 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1647 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1648 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1650 bfd_make_readable (abfd);
1654 /* .section .idata$4
1659 .global __my_dll_iname
1667 asection *id4, *id5, *id7;
1668 unsigned char *d4, *d5, *d7;
1673 oname = (char *) xmalloc (20);
1674 sprintf (oname, "d%06d.o", tmp_seq);
1677 abfd = bfd_create (oname, parent);
1678 bfd_find_target (pe_details->object_target, abfd);
1679 bfd_make_writable (abfd);
1681 bfd_set_format (abfd, bfd_object);
1682 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1685 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1686 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1687 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1688 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1689 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1691 bfd_set_section_size (abfd, id4, 4);
1692 d4 = (unsigned char *) xmalloc (4);
1696 bfd_set_section_size (abfd, id5, 4);
1697 d5 = (unsigned char *) xmalloc (4);
1701 len = strlen (dll_filename) + 1;
1704 bfd_set_section_size (abfd, id7, len);
1705 d7 = (unsigned char *) xmalloc (len);
1707 strcpy (d7, dll_filename);
1709 bfd_set_symtab (abfd, symtab, symptr);
1711 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1712 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1713 bfd_set_section_contents (abfd, id7, d7, 0, len);
1715 bfd_make_readable (abfd);
1721 .global ___imp_function
1722 .global __imp__function
1724 jmp *__imp__function:
1738 .asciz "function" xlate? (add underscore, kill at) */
1740 static unsigned char jmp_ix86_bytes[] =
1742 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1750 .dw __imp_function */
1752 static unsigned char jmp_sh_bytes[] =
1754 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1758 lui $t0,<high:__imp_function>
1759 lw $t0,<low:__imp_function>
1763 static unsigned char jmp_mips_bytes[] =
1765 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1766 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1770 make_one (exp, parent)
1771 def_file_export *exp;
1774 asection *tx, *id7, *id5, *id4, *id6;
1775 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1779 unsigned char *jmp_bytes = NULL;
1780 int jmp_byte_count = 0;
1782 switch (pe_details->pe_arch)
1785 jmp_bytes = jmp_ix86_bytes;
1786 jmp_byte_count = sizeof (jmp_ix86_bytes);
1789 jmp_bytes = jmp_sh_bytes;
1790 jmp_byte_count = sizeof (jmp_sh_bytes);
1793 jmp_bytes = jmp_mips_bytes;
1794 jmp_byte_count = sizeof (jmp_mips_bytes);
1800 oname = (char *) xmalloc (20);
1801 sprintf (oname, "d%06d.o", tmp_seq);
1804 abfd = bfd_create (oname, parent);
1805 bfd_find_target (pe_details->object_target, abfd);
1806 bfd_make_writable (abfd);
1808 bfd_set_format (abfd, bfd_object);
1809 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1812 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1813 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1814 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1815 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1816 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1817 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1819 if (*exp->internal_name == '@')
1821 if (! exp->flag_data)
1822 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1823 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1824 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1825 /* Fastcall applies only to functions,
1826 so no need for auto-import symbol. */
1830 if (! exp->flag_data)
1831 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1832 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1833 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1834 /* Symbol to reference ord/name of imported
1835 data symbol, used to implement auto-import. */
1837 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
1839 if (pe_dll_compat_implib)
1840 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1841 id5, BSF_GLOBAL, 0);
1843 if (! exp->flag_data)
1845 bfd_set_section_size (abfd, tx, jmp_byte_count);
1846 td = (unsigned char *) xmalloc (jmp_byte_count);
1848 memcpy (td, jmp_bytes, jmp_byte_count);
1850 switch (pe_details->pe_arch)
1853 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1856 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1859 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1860 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1861 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1869 bfd_set_section_size (abfd, id7, 4);
1870 d7 = (unsigned char *) xmalloc (4);
1873 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1876 bfd_set_section_size (abfd, id5, 4);
1877 d5 = (unsigned char *) xmalloc (4);
1881 if (exp->flag_noname)
1883 d5[0] = exp->ordinal;
1884 d5[1] = exp->ordinal >> 8;
1889 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1893 bfd_set_section_size (abfd, id4, 4);
1894 d4 = (unsigned char *) xmalloc (4);
1898 if (exp->flag_noname)
1900 d4[0] = exp->ordinal;
1901 d4[1] = exp->ordinal >> 8;
1906 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1910 if (exp->flag_noname)
1913 bfd_set_section_size (abfd, id6, 0);
1917 len = strlen (exp->name) + 3;
1920 bfd_set_section_size (abfd, id6, len);
1921 d6 = (unsigned char *) xmalloc (len);
1923 memset (d6, 0, len);
1924 d6[0] = exp->hint & 0xff;
1925 d6[1] = exp->hint >> 8;
1926 strcpy (d6 + 2, exp->name);
1929 bfd_set_symtab (abfd, symtab, symptr);
1931 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1932 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1933 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1934 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1935 if (!exp->flag_noname)
1936 bfd_set_section_contents (abfd, id6, d6, 0, len);
1938 bfd_make_readable (abfd);
1943 make_singleton_name_thunk (import, parent)
1947 /* Name thunks go to idata$4. */
1953 oname = (char *) xmalloc (20);
1954 sprintf (oname, "nmth%06d.o", tmp_seq);
1957 abfd = bfd_create (oname, parent);
1958 bfd_find_target (pe_details->object_target, abfd);
1959 bfd_make_writable (abfd);
1961 bfd_set_format (abfd, bfd_object);
1962 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1965 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1966 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1967 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1968 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1970 bfd_set_section_size (abfd, id4, 8);
1971 d4 = (unsigned char *) xmalloc (4);
1974 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1977 bfd_set_symtab (abfd, symtab, symptr);
1979 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1981 bfd_make_readable (abfd);
1986 make_import_fixup_mark (rel)
1989 /* We convert reloc to symbol, for later reference. */
1991 static char *fixup_name = NULL;
1992 static size_t buffer_len = 0;
1994 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
1996 bfd *abfd = bfd_asymbol_bfd (sym);
1997 struct bfd_link_hash_entry *bh;
2001 fixup_name = (char *) xmalloc (384);
2005 if (strlen (sym->name) + 25 > buffer_len)
2006 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2007 bigger than 20 digits long, we've got worse problems than
2008 overflowing this buffer... */
2011 /* New buffer size is length of symbol, plus 25, but then
2012 rounded up to the nearest multiple of 128. */
2013 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2014 fixup_name = (char *) xmalloc (buffer_len);
2017 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2020 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2021 current_sec, /* sym->section, */
2022 rel->address, NULL, true, false, &bh);
2026 struct coff_link_hash_entry *myh;
2028 myh = (struct coff_link_hash_entry *) bh;
2029 printf ("type:%d\n", myh->type);
2030 printf ("%s\n", myh->root.u.def.section->name);
2036 /* .section .idata$3
2037 .rva __nm_thnk_SYM (singleton thunk with name of func)
2040 .rva __my_dll_iname (name of dll)
2041 .rva __fuNN_SYM (pointer to reference (address) in text) */
2044 make_import_fixup_entry (name, fixup_name, dll_symname, parent)
2046 const char *fixup_name;
2047 const char *dll_symname;
2055 oname = (char *) xmalloc (20);
2056 sprintf (oname, "fu%06d.o", tmp_seq);
2059 abfd = bfd_create (oname, parent);
2060 bfd_find_target (pe_details->object_target, abfd);
2061 bfd_make_writable (abfd);
2063 bfd_set_format (abfd, bfd_object);
2064 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2067 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2068 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2071 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2073 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2074 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2075 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2077 bfd_set_section_size (abfd, id3, 20);
2078 d3 = (unsigned char *) xmalloc (20);
2082 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2083 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2084 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2087 bfd_set_symtab (abfd, symtab, symptr);
2089 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2091 bfd_make_readable (abfd);
2096 pe_create_import_fixup (rel)
2100 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2101 struct bfd_link_hash_entry *name_thunk_sym;
2102 const char *name = sym->name;
2103 char *fixup_name = make_import_fixup_mark (rel);
2105 sprintf (buf, U ("_nm_thnk_%s"), name);
2107 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2109 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2111 bfd *b = make_singleton_name_thunk (name, output_bfd);
2112 add_bfd_to_link (b, b->filename, &link_info);
2114 /* If we ever use autoimport, we have to cast text section writable. */
2115 config.text_read_only = false;
2119 extern char * pe_data_import_dll;
2120 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2122 bfd *b = make_import_fixup_entry (name, fixup_name, dll_symname,
2124 add_bfd_to_link (b, b->filename, &link_info);
2130 pe_dll_generate_implib (def, impfilename)
2132 const char *impfilename;
2140 dll_filename = (def->name) ? def->name : dll_name;
2141 dll_symname = xstrdup (dll_filename);
2142 for (i = 0; dll_symname[i]; i++)
2143 if (!ISALNUM (dll_symname[i]))
2144 dll_symname[i] = '_';
2146 unlink (impfilename);
2148 outarch = bfd_openw (impfilename, 0);
2152 /* xgettext:c-format */
2153 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2157 /* xgettext:c-format */
2158 einfo (_("Creating library file: %s\n"), impfilename);
2160 bfd_set_format (outarch, bfd_archive);
2161 outarch->has_armap = 1;
2163 /* Work out a reasonable size of things to put onto one line. */
2164 ar_head = make_head (outarch);
2166 for (i = 0; i < def->num_exports; i++)
2168 /* The import library doesn't know about the internal name. */
2169 char *internal = def->exports[i].internal_name;
2172 def->exports[i].internal_name = def->exports[i].name;
2173 n = make_one (def->exports + i, outarch);
2176 def->exports[i].internal_name = internal;
2179 ar_tail = make_tail (outarch);
2181 if (ar_head == NULL || ar_tail == NULL)
2184 /* Now stick them all into the archive. */
2185 ar_head->next = head;
2186 ar_tail->next = ar_head;
2189 if (! bfd_set_archive_head (outarch, head))
2190 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2192 if (! bfd_close (outarch))
2193 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2195 while (head != NULL)
2197 bfd *n = head->next;
2204 add_bfd_to_link (abfd, name, link_info)
2207 struct bfd_link_info *link_info;
2209 lang_input_statement_type *fake_file;
2211 fake_file = lang_add_input_file (name,
2212 lang_input_file_is_fake_enum,
2214 fake_file->the_bfd = abfd;
2215 ldlang_add_file (fake_file);
2217 if (!bfd_link_add_symbols (abfd, link_info))
2218 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2222 pe_process_import_defs (output_bfd, link_info)
2224 struct bfd_link_info *link_info;
2226 def_file_module *module;
2228 pe_dll_id_target (bfd_get_target (output_bfd));
2233 for (module = pe_def_file->modules; module; module = module->next)
2237 dll_filename = module->name;
2238 dll_symname = xstrdup (module->name);
2239 for (i = 0; dll_symname[i]; i++)
2240 if (!ISALNUM (dll_symname[i]))
2241 dll_symname[i] = '_';
2245 for (i = 0; i < pe_def_file->num_imports; i++)
2246 if (pe_def_file->imports[i].module == module)
2248 def_file_export exp;
2249 struct bfd_link_hash_entry *blhe;
2250 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2251 /* See if we need this import. */
2252 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2255 sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
2257 sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
2259 blhe = bfd_link_hash_lookup (link_info->hash, name,
2260 false, false, false);
2262 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2265 sprintf (name, "%s%s", U ("_imp_"),
2266 pe_def_file->imports[i].internal_name);
2268 sprintf (name, "%s%s", U ("_imp__"),
2269 pe_def_file->imports[i].internal_name);
2271 blhe = bfd_link_hash_lookup (link_info->hash, name,
2272 false, false, false);
2276 if (blhe && blhe->type == bfd_link_hash_undefined)
2282 bfd *ar_head = make_head (output_bfd);
2283 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2286 exp.internal_name = pe_def_file->imports[i].internal_name;
2287 exp.name = pe_def_file->imports[i].name;
2288 exp.ordinal = pe_def_file->imports[i].ordinal;
2289 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2290 exp.flag_private = 0;
2291 exp.flag_constant = 0;
2293 exp.flag_noname = exp.name ? 0 : 1;
2294 one = make_one (&exp, output_bfd);
2295 add_bfd_to_link (one, one->filename, link_info);
2300 bfd *ar_tail = make_tail (output_bfd);
2301 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2308 /* We were handed a *.DLL file. Parse it and turn it into a set of
2309 IMPORTS directives in the def file. Return true if the file was
2310 handled, false if not. */
2313 pe_get16 (abfd, where)
2319 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2320 bfd_bread (b, (bfd_size_type) 2, abfd);
2321 return b[0] + (b[1] << 8);
2325 pe_get32 (abfd, where)
2331 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2332 bfd_bread (b, (bfd_size_type) 4, abfd);
2333 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2336 #if 0 /* This is not currently used. */
2342 unsigned char *b = ptr;
2344 return b[0] + (b[1] << 8);
2353 unsigned char *b = ptr;
2355 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2359 pe_implied_import_dll (filename)
2360 const char *filename;
2363 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2364 unsigned long export_rva, export_size, nsections, secptr, expptr;
2365 unsigned char *expdata, *erva;
2366 unsigned long name_rvas, ordinals, nexp, ordbase;
2367 const char *dll_name;
2369 /* No, I can't use bfd here. kernel32.dll puts its export table in
2370 the middle of the .rdata section. */
2371 dll = bfd_openr (filename, pe_details->target_name);
2374 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2378 /* PEI dlls seem to be bfd_objects. */
2379 if (!bfd_check_format (dll, bfd_object))
2381 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2385 dll_name = filename;
2386 for (i = 0; filename[i]; i++)
2387 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
2388 dll_name = filename + i + 1;
2390 pe_header_offset = pe_get32 (dll, 0x3c);
2391 opthdr_ofs = pe_header_offset + 4 + 20;
2392 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2394 if (num_entries < 1) /* No exports. */
2397 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2398 export_size = pe_get32 (dll, opthdr_ofs + 100);
2399 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2400 secptr = (pe_header_offset + 4 + 20 +
2401 pe_get16 (dll, pe_header_offset + 4 + 16));
2404 for (i = 0; i < nsections; i++)
2407 unsigned long secptr1 = secptr + 40 * i;
2408 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2409 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2410 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2412 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2413 bfd_bread (sname, (bfd_size_type) 8, dll);
2415 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2417 expptr = fptr + (export_rva - vaddr);
2418 if (export_rva + export_size > vaddr + vsize)
2419 export_size = vsize - (export_rva - vaddr);
2424 expdata = (unsigned char *) xmalloc (export_size);
2425 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2426 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2427 erva = expdata - export_rva;
2429 if (pe_def_file == 0)
2430 pe_def_file = def_file_empty ();
2432 nexp = pe_as32 (expdata + 24);
2433 name_rvas = pe_as32 (expdata + 32);
2434 ordinals = pe_as32 (expdata + 36);
2435 ordbase = pe_as32 (expdata + 16);
2437 for (i = 0; i < nexp; i++)
2439 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2440 def_file_import *imp;
2442 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
2449 /* These are the main functions, called from the emulation. The first
2450 is called after the bfds are read, so we can guess at how much space
2451 we need. The second is called after everything is placed, so we
2452 can put the right values in place. */
2455 pe_dll_build_sections (abfd, info)
2457 struct bfd_link_info *info;
2459 pe_dll_id_target (bfd_get_target (abfd));
2460 process_def_file (abfd, info);
2462 generate_edata (abfd, info);
2463 build_filler_bfd (1);
2467 pe_exe_build_sections (abfd, info)
2469 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2471 pe_dll_id_target (bfd_get_target (abfd));
2472 build_filler_bfd (0);
2476 pe_dll_fill_sections (abfd, info)
2478 struct bfd_link_info *info;
2480 pe_dll_id_target (bfd_get_target (abfd));
2481 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2483 generate_reloc (abfd, info);
2486 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2488 /* Resize the sections. */
2489 lang_size_sections (stat_ptr->head, abs_output_section,
2490 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2492 /* Redo special stuff. */
2493 ldemul_after_allocation ();
2495 /* Do the assignments again. */
2496 lang_do_assignments (stat_ptr->head,
2498 (fill_type *) 0, (bfd_vma) 0);
2501 fill_edata (abfd, info);
2503 pe_data (abfd)->dll = 1;
2505 edata_s->contents = edata_d;
2506 reloc_s->contents = reloc_d;
2510 pe_exe_fill_sections (abfd, info)
2512 struct bfd_link_info *info;
2514 pe_dll_id_target (bfd_get_target (abfd));
2515 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2517 generate_reloc (abfd, info);
2520 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2522 /* Resize the sections. */
2523 lang_size_sections (stat_ptr->head, abs_output_section,
2524 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2526 /* Redo special stuff. */
2527 ldemul_after_allocation ();
2529 /* Do the assignments again. */
2530 lang_do_assignments (stat_ptr->head,
2532 (fill_type *) 0, (bfd_vma) 0);
2534 reloc_s->contents = reloc_d;