1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000 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"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
44 /************************************************************************
46 This file turns a regular Windows PE image into a DLL. Because of
47 the complexity of this operation, it has been broken down into a
48 number of separate modules which are all called by the main function
49 at the end of this file. This function is not re-entrant and is
50 normally only called once, so static variables are used to reduce
51 the number of parameters and return values required.
53 See also: ld/emultempl/pe.em
55 ************************************************************************/
57 /************************************************************************
59 Auto-import feature by Paul Sokolovsky
63 1. With this feature on, DLL clients can import variables from DLL
64 without any concern from their side (for example, without any source
67 2. This is done completely in bounds of the PE specification (to be fair,
68 there's a place where it pokes nose out of, but in practise it works).
69 So, resulting module can be used with any other PE compiler/linker.
71 3. Auto-import is fully compatible with standard import method and they
72 can be mixed together.
74 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
75 reference to it; load time: negligible; virtual/physical memory: should be
76 less than effect of DLL relocation, and I sincerely hope it doesn't affect
77 DLL sharability (too much).
81 The obvious and only way to get rid of dllimport insanity is to make client
82 access variable directly in the DLL, bypassing extra dereference. I.e.,
83 whenever client contains someting like
87 address of dll_var in the command should be relocated to point into loaded
88 DLL. The aim is to make OS loader do so, and than make ld help with that.
89 Import section of PE made following way: there's a vector of structures
90 each describing imports from particular DLL. Each such structure points
91 to two other parellel vectors: one holding imported names, and one which
92 will hold address of corresponding imported name. So, the solution is
93 de-vectorize these structures, making import locations be sparse and
94 pointing directly into code. Before continuing, it is worth a note that,
95 while authors strives to make PE act ELF-like, there're some other people
96 make ELF act PE-like: elfvector, ;-) .
100 For each reference of data symbol to be imported from DLL (to set of which
101 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
102 import fixup entry is generated. That entry is of type
103 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
104 fixup entry contains pointer to symbol's address within .text section
105 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
106 (so, DLL name is referenced by multiple entries), and pointer to symbol
107 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
108 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
109 containing imported name. Here comes that "om the edge" problem mentioned
110 above: PE specification rambles that name vector (OriginalFirstThunk)
111 should run in parallel with addresses vector (FirstThunk), i.e. that they
112 should have same number of elements and terminated with zero. We violate
113 this, since FirstThunk points directly into machine code. But in practise,
114 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
115 puts addresses to FirstThunk, not something else. It once again should be
116 noted that dll and symbol name structures are reused across fixup entries
117 and should be there anyway to support standard import stuff, so sustained
118 overhead is 20 bytes per reference. Other question is whether having several
119 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
120 done even by native compiler/linker (libth32's functions are in fact reside
121 in windows9x kernel32.dll, so if you use it, you have two
122 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
123 referencing the same PE structures several times is valid. The answer is why
124 not, prohibitting that (detecting violation) would require more work on
125 behalf of loader than not doing it.
128 See also: ld/emultempl/pe.em
130 ************************************************************************/
133 add_bfd_to_link (bfd *abfd, CONST char *name,
134 struct bfd_link_info *link_info);
136 /* for emultempl/pe.em */
138 def_file *pe_def_file = 0;
139 int pe_dll_export_everything = 0;
140 int pe_dll_do_default_excludes = 1;
141 int pe_dll_kill_ats = 0;
142 int pe_dll_stdcall_aliases = 0;
143 int pe_dll_warn_dup_exports = 0;
144 int pe_dll_compat_implib = 0;
145 int pe_dll_extra_pe_debug = 0;
147 /************************************************************************
149 static variables and types
151 ************************************************************************/
153 static bfd_vma image_base;
155 static bfd *filler_bfd;
156 static struct sec *edata_s, *reloc_s;
157 static unsigned char *edata_d, *reloc_d;
158 static size_t edata_sz, reloc_sz;
163 unsigned int imagebase_reloc;
172 } autofilter_entry_type;
174 #define PE_ARCH_i386 1
176 #define PE_ARCH_mips 3
177 #define PE_ARCH_arm 4
179 static pe_details_type pe_detail_list[] = {
191 16 /* R_SH_IMAGEBASE */,
212 { NULL, NULL, 0, 0, 0, 0 }
215 static pe_details_type *pe_details;
217 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 },
227 /* Do not specify library suffix explicitly, to allow for dllized versions */
228 static autofilter_entry_type autofilter_liblist[] = {
230 { "libstdc++.", 10 },
231 { "libmingw32.", 11 },
234 static autofilter_entry_type autofilter_objlist[] = {
240 static autofilter_entry_type autofilter_symbolprefixlist[] = {
241 /* { "__imp_", 6 }, */
242 /* Do __imp_ explicitly to save time */
244 { "__builtin_", 10 },
245 { "_head_", 6 }, /* don't export symbols specifying internal DLL layout */
247 { "_impure_ptr", 11 },
248 { "cygwin_attach_dll", 17 },
249 { "cygwin_premain0", 15 },
250 { "cygwin_premain1", 15 },
251 { "cygwin_premain2", 15 },
252 { "cygwin_premain3", 15 },
256 static autofilter_entry_type autofilter_symbolsuffixlist[] = {
261 #define U(str) (pe_details->underscored ? "_" str : str)
264 pe_dll_id_target (target)
268 for (i = 0; pe_detail_list[i].target_name; i++)
269 if (strcmp (pe_detail_list[i].target_name, target) == 0
270 || strcmp (pe_detail_list[i].object_target, target) == 0)
272 pe_details = pe_detail_list + i;
275 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
279 /************************************************************************
281 Helper functions for qsort. Relocs must be sorted so that we can write
284 ************************************************************************/
296 bfd_vma a = ((reloc_data_type *) va)->vma;
297 bfd_vma b = ((reloc_data_type *) vb)->vma;
298 return (a > b) ? 1 : ((a < b) ? -1 : 0);
302 pe_export_sort (va, vb)
305 def_file_export *a = (def_file_export *) va;
306 def_file_export *b = (def_file_export *) vb;
307 return strcmp (a->name, b->name);
310 /************************************************************************
312 Read and process the .DEF file
314 ************************************************************************/
316 /* These correspond to the entries in pe_def_file->exports[]. I use
317 exported_symbol_sections[i] to tag whether or not the symbol was
318 defined, since we can't export symbols we don't have. */
320 static bfd_vma *exported_symbol_offsets;
321 static struct sec **exported_symbol_sections;
323 static int export_table_size;
324 static int count_exported;
325 static int count_exported_byname;
326 static int count_with_ordinals;
327 static const char *dll_name;
328 static int min_ordinal, max_ordinal;
329 static int *exported_symbols;
331 typedef struct exclude_list_struct {
333 struct exclude_list_struct *next;
334 } exclude_list_struct;
336 static struct exclude_list_struct *excludes = 0;
339 pe_dll_add_excludes (new_excludes)
340 const char *new_excludes;
343 char *exclude_string;
345 local_copy = xstrdup (new_excludes);
347 exclude_string = strtok (local_copy, ",:");
348 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
350 struct exclude_list_struct *new_exclude;
352 new_exclude = ((struct exclude_list_struct *)
353 xmalloc (sizeof (struct exclude_list_struct)));
354 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
355 strcpy (new_exclude->string, exclude_string);
356 new_exclude->next = excludes;
357 excludes = new_exclude;
364 abfd is a bfd containing n (or NULL)
365 It can be used for contextual checks.
368 auto_export (abfd, d, n)
374 struct exclude_list_struct *ex;
375 autofilter_entry_type *afptr;
377 /* we should not re-export imported stuff */
378 if (strncmp (n, "_imp__", 6) == 0)
381 for (i = 0; i < d->num_exports; i++)
382 if (strcmp (d->exports[i].name, n) == 0)
384 if (pe_dll_do_default_excludes)
386 if (pe_dll_extra_pe_debug)
388 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
389 n, abfd, abfd->my_archive);
392 /* First of all, make context checks:
393 Don't export anything from libgcc */
394 if (abfd && abfd->my_archive)
396 afptr = autofilter_liblist;
399 if (strstr (abfd->my_archive->filename, afptr->name))
405 /* Next, exclude symbols from certain startup objects */
408 afptr = autofilter_objlist;
412 (p = strstr (abfd->filename, afptr->name)) &&
413 (*(p + afptr->len - 1) == 0))
419 /* Don't try to blindly exclude all symbols
420 that begin with '__'; this was tried and
421 it is too restrictive */
423 /* Then, exclude specific symbols */
424 afptr = autofilter_symbollist;
427 if (strcmp (n, afptr->name) == 0)
432 /* Next, exclude symbols starting with ... */
433 afptr = autofilter_symbolprefixlist;
436 if (strncmp (n, afptr->name, afptr->len) == 0)
441 /* Finally, exclude symbols ending with ... */
444 afptr = autofilter_symbolsuffixlist;
447 if ((len >= afptr->len) &&
448 /* add 1 to insure match with trailing '\0' */
449 strncmp (n + len - afptr->len, afptr->name,
450 afptr->len + 1) == 0)
456 for (ex = excludes; ex; ex = ex->next)
457 if (strcmp (n, ex->string) == 0)
463 process_def_file (abfd, info)
464 bfd *abfd ATTRIBUTE_UNUSED;
465 struct bfd_link_info *info;
468 struct bfd_link_hash_entry *blhe;
471 def_file_export *e = 0;
474 pe_def_file = def_file_empty ();
476 /* First, run around to all the objects looking for the .drectve
477 sections, and push those into the def file too. */
479 for (b = info->input_bfds; b; b = b->link_next)
481 s = bfd_get_section_by_name (b, ".drectve");
484 int size = bfd_get_section_size_before_reloc (s);
485 char *buf = xmalloc (size);
486 bfd_get_section_contents (b, s, buf, 0, size);
487 def_file_add_directive (pe_def_file, buf, size);
492 /* Now, maybe export everything else the default way. */
494 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
496 for (b = info->input_bfds; b; b = b->link_next)
501 symsize = bfd_get_symtab_upper_bound (b);
502 symbols = (asymbol **) xmalloc (symsize);
503 nsyms = bfd_canonicalize_symtab (b, symbols);
505 for (j = 0; j < nsyms; j++)
507 /* We should export symbols which are either global or not
508 anything at all. (.bss data is the latter)
509 We should not export undefined symbols
511 if (symbols[j]->section != &bfd_und_section
512 && ((symbols[j]->flags & BSF_GLOBAL)
513 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
515 const char *sn = symbols[j]->name;
517 /* we should not re-export imported stuff */
519 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
520 sprintf (name, "%s%s", U("_imp_"), sn);
521 blhe = bfd_link_hash_lookup (info->hash, name,
522 false, false, false);
525 if (blhe && blhe->type == bfd_link_hash_defined)
531 if (auto_export (b, pe_def_file, sn))
534 p=def_file_add_export (pe_def_file, sn, 0, -1);
535 /* Fill data flag properly, from dlltool.c */
536 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
544 #define NE pe_def_file->num_exports
546 /* Canonicalize the export list. */
550 for (i = 0; i < NE; i++)
552 if (strchr (pe_def_file->exports[i].name, '@'))
554 /* This will preserve internal_name, which may have been
555 pointing to the same memory as name, or might not
557 char *tmp = xstrdup (pe_def_file->exports[i].name);
558 *(strchr (tmp, '@')) = 0;
559 pe_def_file->exports[i].name = tmp;
564 if (pe_dll_stdcall_aliases)
566 for (i = 0; i < NE; i++)
568 if (strchr (pe_def_file->exports[i].name, '@'))
570 char *tmp = xstrdup (pe_def_file->exports[i].name);
571 *(strchr (tmp, '@')) = 0;
572 if (auto_export (NULL, pe_def_file, tmp))
573 def_file_add_export (pe_def_file, tmp,
574 pe_def_file->exports[i].internal_name,
582 /* Convenience, but watch out for it changing. */
583 e = pe_def_file->exports;
585 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
586 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
588 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
592 count_exported_byname = 0;
593 count_with_ordinals = 0;
595 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
596 for (i = 0, j = 0; i < NE; i++)
598 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
600 /* This is a duplicate. */
601 if (e[j - 1].ordinal != -1
602 && e[i].ordinal != -1
603 && e[j - 1].ordinal != e[i].ordinal)
605 if (pe_dll_warn_dup_exports)
606 /* xgettext:c-format */
607 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
608 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
612 if (pe_dll_warn_dup_exports)
613 /* xgettext:c-format */
614 einfo (_("Warning, duplicate EXPORT: %s\n"),
617 if (e[i].ordinal != -1)
618 e[j - 1].ordinal = e[i].ordinal;
619 e[j - 1].flag_private |= e[i].flag_private;
620 e[j - 1].flag_constant |= e[i].flag_constant;
621 e[j - 1].flag_noname |= e[i].flag_noname;
622 e[j - 1].flag_data |= e[i].flag_data;
631 pe_def_file->num_exports = j; /* == NE */
633 for (i = 0; i < NE; i++)
635 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
636 if (pe_details->underscored)
639 strcpy (name + 1, pe_def_file->exports[i].internal_name);
642 strcpy (name, pe_def_file->exports[i].internal_name);
644 blhe = bfd_link_hash_lookup (info->hash,
649 && (blhe->type == bfd_link_hash_defined
650 || (blhe->type == bfd_link_hash_common)))
653 if (!pe_def_file->exports[i].flag_noname)
654 count_exported_byname++;
656 /* Only fill in the sections. The actual offsets are computed
657 in fill_exported_offsets() after common symbols are laid
659 if (blhe->type == bfd_link_hash_defined)
660 exported_symbol_sections[i] = blhe->u.def.section;
662 exported_symbol_sections[i] = blhe->u.c.p->section;
664 if (pe_def_file->exports[i].ordinal != -1)
666 if (max_ordinal < pe_def_file->exports[i].ordinal)
667 max_ordinal = pe_def_file->exports[i].ordinal;
668 if (min_ordinal > pe_def_file->exports[i].ordinal)
669 min_ordinal = pe_def_file->exports[i].ordinal;
670 count_with_ordinals++;
673 else if (blhe && blhe->type == bfd_link_hash_undefined)
675 /* xgettext:c-format */
676 einfo (_("%XCannot export %s: symbol not defined\n"),
677 pe_def_file->exports[i].internal_name);
681 /* xgettext:c-format */
682 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
683 pe_def_file->exports[i].internal_name,
684 blhe->type, bfd_link_hash_defined);
688 /* xgettext:c-format */
689 einfo (_("%XCannot export %s: symbol not found\n"),
690 pe_def_file->exports[i].internal_name);
696 /************************************************************************
698 Build the bfd that will contain .edata and .reloc sections
700 ************************************************************************/
703 build_filler_bfd (include_edata)
706 lang_input_statement_type *filler_file;
707 filler_file = lang_add_input_file ("dll stuff",
708 lang_input_file_is_fake_enum,
710 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
711 if (filler_bfd == NULL
712 || !bfd_set_arch_mach (filler_bfd,
713 bfd_get_arch (output_bfd),
714 bfd_get_mach (output_bfd)))
716 einfo ("%X%P: can not create BFD %E\n");
722 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
724 || !bfd_set_section_flags (filler_bfd, edata_s,
731 einfo ("%X%P: can not create .edata section: %E\n");
734 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
737 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
739 || !bfd_set_section_flags (filler_bfd, reloc_s,
746 einfo ("%X%P: can not create .reloc section: %E\n");
749 bfd_set_section_size (filler_bfd, reloc_s, 0);
751 ldlang_add_file (filler_file);
754 /************************************************************************
756 Gather all the exported symbols and build the .edata section
758 ************************************************************************/
761 generate_edata (abfd, info)
763 struct bfd_link_info *info ATTRIBUTE_UNUSED;
766 int name_table_size = 0;
769 /* First, we need to know how many exported symbols there are,
770 and what the range of ordinals is. */
772 if (pe_def_file->name)
774 dll_name = pe_def_file->name;
778 dll_name = abfd->filename;
779 for (dlnp = dll_name; *dlnp; dlnp++)
781 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
786 if (count_with_ordinals && max_ordinal > count_exported)
788 if (min_ordinal > max_ordinal - count_exported + 1)
789 min_ordinal = max_ordinal - count_exported + 1;
794 max_ordinal = count_exported;
796 export_table_size = max_ordinal - min_ordinal + 1;
798 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
799 for (i = 0; i < export_table_size; i++)
800 exported_symbols[i] = -1;
802 /* Now we need to assign ordinals to those that don't have them. */
803 for (i = 0; i < NE; i++)
805 if (exported_symbol_sections[i])
807 if (pe_def_file->exports[i].ordinal != -1)
809 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
810 int pi = exported_symbols[ei];
813 /* xgettext:c-format */
814 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
815 pe_def_file->exports[i].ordinal,
816 pe_def_file->exports[i].name,
817 pe_def_file->exports[pi].name);
819 exported_symbols[ei] = i;
821 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
825 next_ordinal = min_ordinal;
826 for (i = 0; i < NE; i++)
827 if (exported_symbol_sections[i])
828 if (pe_def_file->exports[i].ordinal == -1)
830 while (exported_symbols[next_ordinal - min_ordinal] != -1)
832 exported_symbols[next_ordinal - min_ordinal] = i;
833 pe_def_file->exports[i].ordinal = next_ordinal;
836 /* OK, now we can allocate some memory. */
838 edata_sz = (40 /* directory */
839 + 4 * export_table_size /* addresses */
840 + 4 * count_exported_byname /* name ptrs */
841 + 2 * count_exported_byname /* ordinals */
842 + name_table_size + strlen (dll_name) + 1);
845 /* Fill the exported symbol offsets. The preliminary work has already
846 been done in process_def_file(). */
849 fill_exported_offsets (abfd, info)
850 bfd *abfd ATTRIBUTE_UNUSED;
851 struct bfd_link_info *info;
854 struct bfd_link_hash_entry *blhe;
856 for (i = 0; i < pe_def_file->num_exports; i++)
858 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
859 if (pe_details->underscored)
862 strcpy (name + 1, pe_def_file->exports[i].internal_name);
865 strcpy (name, pe_def_file->exports[i].internal_name);
867 blhe = bfd_link_hash_lookup (info->hash,
871 if (blhe && (blhe->type == bfd_link_hash_defined))
873 exported_symbol_offsets[i] = blhe->u.def.value;
880 fill_edata (abfd, info)
882 struct bfd_link_info *info ATTRIBUTE_UNUSED;
885 unsigned char *edirectory;
886 unsigned long *eaddresses;
887 unsigned long *enameptrs;
888 unsigned short *eordinals;
889 unsigned char *enamestr;
894 edata_d = (unsigned char *) xmalloc (edata_sz);
896 /* Note use of array pointer math here. */
897 edirectory = edata_d;
898 eaddresses = (unsigned long *) (edata_d + 40);
899 enameptrs = eaddresses + export_table_size;
900 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
901 enamestr = (char *) (eordinals + count_exported_byname);
903 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
905 memset (edata_d, 0, edata_sz);
906 bfd_put_32 (abfd, now, edata_d + 4);
907 if (pe_def_file->version_major != -1)
909 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
910 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
912 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
913 strcpy (enamestr, dll_name);
914 enamestr += strlen (enamestr) + 1;
915 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
916 bfd_put_32 (abfd, export_table_size, edata_d + 20);
917 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
918 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
919 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
920 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
922 fill_exported_offsets (abfd, info);
924 /* Ok, now for the filling in part. */
926 for (i = 0; i < export_table_size; i++)
928 int s = exported_symbols[i];
931 struct sec *ssec = exported_symbol_sections[s];
932 unsigned long srva = (exported_symbol_offsets[s]
933 + ssec->output_section->vma
934 + ssec->output_offset);
935 int ord = pe_def_file->exports[s].ordinal;
937 bfd_put_32 (abfd, srva - image_base,
938 (void *) (eaddresses + ord - min_ordinal));
939 if (!pe_def_file->exports[s].flag_noname)
941 char *ename = pe_def_file->exports[s].name;
942 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
944 strcpy (enamestr, ename);
945 enamestr += strlen (enamestr) + 1;
946 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
948 pe_def_file->exports[s].hint = hint++;
955 static struct sec *current_sec;
958 pe_walk_relocs_of_symbol (info, name, cb)
959 struct bfd_link_info *info;
961 int (*cb) (arelent *);
966 for (b = info->input_bfds; b; b = b->link_next)
969 int relsize, nrelocs, i;
971 for (s = b->sections; s; s = s->next)
975 int flags = bfd_get_section_flags (b, s);
977 /* Skip discarded linkonce sections */
978 if (flags & SEC_LINK_ONCE
979 && s->output_section == bfd_abs_section_ptr)
984 symsize = bfd_get_symtab_upper_bound (b);
985 symbols = (asymbol **) xmalloc (symsize);
986 nsyms = bfd_canonicalize_symtab (b, symbols);
988 relsize = bfd_get_reloc_upper_bound (b, s);
989 relocs = (arelent **) xmalloc ((size_t) relsize);
990 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
992 for (i = 0; i < nrelocs; i++)
994 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
995 if (!strcmp(name,sym->name)) cb(relocs[i]);
998 /* Warning: the allocated symbols are remembered in BFD and reused
999 later, so don't free them! */
1000 /* free (symbols); */
1005 /************************************************************************
1007 Gather all the relocations and build the .reloc section
1009 ************************************************************************/
1012 generate_reloc (abfd, info)
1014 struct bfd_link_info *info;
1017 /* For .reloc stuff. */
1018 reloc_data_type *reloc_data;
1019 int total_relocs = 0;
1021 unsigned long sec_page = (unsigned long) (-1);
1022 unsigned long page_ptr, page_count;
1028 for (b = info->input_bfds; b; b = b->link_next)
1029 for (s = b->sections; s; s = s->next)
1030 total_relocs += s->reloc_count;
1033 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1037 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1040 int relsize, nrelocs, i;
1042 for (s = b->sections; s; s = s->next)
1044 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1048 /* If it's not loaded, we don't need to relocate it this way. */
1049 if (!(s->output_section->flags & SEC_LOAD))
1052 /* I don't know why there would be a reloc for these, but I've
1053 seen it happen - DJ */
1054 if (s->output_section == &bfd_abs_section)
1057 if (s->output_section->vma == 0)
1059 /* Huh? Shouldn't happen, but punt if it does. */
1060 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1061 s->output_section->name, s->output_section->index,
1062 s->output_section->flags);
1066 symsize = bfd_get_symtab_upper_bound (b);
1067 symbols = (asymbol **) xmalloc (symsize);
1068 nsyms = bfd_canonicalize_symtab (b, symbols);
1070 relsize = bfd_get_reloc_upper_bound (b, s);
1071 relocs = (arelent **) xmalloc ((size_t) relsize);
1072 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1074 for (i = 0; i < nrelocs; i++)
1076 if (pe_dll_extra_pe_debug)
1078 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1079 printf("rel: %s\n",sym->name);
1081 if (!relocs[i]->howto->pc_relative
1082 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1085 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1086 sym_vma = (relocs[i]->addend
1089 + sym->section->output_offset
1090 + sym->section->output_section->vma);
1091 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1093 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1095 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1096 relocs[i]->howto->rightshift)
1098 case BITS_AND_SHIFT (32, 0):
1099 reloc_data[total_relocs].type = 3;
1102 case BITS_AND_SHIFT (16, 0):
1103 reloc_data[total_relocs].type = 2;
1106 case BITS_AND_SHIFT (16, 16):
1107 reloc_data[total_relocs].type = 4;
1108 /* FIXME: we can't know the symbol's right value
1109 yet, but we probably can safely assume that
1110 CE will relocate us in 64k blocks, so leaving
1112 reloc_data[total_relocs].extra = 0;
1115 case BITS_AND_SHIFT (26, 2):
1116 reloc_data[total_relocs].type = 5;
1120 /* xgettext:c-format */
1121 einfo (_("%XError: %d-bit reloc in dll\n"),
1122 relocs[i]->howto->bitsize);
1128 /* Warning: the allocated symbols are remembered in BFD and
1129 reused later, so don't free them! */
1136 /* At this point, we have total_relocs relocation addresses in
1137 reloc_addresses, which are all suitable for the .reloc section.
1138 We must now create the new sections. */
1140 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1142 for (i = 0; i < total_relocs; i++)
1144 unsigned long this_page = (reloc_data[i].vma >> 12);
1146 if (this_page != sec_page)
1148 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
1150 sec_page = this_page;
1155 if (reloc_data[i].type == 4)
1158 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
1160 reloc_d = (unsigned char *) xmalloc (reloc_sz);
1162 sec_page = (unsigned long) (-1);
1164 page_ptr = (unsigned long) (-1);
1166 for (i = 0; i < total_relocs; i++)
1168 unsigned long rva = reloc_data[i].vma - image_base;
1169 unsigned long this_page = (rva & ~0xfff);
1170 if (this_page != sec_page)
1172 while (reloc_sz & 3)
1173 reloc_d[reloc_sz++] = 0;
1174 if (page_ptr != (unsigned long) (-1))
1175 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1176 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1177 page_ptr = reloc_sz;
1179 sec_page = this_page;
1182 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1183 reloc_d + reloc_sz);
1185 if (reloc_data[i].type == 4)
1187 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1192 while (reloc_sz & 3)
1193 reloc_d[reloc_sz++] = 0;
1194 if (page_ptr != (unsigned long) (-1))
1195 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1196 while (reloc_sz < reloc_s->_raw_size)
1197 reloc_d[reloc_sz++] = 0;
1200 /************************************************************************
1202 Given the exiting def_file structure, print out a .DEF file that
1205 ************************************************************************/
1208 quoteput (s, f, needs_quotes)
1214 for (cp = s; *cp; cp++)
1218 || isspace ((unsigned char) *cp)
1227 if (*s == '"' || *s == '\\')
1239 pe_dll_generate_def_file (pe_out_def_filename)
1240 const char *pe_out_def_filename;
1243 FILE *out = fopen (pe_out_def_filename, "w");
1246 /* xgettext:c-format */
1247 einfo (_("%s: Can't open output def file %s\n"),
1248 program_name, pe_out_def_filename);
1253 if (pe_def_file->name)
1255 if (pe_def_file->is_dll)
1256 fprintf (out, "LIBRARY ");
1258 fprintf (out, "NAME ");
1259 quoteput (pe_def_file->name, out, 1);
1260 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1261 fprintf (out, " BASE=0x%lx",
1262 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1263 fprintf (out, "\n");
1266 if (pe_def_file->description)
1268 fprintf (out, "DESCRIPTION ");
1269 quoteput (pe_def_file->description, out, 1);
1270 fprintf (out, "\n");
1273 if (pe_def_file->version_minor != -1)
1274 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1275 pe_def_file->version_minor);
1276 else if (pe_def_file->version_major != -1)
1277 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1279 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1280 fprintf (out, "\n");
1282 if (pe_def_file->stack_commit != -1)
1283 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1284 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1285 else if (pe_def_file->stack_reserve != -1)
1286 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1287 if (pe_def_file->heap_commit != -1)
1288 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1289 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1290 else if (pe_def_file->heap_reserve != -1)
1291 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1293 if (pe_def_file->num_section_defs > 0)
1295 fprintf (out, "\nSECTIONS\n\n");
1296 for (i = 0; i < pe_def_file->num_section_defs; i++)
1299 quoteput (pe_def_file->section_defs[i].name, out, 0);
1300 if (pe_def_file->section_defs[i].class)
1302 fprintf (out, " CLASS ");
1303 quoteput (pe_def_file->section_defs[i].class, out, 0);
1305 if (pe_def_file->section_defs[i].flag_read)
1306 fprintf (out, " READ");
1307 if (pe_def_file->section_defs[i].flag_write)
1308 fprintf (out, " WRITE");
1309 if (pe_def_file->section_defs[i].flag_execute)
1310 fprintf (out, " EXECUTE");
1311 if (pe_def_file->section_defs[i].flag_shared)
1312 fprintf (out, " SHARED");
1313 fprintf (out, "\n");
1317 if (pe_def_file->num_exports > 0)
1319 fprintf (out, "EXPORTS\n");
1320 for (i = 0; i < pe_def_file->num_exports; i++)
1322 def_file_export *e = pe_def_file->exports + i;
1324 quoteput (e->name, out, 0);
1325 if (e->internal_name && strcmp (e->internal_name, e->name))
1327 fprintf (out, " = ");
1328 quoteput (e->internal_name, out, 0);
1330 if (e->ordinal != -1)
1331 fprintf (out, " @%d", e->ordinal);
1332 if (e->flag_private)
1333 fprintf (out, " PRIVATE");
1334 if (e->flag_constant)
1335 fprintf (out, " CONSTANT");
1337 fprintf (out, " NONAME");
1339 fprintf (out, " DATA");
1341 fprintf (out, "\n");
1345 if (pe_def_file->num_imports > 0)
1347 fprintf (out, "\nIMPORTS\n\n");
1348 for (i = 0; i < pe_def_file->num_imports; i++)
1350 def_file_import *im = pe_def_file->imports + i;
1352 if (im->internal_name
1353 && (!im->name || strcmp (im->internal_name, im->name)))
1355 quoteput (im->internal_name, out, 0);
1356 fprintf (out, " = ");
1358 quoteput (im->module->name, out, 0);
1361 quoteput (im->name, out, 0);
1363 fprintf (out, "%d", im->ordinal);
1364 fprintf (out, "\n");
1369 fprintf (out, _("; no contents available\n"));
1371 if (fclose (out) == EOF)
1373 /* xgettext:c-format */
1374 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1378 /************************************************************************
1380 Generate the import library
1382 ************************************************************************/
1384 static asymbol **symtab;
1387 static const char *dll_filename;
1388 static char *dll_symname;
1390 #define UNDSEC (asection *) &bfd_und_section
1393 quick_section (abfd, name, flags, align)
1402 sec = bfd_make_section_old_way (abfd, name);
1403 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1404 bfd_set_section_alignment (abfd, sec, align);
1405 /* Remember to undo this before trying to link internally! */
1406 sec->output_section = sec;
1408 sym = bfd_make_empty_symbol (abfd);
1409 symtab[symptr++] = sym;
1410 sym->name = sec->name;
1412 sym->flags = BSF_LOCAL;
1419 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1429 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1433 sym = bfd_make_empty_symbol (abfd);
1438 symtab[symptr++] = sym;
1441 static arelent *reltab = 0;
1442 static int relcount = 0, relsize = 0;
1445 quick_reloc (abfd, address, which_howto, symidx)
1451 if (relcount >= (relsize - 1))
1455 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1457 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1459 reltab[relcount].address = address;
1460 reltab[relcount].addend = 0;
1461 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1462 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1467 save_relocs (asection *sec)
1470 sec->relocation = reltab;
1471 sec->reloc_count = relcount;
1472 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1473 for (i = 0; i < relcount; i++)
1474 sec->orelocation[i] = sec->relocation + i;
1475 sec->orelocation[relcount] = 0;
1476 sec->flags |= SEC_RELOC;
1478 relcount = relsize = 0;
1483 * .global __head_my_dll
1488 * .rva __my_dll_iname
1504 asection *id2, *id5, *id4;
1505 unsigned char *d2, *d5, *d4;
1509 oname = (char *) xmalloc (20);
1510 sprintf (oname, "d%06d.o", tmp_seq);
1513 abfd = bfd_create (oname, parent);
1514 bfd_find_target (pe_details->object_target, abfd);
1515 bfd_make_writable (abfd);
1517 bfd_set_format (abfd, bfd_object);
1518 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1521 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1522 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1523 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1524 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1525 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1526 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1528 /* OK, pay attention here. I got confused myself looking back at
1529 it. We create a four-byte section to mark the beginning of the
1530 list, and we include an offset of 4 in the section, so that the
1531 pointer to the list points to the *end* of this section, which is
1532 the start of the list of sections from other objects. */
1534 bfd_set_section_size (abfd, id2, 20);
1535 d2 = (unsigned char *) xmalloc (20);
1538 d2[0] = d2[16] = 4; /* reloc addend */
1539 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1540 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1541 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1544 bfd_set_section_size (abfd, id5, 4);
1545 d5 = (unsigned char *) xmalloc (4);
1549 bfd_set_section_size (abfd, id4, 4);
1550 d4 = (unsigned char *) xmalloc (4);
1554 bfd_set_symtab (abfd, symtab, symptr);
1556 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1557 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1558 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1560 bfd_make_readable (abfd);
1570 * .global __my_dll_iname
1579 asection *id4, *id5, *id7;
1580 unsigned char *d4, *d5, *d7;
1585 oname = (char *) xmalloc (20);
1586 sprintf (oname, "d%06d.o", tmp_seq);
1589 abfd = bfd_create (oname, parent);
1590 bfd_find_target (pe_details->object_target, abfd);
1591 bfd_make_writable (abfd);
1593 bfd_set_format (abfd, bfd_object);
1594 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1597 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1598 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1599 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1600 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1601 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1603 bfd_set_section_size (abfd, id4, 4);
1604 d4 = (unsigned char *) xmalloc (4);
1608 bfd_set_section_size (abfd, id5, 4);
1609 d5 = (unsigned char *) xmalloc (4);
1613 len = strlen (dll_filename) + 1;
1616 bfd_set_section_size (abfd, id7, len);
1617 d7 = (unsigned char *) xmalloc (len);
1619 strcpy (d7, dll_filename);
1621 bfd_set_symtab (abfd, symtab, symptr);
1623 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1624 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1625 bfd_set_section_contents (abfd, id7, d7, 0, len);
1627 bfd_make_readable (abfd);
1634 * .global ___imp_function
1635 * .global __imp__function
1637 * jmp *__imp__function:
1640 * .long __head_my_dll
1651 * .asciz "function" xlate? (add underscore, kill at)
1654 static unsigned char jmp_ix86_bytes[] = {
1655 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1664 * .dw __imp_function
1667 static unsigned char jmp_sh_bytes[] = {
1668 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1673 * lui $t0,<high:__imp_function>
1674 * lw $t0,<low:__imp_function>
1679 static unsigned char jmp_mips_bytes[] = {
1680 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1681 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1685 make_one (exp, parent)
1686 def_file_export *exp;
1689 asection *tx, *id7, *id5, *id4, *id6;
1690 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1694 unsigned char *jmp_bytes = NULL;
1695 int jmp_byte_count = 0;
1697 switch (pe_details->pe_arch)
1700 jmp_bytes = jmp_ix86_bytes;
1701 jmp_byte_count = sizeof (jmp_ix86_bytes);
1704 jmp_bytes = jmp_sh_bytes;
1705 jmp_byte_count = sizeof (jmp_sh_bytes);
1708 jmp_bytes = jmp_mips_bytes;
1709 jmp_byte_count = sizeof (jmp_mips_bytes);
1713 oname = (char *) xmalloc (20);
1714 sprintf (oname, "d%06d.o", tmp_seq);
1717 abfd = bfd_create (oname, parent);
1718 bfd_find_target (pe_details->object_target, abfd);
1719 bfd_make_writable (abfd);
1721 bfd_set_format (abfd, bfd_object);
1722 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1725 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1726 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1727 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1728 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1729 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1730 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1731 if (! exp->flag_data)
1732 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1733 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1734 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1735 /* symbol to reference ord/name of imported symbol, used to implement
1737 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL, 0);
1738 if (pe_dll_compat_implib)
1739 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1740 id5, BSF_GLOBAL, 0);
1742 if (! exp->flag_data)
1744 bfd_set_section_size (abfd, tx, jmp_byte_count);
1745 td = (unsigned char *) xmalloc (jmp_byte_count);
1747 memcpy (td, jmp_bytes, jmp_byte_count);
1748 switch (pe_details->pe_arch)
1751 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1754 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1757 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1758 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1759 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1765 bfd_set_section_size (abfd, id7, 4);
1766 d7 = (unsigned char *) xmalloc (4);
1769 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1772 bfd_set_section_size (abfd, id5, 4);
1773 d5 = (unsigned char *) xmalloc (4);
1776 if (exp->flag_noname)
1778 d5[0] = exp->ordinal;
1779 d5[1] = exp->ordinal >> 8;
1784 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1788 bfd_set_section_size (abfd, id4, 4);
1789 d4 = (unsigned char *) xmalloc (4);
1792 if (exp->flag_noname)
1794 d4[0] = exp->ordinal;
1795 d4[1] = exp->ordinal >> 8;
1800 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1804 if (exp->flag_noname)
1807 bfd_set_section_size (abfd, id6, 0);
1811 len = strlen (exp->name) + 3;
1814 bfd_set_section_size (abfd, id6, len);
1815 d6 = (unsigned char *) xmalloc (len);
1817 memset (d6, 0, len);
1818 d6[0] = exp->hint & 0xff;
1819 d6[1] = exp->hint >> 8;
1820 strcpy (d6 + 2, exp->name);
1823 bfd_set_symtab (abfd, symtab, symptr);
1825 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1826 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1827 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1828 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1829 if (!exp->flag_noname)
1830 bfd_set_section_contents (abfd, id6, d6, 0, len);
1832 bfd_make_readable (abfd);
1837 make_singleton_name_thunk (import, parent)
1841 /* name thunks go to idata$4 */
1848 oname = (char *) xmalloc (20);
1849 sprintf (oname, "nmth%06d.o", tmp_seq);
1852 abfd = bfd_create (oname, parent);
1853 bfd_find_target (pe_details->object_target, abfd);
1854 bfd_make_writable (abfd);
1856 bfd_set_format (abfd, bfd_object);
1857 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1860 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1861 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1862 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1863 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1865 bfd_set_section_size (abfd, id4, 8);
1866 d4 = (unsigned char *) xmalloc (4);
1869 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1872 bfd_set_symtab (abfd, symtab, symptr);
1874 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1876 bfd_make_readable (abfd);
1881 make_import_fixup_mark (rel)
1884 /* we convert reloc to symbol, for later reference */
1886 static char *fixup_name = NULL;
1887 static int buffer_len = 0;
1889 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
1891 bfd *abfd = bfd_asymbol_bfd (sym);
1892 struct coff_link_hash_entry *myh = NULL;
1896 fixup_name = (char *) xmalloc (384);
1900 if (strlen (sym->name) + 25 > buffer_len)
1901 /* assume 25 chars for "__fu" + counter + "_". If counter is
1902 bigger than 20 digits long, we've got worse problems than
1903 overflowing this buffer... */
1906 /* new buffer size is length of symbol, plus 25, but then
1907 rounded up to the nearest multiple of 128 */
1908 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1909 fixup_name = (char *) xmalloc (buffer_len);
1912 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
1914 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
1915 current_sec, /* sym->section, */
1916 rel->address, NULL, true, false,
1917 (struct bfd_link_hash_entry **) &myh);
1920 printf("type:%d\n",myh->type);
1921 printf("%s\n",myh->root.u.def.section->name);
1929 * .rva __nm_thnk_SYM (singleton thunk with name of func)
1932 * .rva __my_dll_iname (name of dll)
1933 * .rva __fuNN_SYM (pointer to reference (address) in text)
1938 make_import_fixup_entry (name, fixup_name, dll_symname,parent)
1949 oname = (char *) xmalloc (20);
1950 sprintf (oname, "fu%06d.o", tmp_seq);
1953 abfd = bfd_create (oname, parent);
1954 bfd_find_target (pe_details->object_target, abfd);
1955 bfd_make_writable (abfd);
1957 bfd_set_format (abfd, bfd_object);
1958 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1961 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1962 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
1964 quick_symbol (abfd, U("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1966 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
1967 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1968 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
1970 bfd_set_section_size (abfd, id3, 20);
1971 d3 = (unsigned char *) xmalloc (20);
1975 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
1976 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
1977 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
1980 bfd_set_symtab (abfd, symtab, symptr);
1982 bfd_set_section_contents (abfd, id3, d3, 0, 20);
1984 bfd_make_readable (abfd);
1989 pe_create_import_fixup (rel)
1993 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
1994 struct bfd_link_hash_entry *name_thunk_sym;
1995 CONST char *name = sym->name;
1996 char *fixup_name = make_import_fixup_mark (rel);
1998 sprintf (buf, U ("_nm_thnk_%s"), name);
2000 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2002 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2004 bfd *b = make_singleton_name_thunk (name, output_bfd);
2005 add_bfd_to_link (b, b->filename, &link_info);
2007 /* If we ever use autoimport, we have to cast text section writable */
2008 config.text_read_only = false;
2012 extern char *pe_data_import_dll;
2013 bfd *b = make_import_fixup_entry (name, fixup_name, pe_data_import_dll,
2015 add_bfd_to_link (b, b->filename, &link_info);
2021 pe_dll_generate_implib (def, impfilename)
2023 const char *impfilename;
2031 dll_filename = (def->name) ? def->name : dll_name;
2032 dll_symname = xstrdup (dll_filename);
2033 for (i = 0; dll_symname[i]; i++)
2034 if (!isalnum ((unsigned char) dll_symname[i]))
2035 dll_symname[i] = '_';
2037 unlink (impfilename);
2039 outarch = bfd_openw (impfilename, 0);
2043 /* xgettext:c-format */
2044 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2048 /* xgettext:c-format */
2049 einfo (_("Creating library file: %s\n"), impfilename);
2051 bfd_set_format (outarch, bfd_archive);
2052 outarch->has_armap = 1;
2054 /* Work out a reasonable size of things to put onto one line. */
2056 ar_head = make_head (outarch);
2058 for (i = 0; i < def->num_exports; i++)
2060 /* The import library doesn't know about the internal name. */
2061 char *internal = def->exports[i].internal_name;
2063 def->exports[i].internal_name = def->exports[i].name;
2064 n = make_one (def->exports + i, outarch);
2067 def->exports[i].internal_name = internal;
2070 ar_tail = make_tail (outarch);
2072 if (ar_head == NULL || ar_tail == NULL)
2075 /* Now stick them all into the archive. */
2077 ar_head->next = head;
2078 ar_tail->next = ar_head;
2081 if (! bfd_set_archive_head (outarch, head))
2082 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2084 if (! bfd_close (outarch))
2085 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2087 while (head != NULL)
2089 bfd *n = head->next;
2096 add_bfd_to_link (abfd, name, link_info)
2099 struct bfd_link_info *link_info;
2101 lang_input_statement_type *fake_file;
2102 fake_file = lang_add_input_file (name,
2103 lang_input_file_is_fake_enum,
2105 fake_file->the_bfd = abfd;
2106 ldlang_add_file (fake_file);
2107 if (!bfd_link_add_symbols (abfd, link_info))
2108 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2112 pe_process_import_defs (output_bfd, link_info)
2114 struct bfd_link_info *link_info;
2116 def_file_module *module;
2117 pe_dll_id_target (bfd_get_target (output_bfd));
2122 for (module = pe_def_file->modules; module; module = module->next)
2126 dll_filename = module->name;
2127 dll_symname = xstrdup (module->name);
2128 for (i = 0; dll_symname[i]; i++)
2129 if (!isalnum (dll_symname[i]))
2130 dll_symname[i] = '_';
2134 for (i = 0; i < pe_def_file->num_imports; i++)
2135 if (pe_def_file->imports[i].module == module)
2137 def_file_export exp;
2138 struct bfd_link_hash_entry *blhe;
2140 /* See if we need this import. */
2141 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2142 sprintf (name, "%s%s", U (""), pe_def_file->imports[i].internal_name);
2143 blhe = bfd_link_hash_lookup (link_info->hash, name,
2144 false, false, false);
2145 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2147 sprintf (name, "%s%s", U ("_imp__"),
2148 pe_def_file->imports[i].internal_name);
2149 blhe = bfd_link_hash_lookup (link_info->hash, name,
2150 false, false, false);
2153 if (blhe && blhe->type == bfd_link_hash_undefined)
2159 bfd *ar_head = make_head (output_bfd);
2160 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2163 exp.internal_name = pe_def_file->imports[i].internal_name;
2164 exp.name = pe_def_file->imports[i].name;
2165 exp.ordinal = pe_def_file->imports[i].ordinal;
2166 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2167 exp.flag_private = 0;
2168 exp.flag_constant = 0;
2170 exp.flag_noname = exp.name ? 0 : 1;
2171 one = make_one (&exp, output_bfd);
2172 add_bfd_to_link (one, one->filename, link_info);
2177 bfd *ar_tail = make_tail (output_bfd);
2178 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2185 /************************************************************************
2187 We were handed a *.DLL file. Parse it and turn it into a set of
2188 IMPORTS directives in the def file. Return true if the file was
2189 handled, false if not.
2191 ************************************************************************/
2194 pe_get16 (abfd, where)
2199 bfd_seek (abfd, where, SEEK_SET);
2200 bfd_read (b, 1, 2, abfd);
2201 return b[0] + (b[1] << 8);
2205 pe_get32 (abfd, where)
2210 bfd_seek (abfd, where, SEEK_SET);
2211 bfd_read (b, 1, 4, abfd);
2212 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2215 #if 0 /* This is not currently used. */
2221 unsigned char *b = ptr;
2222 return b[0] + (b[1] << 8);
2231 unsigned char *b = ptr;
2232 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2236 pe_implied_import_dll (filename)
2237 const char *filename;
2240 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2241 unsigned long export_rva, export_size, nsections, secptr, expptr;
2242 unsigned char *expdata, *erva;
2243 unsigned long name_rvas, ordinals, nexp, ordbase;
2244 const char *dll_name;
2246 /* No, I can't use bfd here. kernel32.dll puts its export table in
2247 the middle of the .rdata section. */
2249 dll = bfd_openr (filename, pe_details->target_name);
2252 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2255 /* PEI dlls seem to be bfd_objects. */
2256 if (!bfd_check_format (dll, bfd_object))
2258 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2262 dll_name = filename;
2263 for (i = 0; filename[i]; i++)
2264 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
2265 dll_name = filename + i + 1;
2267 pe_header_offset = pe_get32 (dll, 0x3c);
2268 opthdr_ofs = pe_header_offset + 4 + 20;
2269 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2270 if (num_entries < 1) /* no exports */
2272 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2273 export_size = pe_get32 (dll, opthdr_ofs + 100);
2274 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2275 secptr = (pe_header_offset + 4 + 20 +
2276 pe_get16 (dll, pe_header_offset + 4 + 16));
2278 for (i = 0; i < nsections; i++)
2281 unsigned long secptr1 = secptr + 40 * i;
2282 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2283 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2284 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2285 bfd_seek (dll, secptr1, SEEK_SET);
2286 bfd_read (sname, 1, 8, dll);
2287 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2289 expptr = fptr + (export_rva - vaddr);
2290 if (export_rva + export_size > vaddr + vsize)
2291 export_size = vsize - (export_rva - vaddr);
2296 expdata = (unsigned char *) xmalloc (export_size);
2297 bfd_seek (dll, expptr, SEEK_SET);
2298 bfd_read (expdata, 1, export_size, dll);
2299 erva = expdata - export_rva;
2301 if (pe_def_file == 0)
2302 pe_def_file = def_file_empty ();
2304 nexp = pe_as32 (expdata + 24);
2305 name_rvas = pe_as32 (expdata + 32);
2306 ordinals = pe_as32 (expdata + 36);
2307 ordbase = pe_as32 (expdata + 16);
2308 for (i = 0; i < nexp; i++)
2310 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2311 def_file_import *imp;
2312 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
2319 /************************************************************************
2321 These are the main functions, called from the emulation. The first
2322 is called after the bfds are read, so we can guess at how much space
2323 we need. The second is called after everything is placed, so we
2324 can put the right values in place.
2326 ************************************************************************/
2329 pe_dll_build_sections (abfd, info)
2331 struct bfd_link_info *info;
2333 pe_dll_id_target (bfd_get_target (abfd));
2334 process_def_file (abfd, info);
2336 generate_edata (abfd, info);
2337 build_filler_bfd (1);
2341 pe_exe_build_sections (abfd, info)
2343 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2345 pe_dll_id_target (bfd_get_target (abfd));
2346 build_filler_bfd (0);
2350 pe_dll_fill_sections (abfd, info)
2352 struct bfd_link_info *info;
2354 pe_dll_id_target (bfd_get_target (abfd));
2355 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2357 generate_reloc (abfd, info);
2360 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2362 /* Resize the sections. */
2363 lang_size_sections (stat_ptr->head, abs_output_section,
2364 &stat_ptr->head, 0, (bfd_vma) 0, false);
2366 /* Redo special stuff. */
2367 ldemul_after_allocation ();
2369 /* Do the assignments again. */
2370 lang_do_assignments (stat_ptr->head,
2372 (fill_type) 0, (bfd_vma) 0);
2375 fill_edata (abfd, info);
2377 pe_data (abfd)->dll = 1;
2379 edata_s->contents = edata_d;
2380 reloc_s->contents = reloc_d;
2384 pe_exe_fill_sections (abfd, info)
2386 struct bfd_link_info *info;
2388 pe_dll_id_target (bfd_get_target (abfd));
2389 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2391 generate_reloc (abfd, info);
2394 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2396 /* Resize the sections. */
2397 lang_size_sections (stat_ptr->head, abs_output_section,
2398 &stat_ptr->head, 0, (bfd_vma) 0, false);
2400 /* Redo special stuff. */
2401 ldemul_after_allocation ();
2403 /* Do the assignments again. */
2404 lang_do_assignments (stat_ptr->head,
2406 (fill_type) 0, (bfd_vma) 0);
2408 reloc_s->contents = reloc_d;