1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of GLD, the Gnu Linker.
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
26 #include "libiberty.h"
27 #include "safe-ctype.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
46 #define PE_IDATA4_SIZE 8
47 #define PE_IDATA5_SIZE 8
50 #define AOUTSZ PEPAOUTSZ
51 #define PEAOUTHDR PEPAOUTHDR
59 #ifndef PE_IDATA4_SIZE
60 #define PE_IDATA4_SIZE 4
63 #ifndef PE_IDATA5_SIZE
64 #define PE_IDATA5_SIZE 4
67 /* This file turns a regular Windows PE image into a DLL. Because of
68 the complexity of this operation, it has been broken down into a
69 number of separate modules which are all called by the main function
70 at the end of this file. This function is not re-entrant and is
71 normally only called once, so static variables are used to reduce
72 the number of parameters and return values required.
74 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
76 /* Auto-import feature by Paul Sokolovsky
80 1. With this feature on, DLL clients can import variables from DLL
81 without any concern from their side (for example, without any source
84 2. This is done completely in bounds of the PE specification (to be fair,
85 there's a place where it pokes nose out of, but in practice it works).
86 So, resulting module can be used with any other PE compiler/linker.
88 3. Auto-import is fully compatible with standard import method and they
89 can be mixed together.
91 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
92 reference to it; load time: negligible; virtual/physical memory: should be
93 less than effect of DLL relocation, and I sincerely hope it doesn't affect
94 DLL sharability (too much).
98 The obvious and only way to get rid of dllimport insanity is to make client
99 access variable directly in the DLL, bypassing extra dereference. I.e.,
100 whenever client contains something like
104 address of dll_var in the command should be relocated to point into loaded
105 DLL. The aim is to make OS loader do so, and than make ld help with that.
106 Import section of PE made following way: there's a vector of structures
107 each describing imports from particular DLL. Each such structure points
108 to two other parallel vectors: one holding imported names, and one which
109 will hold address of corresponding imported name. So, the solution is
110 de-vectorize these structures, making import locations be sparse and
111 pointing directly into code. Before continuing, it is worth a note that,
112 while authors strives to make PE act ELF-like, there're some other people
113 make ELF act PE-like: elfvector, ;-) .
117 For each reference of data symbol to be imported from DLL (to set of which
118 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
119 import fixup entry is generated. That entry is of type
120 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
121 fixup entry contains pointer to symbol's address within .text section
122 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
123 (so, DLL name is referenced by multiple entries), and pointer to symbol
124 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
125 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
126 containing imported name. Here comes that "om the edge" problem mentioned
127 above: PE specification rambles that name vector (OriginalFirstThunk)
128 should run in parallel with addresses vector (FirstThunk), i.e. that they
129 should have same number of elements and terminated with zero. We violate
130 this, since FirstThunk points directly into machine code. But in practice,
131 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
132 puts addresses to FirstThunk, not something else. It once again should be
133 noted that dll and symbol name structures are reused across fixup entries
134 and should be there anyway to support standard import stuff, so sustained
135 overhead is 20 bytes per reference. Other question is whether having several
136 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
137 done even by native compiler/linker (libth32's functions are in fact reside
138 in windows9x kernel32.dll, so if you use it, you have two
139 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
140 referencing the same PE structures several times is valid. The answer is why
141 not, prohibiting that (detecting violation) would require more work on
142 behalf of loader than not doing it.
144 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
146 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
148 /* For emultempl/pe.em. */
150 def_file * pe_def_file = 0;
151 int pe_dll_export_everything = 0;
152 int pe_dll_do_default_excludes = 1;
153 int pe_dll_kill_ats = 0;
154 int pe_dll_stdcall_aliases = 0;
155 int pe_dll_warn_dup_exports = 0;
156 int pe_dll_compat_implib = 0;
157 int pe_dll_extra_pe_debug = 0;
159 /* Static variables and types. */
161 static bfd_vma image_base;
162 static bfd *filler_bfd;
163 static struct bfd_section *edata_s, *reloc_s;
164 static unsigned char *edata_d, *reloc_d;
165 static size_t edata_sz, reloc_sz;
166 static int runtime_pseudo_relocs_created = 0;
173 autofilter_entry_type;
179 unsigned int imagebase_reloc;
182 bfd_boolean underscored;
183 autofilter_entry_type* autofilter_symbollist;
187 static autofilter_entry_type autofilter_symbollist_generic[] =
189 { STRING_COMMA_LEN (".text") },
190 /* Entry point symbols. */
191 { STRING_COMMA_LEN ("DllMain") },
192 { STRING_COMMA_LEN ("DllMainCRTStartup") },
193 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
194 /* Runtime pseudo-reloc. */
195 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
196 { STRING_COMMA_LEN ("do_pseudo_reloc") },
197 { STRING_COMMA_LEN (NULL) }
200 static autofilter_entry_type autofilter_symbollist_i386[] =
202 { STRING_COMMA_LEN (".text") },
203 /* Entry point symbols, and entry hooks. */
204 { STRING_COMMA_LEN ("cygwin_crt0") },
205 { STRING_COMMA_LEN ("DllMain@12") },
206 { STRING_COMMA_LEN ("DllEntryPoint@0") },
207 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
208 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
209 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
210 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
211 { STRING_COMMA_LEN ("cygwin_attach_dll") },
212 { STRING_COMMA_LEN ("cygwin_premain0") },
213 { STRING_COMMA_LEN ("cygwin_premain1") },
214 { STRING_COMMA_LEN ("cygwin_premain2") },
215 { STRING_COMMA_LEN ("cygwin_premain3") },
216 /* Runtime pseudo-reloc. */
217 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
218 { STRING_COMMA_LEN ("do_pseudo_reloc") },
219 /* Global vars that should not be exported. */
220 { STRING_COMMA_LEN ("impure_ptr") },
221 { STRING_COMMA_LEN ("_impure_ptr") },
222 { STRING_COMMA_LEN ("_fmode") },
223 { STRING_COMMA_LEN ("environ") },
224 { STRING_COMMA_LEN (NULL) }
227 #define PE_ARCH_i386 1
229 #define PE_ARCH_mips 3
230 #define PE_ARCH_arm 4
231 #define PE_ARCH_arm_epoc 5
232 #define PE_ARCH_arm_wince 6
234 static pe_details_type pe_detail_list[] =
249 autofilter_symbollist_i386
254 16 /* R_SH_IMAGEBASE */,
258 autofilter_symbollist_generic
267 autofilter_symbollist_generic
276 autofilter_symbollist_generic
279 "epoc-pei-arm-little",
280 "epoc-pe-arm-little",
285 autofilter_symbollist_generic
288 "pei-arm-wince-little",
289 "pe-arm-wince-little",
290 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
294 autofilter_symbollist_generic
296 { NULL, NULL, 0, 0, 0, FALSE, NULL }
299 static pe_details_type *pe_details;
301 /* Do not specify library suffix explicitly, to allow for dllized versions. */
302 static autofilter_entry_type autofilter_liblist[] =
304 { STRING_COMMA_LEN ("libcegcc") },
305 { STRING_COMMA_LEN ("libcygwin") },
306 { STRING_COMMA_LEN ("libgcc") },
307 { STRING_COMMA_LEN ("libstdc++") },
308 { STRING_COMMA_LEN ("libmingw32") },
309 { STRING_COMMA_LEN ("libmingwex") },
310 { STRING_COMMA_LEN ("libg2c") },
311 { STRING_COMMA_LEN ("libsupc++") },
312 { STRING_COMMA_LEN ("libobjc") },
313 { STRING_COMMA_LEN ("libgcj") },
314 { STRING_COMMA_LEN (NULL) }
317 static autofilter_entry_type autofilter_objlist[] =
319 { STRING_COMMA_LEN ("crt0.o") },
320 { STRING_COMMA_LEN ("crt1.o") },
321 { STRING_COMMA_LEN ("crt2.o") },
322 { STRING_COMMA_LEN ("dllcrt1.o") },
323 { STRING_COMMA_LEN ("dllcrt2.o") },
324 { STRING_COMMA_LEN ("gcrt0.o") },
325 { STRING_COMMA_LEN ("gcrt1.o") },
326 { STRING_COMMA_LEN ("gcrt2.o") },
327 { STRING_COMMA_LEN ("crtbegin.o") },
328 { STRING_COMMA_LEN ("crtend.o") },
329 { STRING_COMMA_LEN (NULL) }
332 static autofilter_entry_type autofilter_symbolprefixlist[] =
334 { STRING_COMMA_LEN ("__imp_") },
335 /* Do __imp_ explicitly to save time. */
336 { STRING_COMMA_LEN ("__rtti_") },
337 /* Don't re-export auto-imported symbols. */
338 { STRING_COMMA_LEN ("_nm_") },
339 { STRING_COMMA_LEN ("__builtin_") },
340 /* Don't export symbols specifying internal DLL layout. */
341 { STRING_COMMA_LEN ("_head_") },
342 { STRING_COMMA_LEN (NULL) }
345 static autofilter_entry_type autofilter_symbolsuffixlist[] =
347 { STRING_COMMA_LEN ("_iname") },
348 { STRING_COMMA_LEN (NULL) }
351 #define U(str) (pe_details->underscored ? "_" str : str)
354 pe_dll_id_target (const char *target)
358 for (i = 0; pe_detail_list[i].target_name; i++)
359 if (strcmp (pe_detail_list[i].target_name, target) == 0
360 || strcmp (pe_detail_list[i].object_target, target) == 0)
362 pe_details = pe_detail_list + i;
365 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
369 /* Helper functions for qsort. Relocs must be sorted so that we can write
370 them out by pages. */
381 reloc_sort (const void *va, const void *vb)
383 bfd_vma a = ((const reloc_data_type *) va)->vma;
384 bfd_vma b = ((const reloc_data_type *) vb)->vma;
386 return (a > b) ? 1 : ((a < b) ? -1 : 0);
390 pe_export_sort (const void *va, const void *vb)
392 const def_file_export *a = va;
393 const def_file_export *b = vb;
395 return strcmp (a->name, b->name);
398 /* Read and process the .DEF file. */
400 /* These correspond to the entries in pe_def_file->exports[]. I use
401 exported_symbol_sections[i] to tag whether or not the symbol was
402 defined, since we can't export symbols we don't have. */
404 static bfd_vma *exported_symbol_offsets;
405 static struct bfd_section **exported_symbol_sections;
406 static int export_table_size;
407 static int count_exported;
408 static int count_exported_byname;
409 static int count_with_ordinals;
410 static const char *dll_name;
411 static int min_ordinal, max_ordinal;
412 static int *exported_symbols;
414 typedef struct exclude_list_struct
417 struct exclude_list_struct *next;
422 static struct exclude_list_struct *excludes = 0;
425 pe_dll_add_excludes (const char *new_excludes, const int type)
428 char *exclude_string;
430 local_copy = xstrdup (new_excludes);
432 exclude_string = strtok (local_copy, ",:");
433 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
435 struct exclude_list_struct *new_exclude;
437 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
438 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
439 strcpy (new_exclude->string, exclude_string);
440 new_exclude->type = type;
441 new_exclude->next = excludes;
442 excludes = new_exclude;
449 /* abfd is a bfd containing n (or NULL)
450 It can be used for contextual checks. */
453 auto_export (bfd *abfd, def_file *d, const char *n)
456 struct exclude_list_struct *ex;
457 autofilter_entry_type *afptr;
458 const char * libname = 0;
459 if (abfd && abfd->my_archive)
460 libname = lbasename (abfd->my_archive->filename);
462 /* We should not re-export imported stuff. */
463 if (CONST_STRNEQ (n, "_imp_"))
466 for (i = 0; i < d->num_exports; i++)
467 if (strcmp (d->exports[i].name, n) == 0)
470 if (pe_dll_do_default_excludes)
475 if (pe_dll_extra_pe_debug)
476 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
477 n, abfd, abfd->my_archive);
479 /* First of all, make context checks:
480 Don't export anything from standard libs. */
483 afptr = autofilter_liblist;
487 if (strncmp (libname, afptr->name, afptr->len) == 0 )
493 /* Next, exclude symbols from certain startup objects. */
495 if (abfd && (p = lbasename (abfd->filename)))
497 afptr = autofilter_objlist;
500 if (strcmp (p, afptr->name) == 0)
506 /* Don't try to blindly exclude all symbols
507 that begin with '__'; this was tried and
508 it is too restrictive. Instead we have
509 a target specific list to use: */
510 afptr = pe_details->autofilter_symbollist;
514 if (strcmp (n, afptr->name) == 0)
520 /* Next, exclude symbols starting with ... */
521 afptr = autofilter_symbolprefixlist;
524 if (strncmp (n, afptr->name, afptr->len) == 0)
530 /* Finally, exclude symbols ending with ... */
532 afptr = autofilter_symbolsuffixlist;
535 if ((len >= afptr->len)
536 /* Add 1 to insure match with trailing '\0'. */
537 && strncmp (n + len - afptr->len, afptr->name,
538 afptr->len + 1) == 0)
545 for (ex = excludes; ex; ex = ex->next)
547 if (ex->type == 1) /* exclude-libs */
550 && ((strcmp (libname, ex->string) == 0)
551 || (strcasecmp ("ALL", ex->string) == 0)))
554 else if (strcmp (n, ex->string) == 0)
562 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
565 struct bfd_link_hash_entry *blhe;
567 struct bfd_section *s;
568 def_file_export *e = 0;
571 pe_def_file = def_file_empty ();
573 /* First, run around to all the objects looking for the .drectve
574 sections, and push those into the def file too. */
575 for (b = info->input_bfds; b; b = b->link_next)
577 s = bfd_get_section_by_name (b, ".drectve");
581 char *buf = xmalloc (size);
583 bfd_get_section_contents (b, s, buf, 0, size);
584 def_file_add_directive (pe_def_file, buf, size);
589 /* If we are not building a DLL, when there are no exports
590 we do not build an export table at all. */
591 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
595 /* Now, maybe export everything else the default way. */
596 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
598 for (b = info->input_bfds; b; b = b->link_next)
603 symsize = bfd_get_symtab_upper_bound (b);
604 symbols = xmalloc (symsize);
605 nsyms = bfd_canonicalize_symtab (b, symbols);
607 for (j = 0; j < nsyms; j++)
609 /* We should export symbols which are either global or not
610 anything at all. (.bss data is the latter)
611 We should not export undefined symbols. */
612 if (symbols[j]->section != &bfd_und_section
613 && ((symbols[j]->flags & BSF_GLOBAL)
614 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
616 const char *sn = symbols[j]->name;
618 /* We should not re-export imported stuff. */
620 char *name = xmalloc (strlen (sn) + 2 + 6);
621 sprintf (name, "%s%s", U("_imp_"), sn);
623 blhe = bfd_link_hash_lookup (info->hash, name,
624 FALSE, FALSE, FALSE);
627 if (blhe && blhe->type == bfd_link_hash_defined)
634 if (auto_export (b, pe_def_file, sn))
637 p=def_file_add_export (pe_def_file, sn, 0, -1);
638 /* Fill data flag properly, from dlltool.c. */
639 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
647 #define NE pe_def_file->num_exports
649 /* Canonicalize the export list. */
652 for (i = 0; i < NE; i++)
654 if (strchr (pe_def_file->exports[i].name, '@'))
656 /* This will preserve internal_name, which may have been
657 pointing to the same memory as name, or might not
659 int lead_at = (*pe_def_file->exports[i].name == '@');
660 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
661 char *tmp_at = strchr (tmp, '@');
666 einfo (_("%XCannot export %s: invalid export name\n"),
667 pe_def_file->exports[i].name);
668 pe_def_file->exports[i].name = tmp;
673 if (pe_dll_stdcall_aliases)
675 for (i = 0; i < NE; i++)
677 if (strchr (pe_def_file->exports[i].name, '@'))
679 int lead_at = (*pe_def_file->exports[i].name == '@');
680 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
682 *(strchr (tmp, '@')) = 0;
683 if (auto_export (NULL, pe_def_file, tmp))
684 def_file_add_export (pe_def_file, tmp,
685 pe_def_file->exports[i].internal_name,
693 /* Convenience, but watch out for it changing. */
694 e = pe_def_file->exports;
696 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
697 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
699 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
703 count_exported_byname = 0;
704 count_with_ordinals = 0;
706 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
708 for (i = 0, j = 0; i < NE; i++)
710 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
712 /* This is a duplicate. */
713 if (e[j - 1].ordinal != -1
714 && e[i].ordinal != -1
715 && e[j - 1].ordinal != e[i].ordinal)
717 if (pe_dll_warn_dup_exports)
718 /* xgettext:c-format */
719 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
720 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
724 if (pe_dll_warn_dup_exports)
725 /* xgettext:c-format */
726 einfo (_("Warning, duplicate EXPORT: %s\n"),
730 if (e[i].ordinal != -1)
731 e[j - 1].ordinal = e[i].ordinal;
732 e[j - 1].flag_private |= e[i].flag_private;
733 e[j - 1].flag_constant |= e[i].flag_constant;
734 e[j - 1].flag_noname |= e[i].flag_noname;
735 e[j - 1].flag_data |= e[i].flag_data;
744 pe_def_file->num_exports = j; /* == NE */
746 for (i = 0; i < NE; i++)
750 /* Check for forward exports */
751 if (strchr (pe_def_file->exports[i].internal_name, '.'))
754 if (!pe_def_file->exports[i].flag_noname)
755 count_exported_byname++;
757 pe_def_file->exports[i].flag_forward = 1;
759 if (pe_def_file->exports[i].ordinal != -1)
761 if (max_ordinal < pe_def_file->exports[i].ordinal)
762 max_ordinal = pe_def_file->exports[i].ordinal;
763 if (min_ordinal > pe_def_file->exports[i].ordinal)
764 min_ordinal = pe_def_file->exports[i].ordinal;
765 count_with_ordinals++;
771 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
772 if (pe_details->underscored
773 && (*pe_def_file->exports[i].internal_name != '@'))
776 strcpy (name + 1, pe_def_file->exports[i].internal_name);
779 strcpy (name, pe_def_file->exports[i].internal_name);
781 blhe = bfd_link_hash_lookup (info->hash,
786 && (blhe->type == bfd_link_hash_defined
787 || (blhe->type == bfd_link_hash_common)))
790 if (!pe_def_file->exports[i].flag_noname)
791 count_exported_byname++;
793 /* Only fill in the sections. The actual offsets are computed
794 in fill_exported_offsets() after common symbols are laid
796 if (blhe->type == bfd_link_hash_defined)
797 exported_symbol_sections[i] = blhe->u.def.section;
799 exported_symbol_sections[i] = blhe->u.c.p->section;
801 if (pe_def_file->exports[i].ordinal != -1)
803 if (max_ordinal < pe_def_file->exports[i].ordinal)
804 max_ordinal = pe_def_file->exports[i].ordinal;
805 if (min_ordinal > pe_def_file->exports[i].ordinal)
806 min_ordinal = pe_def_file->exports[i].ordinal;
807 count_with_ordinals++;
810 else if (blhe && blhe->type == bfd_link_hash_undefined)
812 /* xgettext:c-format */
813 einfo (_("%XCannot export %s: symbol not defined\n"),
814 pe_def_file->exports[i].internal_name);
818 /* xgettext:c-format */
819 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
820 pe_def_file->exports[i].internal_name,
821 blhe->type, bfd_link_hash_defined);
825 /* xgettext:c-format */
826 einfo (_("%XCannot export %s: symbol not found\n"),
827 pe_def_file->exports[i].internal_name);
833 /* Build the bfd that will contain .edata and .reloc sections. */
836 build_filler_bfd (int include_edata)
838 lang_input_statement_type *filler_file;
839 filler_file = lang_add_input_file ("dll stuff",
840 lang_input_file_is_fake_enum,
842 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
843 if (filler_bfd == NULL
844 || !bfd_set_arch_mach (filler_bfd,
845 bfd_get_arch (output_bfd),
846 bfd_get_mach (output_bfd)))
848 einfo ("%X%P: can not create BFD: %E\n");
854 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
856 || !bfd_set_section_flags (filler_bfd, edata_s,
863 einfo ("%X%P: can not create .edata section: %E\n");
866 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
869 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
871 || !bfd_set_section_flags (filler_bfd, reloc_s,
878 einfo ("%X%P: can not create .reloc section: %E\n");
882 bfd_set_section_size (filler_bfd, reloc_s, 0);
884 ldlang_add_file (filler_file);
887 /* Gather all the exported symbols and build the .edata section. */
890 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
893 int name_table_size = 0;
896 /* First, we need to know how many exported symbols there are,
897 and what the range of ordinals is. */
898 if (pe_def_file->name)
899 dll_name = pe_def_file->name;
902 dll_name = abfd->filename;
904 for (dlnp = dll_name; *dlnp; dlnp++)
905 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
909 if (count_with_ordinals && max_ordinal > count_exported)
911 if (min_ordinal > max_ordinal - count_exported + 1)
912 min_ordinal = max_ordinal - count_exported + 1;
917 max_ordinal = count_exported;
920 export_table_size = max_ordinal - min_ordinal + 1;
921 exported_symbols = xmalloc (export_table_size * sizeof (int));
922 for (i = 0; i < export_table_size; i++)
923 exported_symbols[i] = -1;
925 /* Now we need to assign ordinals to those that don't have them. */
926 for (i = 0; i < NE; i++)
928 if (exported_symbol_sections[i] ||
929 pe_def_file->exports[i].flag_forward)
931 if (pe_def_file->exports[i].ordinal != -1)
933 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
934 int pi = exported_symbols[ei];
938 /* xgettext:c-format */
939 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
940 pe_def_file->exports[i].ordinal,
941 pe_def_file->exports[i].name,
942 pe_def_file->exports[pi].name);
944 exported_symbols[ei] = i;
946 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
949 /* Reserve space for the forward name. */
950 if (pe_def_file->exports[i].flag_forward)
952 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
956 next_ordinal = min_ordinal;
957 for (i = 0; i < NE; i++)
958 if ((exported_symbol_sections[i] ||
959 pe_def_file->exports[i].flag_forward) &&
960 pe_def_file->exports[i].ordinal == -1)
962 while (exported_symbols[next_ordinal - min_ordinal] != -1)
965 exported_symbols[next_ordinal - min_ordinal] = i;
966 pe_def_file->exports[i].ordinal = next_ordinal;
969 /* OK, now we can allocate some memory. */
970 edata_sz = (40 /* directory */
971 + 4 * export_table_size /* addresses */
972 + 4 * count_exported_byname /* name ptrs */
973 + 2 * count_exported_byname /* ordinals */
974 + name_table_size + strlen (dll_name) + 1);
977 /* Fill the exported symbol offsets. The preliminary work has already
978 been done in process_def_file(). */
981 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
984 struct bfd_link_hash_entry *blhe;
986 for (i = 0; i < pe_def_file->num_exports; i++)
990 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
991 if (pe_details->underscored
992 && *pe_def_file->exports[i].internal_name != '@')
995 strcpy (name + 1, pe_def_file->exports[i].internal_name);
998 strcpy (name, pe_def_file->exports[i].internal_name);
1000 blhe = bfd_link_hash_lookup (info->hash,
1002 FALSE, FALSE, TRUE);
1004 if (blhe && blhe->type == bfd_link_hash_defined)
1005 exported_symbol_offsets[i] = blhe->u.def.value;
1012 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1015 unsigned char *edirectory;
1016 unsigned char *eaddresses;
1017 unsigned char *enameptrs;
1018 unsigned char *eordinals;
1024 edata_d = xmalloc (edata_sz);
1026 /* Note use of array pointer math here. */
1027 edirectory = edata_d;
1028 eaddresses = edata_d + 40;
1029 enameptrs = eaddresses + 4 * export_table_size;
1030 eordinals = enameptrs + 4 * count_exported_byname;
1031 enamestr = (char *) eordinals + 2 * count_exported_byname;
1033 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1034 + edata_s->output_section->vma - image_base)
1036 memset (edata_d, 0, edata_sz);
1037 bfd_put_32 (abfd, now, edata_d + 4);
1038 if (pe_def_file->version_major != -1)
1040 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1041 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1044 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1045 strcpy (enamestr, dll_name);
1046 enamestr += strlen (enamestr) + 1;
1047 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1048 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1049 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1050 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1051 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1052 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1054 fill_exported_offsets (abfd, info);
1056 /* Ok, now for the filling in part.
1057 Scan alphabetically - ie the ordering in the exports[] table,
1058 rather than by ordinal - the ordering in the exported_symbol[]
1059 table. See dlltool.c and:
1060 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1061 for more information. */
1063 for (s = 0; s < NE; s++)
1065 struct bfd_section *ssec = exported_symbol_sections[s];
1066 if (pe_def_file->exports[s].ordinal != -1 &&
1067 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1069 int ord = pe_def_file->exports[s].ordinal;
1071 if (pe_def_file->exports[s].flag_forward)
1073 bfd_put_32 (abfd, ERVA (enamestr),
1074 eaddresses + 4 * (ord - min_ordinal));
1076 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1077 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1081 unsigned long srva = (exported_symbol_offsets[s]
1082 + ssec->output_section->vma
1083 + ssec->output_offset);
1085 bfd_put_32 (abfd, srva - image_base,
1086 eaddresses + 4 * (ord - min_ordinal));
1089 if (!pe_def_file->exports[s].flag_noname)
1091 char *ename = pe_def_file->exports[s].name;
1093 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1095 strcpy (enamestr, ename);
1096 enamestr += strlen (enamestr) + 1;
1097 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1099 pe_def_file->exports[s].hint = hint++;
1106 static struct bfd_section *current_sec;
1109 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1111 int (*cb) (arelent *, asection *))
1116 for (b = info->input_bfds; b; b = b->link_next)
1121 symsize = bfd_get_symtab_upper_bound (b);
1122 symbols = xmalloc (symsize);
1123 nsyms = bfd_canonicalize_symtab (b, symbols);
1125 for (s = b->sections; s; s = s->next)
1128 int relsize, nrelocs, i;
1129 int flags = bfd_get_section_flags (b, s);
1131 /* Skip discarded linkonce sections. */
1132 if (flags & SEC_LINK_ONCE
1133 && s->output_section == bfd_abs_section_ptr)
1138 relsize = bfd_get_reloc_upper_bound (b, s);
1139 relocs = xmalloc (relsize);
1140 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1142 for (i = 0; i < nrelocs; i++)
1144 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1146 if (!strcmp (name, sym->name))
1152 /* Warning: the allocated symbols are remembered in BFD and reused
1153 later, so don't free them! */
1154 /* free (symbols); */
1159 /* Gather all the relocations and build the .reloc section. */
1162 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1165 /* For .reloc stuff. */
1166 reloc_data_type *reloc_data;
1167 int total_relocs = 0;
1169 unsigned long sec_page = (unsigned long) -1;
1170 unsigned long page_ptr, page_count;
1173 struct bfd_section *s;
1176 for (b = info->input_bfds; b; b = b->link_next)
1177 for (s = b->sections; s; s = s->next)
1178 total_relocs += s->reloc_count;
1180 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1184 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1187 int relsize, nrelocs, i;
1189 for (s = b->sections; s; s = s->next)
1191 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1195 /* If it's not loaded, we don't need to relocate it this way. */
1196 if (!(s->output_section->flags & SEC_LOAD))
1199 /* I don't know why there would be a reloc for these, but I've
1200 seen it happen - DJ */
1201 if (s->output_section == &bfd_abs_section)
1204 if (s->output_section->vma == 0)
1206 /* Huh? Shouldn't happen, but punt if it does. */
1207 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1208 s->output_section->name, s->output_section->index,
1209 s->output_section->flags);
1213 symsize = bfd_get_symtab_upper_bound (b);
1214 symbols = xmalloc (symsize);
1215 nsyms = bfd_canonicalize_symtab (b, symbols);
1217 relsize = bfd_get_reloc_upper_bound (b, s);
1218 relocs = xmalloc (relsize);
1219 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1221 for (i = 0; i < nrelocs; i++)
1223 if (pe_dll_extra_pe_debug)
1225 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1226 printf ("rel: %s\n", sym->name);
1228 if (!relocs[i]->howto->pc_relative
1229 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1232 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1234 sym_vma = (relocs[i]->addend
1237 + sym->section->output_offset
1238 + sym->section->output_section->vma);
1239 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1241 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1243 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1244 relocs[i]->howto->rightshift)
1246 #ifdef pe_use_x86_64
1247 case BITS_AND_SHIFT (64, 0):
1248 reloc_data[total_relocs].type = 10;
1252 case BITS_AND_SHIFT (32, 0):
1253 reloc_data[total_relocs].type = 3;
1256 case BITS_AND_SHIFT (16, 0):
1257 reloc_data[total_relocs].type = 2;
1260 case BITS_AND_SHIFT (16, 16):
1261 reloc_data[total_relocs].type = 4;
1262 /* FIXME: we can't know the symbol's right value
1263 yet, but we probably can safely assume that
1264 CE will relocate us in 64k blocks, so leaving
1266 reloc_data[total_relocs].extra = 0;
1269 case BITS_AND_SHIFT (26, 2):
1270 reloc_data[total_relocs].type = 5;
1273 case BITS_AND_SHIFT (24, 2):
1274 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1275 Those ARM_xxx definitions should go in proper
1277 if (relocs[i]->howto->type == 0
1278 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1279 || relocs[i]->howto->type == 5)
1280 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1281 that has already been fully processed during a
1282 previous link stage, so ignore it here. */
1286 /* xgettext:c-format */
1287 einfo (_("%XError: %d-bit reloc in dll\n"),
1288 relocs[i]->howto->bitsize);
1294 /* Warning: the allocated symbols are remembered in BFD and
1295 reused later, so don't free them! */
1299 /* At this point, we have total_relocs relocation addresses in
1300 reloc_addresses, which are all suitable for the .reloc section.
1301 We must now create the new sections. */
1302 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1304 for (i = 0; i < total_relocs; i++)
1306 unsigned long this_page = (reloc_data[i].vma >> 12);
1308 if (this_page != sec_page)
1310 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1312 sec_page = this_page;
1317 if (reloc_data[i].type == 4)
1321 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1322 reloc_d = xmalloc (reloc_sz);
1323 sec_page = (unsigned long) -1;
1325 page_ptr = (unsigned long) -1;
1328 for (i = 0; i < total_relocs; i++)
1330 unsigned long rva = reloc_data[i].vma - image_base;
1331 unsigned long this_page = (rva & ~0xfff);
1333 if (this_page != sec_page)
1335 while (reloc_sz & 3)
1336 reloc_d[reloc_sz++] = 0;
1338 if (page_ptr != (unsigned long) -1)
1339 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1341 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1342 page_ptr = reloc_sz;
1344 sec_page = this_page;
1348 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1349 reloc_d + reloc_sz);
1352 if (reloc_data[i].type == 4)
1354 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1361 while (reloc_sz & 3)
1362 reloc_d[reloc_sz++] = 0;
1364 if (page_ptr != (unsigned long) -1)
1365 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1367 while (reloc_sz < reloc_s->size)
1368 reloc_d[reloc_sz++] = 0;
1371 /* Given the exiting def_file structure, print out a .DEF file that
1372 corresponds to it. */
1375 quoteput (char *s, FILE *f, int needs_quotes)
1379 for (cp = s; *cp; cp++)
1394 if (*s == '"' || *s == '\\')
1408 pe_dll_generate_def_file (const char *pe_out_def_filename)
1411 FILE *out = fopen (pe_out_def_filename, "w");
1414 /* xgettext:c-format */
1415 einfo (_("%s: Can't open output def file %s\n"),
1416 program_name, pe_out_def_filename);
1420 if (pe_def_file->name)
1422 if (pe_def_file->is_dll)
1423 fprintf (out, "LIBRARY ");
1425 fprintf (out, "NAME ");
1427 quoteput (pe_def_file->name, out, 1);
1429 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1430 fprintf (out, " BASE=0x%lx",
1431 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1432 fprintf (out, "\n");
1435 if (pe_def_file->description)
1437 fprintf (out, "DESCRIPTION ");
1438 quoteput (pe_def_file->description, out, 1);
1439 fprintf (out, "\n");
1442 if (pe_def_file->version_minor != -1)
1443 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1444 pe_def_file->version_minor);
1445 else if (pe_def_file->version_major != -1)
1446 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1448 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1449 fprintf (out, "\n");
1451 if (pe_def_file->stack_commit != -1)
1452 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1453 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1454 else if (pe_def_file->stack_reserve != -1)
1455 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1457 if (pe_def_file->heap_commit != -1)
1458 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1459 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1460 else if (pe_def_file->heap_reserve != -1)
1461 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1463 if (pe_def_file->num_section_defs > 0)
1465 fprintf (out, "\nSECTIONS\n\n");
1467 for (i = 0; i < pe_def_file->num_section_defs; i++)
1470 quoteput (pe_def_file->section_defs[i].name, out, 0);
1472 if (pe_def_file->section_defs[i].class)
1474 fprintf (out, " CLASS ");
1475 quoteput (pe_def_file->section_defs[i].class, out, 0);
1478 if (pe_def_file->section_defs[i].flag_read)
1479 fprintf (out, " READ");
1481 if (pe_def_file->section_defs[i].flag_write)
1482 fprintf (out, " WRITE");
1484 if (pe_def_file->section_defs[i].flag_execute)
1485 fprintf (out, " EXECUTE");
1487 if (pe_def_file->section_defs[i].flag_shared)
1488 fprintf (out, " SHARED");
1490 fprintf (out, "\n");
1494 if (pe_def_file->num_exports > 0)
1496 fprintf (out, "EXPORTS\n");
1498 for (i = 0; i < pe_def_file->num_exports; i++)
1500 def_file_export *e = pe_def_file->exports + i;
1502 quoteput (e->name, out, 0);
1504 if (e->internal_name && strcmp (e->internal_name, e->name))
1506 fprintf (out, " = ");
1507 quoteput (e->internal_name, out, 0);
1510 if (e->ordinal != -1)
1511 fprintf (out, " @%d", e->ordinal);
1513 if (e->flag_private)
1514 fprintf (out, " PRIVATE");
1516 if (e->flag_constant)
1517 fprintf (out, " CONSTANT");
1520 fprintf (out, " NONAME");
1523 fprintf (out, " DATA");
1525 fprintf (out, "\n");
1529 if (pe_def_file->num_imports > 0)
1531 fprintf (out, "\nIMPORTS\n\n");
1533 for (i = 0; i < pe_def_file->num_imports; i++)
1535 def_file_import *im = pe_def_file->imports + i;
1538 if (im->internal_name
1539 && (!im->name || strcmp (im->internal_name, im->name)))
1541 quoteput (im->internal_name, out, 0);
1542 fprintf (out, " = ");
1545 quoteput (im->module->name, out, 0);
1549 quoteput (im->name, out, 0);
1551 fprintf (out, "%d", im->ordinal);
1553 fprintf (out, "\n");
1558 fprintf (out, _("; no contents available\n"));
1560 if (fclose (out) == EOF)
1561 /* xgettext:c-format */
1562 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1565 /* Generate the import library. */
1567 static asymbol **symtab;
1570 static const char *dll_filename;
1571 static char *dll_symname;
1573 #define UNDSEC (asection *) &bfd_und_section
1576 quick_section (bfd *abfd, const char *name, int flags, int align)
1581 sec = bfd_make_section_old_way (abfd, name);
1582 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1583 bfd_set_section_alignment (abfd, sec, align);
1584 /* Remember to undo this before trying to link internally! */
1585 sec->output_section = sec;
1587 sym = bfd_make_empty_symbol (abfd);
1588 symtab[symptr++] = sym;
1589 sym->name = sec->name;
1591 sym->flags = BSF_LOCAL;
1598 quick_symbol (bfd *abfd,
1607 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1612 sym = bfd_make_empty_symbol (abfd);
1617 symtab[symptr++] = sym;
1620 static arelent *reltab = 0;
1621 static int relcount = 0, relsize = 0;
1624 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1626 if (relcount >= relsize - 1)
1630 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1632 reltab = xmalloc (relsize * sizeof (arelent));
1634 reltab[relcount].address = address;
1635 reltab[relcount].addend = 0;
1636 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1637 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1642 save_relocs (asection *sec)
1646 sec->relocation = reltab;
1647 sec->reloc_count = relcount;
1648 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1649 for (i = 0; i < relcount; i++)
1650 sec->orelocation[i] = sec->relocation + i;
1651 sec->orelocation[relcount] = 0;
1652 sec->flags |= SEC_RELOC;
1654 relcount = relsize = 0;
1657 /* .section .idata$2
1658 .global __head_my_dll
1675 make_head (bfd *parent)
1677 asection *id2, *id5, *id4;
1678 unsigned char *d2, *d5, *d4;
1682 oname = xmalloc (20);
1683 sprintf (oname, "d%06d.o", tmp_seq);
1686 abfd = bfd_create (oname, parent);
1687 bfd_find_target (pe_details->object_target, abfd);
1688 bfd_make_writable (abfd);
1690 bfd_set_format (abfd, bfd_object);
1691 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1694 symtab = xmalloc (6 * sizeof (asymbol *));
1695 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1696 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1697 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1698 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1699 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1701 /* OK, pay attention here. I got confused myself looking back at
1702 it. We create a four-byte section to mark the beginning of the
1703 list, and we include an offset of 4 in the section, so that the
1704 pointer to the list points to the *end* of this section, which is
1705 the start of the list of sections from other objects. */
1707 bfd_set_section_size (abfd, id2, 20);
1711 d2[0] = d2[16] = 4; /* Reloc addend. */
1712 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1713 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1714 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1717 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1718 d5 = xmalloc (PE_IDATA5_SIZE);
1720 memset (d5, 0, PE_IDATA5_SIZE);
1722 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1723 d4 = xmalloc (PE_IDATA4_SIZE);
1725 memset (d4, 0, PE_IDATA4_SIZE);
1727 bfd_set_symtab (abfd, symtab, symptr);
1729 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1730 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1731 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1733 bfd_make_readable (abfd);
1737 /* .section .idata$4
1744 .global __my_dll_iname
1749 make_tail (bfd *parent)
1751 asection *id4, *id5, *id7;
1752 unsigned char *d4, *d5, *d7;
1757 oname = xmalloc (20);
1758 sprintf (oname, "d%06d.o", tmp_seq);
1761 abfd = bfd_create (oname, parent);
1762 bfd_find_target (pe_details->object_target, abfd);
1763 bfd_make_writable (abfd);
1765 bfd_set_format (abfd, bfd_object);
1766 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1769 symtab = xmalloc (5 * sizeof (asymbol *));
1770 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1771 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1772 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1773 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1775 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1776 d4 = xmalloc (PE_IDATA4_SIZE);
1778 memset (d4, 0, PE_IDATA4_SIZE);
1780 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1781 d5 = xmalloc (PE_IDATA5_SIZE);
1783 memset (d5, 0, PE_IDATA5_SIZE);
1785 len = strlen (dll_filename) + 1;
1788 bfd_set_section_size (abfd, id7, len);
1791 strcpy ((char *) d7, dll_filename);
1793 bfd_set_symtab (abfd, symtab, symptr);
1795 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1796 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1797 bfd_set_section_contents (abfd, id7, d7, 0, len);
1799 bfd_make_readable (abfd);
1805 .global ___imp_function
1806 .global __imp__function
1808 jmp *__imp__function:
1822 .asciz "function" xlate? (add underscore, kill at) */
1824 static unsigned char jmp_ix86_bytes[] =
1826 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1834 .dw __imp_function */
1836 static unsigned char jmp_sh_bytes[] =
1838 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1842 lui $t0,<high:__imp_function>
1843 lw $t0,<low:__imp_function>
1847 static unsigned char jmp_mips_bytes[] =
1849 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1850 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1853 static unsigned char jmp_arm_bytes[] =
1855 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1856 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1862 make_one (def_file_export *exp, bfd *parent)
1864 asection *tx, *id7, *id5, *id4, *id6;
1865 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1869 unsigned char *jmp_bytes = NULL;
1870 int jmp_byte_count = 0;
1872 switch (pe_details->pe_arch)
1875 jmp_bytes = jmp_ix86_bytes;
1876 jmp_byte_count = sizeof (jmp_ix86_bytes);
1879 jmp_bytes = jmp_sh_bytes;
1880 jmp_byte_count = sizeof (jmp_sh_bytes);
1883 jmp_bytes = jmp_mips_bytes;
1884 jmp_byte_count = sizeof (jmp_mips_bytes);
1887 case PE_ARCH_arm_epoc:
1888 case PE_ARCH_arm_wince:
1889 jmp_bytes = jmp_arm_bytes;
1890 jmp_byte_count = sizeof (jmp_arm_bytes);
1896 oname = xmalloc (20);
1897 sprintf (oname, "d%06d.o", tmp_seq);
1900 abfd = bfd_create (oname, parent);
1901 bfd_find_target (pe_details->object_target, abfd);
1902 bfd_make_writable (abfd);
1904 bfd_set_format (abfd, bfd_object);
1905 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1908 symtab = xmalloc (11 * sizeof (asymbol *));
1909 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1910 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1911 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1912 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1913 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1915 if (*exp->internal_name == '@')
1917 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1919 if (! exp->flag_data)
1920 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1921 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1923 /* Fastcall applies only to functions,
1924 so no need for auto-import symbol. */
1928 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1930 if (! exp->flag_data)
1931 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1933 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1935 /* Symbol to reference ord/name of imported
1936 data symbol, used to implement auto-import. */
1938 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1941 if (pe_dll_compat_implib)
1942 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1945 if (! exp->flag_data)
1947 bfd_set_section_size (abfd, tx, jmp_byte_count);
1948 td = xmalloc (jmp_byte_count);
1950 memcpy (td, jmp_bytes, jmp_byte_count);
1952 switch (pe_details->pe_arch)
1955 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1958 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1961 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1962 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1963 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1966 case PE_ARCH_arm_epoc:
1967 case PE_ARCH_arm_wince:
1968 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1976 bfd_set_section_size (abfd, id7, 4);
1980 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1983 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1984 d5 = xmalloc (PE_IDATA5_SIZE);
1986 memset (d5, 0, PE_IDATA5_SIZE);
1988 if (exp->flag_noname)
1990 d5[0] = exp->ordinal;
1991 d5[1] = exp->ordinal >> 8;
1992 d5[PE_IDATA5_SIZE - 1] = 0x80;
1996 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2000 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2001 d4 = xmalloc (PE_IDATA4_SIZE);
2003 memset (d4, 0, PE_IDATA4_SIZE);
2005 if (exp->flag_noname)
2007 d4[0] = exp->ordinal;
2008 d4[1] = exp->ordinal >> 8;
2009 d4[PE_IDATA4_SIZE - 1] = 0x80;
2013 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2017 if (exp->flag_noname)
2020 bfd_set_section_size (abfd, id6, 0);
2024 len = strlen (exp->name) + 3;
2027 bfd_set_section_size (abfd, id6, len);
2030 memset (d6, 0, len);
2031 d6[0] = exp->hint & 0xff;
2032 d6[1] = exp->hint >> 8;
2033 strcpy ((char *) d6 + 2, exp->name);
2036 bfd_set_symtab (abfd, symtab, symptr);
2038 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2039 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2040 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2041 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2042 if (!exp->flag_noname)
2043 bfd_set_section_contents (abfd, id6, d6, 0, len);
2045 bfd_make_readable (abfd);
2050 make_singleton_name_thunk (const char *import, bfd *parent)
2052 /* Name thunks go to idata$4. */
2058 oname = xmalloc (20);
2059 sprintf (oname, "nmth%06d.o", tmp_seq);
2062 abfd = bfd_create (oname, parent);
2063 bfd_find_target (pe_details->object_target, abfd);
2064 bfd_make_writable (abfd);
2066 bfd_set_format (abfd, bfd_object);
2067 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2070 symtab = xmalloc (3 * sizeof (asymbol *));
2071 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2072 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2073 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2075 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2076 d4 = xmalloc (PE_IDATA4_SIZE);
2078 memset (d4, 0, PE_IDATA4_SIZE);
2079 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2082 bfd_set_symtab (abfd, symtab, symptr);
2084 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2086 bfd_make_readable (abfd);
2091 make_import_fixup_mark (arelent *rel)
2093 /* We convert reloc to symbol, for later reference. */
2095 static char *fixup_name = NULL;
2096 static size_t buffer_len = 0;
2098 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2100 bfd *abfd = bfd_asymbol_bfd (sym);
2101 struct bfd_link_hash_entry *bh;
2105 fixup_name = xmalloc (384);
2109 if (strlen (sym->name) + 25 > buffer_len)
2110 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2111 bigger than 20 digits long, we've got worse problems than
2112 overflowing this buffer... */
2115 /* New buffer size is length of symbol, plus 25, but
2116 then rounded up to the nearest multiple of 128. */
2117 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2118 fixup_name = xmalloc (buffer_len);
2121 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2124 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2125 current_sec, /* sym->section, */
2126 rel->address, NULL, TRUE, FALSE, &bh);
2131 /* .section .idata$2
2132 .rva __nm_thnk_SYM (singleton thunk with name of func)
2135 .rva __my_dll_iname (name of dll)
2136 .rva __fuNN_SYM (pointer to reference (address) in text) */
2139 make_import_fixup_entry (const char *name,
2140 const char *fixup_name,
2141 const char *dll_symname,
2149 oname = xmalloc (20);
2150 sprintf (oname, "fu%06d.o", tmp_seq);
2153 abfd = bfd_create (oname, parent);
2154 bfd_find_target (pe_details->object_target, abfd);
2155 bfd_make_writable (abfd);
2157 bfd_set_format (abfd, bfd_object);
2158 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2161 symtab = xmalloc (6 * sizeof (asymbol *));
2162 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2164 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2165 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2166 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2168 bfd_set_section_size (abfd, id2, 20);
2173 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2174 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2175 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2178 bfd_set_symtab (abfd, symtab, symptr);
2180 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2182 bfd_make_readable (abfd);
2186 /* .section .rdata_runtime_pseudo_reloc
2188 .rva __fuNN_SYM (pointer to reference (address) in text) */
2191 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2192 const char *fixup_name,
2197 unsigned char *rt_rel_d;
2201 oname = xmalloc (20);
2202 sprintf (oname, "rtr%06d.o", tmp_seq);
2205 abfd = bfd_create (oname, parent);
2206 bfd_find_target (pe_details->object_target, abfd);
2207 bfd_make_writable (abfd);
2209 bfd_set_format (abfd, bfd_object);
2210 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2213 symtab = xmalloc (2 * sizeof (asymbol *));
2214 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2215 SEC_HAS_CONTENTS, 2);
2217 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2219 bfd_set_section_size (abfd, rt_rel, 8);
2220 rt_rel_d = xmalloc (8);
2221 rt_rel->contents = rt_rel_d;
2222 memset (rt_rel_d, 0, 8);
2223 bfd_put_32 (abfd, addend, rt_rel_d);
2225 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2226 save_relocs (rt_rel);
2228 bfd_set_symtab (abfd, symtab, symptr);
2230 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2232 bfd_make_readable (abfd);
2237 .rva __pei386_runtime_relocator */
2240 pe_create_runtime_relocator_reference (bfd *parent)
2242 asection *extern_rt_rel;
2243 unsigned char *extern_rt_rel_d;
2247 oname = xmalloc (20);
2248 sprintf (oname, "ertr%06d.o", tmp_seq);
2251 abfd = bfd_create (oname, parent);
2252 bfd_find_target (pe_details->object_target, abfd);
2253 bfd_make_writable (abfd);
2255 bfd_set_format (abfd, bfd_object);
2256 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2259 symtab = xmalloc (2 * sizeof (asymbol *));
2260 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2262 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2265 bfd_set_section_size (abfd, extern_rt_rel, 4);
2266 extern_rt_rel_d = xmalloc (4);
2267 extern_rt_rel->contents = extern_rt_rel_d;
2269 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2270 save_relocs (extern_rt_rel);
2272 bfd_set_symtab (abfd, symtab, symptr);
2274 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2276 bfd_make_readable (abfd);
2281 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2284 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2285 struct bfd_link_hash_entry *name_thunk_sym;
2286 const char *name = sym->name;
2287 char *fixup_name = make_import_fixup_mark (rel);
2290 sprintf (buf, U ("_nm_thnk_%s"), name);
2292 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2294 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2296 bfd *b = make_singleton_name_thunk (name, output_bfd);
2297 add_bfd_to_link (b, b->filename, &link_info);
2299 /* If we ever use autoimport, we have to cast text section writable. */
2300 config.text_read_only = FALSE;
2301 output_bfd->flags &= ~WP_TEXT;
2304 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2306 extern char * pe_data_import_dll;
2307 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2309 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2310 add_bfd_to_link (b, b->filename, &link_info);
2315 if (link_info.pei386_runtime_pseudo_reloc)
2317 if (pe_dll_extra_pe_debug)
2318 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2319 fixup_name, addend);
2320 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2321 add_bfd_to_link (b, b->filename, &link_info);
2323 if (runtime_pseudo_relocs_created == 0)
2325 b = pe_create_runtime_relocator_reference (output_bfd);
2326 add_bfd_to_link (b, b->filename, &link_info);
2328 runtime_pseudo_relocs_created++;
2332 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2333 s->owner, s, rel->address, sym->name);
2341 pe_dll_generate_implib (def_file *def, const char *impfilename)
2349 dll_filename = (def->name) ? def->name : dll_name;
2350 dll_symname = xstrdup (dll_filename);
2351 for (i = 0; dll_symname[i]; i++)
2352 if (!ISALNUM (dll_symname[i]))
2353 dll_symname[i] = '_';
2355 unlink_if_ordinary (impfilename);
2357 outarch = bfd_openw (impfilename, 0);
2361 /* xgettext:c-format */
2362 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2366 /* xgettext:c-format */
2367 info_msg (_("Creating library file: %s\n"), impfilename);
2369 bfd_set_format (outarch, bfd_archive);
2370 outarch->has_armap = 1;
2372 /* Work out a reasonable size of things to put onto one line. */
2373 ar_head = make_head (outarch);
2375 for (i = 0; i < def->num_exports; i++)
2377 /* The import library doesn't know about the internal name. */
2378 char *internal = def->exports[i].internal_name;
2381 /* Don't add PRIVATE entries to import lib. */
2382 if (pe_def_file->exports[i].flag_private)
2384 def->exports[i].internal_name = def->exports[i].name;
2385 n = make_one (def->exports + i, outarch);
2388 def->exports[i].internal_name = internal;
2391 ar_tail = make_tail (outarch);
2393 if (ar_head == NULL || ar_tail == NULL)
2396 /* Now stick them all into the archive. */
2397 ar_head->next = head;
2398 ar_tail->next = ar_head;
2401 if (! bfd_set_archive_head (outarch, head))
2402 einfo ("%Xbfd_set_archive_head: %E\n");
2404 if (! bfd_close (outarch))
2405 einfo ("%Xbfd_close %s: %E\n", impfilename);
2407 while (head != NULL)
2409 bfd *n = head->next;
2416 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2418 lang_input_statement_type *fake_file;
2420 fake_file = lang_add_input_file (name,
2421 lang_input_file_is_fake_enum,
2423 fake_file->the_bfd = abfd;
2424 ldlang_add_file (fake_file);
2426 if (!bfd_link_add_symbols (abfd, link_info))
2427 einfo ("%Xaddsym %s: %E\n", name);
2431 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2433 def_file_module *module;
2435 pe_dll_id_target (bfd_get_target (output_bfd));
2440 for (module = pe_def_file->modules; module; module = module->next)
2444 dll_filename = module->name;
2445 dll_symname = xstrdup (module->name);
2446 for (i = 0; dll_symname[i]; i++)
2447 if (!ISALNUM (dll_symname[i]))
2448 dll_symname[i] = '_';
2452 for (i = 0; i < pe_def_file->num_imports; i++)
2453 if (pe_def_file->imports[i].module == module)
2455 def_file_export exp;
2456 struct bfd_link_hash_entry *blhe;
2457 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2458 /* See if we need this import. */
2459 size_t len = strlen (pe_def_file->imports[i].internal_name);
2460 char *name = xmalloc (len + 2 + 6);
2463 sprintf (name, "%s%s", "",
2464 pe_def_file->imports[i].internal_name);
2466 sprintf (name, "%s%s",U (""),
2467 pe_def_file->imports[i].internal_name);
2469 blhe = bfd_link_hash_lookup (link_info->hash, name,
2470 FALSE, FALSE, FALSE);
2472 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2475 sprintf (name, "%s%s", U ("_imp_"),
2476 pe_def_file->imports[i].internal_name);
2478 sprintf (name, "%s%s", U ("_imp__"),
2479 pe_def_file->imports[i].internal_name);
2481 blhe = bfd_link_hash_lookup (link_info->hash, name,
2482 FALSE, FALSE, FALSE);
2486 if (blhe && blhe->type == bfd_link_hash_undefined)
2492 bfd *ar_head = make_head (output_bfd);
2493 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2496 exp.internal_name = pe_def_file->imports[i].internal_name;
2497 exp.name = pe_def_file->imports[i].name;
2498 exp.ordinal = pe_def_file->imports[i].ordinal;
2499 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2500 exp.flag_private = 0;
2501 exp.flag_constant = 0;
2502 exp.flag_data = pe_def_file->imports[i].data;
2503 exp.flag_noname = exp.name ? 0 : 1;
2504 one = make_one (&exp, output_bfd);
2505 add_bfd_to_link (one, one->filename, link_info);
2510 bfd *ar_tail = make_tail (output_bfd);
2511 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2518 /* We were handed a *.DLL file. Parse it and turn it into a set of
2519 IMPORTS directives in the def file. Return TRUE if the file was
2520 handled, FALSE if not. */
2523 pe_get16 (bfd *abfd, int where)
2527 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2528 bfd_bread (b, (bfd_size_type) 2, abfd);
2529 return b[0] + (b[1] << 8);
2533 pe_get32 (bfd *abfd, int where)
2537 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2538 bfd_bread (b, (bfd_size_type) 4, abfd);
2539 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2545 unsigned char *b = ptr;
2547 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2551 pe_implied_import_dll (const char *filename)
2554 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2555 unsigned long export_rva, export_size, nsections, secptr, expptr;
2556 unsigned long exp_funcbase;
2557 unsigned char *expdata;
2559 unsigned long name_rvas, ordinals, nexp, ordbase;
2560 const char *dll_name;
2561 /* Initialization with start > end guarantees that is_data
2562 will not be set by mistake, and avoids compiler warning. */
2563 unsigned long data_start = 1;
2564 unsigned long data_end = 0;
2565 unsigned long rdata_start = 1;
2566 unsigned long rdata_end = 0;
2567 unsigned long bss_start = 1;
2568 unsigned long bss_end = 0;
2570 /* No, I can't use bfd here. kernel32.dll puts its export table in
2571 the middle of the .rdata section. */
2572 dll = bfd_openr (filename, pe_details->target_name);
2575 einfo ("%Xopen %s: %E\n", filename);
2579 /* PEI dlls seem to be bfd_objects. */
2580 if (!bfd_check_format (dll, bfd_object))
2582 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2586 /* Get pe_header, optional header and numbers of export entries. */
2587 pe_header_offset = pe_get32 (dll, 0x3c);
2588 opthdr_ofs = pe_header_offset + 4 + 20;
2589 #ifdef pe_use_x86_64
2590 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2592 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2595 if (num_entries < 1) /* No exports. */
2598 #ifdef pe_use_x86_64
2599 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2600 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2602 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2603 export_size = pe_get32 (dll, opthdr_ofs + 100);
2606 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2607 secptr = (pe_header_offset + 4 + 20 +
2608 pe_get16 (dll, pe_header_offset + 4 + 16));
2611 /* Get the rva and size of the export section. */
2612 for (i = 0; i < nsections; i++)
2615 unsigned long secptr1 = secptr + 40 * i;
2616 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2617 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2618 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2620 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2621 bfd_bread (sname, (bfd_size_type) 8, dll);
2623 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2625 expptr = fptr + (export_rva - vaddr);
2626 if (export_rva + export_size > vaddr + vsize)
2627 export_size = vsize - (export_rva - vaddr);
2632 /* Scan sections and store the base and size of the
2633 data and bss segments in data/base_start/end. */
2634 for (i = 0; i < nsections; i++)
2636 unsigned long secptr1 = secptr + 40 * i;
2637 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2638 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2639 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2643 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2644 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2646 if (strcmp(sec_name,".data") == 0)
2649 data_end = vaddr + vsize;
2651 if (pe_dll_extra_pe_debug)
2652 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2653 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2655 else if (strcmp(sec_name,".rdata") == 0)
2657 rdata_start = vaddr;
2658 rdata_end = vaddr + vsize;
2660 if (pe_dll_extra_pe_debug)
2661 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2662 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2664 else if (strcmp (sec_name,".bss") == 0)
2667 bss_end = vaddr + vsize;
2669 if (pe_dll_extra_pe_debug)
2670 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2671 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2675 expdata = xmalloc (export_size);
2676 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2677 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2678 erva = (char *) expdata - export_rva;
2680 if (pe_def_file == 0)
2681 pe_def_file = def_file_empty ();
2683 nexp = pe_as32 (expdata + 24);
2684 name_rvas = pe_as32 (expdata + 32);
2685 ordinals = pe_as32 (expdata + 36);
2686 ordbase = pe_as32 (expdata + 16);
2687 exp_funcbase = pe_as32 (expdata + 28);
2689 /* Use internal dll name instead of filename
2690 to enable symbolic dll linking. */
2691 dll_name = erva + pe_as32 (expdata + 12);
2693 /* Check to see if the dll has already been added to
2694 the definition list and if so return without error.
2695 This avoids multiple symbol definitions. */
2696 if (def_get_module (pe_def_file, dll_name))
2698 if (pe_dll_extra_pe_debug)
2699 printf ("%s is already loaded\n", dll_name);
2703 /* Iterate through the list of symbols. */
2704 for (i = 0; i < nexp; i++)
2706 /* Pointer to the names vector. */
2707 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2708 def_file_import *imp;
2709 /* Pointer to the function address vector. */
2710 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2713 /* Skip unwanted symbols, which are
2714 exported in buggy auto-import releases. */
2715 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
2717 /* is_data is true if the address is in the data, rdata or bss
2720 (func_rva >= data_start && func_rva < data_end)
2721 || (func_rva >= rdata_start && func_rva < rdata_end)
2722 || (func_rva >= bss_start && func_rva < bss_end);
2724 imp = def_file_add_import (pe_def_file, erva + name_rva,
2726 /* Mark symbol type. */
2727 imp->data = is_data;
2729 if (pe_dll_extra_pe_debug)
2730 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2731 __FUNCTION__, dll_name, erva + name_rva,
2732 func_rva, is_data ? "(data)" : "");
2739 /* These are the main functions, called from the emulation. The first
2740 is called after the bfds are read, so we can guess at how much space
2741 we need. The second is called after everything is placed, so we
2742 can put the right values in place. */
2745 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2747 pe_dll_id_target (bfd_get_target (abfd));
2748 process_def_file (abfd, info);
2750 if (pe_def_file->num_exports == 0 && !info->shared)
2753 generate_edata (abfd, info);
2754 build_filler_bfd (1);
2758 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2760 pe_dll_id_target (bfd_get_target (abfd));
2761 build_filler_bfd (0);
2765 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2767 pe_dll_id_target (bfd_get_target (abfd));
2768 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2770 generate_reloc (abfd, info);
2773 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2775 /* Resize the sections. */
2776 lang_reset_memory_regions ();
2777 lang_size_sections (NULL, TRUE);
2779 /* Redo special stuff. */
2780 ldemul_after_allocation ();
2782 /* Do the assignments again. */
2783 lang_do_assignments ();
2786 fill_edata (abfd, info);
2788 if (info->shared && !info->pie)
2789 pe_data (abfd)->dll = 1;
2791 edata_s->contents = edata_d;
2792 reloc_s->contents = reloc_d;
2796 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2798 pe_dll_id_target (bfd_get_target (abfd));
2799 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2801 generate_reloc (abfd, info);
2804 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2806 /* Resize the sections. */
2807 lang_reset_memory_regions ();
2808 lang_size_sections (NULL, TRUE);
2810 /* Redo special stuff. */
2811 ldemul_after_allocation ();
2813 /* Do the assignments again. */
2814 lang_do_assignments ();
2816 reloc_s->contents = reloc_d;