1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001 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 /* Defined in emultempl/pe.em. */
128 pe_get_data_import_dll_name PARAMS ((void));
130 /* For emultempl/pe.em. */
132 def_file * pe_def_file = 0;
133 int pe_dll_export_everything = 0;
134 int pe_dll_do_default_excludes = 1;
135 int pe_dll_kill_ats = 0;
136 int pe_dll_stdcall_aliases = 0;
137 int pe_dll_warn_dup_exports = 0;
138 int pe_dll_compat_implib = 0;
139 int pe_dll_extra_pe_debug = 0;
141 /* Static variables and types. */
143 static bfd_vma image_base;
144 static bfd *filler_bfd;
145 static struct sec *edata_s, *reloc_s;
146 static unsigned char *edata_d, *reloc_d;
147 static size_t edata_sz, reloc_sz;
153 unsigned int imagebase_reloc;
165 autofilter_entry_type;
167 #define PE_ARCH_i386 1
169 #define PE_ARCH_mips 3
170 #define PE_ARCH_arm 4
171 #define PE_ARCH_arm_epoc 5
173 static pe_details_type pe_detail_list[] =
186 16 /* R_SH_IMAGEBASE */,
208 "epoc-pei-arm-little",
209 "epoc-pe-arm-little",
215 { NULL, NULL, 0, 0, 0, 0 }
218 static pe_details_type *pe_details;
220 static autofilter_entry_type autofilter_symbollist[] =
222 { "DllMain@12", 10 },
223 { "DllEntryPoint@0", 15 },
224 { "DllMainCRTStartup@12", 20 },
225 { "_cygwin_dll_entry@12", 20 },
226 { "_cygwin_crt0_common@8", 21 },
227 { "_cygwin_noncygwin_dll_entry@12", 30 },
228 { "impure_ptr", 10 },
232 /* Do not specify library suffix explicitly, to allow for dllized versions. */
233 static autofilter_entry_type autofilter_liblist[] =
236 { "libstdc++.", 10 },
237 { "libmingw32.", 11 },
241 static autofilter_entry_type autofilter_objlist[] =
249 static autofilter_entry_type autofilter_symbolprefixlist[] =
251 /* { "__imp_", 6 }, */
252 /* Do __imp_ explicitly to save time. */
254 { "__builtin_", 10 },
255 /* Don't export symbols specifying internal DLL layout. */
258 { "_impure_ptr", 11 },
259 { "cygwin_attach_dll", 17 },
260 { "cygwin_premain0", 15 },
261 { "cygwin_premain1", 15 },
262 { "cygwin_premain2", 15 },
263 { "cygwin_premain3", 15 },
268 static autofilter_entry_type autofilter_symbolsuffixlist[] =
274 #define U(str) (pe_details->underscored ? "_" str : str)
276 static int reloc_sort PARAMS ((const void *, const void *));
277 static int pe_export_sort PARAMS ((const void *, const void *));
278 static int auto_export PARAMS ((bfd *, def_file *, const char *));
279 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
280 static void build_filler_bfd PARAMS ((int));
281 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
282 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
283 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
284 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
285 static void quoteput PARAMS ((char *, FILE *, int));
286 static asection *quick_section PARAMS ((bfd *, const char *, int, int));
287 static void quick_symbol
288 PARAMS ((bfd *, const char *, const char *, const char *,
289 asection *, int, int));
290 static void quick_reloc PARAMS ((bfd *, int, int, int));
291 static bfd *make_head PARAMS ((bfd *));
292 static bfd *make_tail PARAMS ((bfd *));
293 static bfd *make_one PARAMS ((def_file_export *, bfd *));
294 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
295 static char *make_import_fixup_mark PARAMS ((arelent *));
296 static bfd *make_import_fixup_entry
297 PARAMS ((const char *, const char *, const char *, bfd *));
298 static unsigned int pe_get16 PARAMS ((bfd *, int));
299 static unsigned int pe_get32 PARAMS ((bfd *, int));
300 static unsigned int pe_as32 PARAMS ((void *));
303 pe_dll_id_target (target)
308 for (i = 0; pe_detail_list[i].target_name; i++)
309 if (strcmp (pe_detail_list[i].target_name, target) == 0
310 || strcmp (pe_detail_list[i].object_target, target) == 0)
312 pe_details = pe_detail_list + i;
315 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
319 /* Helper functions for qsort. Relocs must be sorted so that we can write
320 them out by pages. */
334 bfd_vma a = ((reloc_data_type *) va)->vma;
335 bfd_vma b = ((reloc_data_type *) vb)->vma;
337 return (a > b) ? 1 : ((a < b) ? -1 : 0);
341 pe_export_sort (va, vb)
344 def_file_export *a = (def_file_export *) va;
345 def_file_export *b = (def_file_export *) vb;
347 return strcmp (a->name, b->name);
350 /* Read and process the .DEF file. */
352 /* These correspond to the entries in pe_def_file->exports[]. I use
353 exported_symbol_sections[i] to tag whether or not the symbol was
354 defined, since we can't export symbols we don't have. */
356 static bfd_vma *exported_symbol_offsets;
357 static struct sec **exported_symbol_sections;
358 static int export_table_size;
359 static int count_exported;
360 static int count_exported_byname;
361 static int count_with_ordinals;
362 static const char *dll_name;
363 static int min_ordinal, max_ordinal;
364 static int *exported_symbols;
366 typedef struct exclude_list_struct
369 struct exclude_list_struct *next;
373 static struct exclude_list_struct *excludes = 0;
376 pe_dll_add_excludes (new_excludes)
377 const char *new_excludes;
380 char *exclude_string;
382 local_copy = xstrdup (new_excludes);
384 exclude_string = strtok (local_copy, ",:");
385 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
387 struct exclude_list_struct *new_exclude;
389 new_exclude = ((struct exclude_list_struct *)
390 xmalloc (sizeof (struct exclude_list_struct)));
391 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
392 strcpy (new_exclude->string, exclude_string);
393 new_exclude->next = excludes;
394 excludes = new_exclude;
400 /* abfd is a bfd containing n (or NULL)
401 It can be used for contextual checks. */
404 auto_export (abfd, d, n)
410 struct exclude_list_struct *ex;
411 autofilter_entry_type *afptr;
413 /* We should not re-export imported stuff. */
414 if (strncmp (n, "_imp__", 6) == 0)
417 for (i = 0; i < d->num_exports; i++)
418 if (strcmp (d->exports[i].name, n) == 0)
421 if (pe_dll_do_default_excludes)
426 if (pe_dll_extra_pe_debug)
427 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
428 n, abfd, abfd->my_archive);
430 /* First of all, make context checks:
431 Don't export anything from libgcc. */
432 if (abfd && abfd->my_archive)
434 afptr = autofilter_liblist;
438 if (strstr (abfd->my_archive->filename, afptr->name))
444 /* Next, exclude symbols from certain startup objects. */
445 afptr = autofilter_objlist;
450 (p = strstr (abfd->filename, afptr->name)) &&
451 (*(p + afptr->len - 1) == 0))
457 /* Don't try to blindly exclude all symbols
458 that begin with '__'; this was tried and
459 it is too restrictive. */
461 /* Then, exclude specific symbols. */
462 afptr = autofilter_symbollist;
465 if (strcmp (n, afptr->name) == 0)
471 /* Next, exclude symbols starting with ... */
472 afptr = autofilter_symbolprefixlist;
475 if (strncmp (n, afptr->name, afptr->len) == 0)
481 /* Finally, exclude symbols ending with ... */
483 afptr = autofilter_symbolsuffixlist;
486 if ((len >= afptr->len) &&
487 /* Add 1 to insure match with trailing '\0'. */
488 strncmp (n + len - afptr->len, afptr->name,
489 afptr->len + 1) == 0)
496 for (ex = excludes; ex; ex = ex->next)
497 if (strcmp (n, ex->string) == 0)
504 process_def_file (abfd, info)
505 bfd *abfd ATTRIBUTE_UNUSED;
506 struct bfd_link_info *info;
509 struct bfd_link_hash_entry *blhe;
512 def_file_export *e = 0;
515 pe_def_file = def_file_empty ();
517 /* First, run around to all the objects looking for the .drectve
518 sections, and push those into the def file too. */
519 for (b = info->input_bfds; b; b = b->link_next)
521 s = bfd_get_section_by_name (b, ".drectve");
524 int size = bfd_get_section_size_before_reloc (s);
525 char *buf = xmalloc (size);
527 bfd_get_section_contents (b, s, buf, 0, size);
528 def_file_add_directive (pe_def_file, buf, size);
533 /* Now, maybe export everything else the default way. */
534 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
536 for (b = info->input_bfds; b; b = b->link_next)
541 symsize = bfd_get_symtab_upper_bound (b);
542 symbols = (asymbol **) xmalloc (symsize);
543 nsyms = bfd_canonicalize_symtab (b, symbols);
545 for (j = 0; j < nsyms; j++)
547 /* We should export symbols which are either global or not
548 anything at all. (.bss data is the latter)
549 We should not export undefined symbols. */
550 if (symbols[j]->section != &bfd_und_section
551 && ((symbols[j]->flags & BSF_GLOBAL)
552 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
554 const char *sn = symbols[j]->name;
556 /* We should not re-export imported stuff. */
558 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
559 sprintf (name, "%s%s", U("_imp_"), sn);
561 blhe = bfd_link_hash_lookup (info->hash, name,
562 false, false, false);
565 if (blhe && blhe->type == bfd_link_hash_defined)
572 if (auto_export (b, pe_def_file, sn))
575 p=def_file_add_export (pe_def_file, sn, 0, -1);
576 /* Fill data flag properly, from dlltool.c. */
577 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
585 #define NE pe_def_file->num_exports
587 /* Canonicalize the export list. */
590 for (i = 0; i < NE; i++)
592 if (strchr (pe_def_file->exports[i].name, '@'))
594 /* This will preserve internal_name, which may have been
595 pointing to the same memory as name, or might not
597 char *tmp = xstrdup (pe_def_file->exports[i].name);
599 *(strchr (tmp, '@')) = 0;
600 pe_def_file->exports[i].name = tmp;
605 if (pe_dll_stdcall_aliases)
607 for (i = 0; i < NE; i++)
609 if (strchr (pe_def_file->exports[i].name, '@'))
611 char *tmp = xstrdup (pe_def_file->exports[i].name);
613 *(strchr (tmp, '@')) = 0;
614 if (auto_export (NULL, pe_def_file, tmp))
615 def_file_add_export (pe_def_file, tmp,
616 pe_def_file->exports[i].internal_name,
624 /* Convenience, but watch out for it changing. */
625 e = pe_def_file->exports;
627 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
628 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
630 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
634 count_exported_byname = 0;
635 count_with_ordinals = 0;
637 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
638 for (i = 0, j = 0; i < NE; i++)
640 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
642 /* This is a duplicate. */
643 if (e[j - 1].ordinal != -1
644 && e[i].ordinal != -1
645 && e[j - 1].ordinal != e[i].ordinal)
647 if (pe_dll_warn_dup_exports)
648 /* xgettext:c-format */
649 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
650 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
654 if (pe_dll_warn_dup_exports)
655 /* xgettext:c-format */
656 einfo (_("Warning, duplicate EXPORT: %s\n"),
660 if (e[i].ordinal != -1)
661 e[j - 1].ordinal = e[i].ordinal;
662 e[j - 1].flag_private |= e[i].flag_private;
663 e[j - 1].flag_constant |= e[i].flag_constant;
664 e[j - 1].flag_noname |= e[i].flag_noname;
665 e[j - 1].flag_data |= e[i].flag_data;
674 pe_def_file->num_exports = j; /* == NE */
676 for (i = 0; i < NE; i++)
678 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
680 if (pe_details->underscored)
683 strcpy (name + 1, pe_def_file->exports[i].internal_name);
686 strcpy (name, pe_def_file->exports[i].internal_name);
688 blhe = bfd_link_hash_lookup (info->hash,
693 && (blhe->type == bfd_link_hash_defined
694 || (blhe->type == bfd_link_hash_common)))
697 if (!pe_def_file->exports[i].flag_noname)
698 count_exported_byname++;
700 /* Only fill in the sections. The actual offsets are computed
701 in fill_exported_offsets() after common symbols are laid
703 if (blhe->type == bfd_link_hash_defined)
704 exported_symbol_sections[i] = blhe->u.def.section;
706 exported_symbol_sections[i] = blhe->u.c.p->section;
708 if (pe_def_file->exports[i].ordinal != -1)
710 if (max_ordinal < pe_def_file->exports[i].ordinal)
711 max_ordinal = pe_def_file->exports[i].ordinal;
712 if (min_ordinal > pe_def_file->exports[i].ordinal)
713 min_ordinal = pe_def_file->exports[i].ordinal;
714 count_with_ordinals++;
717 else if (blhe && blhe->type == bfd_link_hash_undefined)
719 /* xgettext:c-format */
720 einfo (_("%XCannot export %s: symbol not defined\n"),
721 pe_def_file->exports[i].internal_name);
725 /* xgettext:c-format */
726 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
727 pe_def_file->exports[i].internal_name,
728 blhe->type, bfd_link_hash_defined);
732 /* xgettext:c-format */
733 einfo (_("%XCannot export %s: symbol not found\n"),
734 pe_def_file->exports[i].internal_name);
740 /* Build the bfd that will contain .edata and .reloc sections. */
743 build_filler_bfd (include_edata)
746 lang_input_statement_type *filler_file;
747 filler_file = lang_add_input_file ("dll stuff",
748 lang_input_file_is_fake_enum,
750 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
751 if (filler_bfd == NULL
752 || !bfd_set_arch_mach (filler_bfd,
753 bfd_get_arch (output_bfd),
754 bfd_get_mach (output_bfd)))
756 einfo ("%X%P: can not create BFD %E\n");
762 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
764 || !bfd_set_section_flags (filler_bfd, edata_s,
771 einfo ("%X%P: can not create .edata section: %E\n");
774 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
777 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
779 || !bfd_set_section_flags (filler_bfd, reloc_s,
786 einfo ("%X%P: can not create .reloc section: %E\n");
790 bfd_set_section_size (filler_bfd, reloc_s, 0);
792 ldlang_add_file (filler_file);
795 /* Gather all the exported symbols and build the .edata section. */
798 generate_edata (abfd, info)
800 struct bfd_link_info *info ATTRIBUTE_UNUSED;
803 int name_table_size = 0;
806 /* First, we need to know how many exported symbols there are,
807 and what the range of ordinals is. */
808 if (pe_def_file->name)
809 dll_name = pe_def_file->name;
812 dll_name = abfd->filename;
814 for (dlnp = dll_name; *dlnp; dlnp++)
815 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
819 if (count_with_ordinals && max_ordinal > count_exported)
821 if (min_ordinal > max_ordinal - count_exported + 1)
822 min_ordinal = max_ordinal - count_exported + 1;
827 max_ordinal = count_exported;
830 export_table_size = max_ordinal - min_ordinal + 1;
831 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
832 for (i = 0; i < export_table_size; i++)
833 exported_symbols[i] = -1;
835 /* Now we need to assign ordinals to those that don't have them. */
836 for (i = 0; i < NE; i++)
838 if (exported_symbol_sections[i])
840 if (pe_def_file->exports[i].ordinal != -1)
842 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
843 int pi = exported_symbols[ei];
847 /* xgettext:c-format */
848 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
849 pe_def_file->exports[i].ordinal,
850 pe_def_file->exports[i].name,
851 pe_def_file->exports[pi].name);
853 exported_symbols[ei] = i;
855 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
859 next_ordinal = min_ordinal;
860 for (i = 0; i < NE; i++)
861 if (exported_symbol_sections[i])
862 if (pe_def_file->exports[i].ordinal == -1)
864 while (exported_symbols[next_ordinal - min_ordinal] != -1)
867 exported_symbols[next_ordinal - min_ordinal] = i;
868 pe_def_file->exports[i].ordinal = next_ordinal;
871 /* OK, now we can allocate some memory. */
872 edata_sz = (40 /* directory */
873 + 4 * export_table_size /* addresses */
874 + 4 * count_exported_byname /* name ptrs */
875 + 2 * count_exported_byname /* ordinals */
876 + name_table_size + strlen (dll_name) + 1);
879 /* Fill the exported symbol offsets. The preliminary work has already
880 been done in process_def_file(). */
883 fill_exported_offsets (abfd, info)
884 bfd *abfd ATTRIBUTE_UNUSED;
885 struct bfd_link_info *info;
888 struct bfd_link_hash_entry *blhe;
890 for (i = 0; i < pe_def_file->num_exports; i++)
892 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
894 if (pe_details->underscored)
897 strcpy (name + 1, pe_def_file->exports[i].internal_name);
900 strcpy (name, pe_def_file->exports[i].internal_name);
902 blhe = bfd_link_hash_lookup (info->hash,
906 if (blhe && (blhe->type == bfd_link_hash_defined))
907 exported_symbol_offsets[i] = blhe->u.def.value;
914 fill_edata (abfd, info)
916 struct bfd_link_info *info ATTRIBUTE_UNUSED;
919 unsigned char *edirectory;
920 unsigned long *eaddresses;
921 unsigned long *enameptrs;
922 unsigned short *eordinals;
923 unsigned char *enamestr;
928 edata_d = (unsigned char *) xmalloc (edata_sz);
930 /* Note use of array pointer math here. */
931 edirectory = edata_d;
932 eaddresses = (unsigned long *) (edata_d + 40);
933 enameptrs = eaddresses + export_table_size;
934 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
935 enamestr = (char *) (eordinals + count_exported_byname);
937 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
939 memset (edata_d, 0, edata_sz);
940 bfd_put_32 (abfd, now, edata_d + 4);
941 if (pe_def_file->version_major != -1)
943 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
944 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
947 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
948 strcpy (enamestr, dll_name);
949 enamestr += strlen (enamestr) + 1;
950 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
951 bfd_put_32 (abfd, export_table_size, edata_d + 20);
952 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
953 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
954 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
955 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
957 fill_exported_offsets (abfd, info);
959 /* Ok, now for the filling in part. */
961 for (i = 0; i < export_table_size; i++)
963 int s = exported_symbols[i];
967 struct sec *ssec = exported_symbol_sections[s];
968 unsigned long srva = (exported_symbol_offsets[s]
969 + ssec->output_section->vma
970 + ssec->output_offset);
971 int ord = pe_def_file->exports[s].ordinal;
973 bfd_put_32 (abfd, srva - image_base,
974 (void *) (eaddresses + ord - min_ordinal));
976 if (!pe_def_file->exports[s].flag_noname)
978 char *ename = pe_def_file->exports[s].name;
979 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
981 strcpy (enamestr, ename);
982 enamestr += strlen (enamestr) + 1;
983 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
985 pe_def_file->exports[s].hint = hint++;
992 static struct sec *current_sec;
995 pe_walk_relocs_of_symbol (info, name, cb)
996 struct bfd_link_info *info;
998 int (*cb) (arelent *, asection *);
1003 for (b = info->input_bfds; b; b = b->link_next)
1008 symsize = bfd_get_symtab_upper_bound (b);
1009 symbols = (asymbol **) xmalloc (symsize);
1010 nsyms = bfd_canonicalize_symtab (b, symbols);
1012 for (s = b->sections; s; s = s->next)
1015 int relsize, nrelocs, i;
1016 int flags = bfd_get_section_flags (b, s);
1018 /* Skip discarded linkonce sections. */
1019 if (flags & SEC_LINK_ONCE
1020 && s->output_section == bfd_abs_section_ptr)
1025 relsize = bfd_get_reloc_upper_bound (b, s);
1026 relocs = (arelent **) xmalloc ((size_t) relsize);
1027 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1029 for (i = 0; i < nrelocs; i++)
1031 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1033 if (!strcmp (name, sym->name))
1039 /* Warning: the allocated symbols are remembered in BFD and reused
1040 later, so don't free them! */
1041 /* free (symbols); */
1046 /* Gather all the relocations and build the .reloc section. */
1049 generate_reloc (abfd, info)
1051 struct bfd_link_info *info;
1054 /* For .reloc stuff. */
1055 reloc_data_type *reloc_data;
1056 int total_relocs = 0;
1058 unsigned long sec_page = (unsigned long) (-1);
1059 unsigned long page_ptr, page_count;
1065 for (b = info->input_bfds; b; b = b->link_next)
1066 for (s = b->sections; s; s = s->next)
1067 total_relocs += s->reloc_count;
1070 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1074 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1077 int relsize, nrelocs, i;
1079 for (s = b->sections; s; s = s->next)
1081 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1085 /* If it's not loaded, we don't need to relocate it this way. */
1086 if (!(s->output_section->flags & SEC_LOAD))
1089 /* I don't know why there would be a reloc for these, but I've
1090 seen it happen - DJ */
1091 if (s->output_section == &bfd_abs_section)
1094 if (s->output_section->vma == 0)
1096 /* Huh? Shouldn't happen, but punt if it does. */
1097 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1098 s->output_section->name, s->output_section->index,
1099 s->output_section->flags);
1103 symsize = bfd_get_symtab_upper_bound (b);
1104 symbols = (asymbol **) xmalloc (symsize);
1105 nsyms = bfd_canonicalize_symtab (b, symbols);
1107 relsize = bfd_get_reloc_upper_bound (b, s);
1108 relocs = (arelent **) xmalloc ((size_t) relsize);
1109 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1111 for (i = 0; i < nrelocs; i++)
1113 if (pe_dll_extra_pe_debug)
1115 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1116 printf("rel: %s\n",sym->name);
1118 if (!relocs[i]->howto->pc_relative
1119 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1122 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1124 sym_vma = (relocs[i]->addend
1127 + sym->section->output_offset
1128 + sym->section->output_section->vma);
1129 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1131 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1133 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1134 relocs[i]->howto->rightshift)
1136 case BITS_AND_SHIFT (32, 0):
1137 reloc_data[total_relocs].type = 3;
1140 case BITS_AND_SHIFT (16, 0):
1141 reloc_data[total_relocs].type = 2;
1144 case BITS_AND_SHIFT (16, 16):
1145 reloc_data[total_relocs].type = 4;
1146 /* FIXME: we can't know the symbol's right value
1147 yet, but we probably can safely assume that
1148 CE will relocate us in 64k blocks, so leaving
1150 reloc_data[total_relocs].extra = 0;
1153 case BITS_AND_SHIFT (26, 2):
1154 reloc_data[total_relocs].type = 5;
1158 /* xgettext:c-format */
1159 einfo (_("%XError: %d-bit reloc in dll\n"),
1160 relocs[i]->howto->bitsize);
1166 /* Warning: the allocated symbols are remembered in BFD and
1167 reused later, so don't free them! */
1174 /* At this point, we have total_relocs relocation addresses in
1175 reloc_addresses, which are all suitable for the .reloc section.
1176 We must now create the new sections. */
1177 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1179 for (i = 0; i < total_relocs; i++)
1181 unsigned long this_page = (reloc_data[i].vma >> 12);
1183 if (this_page != sec_page)
1185 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1187 sec_page = this_page;
1192 if (reloc_data[i].type == 4)
1196 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1197 reloc_d = (unsigned char *) xmalloc (reloc_sz);
1198 sec_page = (unsigned long) (-1);
1200 page_ptr = (unsigned long) (-1);
1203 for (i = 0; i < total_relocs; i++)
1205 unsigned long rva = reloc_data[i].vma - image_base;
1206 unsigned long this_page = (rva & ~0xfff);
1208 if (this_page != sec_page)
1210 while (reloc_sz & 3)
1211 reloc_d[reloc_sz++] = 0;
1213 if (page_ptr != (unsigned long) (-1))
1214 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1216 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1217 page_ptr = reloc_sz;
1219 sec_page = this_page;
1223 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1224 reloc_d + reloc_sz);
1227 if (reloc_data[i].type == 4)
1229 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1236 while (reloc_sz & 3)
1237 reloc_d[reloc_sz++] = 0;
1239 if (page_ptr != (unsigned long) (-1))
1240 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1242 while (reloc_sz < reloc_s->_raw_size)
1243 reloc_d[reloc_sz++] = 0;
1246 /* Given the exiting def_file structure, print out a .DEF file that
1247 corresponds to it. */
1250 quoteput (s, f, needs_quotes)
1257 for (cp = s; *cp; cp++)
1272 if (*s == '"' || *s == '\\')
1286 pe_dll_generate_def_file (pe_out_def_filename)
1287 const char *pe_out_def_filename;
1290 FILE *out = fopen (pe_out_def_filename, "w");
1293 /* xgettext:c-format */
1294 einfo (_("%s: Can't open output def file %s\n"),
1295 program_name, pe_out_def_filename);
1299 if (pe_def_file->name)
1301 if (pe_def_file->is_dll)
1302 fprintf (out, "LIBRARY ");
1304 fprintf (out, "NAME ");
1306 quoteput (pe_def_file->name, out, 1);
1308 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1309 fprintf (out, " BASE=0x%lx",
1310 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1311 fprintf (out, "\n");
1314 if (pe_def_file->description)
1316 fprintf (out, "DESCRIPTION ");
1317 quoteput (pe_def_file->description, out, 1);
1318 fprintf (out, "\n");
1321 if (pe_def_file->version_minor != -1)
1322 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1323 pe_def_file->version_minor);
1324 else if (pe_def_file->version_major != -1)
1325 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1327 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1328 fprintf (out, "\n");
1330 if (pe_def_file->stack_commit != -1)
1331 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1332 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1333 else if (pe_def_file->stack_reserve != -1)
1334 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1336 if (pe_def_file->heap_commit != -1)
1337 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1338 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1339 else if (pe_def_file->heap_reserve != -1)
1340 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1342 if (pe_def_file->num_section_defs > 0)
1344 fprintf (out, "\nSECTIONS\n\n");
1346 for (i = 0; i < pe_def_file->num_section_defs; i++)
1349 quoteput (pe_def_file->section_defs[i].name, out, 0);
1351 if (pe_def_file->section_defs[i].class)
1353 fprintf (out, " CLASS ");
1354 quoteput (pe_def_file->section_defs[i].class, out, 0);
1357 if (pe_def_file->section_defs[i].flag_read)
1358 fprintf (out, " READ");
1360 if (pe_def_file->section_defs[i].flag_write)
1361 fprintf (out, " WRITE");
1363 if (pe_def_file->section_defs[i].flag_execute)
1364 fprintf (out, " EXECUTE");
1366 if (pe_def_file->section_defs[i].flag_shared)
1367 fprintf (out, " SHARED");
1369 fprintf (out, "\n");
1373 if (pe_def_file->num_exports > 0)
1375 fprintf (out, "EXPORTS\n");
1377 for (i = 0; i < pe_def_file->num_exports; i++)
1379 def_file_export *e = pe_def_file->exports + i;
1381 quoteput (e->name, out, 0);
1383 if (e->internal_name && strcmp (e->internal_name, e->name))
1385 fprintf (out, " = ");
1386 quoteput (e->internal_name, out, 0);
1389 if (e->ordinal != -1)
1390 fprintf (out, " @%d", e->ordinal);
1392 if (e->flag_private)
1393 fprintf (out, " PRIVATE");
1395 if (e->flag_constant)
1396 fprintf (out, " CONSTANT");
1399 fprintf (out, " NONAME");
1402 fprintf (out, " DATA");
1404 fprintf (out, "\n");
1408 if (pe_def_file->num_imports > 0)
1410 fprintf (out, "\nIMPORTS\n\n");
1412 for (i = 0; i < pe_def_file->num_imports; i++)
1414 def_file_import *im = pe_def_file->imports + i;
1417 if (im->internal_name
1418 && (!im->name || strcmp (im->internal_name, im->name)))
1420 quoteput (im->internal_name, out, 0);
1421 fprintf (out, " = ");
1424 quoteput (im->module->name, out, 0);
1428 quoteput (im->name, out, 0);
1430 fprintf (out, "%d", im->ordinal);
1432 fprintf (out, "\n");
1437 fprintf (out, _("; no contents available\n"));
1439 if (fclose (out) == EOF)
1440 /* xgettext:c-format */
1441 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1444 /* Generate the import library. */
1446 static asymbol **symtab;
1449 static const char *dll_filename;
1450 static char *dll_symname;
1452 #define UNDSEC (asection *) &bfd_und_section
1455 quick_section (abfd, name, flags, align)
1464 sec = bfd_make_section_old_way (abfd, name);
1465 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1466 bfd_set_section_alignment (abfd, sec, align);
1467 /* Remember to undo this before trying to link internally! */
1468 sec->output_section = sec;
1470 sym = bfd_make_empty_symbol (abfd);
1471 symtab[symptr++] = sym;
1472 sym->name = sec->name;
1474 sym->flags = BSF_LOCAL;
1481 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1491 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1496 sym = bfd_make_empty_symbol (abfd);
1501 symtab[symptr++] = sym;
1504 static arelent *reltab = 0;
1505 static int relcount = 0, relsize = 0;
1508 quick_reloc (abfd, address, which_howto, symidx)
1514 if (relcount >= (relsize - 1))
1518 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1520 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1522 reltab[relcount].address = address;
1523 reltab[relcount].addend = 0;
1524 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1525 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1530 save_relocs (asection *sec)
1534 sec->relocation = reltab;
1535 sec->reloc_count = relcount;
1536 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1537 for (i = 0; i < relcount; i++)
1538 sec->orelocation[i] = sec->relocation + i;
1539 sec->orelocation[relcount] = 0;
1540 sec->flags |= SEC_RELOC;
1542 relcount = relsize = 0;
1545 /* .section .idata$2
1546 .global __head_my_dll
1566 asection *id2, *id5, *id4;
1567 unsigned char *d2, *d5, *d4;
1571 oname = (char *) xmalloc (20);
1572 sprintf (oname, "d%06d.o", tmp_seq);
1575 abfd = bfd_create (oname, parent);
1576 bfd_find_target (pe_details->object_target, abfd);
1577 bfd_make_writable (abfd);
1579 bfd_set_format (abfd, bfd_object);
1580 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1583 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1584 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1585 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1586 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1587 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1588 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1590 /* OK, pay attention here. I got confused myself looking back at
1591 it. We create a four-byte section to mark the beginning of the
1592 list, and we include an offset of 4 in the section, so that the
1593 pointer to the list points to the *end* of this section, which is
1594 the start of the list of sections from other objects. */
1596 bfd_set_section_size (abfd, id2, 20);
1597 d2 = (unsigned char *) xmalloc (20);
1600 d2[0] = d2[16] = 4; /* Reloc addend. */
1601 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1602 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1603 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1606 bfd_set_section_size (abfd, id5, 4);
1607 d5 = (unsigned char *) xmalloc (4);
1611 bfd_set_section_size (abfd, id4, 4);
1612 d4 = (unsigned char *) xmalloc (4);
1616 bfd_set_symtab (abfd, symtab, symptr);
1618 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1619 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1620 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1622 bfd_make_readable (abfd);
1626 /* .section .idata$4
1631 .global __my_dll_iname
1639 asection *id4, *id5, *id7;
1640 unsigned char *d4, *d5, *d7;
1645 oname = (char *) xmalloc (20);
1646 sprintf (oname, "d%06d.o", tmp_seq);
1649 abfd = bfd_create (oname, parent);
1650 bfd_find_target (pe_details->object_target, abfd);
1651 bfd_make_writable (abfd);
1653 bfd_set_format (abfd, bfd_object);
1654 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1657 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1658 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1659 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1660 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1661 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1663 bfd_set_section_size (abfd, id4, 4);
1664 d4 = (unsigned char *) xmalloc (4);
1668 bfd_set_section_size (abfd, id5, 4);
1669 d5 = (unsigned char *) xmalloc (4);
1673 len = strlen (dll_filename) + 1;
1676 bfd_set_section_size (abfd, id7, len);
1677 d7 = (unsigned char *) xmalloc (len);
1679 strcpy (d7, dll_filename);
1681 bfd_set_symtab (abfd, symtab, symptr);
1683 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1684 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1685 bfd_set_section_contents (abfd, id7, d7, 0, len);
1687 bfd_make_readable (abfd);
1693 .global ___imp_function
1694 .global __imp__function
1696 jmp *__imp__function:
1710 .asciz "function" xlate? (add underscore, kill at) */
1712 static unsigned char jmp_ix86_bytes[] =
1714 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1722 .dw __imp_function */
1724 static unsigned char jmp_sh_bytes[] =
1726 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1730 lui $t0,<high:__imp_function>
1731 lw $t0,<low:__imp_function>
1735 static unsigned char jmp_mips_bytes[] =
1737 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1738 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1742 make_one (exp, parent)
1743 def_file_export *exp;
1746 asection *tx, *id7, *id5, *id4, *id6;
1747 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1751 unsigned char *jmp_bytes = NULL;
1752 int jmp_byte_count = 0;
1754 switch (pe_details->pe_arch)
1757 jmp_bytes = jmp_ix86_bytes;
1758 jmp_byte_count = sizeof (jmp_ix86_bytes);
1761 jmp_bytes = jmp_sh_bytes;
1762 jmp_byte_count = sizeof (jmp_sh_bytes);
1765 jmp_bytes = jmp_mips_bytes;
1766 jmp_byte_count = sizeof (jmp_mips_bytes);
1772 oname = (char *) xmalloc (20);
1773 sprintf (oname, "d%06d.o", tmp_seq);
1776 abfd = bfd_create (oname, parent);
1777 bfd_find_target (pe_details->object_target, abfd);
1778 bfd_make_writable (abfd);
1780 bfd_set_format (abfd, bfd_object);
1781 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1784 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1785 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1786 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1787 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1788 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1789 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1790 if (! exp->flag_data)
1791 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1792 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1793 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1794 /* Symbol to reference ord/name of imported
1795 symbol, used to implement auto-import. */
1796 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL, 0);
1797 if (pe_dll_compat_implib)
1798 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1799 id5, BSF_GLOBAL, 0);
1801 if (! exp->flag_data)
1803 bfd_set_section_size (abfd, tx, jmp_byte_count);
1804 td = (unsigned char *) xmalloc (jmp_byte_count);
1806 memcpy (td, jmp_bytes, jmp_byte_count);
1808 switch (pe_details->pe_arch)
1811 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1814 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1817 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1818 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1819 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1827 bfd_set_section_size (abfd, id7, 4);
1828 d7 = (unsigned char *) xmalloc (4);
1831 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1834 bfd_set_section_size (abfd, id5, 4);
1835 d5 = (unsigned char *) xmalloc (4);
1839 if (exp->flag_noname)
1841 d5[0] = exp->ordinal;
1842 d5[1] = exp->ordinal >> 8;
1847 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1851 bfd_set_section_size (abfd, id4, 4);
1852 d4 = (unsigned char *) xmalloc (4);
1856 if (exp->flag_noname)
1858 d4[0] = exp->ordinal;
1859 d4[1] = exp->ordinal >> 8;
1864 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1868 if (exp->flag_noname)
1871 bfd_set_section_size (abfd, id6, 0);
1875 len = strlen (exp->name) + 3;
1878 bfd_set_section_size (abfd, id6, len);
1879 d6 = (unsigned char *) xmalloc (len);
1881 memset (d6, 0, len);
1882 d6[0] = exp->hint & 0xff;
1883 d6[1] = exp->hint >> 8;
1884 strcpy (d6 + 2, exp->name);
1887 bfd_set_symtab (abfd, symtab, symptr);
1889 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1890 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1891 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1892 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1893 if (!exp->flag_noname)
1894 bfd_set_section_contents (abfd, id6, d6, 0, len);
1896 bfd_make_readable (abfd);
1901 make_singleton_name_thunk (import, parent)
1905 /* Name thunks go to idata$4. */
1911 oname = (char *) xmalloc (20);
1912 sprintf (oname, "nmth%06d.o", tmp_seq);
1915 abfd = bfd_create (oname, parent);
1916 bfd_find_target (pe_details->object_target, abfd);
1917 bfd_make_writable (abfd);
1919 bfd_set_format (abfd, bfd_object);
1920 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1923 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1924 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1925 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1926 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1928 bfd_set_section_size (abfd, id4, 8);
1929 d4 = (unsigned char *) xmalloc (4);
1932 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1935 bfd_set_symtab (abfd, symtab, symptr);
1937 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1939 bfd_make_readable (abfd);
1944 make_import_fixup_mark (rel)
1947 /* We convert reloc to symbol, for later reference. */
1949 static char *fixup_name = NULL;
1950 static size_t buffer_len = 0;
1952 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
1954 bfd *abfd = bfd_asymbol_bfd (sym);
1955 struct coff_link_hash_entry *myh = NULL;
1959 fixup_name = (char *) xmalloc (384);
1963 if (strlen (sym->name) + 25 > buffer_len)
1964 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1965 bigger than 20 digits long, we've got worse problems than
1966 overflowing this buffer... */
1969 /* New buffer size is length of symbol, plus 25, but then
1970 rounded up to the nearest multiple of 128. */
1971 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1972 fixup_name = (char *) xmalloc (buffer_len);
1975 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
1977 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
1978 current_sec, /* sym->section, */
1979 rel->address, NULL, true, false,
1980 (struct bfd_link_hash_entry **) &myh);
1983 printf ("type:%d\n", myh->type);
1984 printf ("%s\n", myh->root.u.def.section->name);
1989 /* .section .idata$3
1990 .rva __nm_thnk_SYM (singleton thunk with name of func)
1993 .rva __my_dll_iname (name of dll)
1994 .rva __fuNN_SYM (pointer to reference (address) in text) */
1997 make_import_fixup_entry (name, fixup_name, dll_symname,parent)
1999 const char *fixup_name;
2000 const char *dll_symname;
2008 oname = (char *) xmalloc (20);
2009 sprintf (oname, "fu%06d.o", tmp_seq);
2012 abfd = bfd_create (oname, parent);
2013 bfd_find_target (pe_details->object_target, abfd);
2014 bfd_make_writable (abfd);
2016 bfd_set_format (abfd, bfd_object);
2017 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2020 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2021 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2024 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2026 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2027 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2028 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2030 bfd_set_section_size (abfd, id3, 20);
2031 d3 = (unsigned char *) xmalloc (20);
2035 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2036 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2037 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2040 bfd_set_symtab (abfd, symtab, symptr);
2042 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2044 bfd_make_readable (abfd);
2049 pe_create_import_fixup (rel)
2053 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2054 struct bfd_link_hash_entry *name_thunk_sym;
2055 const char *name = sym->name;
2056 char *fixup_name = make_import_fixup_mark (rel);
2058 sprintf (buf, U ("_nm_thnk_%s"), name);
2060 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2062 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2064 bfd *b = make_singleton_name_thunk (name, output_bfd);
2065 add_bfd_to_link (b, b->filename, &link_info);
2067 /* If we ever use autoimport, we have to cast text section writable. */
2068 config.text_read_only = false;
2072 bfd *b = make_import_fixup_entry (name, fixup_name,
2073 pe_get_data_import_dll_name (),
2075 add_bfd_to_link (b, b->filename, &link_info);
2081 pe_dll_generate_implib (def, impfilename)
2083 const char *impfilename;
2091 dll_filename = (def->name) ? def->name : dll_name;
2092 dll_symname = xstrdup (dll_filename);
2093 for (i = 0; dll_symname[i]; i++)
2094 if (!ISALNUM (dll_symname[i]))
2095 dll_symname[i] = '_';
2097 unlink (impfilename);
2099 outarch = bfd_openw (impfilename, 0);
2103 /* xgettext:c-format */
2104 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2108 /* xgettext:c-format */
2109 einfo (_("Creating library file: %s\n"), impfilename);
2111 bfd_set_format (outarch, bfd_archive);
2112 outarch->has_armap = 1;
2114 /* Work out a reasonable size of things to put onto one line. */
2115 ar_head = make_head (outarch);
2117 for (i = 0; i < def->num_exports; i++)
2119 /* The import library doesn't know about the internal name. */
2120 char *internal = def->exports[i].internal_name;
2123 def->exports[i].internal_name = def->exports[i].name;
2124 n = make_one (def->exports + i, outarch);
2127 def->exports[i].internal_name = internal;
2130 ar_tail = make_tail (outarch);
2132 if (ar_head == NULL || ar_tail == NULL)
2135 /* Now stick them all into the archive. */
2136 ar_head->next = head;
2137 ar_tail->next = ar_head;
2140 if (! bfd_set_archive_head (outarch, head))
2141 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2143 if (! bfd_close (outarch))
2144 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2146 while (head != NULL)
2148 bfd *n = head->next;
2155 add_bfd_to_link (abfd, name, link_info)
2158 struct bfd_link_info *link_info;
2160 lang_input_statement_type *fake_file;
2162 fake_file = lang_add_input_file (name,
2163 lang_input_file_is_fake_enum,
2165 fake_file->the_bfd = abfd;
2166 ldlang_add_file (fake_file);
2168 if (!bfd_link_add_symbols (abfd, link_info))
2169 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2173 pe_process_import_defs (output_bfd, link_info)
2175 struct bfd_link_info *link_info;
2177 def_file_module *module;
2179 pe_dll_id_target (bfd_get_target (output_bfd));
2184 for (module = pe_def_file->modules; module; module = module->next)
2188 dll_filename = module->name;
2189 dll_symname = xstrdup (module->name);
2190 for (i = 0; dll_symname[i]; i++)
2191 if (!ISALNUM (dll_symname[i]))
2192 dll_symname[i] = '_';
2196 for (i = 0; i < pe_def_file->num_imports; i++)
2197 if (pe_def_file->imports[i].module == module)
2199 def_file_export exp;
2200 struct bfd_link_hash_entry *blhe;
2202 /* See if we need this import. */
2203 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2204 sprintf (name, "%s%s", U (""), pe_def_file->imports[i].internal_name);
2205 blhe = bfd_link_hash_lookup (link_info->hash, name,
2206 false, false, false);
2207 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2209 sprintf (name, "%s%s", U ("_imp__"),
2210 pe_def_file->imports[i].internal_name);
2211 blhe = bfd_link_hash_lookup (link_info->hash, name,
2212 false, false, false);
2215 if (blhe && blhe->type == bfd_link_hash_undefined)
2221 bfd *ar_head = make_head (output_bfd);
2222 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2225 exp.internal_name = pe_def_file->imports[i].internal_name;
2226 exp.name = pe_def_file->imports[i].name;
2227 exp.ordinal = pe_def_file->imports[i].ordinal;
2228 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2229 exp.flag_private = 0;
2230 exp.flag_constant = 0;
2232 exp.flag_noname = exp.name ? 0 : 1;
2233 one = make_one (&exp, output_bfd);
2234 add_bfd_to_link (one, one->filename, link_info);
2239 bfd *ar_tail = make_tail (output_bfd);
2240 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2247 /* We were handed a *.DLL file. Parse it and turn it into a set of
2248 IMPORTS directives in the def file. Return true if the file was
2249 handled, false if not. */
2252 pe_get16 (abfd, where)
2258 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2259 bfd_bread (b, (bfd_size_type) 2, abfd);
2260 return b[0] + (b[1] << 8);
2264 pe_get32 (abfd, where)
2270 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2271 bfd_bread (b, (bfd_size_type) 4, abfd);
2272 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2275 #if 0 /* This is not currently used. */
2281 unsigned char *b = ptr;
2283 return b[0] + (b[1] << 8);
2292 unsigned char *b = ptr;
2294 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2298 pe_implied_import_dll (filename)
2299 const char *filename;
2302 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2303 unsigned long export_rva, export_size, nsections, secptr, expptr;
2304 unsigned char *expdata, *erva;
2305 unsigned long name_rvas, ordinals, nexp, ordbase;
2306 const char *dll_name;
2308 /* No, I can't use bfd here. kernel32.dll puts its export table in
2309 the middle of the .rdata section. */
2310 dll = bfd_openr (filename, pe_details->target_name);
2313 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2317 /* PEI dlls seem to be bfd_objects. */
2318 if (!bfd_check_format (dll, bfd_object))
2320 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2324 dll_name = filename;
2325 for (i = 0; filename[i]; i++)
2326 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
2327 dll_name = filename + i + 1;
2329 pe_header_offset = pe_get32 (dll, 0x3c);
2330 opthdr_ofs = pe_header_offset + 4 + 20;
2331 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2333 if (num_entries < 1) /* No exports. */
2336 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2337 export_size = pe_get32 (dll, opthdr_ofs + 100);
2338 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2339 secptr = (pe_header_offset + 4 + 20 +
2340 pe_get16 (dll, pe_header_offset + 4 + 16));
2343 for (i = 0; i < nsections; i++)
2346 unsigned long secptr1 = secptr + 40 * i;
2347 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2348 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2349 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2351 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2352 bfd_bread (sname, (bfd_size_type) 8, dll);
2354 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2356 expptr = fptr + (export_rva - vaddr);
2357 if (export_rva + export_size > vaddr + vsize)
2358 export_size = vsize - (export_rva - vaddr);
2363 expdata = (unsigned char *) xmalloc (export_size);
2364 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2365 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2366 erva = expdata - export_rva;
2368 if (pe_def_file == 0)
2369 pe_def_file = def_file_empty ();
2371 nexp = pe_as32 (expdata + 24);
2372 name_rvas = pe_as32 (expdata + 32);
2373 ordinals = pe_as32 (expdata + 36);
2374 ordbase = pe_as32 (expdata + 16);
2376 for (i = 0; i < nexp; i++)
2378 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2379 def_file_import *imp;
2381 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
2388 /* These are the main functions, called from the emulation. The first
2389 is called after the bfds are read, so we can guess at how much space
2390 we need. The second is called after everything is placed, so we
2391 can put the right values in place. */
2394 pe_dll_build_sections (abfd, info)
2396 struct bfd_link_info *info;
2398 pe_dll_id_target (bfd_get_target (abfd));
2399 process_def_file (abfd, info);
2401 generate_edata (abfd, info);
2402 build_filler_bfd (1);
2406 pe_exe_build_sections (abfd, info)
2408 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2410 pe_dll_id_target (bfd_get_target (abfd));
2411 build_filler_bfd (0);
2415 pe_dll_fill_sections (abfd, info)
2417 struct bfd_link_info *info;
2419 pe_dll_id_target (bfd_get_target (abfd));
2420 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2422 generate_reloc (abfd, info);
2425 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2427 /* Resize the sections. */
2428 lang_size_sections (stat_ptr->head, abs_output_section,
2429 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2431 /* Redo special stuff. */
2432 ldemul_after_allocation ();
2434 /* Do the assignments again. */
2435 lang_do_assignments (stat_ptr->head,
2437 (fill_type) 0, (bfd_vma) 0);
2440 fill_edata (abfd, info);
2442 pe_data (abfd)->dll = 1;
2444 edata_s->contents = edata_d;
2445 reloc_s->contents = reloc_d;
2449 pe_exe_fill_sections (abfd, info)
2451 struct bfd_link_info *info;
2453 pe_dll_id_target (bfd_get_target (abfd));
2454 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2456 generate_reloc (abfd, info);
2459 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2461 /* Resize the sections. */
2462 lang_size_sections (stat_ptr->head, abs_output_section,
2463 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2465 /* Redo special stuff. */
2466 ldemul_after_allocation ();
2468 /* Do the assignments again. */
2469 lang_do_assignments (stat_ptr->head,
2471 (fill_type) 0, (bfd_vma) 0);
2473 reloc_s->contents = reloc_d;