1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009 Free Software Foundation, Inc.
6 This file is part of the GNU Binutils.
8 This program 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 3 of the License, or
11 (at your option) any later version.
13 This program 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 this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
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 "on 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_exclude_all_symbols = 0;
153 int pe_dll_do_default_excludes = 1;
154 int pe_dll_kill_ats = 0;
155 int pe_dll_stdcall_aliases = 0;
156 int pe_dll_warn_dup_exports = 0;
157 int pe_dll_compat_implib = 0;
158 int pe_dll_extra_pe_debug = 0;
159 int pe_use_nul_prefixed_import_tables = 0;
160 int pe_use_coff_long_section_names = -1;
162 /* Static variables and types. */
164 static bfd_vma image_base;
165 static bfd *filler_bfd;
166 static struct bfd_section *edata_s, *reloc_s;
167 static unsigned char *edata_d, *reloc_d;
168 static size_t edata_sz, reloc_sz;
169 static int runtime_pseudo_relocs_created = 0;
170 static int runtime_pseudp_reloc_v2_init = 0;
177 autofilter_entry_type;
181 const char *target_name;
182 const char *object_target;
183 unsigned int imagebase_reloc;
186 bfd_boolean underscored;
187 const autofilter_entry_type* autofilter_symbollist;
191 static const autofilter_entry_type autofilter_symbollist_generic[] =
193 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
194 /* Entry point symbols. */
195 { STRING_COMMA_LEN ("DllMain") },
196 { STRING_COMMA_LEN ("DllMainCRTStartup") },
197 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
198 /* Runtime pseudo-reloc. */
199 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
200 { STRING_COMMA_LEN ("do_pseudo_reloc") },
204 static const autofilter_entry_type autofilter_symbollist_i386[] =
206 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
207 /* Entry point symbols, and entry hooks. */
208 { STRING_COMMA_LEN ("cygwin_crt0") },
210 { STRING_COMMA_LEN ("DllMain") },
211 { STRING_COMMA_LEN ("DllEntryPoint") },
212 { STRING_COMMA_LEN ("DllMainCRTStartup") },
213 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
214 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
215 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
217 { STRING_COMMA_LEN ("DllMain@12") },
218 { STRING_COMMA_LEN ("DllEntryPoint@0") },
219 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
220 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
221 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
222 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
223 { STRING_COMMA_LEN ("cygwin_attach_dll") },
225 { STRING_COMMA_LEN ("cygwin_premain0") },
226 { STRING_COMMA_LEN ("cygwin_premain1") },
227 { STRING_COMMA_LEN ("cygwin_premain2") },
228 { STRING_COMMA_LEN ("cygwin_premain3") },
229 /* Runtime pseudo-reloc. */
230 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
231 { STRING_COMMA_LEN ("do_pseudo_reloc") },
232 /* Global vars that should not be exported. */
233 { STRING_COMMA_LEN ("impure_ptr") },
234 { STRING_COMMA_LEN ("_impure_ptr") },
235 { STRING_COMMA_LEN ("_fmode") },
236 { STRING_COMMA_LEN ("environ") },
240 #define PE_ARCH_i386 1
242 #define PE_ARCH_mips 3
243 #define PE_ARCH_arm 4
244 #define PE_ARCH_arm_epoc 5
245 #define PE_ARCH_arm_wince 6
247 static const pe_details_type pe_detail_list[] =
262 autofilter_symbollist_i386
267 16 /* R_SH_IMAGEBASE */,
271 autofilter_symbollist_generic
280 autofilter_symbollist_generic
289 autofilter_symbollist_generic
292 "epoc-pei-arm-little",
293 "epoc-pe-arm-little",
298 autofilter_symbollist_generic
301 "pei-arm-wince-little",
302 "pe-arm-wince-little",
303 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
307 autofilter_symbollist_generic
309 { NULL, NULL, 0, 0, 0, FALSE, NULL }
312 static const pe_details_type *pe_details;
314 /* Do not specify library suffix explicitly, to allow for dllized versions. */
315 static const autofilter_entry_type autofilter_liblist[] =
317 { STRING_COMMA_LEN ("libcegcc") },
318 { STRING_COMMA_LEN ("libcygwin") },
319 { STRING_COMMA_LEN ("libgcc") },
320 { STRING_COMMA_LEN ("libgcc_s") },
321 { STRING_COMMA_LEN ("libstdc++") },
322 { STRING_COMMA_LEN ("libmingw32") },
323 { STRING_COMMA_LEN ("libmingwex") },
324 { STRING_COMMA_LEN ("libg2c") },
325 { STRING_COMMA_LEN ("libsupc++") },
326 { STRING_COMMA_LEN ("libobjc") },
327 { STRING_COMMA_LEN ("libgcj") },
331 /* Regardless of the suffix issue mentioned above, we must ensure that
332 we do not falsely match on a leading substring, such as when libtool
333 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
334 This routine ensures that the leading part of the name matches and that
335 it is followed by only an optional version suffix and a file extension,
336 returning zero if so or -1 if not. */
337 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
339 if (strncmp (libname, afptr->name, afptr->len))
342 libname += afptr->len;
344 /* Be liberal in interpreting what counts as a version suffix; we
345 accept anything that has a dash to separate it from the name and
346 begins with a digit. */
347 if (libname[0] == '-')
349 if (!ISDIGIT (*++libname))
351 /* Ensure the filename has an extension. */
352 while (*++libname != '.')
356 else if (libname[0] != '.')
362 static const autofilter_entry_type autofilter_objlist[] =
364 { STRING_COMMA_LEN ("crt0.o") },
365 { STRING_COMMA_LEN ("crt1.o") },
366 { STRING_COMMA_LEN ("crt2.o") },
367 { STRING_COMMA_LEN ("dllcrt1.o") },
368 { STRING_COMMA_LEN ("dllcrt2.o") },
369 { STRING_COMMA_LEN ("gcrt0.o") },
370 { STRING_COMMA_LEN ("gcrt1.o") },
371 { STRING_COMMA_LEN ("gcrt2.o") },
372 { STRING_COMMA_LEN ("crtbegin.o") },
373 { STRING_COMMA_LEN ("crtend.o") },
377 static const autofilter_entry_type autofilter_symbolprefixlist[] =
379 /* _imp_ is treated specially, as it is always underscored. */
380 /* { STRING_COMMA_LEN ("_imp_") }, */
381 /* Don't export some c++ symbols. */
382 { STRING_COMMA_LEN ("__rtti_") },
383 { STRING_COMMA_LEN ("__builtin_") },
384 /* Don't re-export auto-imported symbols. */
385 { STRING_COMMA_LEN ("_nm_") },
386 /* Don't export symbols specifying internal DLL layout. */
387 { STRING_COMMA_LEN ("_head_") },
388 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
389 /* Don't export section labels or artificial symbols
391 { STRING_COMMA_LEN (".") },
395 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
397 { STRING_COMMA_LEN ("_iname") },
398 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
402 #define U(str) (pe_details->underscored ? "_" str : str)
405 pe_dll_id_target (const char *target)
409 for (i = 0; pe_detail_list[i].target_name; i++)
410 if (strcmp (pe_detail_list[i].target_name, target) == 0
411 || strcmp (pe_detail_list[i].object_target, target) == 0)
413 pe_details = pe_detail_list + i;
416 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
420 /* Helper functions for qsort. Relocs must be sorted so that we can write
421 them out by pages. */
432 reloc_sort (const void *va, const void *vb)
434 bfd_vma a = ((const reloc_data_type *) va)->vma;
435 bfd_vma b = ((const reloc_data_type *) vb)->vma;
437 return (a > b) ? 1 : ((a < b) ? -1 : 0);
441 pe_export_sort (const void *va, const void *vb)
443 const def_file_export *a = va;
444 const def_file_export *b = vb;
446 return strcmp (a->name, b->name);
449 /* Read and process the .DEF file. */
451 /* These correspond to the entries in pe_def_file->exports[]. I use
452 exported_symbol_sections[i] to tag whether or not the symbol was
453 defined, since we can't export symbols we don't have. */
455 static bfd_vma *exported_symbol_offsets;
456 static struct bfd_section **exported_symbol_sections;
457 static int export_table_size;
458 static int count_exported;
459 static int count_exported_byname;
460 static int count_with_ordinals;
461 static const char *dll_name;
462 static int min_ordinal, max_ordinal;
463 static int *exported_symbols;
465 typedef struct exclude_list_struct
468 struct exclude_list_struct *next;
473 static struct exclude_list_struct *excludes = 0;
476 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
479 char *exclude_string;
481 local_copy = xstrdup (new_excludes);
483 exclude_string = strtok (local_copy, ",:");
484 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
486 struct exclude_list_struct *new_exclude;
488 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
489 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
490 strcpy (new_exclude->string, exclude_string);
491 new_exclude->type = type;
492 new_exclude->next = excludes;
493 excludes = new_exclude;
500 is_import (const char* n)
502 return (CONST_STRNEQ (n, "__imp_"));
505 /* abfd is a bfd containing n (or NULL)
506 It can be used for contextual checks. */
509 auto_export (bfd *abfd, def_file *d, const char *n)
512 struct exclude_list_struct *ex;
513 const autofilter_entry_type *afptr;
514 const char * libname = 0;
515 if (abfd && abfd->my_archive)
516 libname = lbasename (abfd->my_archive->filename);
518 for (i = 0; i < d->num_exports; i++)
519 if (strcmp (d->exports[i].name, n) == 0)
522 if (pe_dll_do_default_excludes)
527 if (pe_dll_extra_pe_debug)
528 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
529 n, abfd, abfd->my_archive);
531 /* First of all, make context checks:
532 Don't export anything from standard libs. */
535 afptr = autofilter_liblist;
539 if (libnamencmp (libname, afptr) == 0 )
545 /* Next, exclude symbols from certain startup objects. */
547 if (abfd && (p = lbasename (abfd->filename)))
549 afptr = autofilter_objlist;
552 if (strcmp (p, afptr->name) == 0)
558 /* Don't try to blindly exclude all symbols
559 that begin with '__'; this was tried and
560 it is too restrictive. Instead we have
561 a target specific list to use: */
562 afptr = pe_details->autofilter_symbollist;
566 if (strcmp (n, afptr->name) == 0)
572 /* Next, exclude symbols starting with ... */
573 afptr = autofilter_symbolprefixlist;
576 if (strncmp (n, afptr->name, afptr->len) == 0)
582 /* Finally, exclude symbols ending with ... */
584 afptr = autofilter_symbolsuffixlist;
587 if ((len >= afptr->len)
588 /* Add 1 to insure match with trailing '\0'. */
589 && strncmp (n + len - afptr->len, afptr->name,
590 afptr->len + 1) == 0)
597 for (ex = excludes; ex; ex = ex->next)
599 if (ex->type == EXCLUDELIBS)
602 && ((strcmp (libname, ex->string) == 0)
603 || (strcasecmp ("ALL", ex->string) == 0)))
606 else if (ex->type == EXCLUDEFORIMPLIB)
608 if (strcmp (abfd->filename, ex->string) == 0)
611 else if (strcmp (n, ex->string) == 0)
619 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
622 struct bfd_link_hash_entry *blhe;
624 struct bfd_section *s;
625 def_file_export *e = 0;
628 pe_def_file = def_file_empty ();
630 /* First, run around to all the objects looking for the .drectve
631 sections, and push those into the def file too. */
632 for (b = info->input_bfds; b; b = b->link_next)
634 s = bfd_get_section_by_name (b, ".drectve");
638 char *buf = xmalloc (size);
640 bfd_get_section_contents (b, s, buf, 0, size);
641 def_file_add_directive (pe_def_file, buf, size);
646 /* Process aligned common symbol information from the
647 .drectve sections now; common symbol allocation is
648 done before final link, so it will be too late to
649 process them in process_embedded_commands() called
650 from _bfd_coff_link_input_bfd(). */
651 if (pe_def_file->aligncomms)
653 def_file_aligncomm *ac = pe_def_file->aligncomms;
656 struct coff_link_hash_entry *sym_hash;
657 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
658 ac->symbol_name, FALSE, FALSE, FALSE);
659 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
660 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
662 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
668 /* If we are building an executable and there is nothing
669 to export, we do not build an export table at all. */
670 if (info->executable && pe_def_file->num_exports == 0
671 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
674 /* Now, maybe export everything else the default way. */
675 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
676 && !pe_dll_exclude_all_symbols)
678 for (b = info->input_bfds; b; b = b->link_next)
683 if (!bfd_generic_link_read_symbols (b))
685 einfo (_("%B%F: could not read symbols: %E\n"), b);
689 symbols = bfd_get_outsymbols (b);
690 nsyms = bfd_get_symcount (b);
692 for (j = 0; j < nsyms; j++)
694 /* We should export symbols which are either global or not
695 anything at all. (.bss data is the latter)
696 We should not export undefined symbols. */
697 bfd_boolean would_export = symbols[j]->section != &bfd_und_section
698 && ((symbols[j]->flags & BSF_GLOBAL)
699 || (symbols[j]->flags == 0));
700 if (lang_elf_version_info && would_export)
702 bfd_boolean hide = 0;
703 char ofs = pe_details->underscored && symbols[j]->name[0] == '_';
704 (void) bfd_find_version_for_sym (lang_elf_version_info,
705 symbols[j]->name + ofs, &hide);
706 would_export = !hide;
710 const char *sn = symbols[j]->name;
712 /* We should not re-export imported stuff. */
718 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
719 sprintf (name, "%s%s", "__imp_", sn);
721 blhe = bfd_link_hash_lookup (info->hash, name,
722 FALSE, FALSE, FALSE);
725 if (blhe && blhe->type == bfd_link_hash_defined)
729 if (pe_details->underscored && *sn == '_')
732 if (auto_export (b, pe_def_file, sn))
735 p=def_file_add_export (pe_def_file, sn, 0, -1);
736 /* Fill data flag properly, from dlltool.c. */
737 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
745 #define NE pe_def_file->num_exports
747 /* Don't create an empty export table. */
751 /* Canonicalize the export list. */
754 for (i = 0; i < NE; i++)
756 if (strchr (pe_def_file->exports[i].name, '@'))
758 /* This will preserve internal_name, which may have been
759 pointing to the same memory as name, or might not
761 int lead_at = (*pe_def_file->exports[i].name == '@');
762 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
763 char *tmp_at = strchr (tmp, '@');
768 einfo (_("%XCannot export %s: invalid export name\n"),
769 pe_def_file->exports[i].name);
770 pe_def_file->exports[i].name = tmp;
775 if (pe_dll_stdcall_aliases)
777 for (i = 0; i < NE; i++)
779 if (is_import (pe_def_file->exports[i].name))
782 if (strchr (pe_def_file->exports[i].name, '@'))
784 int lead_at = (*pe_def_file->exports[i].name == '@');
785 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
787 *(strchr (tmp, '@')) = 0;
788 if (auto_export (NULL, pe_def_file, tmp))
789 def_file_add_export (pe_def_file, tmp,
790 pe_def_file->exports[i].internal_name,
798 /* Convenience, but watch out for it changing. */
799 e = pe_def_file->exports;
801 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
802 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
804 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
808 count_exported_byname = 0;
809 count_with_ordinals = 0;
811 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
813 for (i = 0, j = 0; i < NE; i++)
815 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
817 /* This is a duplicate. */
818 if (e[j - 1].ordinal != -1
819 && e[i].ordinal != -1
820 && e[j - 1].ordinal != e[i].ordinal)
822 if (pe_dll_warn_dup_exports)
823 /* xgettext:c-format */
824 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
825 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
829 if (pe_dll_warn_dup_exports)
830 /* xgettext:c-format */
831 einfo (_("Warning, duplicate EXPORT: %s\n"),
835 if (e[i].ordinal != -1)
836 e[j - 1].ordinal = e[i].ordinal;
837 e[j - 1].flag_private |= e[i].flag_private;
838 e[j - 1].flag_constant |= e[i].flag_constant;
839 e[j - 1].flag_noname |= e[i].flag_noname;
840 e[j - 1].flag_data |= e[i].flag_data;
849 pe_def_file->num_exports = j; /* == NE */
851 for (i = 0; i < NE; i++)
855 /* Check for forward exports */
856 if (strchr (pe_def_file->exports[i].internal_name, '.'))
859 if (!pe_def_file->exports[i].flag_noname)
860 count_exported_byname++;
862 pe_def_file->exports[i].flag_forward = 1;
864 if (pe_def_file->exports[i].ordinal != -1)
866 if (max_ordinal < pe_def_file->exports[i].ordinal)
867 max_ordinal = pe_def_file->exports[i].ordinal;
868 if (min_ordinal > pe_def_file->exports[i].ordinal)
869 min_ordinal = pe_def_file->exports[i].ordinal;
870 count_with_ordinals++;
876 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
877 if (pe_details->underscored
878 && (*pe_def_file->exports[i].internal_name != '@'))
881 strcpy (name + 1, pe_def_file->exports[i].internal_name);
884 strcpy (name, pe_def_file->exports[i].internal_name);
886 blhe = bfd_link_hash_lookup (info->hash,
891 && (blhe->type == bfd_link_hash_defined
892 || (blhe->type == bfd_link_hash_common)))
895 if (!pe_def_file->exports[i].flag_noname)
896 count_exported_byname++;
898 /* Only fill in the sections. The actual offsets are computed
899 in fill_exported_offsets() after common symbols are laid
901 if (blhe->type == bfd_link_hash_defined)
902 exported_symbol_sections[i] = blhe->u.def.section;
904 exported_symbol_sections[i] = blhe->u.c.p->section;
906 if (pe_def_file->exports[i].ordinal != -1)
908 if (max_ordinal < pe_def_file->exports[i].ordinal)
909 max_ordinal = pe_def_file->exports[i].ordinal;
910 if (min_ordinal > pe_def_file->exports[i].ordinal)
911 min_ordinal = pe_def_file->exports[i].ordinal;
912 count_with_ordinals++;
915 else if (blhe && blhe->type == bfd_link_hash_undefined)
917 /* xgettext:c-format */
918 einfo (_("%XCannot export %s: symbol not defined\n"),
919 pe_def_file->exports[i].internal_name);
923 /* xgettext:c-format */
924 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
925 pe_def_file->exports[i].internal_name,
926 blhe->type, bfd_link_hash_defined);
930 /* xgettext:c-format */
931 einfo (_("%XCannot export %s: symbol not found\n"),
932 pe_def_file->exports[i].internal_name);
938 /* Build the bfd that will contain .edata and .reloc sections. */
941 build_filler_bfd (int include_edata)
943 lang_input_statement_type *filler_file;
944 filler_file = lang_add_input_file ("dll stuff",
945 lang_input_file_is_fake_enum,
947 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
948 link_info.output_bfd);
949 if (filler_bfd == NULL
950 || !bfd_set_arch_mach (filler_bfd,
951 bfd_get_arch (link_info.output_bfd),
952 bfd_get_mach (link_info.output_bfd)))
954 einfo ("%X%P: can not create BFD: %E\n");
960 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
962 || !bfd_set_section_flags (filler_bfd, edata_s,
969 einfo ("%X%P: can not create .edata section: %E\n");
972 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
975 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
977 || !bfd_set_section_flags (filler_bfd, reloc_s,
984 einfo ("%X%P: can not create .reloc section: %E\n");
988 bfd_set_section_size (filler_bfd, reloc_s, 0);
990 ldlang_add_file (filler_file);
993 /* Gather all the exported symbols and build the .edata section. */
996 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
999 int name_table_size = 0;
1002 /* First, we need to know how many exported symbols there are,
1003 and what the range of ordinals is. */
1004 if (pe_def_file->name)
1005 dll_name = pe_def_file->name;
1008 dll_name = abfd->filename;
1010 for (dlnp = dll_name; *dlnp; dlnp++)
1011 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1012 dll_name = dlnp + 1;
1015 if (count_with_ordinals && max_ordinal > count_exported)
1017 if (min_ordinal > max_ordinal - count_exported + 1)
1018 min_ordinal = max_ordinal - count_exported + 1;
1023 max_ordinal = count_exported;
1026 export_table_size = max_ordinal - min_ordinal + 1;
1027 exported_symbols = xmalloc (export_table_size * sizeof (int));
1028 for (i = 0; i < export_table_size; i++)
1029 exported_symbols[i] = -1;
1031 /* Now we need to assign ordinals to those that don't have them. */
1032 for (i = 0; i < NE; i++)
1034 if (exported_symbol_sections[i] ||
1035 pe_def_file->exports[i].flag_forward)
1037 if (pe_def_file->exports[i].ordinal != -1)
1039 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1040 int pi = exported_symbols[ei];
1044 /* xgettext:c-format */
1045 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1046 pe_def_file->exports[i].ordinal,
1047 pe_def_file->exports[i].name,
1048 pe_def_file->exports[pi].name);
1050 exported_symbols[ei] = i;
1052 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1055 /* Reserve space for the forward name. */
1056 if (pe_def_file->exports[i].flag_forward)
1058 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1062 next_ordinal = min_ordinal;
1063 for (i = 0; i < NE; i++)
1064 if ((exported_symbol_sections[i] ||
1065 pe_def_file->exports[i].flag_forward) &&
1066 pe_def_file->exports[i].ordinal == -1)
1068 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1071 exported_symbols[next_ordinal - min_ordinal] = i;
1072 pe_def_file->exports[i].ordinal = next_ordinal;
1075 /* OK, now we can allocate some memory. */
1076 edata_sz = (40 /* directory */
1077 + 4 * export_table_size /* addresses */
1078 + 4 * count_exported_byname /* name ptrs */
1079 + 2 * count_exported_byname /* ordinals */
1080 + name_table_size + strlen (dll_name) + 1);
1083 /* Fill the exported symbol offsets. The preliminary work has already
1084 been done in process_def_file_and_drectve(). */
1087 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1090 struct bfd_link_hash_entry *blhe;
1092 for (i = 0; i < pe_def_file->num_exports; i++)
1096 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1097 if (pe_details->underscored
1098 && *pe_def_file->exports[i].internal_name != '@')
1101 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1104 strcpy (name, pe_def_file->exports[i].internal_name);
1106 blhe = bfd_link_hash_lookup (info->hash,
1108 FALSE, FALSE, TRUE);
1110 if (blhe && blhe->type == bfd_link_hash_defined)
1111 exported_symbol_offsets[i] = blhe->u.def.value;
1118 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1121 unsigned char *edirectory;
1122 unsigned char *eaddresses;
1123 unsigned char *enameptrs;
1124 unsigned char *eordinals;
1130 edata_d = xmalloc (edata_sz);
1132 /* Note use of array pointer math here. */
1133 edirectory = edata_d;
1134 eaddresses = edata_d + 40;
1135 enameptrs = eaddresses + 4 * export_table_size;
1136 eordinals = enameptrs + 4 * count_exported_byname;
1137 enamestr = (char *) eordinals + 2 * count_exported_byname;
1139 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1140 + edata_s->output_section->vma - image_base)
1142 memset (edata_d, 0, edata_sz);
1143 bfd_put_32 (abfd, now, edata_d + 4);
1144 if (pe_def_file->version_major != -1)
1146 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1147 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1150 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1151 strcpy (enamestr, dll_name);
1152 enamestr += strlen (enamestr) + 1;
1153 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1154 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1155 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1156 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1157 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1158 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1160 fill_exported_offsets (abfd, info);
1162 /* Ok, now for the filling in part.
1163 Scan alphabetically - ie the ordering in the exports[] table,
1164 rather than by ordinal - the ordering in the exported_symbol[]
1165 table. See dlltool.c and:
1166 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1167 for more information. */
1169 for (s = 0; s < NE; s++)
1171 struct bfd_section *ssec = exported_symbol_sections[s];
1172 if (pe_def_file->exports[s].ordinal != -1 &&
1173 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1175 int ord = pe_def_file->exports[s].ordinal;
1177 if (pe_def_file->exports[s].flag_forward)
1179 bfd_put_32 (abfd, ERVA (enamestr),
1180 eaddresses + 4 * (ord - min_ordinal));
1182 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1183 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1187 bfd_vma srva = (exported_symbol_offsets[s]
1188 + ssec->output_section->vma
1189 + ssec->output_offset);
1191 bfd_put_32 (abfd, srva - image_base,
1192 eaddresses + 4 * (ord - min_ordinal));
1195 if (!pe_def_file->exports[s].flag_noname)
1197 char *ename = pe_def_file->exports[s].name;
1199 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1201 strcpy (enamestr, ename);
1202 enamestr += strlen (enamestr) + 1;
1203 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1205 pe_def_file->exports[s].hint = hint++;
1212 static struct bfd_section *current_sec;
1215 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1217 int (*cb) (arelent *, asection *))
1222 for (b = info->input_bfds; b; b = b->link_next)
1227 if (!bfd_generic_link_read_symbols (b))
1229 einfo (_("%B%F: could not read symbols: %E\n"), b);
1233 symbols = bfd_get_outsymbols (b);
1234 nsyms = bfd_get_symcount (b);
1236 for (s = b->sections; s; s = s->next)
1239 int relsize, nrelocs, i;
1240 int flags = bfd_get_section_flags (b, s);
1242 /* Skip discarded linkonce sections. */
1243 if (flags & SEC_LINK_ONCE
1244 && s->output_section == bfd_abs_section_ptr)
1249 relsize = bfd_get_reloc_upper_bound (b, s);
1250 relocs = xmalloc (relsize);
1251 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1253 for (i = 0; i < nrelocs; i++)
1255 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1257 if (!strcmp (name, sym->name))
1263 /* Warning: the allocated symbols are remembered in BFD and reused
1264 later, so don't free them! */
1265 /* free (symbols); */
1270 /* Gather all the relocations and build the .reloc section. */
1273 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1276 /* For .reloc stuff. */
1277 reloc_data_type *reloc_data;
1278 int total_relocs = 0;
1280 bfd_vma sec_page = (bfd_vma) -1;
1281 bfd_vma page_ptr, page_count;
1284 struct bfd_section *s;
1287 for (b = info->input_bfds; b; b = b->link_next)
1288 for (s = b->sections; s; s = s->next)
1289 total_relocs += s->reloc_count;
1291 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1295 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1298 int relsize, nrelocs, i;
1300 for (s = b->sections; s; s = s->next)
1302 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1306 /* If it's not loaded, we don't need to relocate it this way. */
1307 if (!(s->output_section->flags & SEC_LOAD))
1310 /* I don't know why there would be a reloc for these, but I've
1311 seen it happen - DJ */
1312 if (s->output_section == &bfd_abs_section)
1315 if (s->output_section->vma == 0)
1317 /* Huh? Shouldn't happen, but punt if it does. */
1318 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1319 s->output_section->name, s->output_section->index,
1320 s->output_section->flags);
1324 if (!bfd_generic_link_read_symbols (b))
1326 einfo (_("%B%F: could not read symbols: %E\n"), b);
1330 symbols = bfd_get_outsymbols (b);
1331 nsyms = bfd_get_symcount (b);
1332 relsize = bfd_get_reloc_upper_bound (b, s);
1333 relocs = xmalloc (relsize);
1334 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1336 for (i = 0; i < nrelocs; i++)
1338 if (pe_dll_extra_pe_debug)
1340 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1341 printf ("rel: %s\n", sym->name);
1343 if (!relocs[i]->howto->pc_relative
1344 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1347 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1349 /* Don't create relocs for undefined weak symbols. */
1350 if (sym->flags == BSF_WEAK)
1352 struct bfd_link_hash_entry *blhe
1353 = bfd_link_hash_lookup (info->hash, sym->name,
1354 FALSE, FALSE, FALSE);
1355 if (!blhe || blhe->type != bfd_link_hash_defined)
1359 sym_vma = (relocs[i]->addend
1362 + sym->section->output_offset
1363 + sym->section->output_section->vma);
1364 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1366 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1368 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1369 relocs[i]->howto->rightshift)
1371 #ifdef pe_use_x86_64
1372 case BITS_AND_SHIFT (64, 0):
1373 reloc_data[total_relocs].type = 10;
1377 case BITS_AND_SHIFT (32, 0):
1378 reloc_data[total_relocs].type = 3;
1381 case BITS_AND_SHIFT (16, 0):
1382 reloc_data[total_relocs].type = 2;
1385 case BITS_AND_SHIFT (16, 16):
1386 reloc_data[total_relocs].type = 4;
1387 /* FIXME: we can't know the symbol's right value
1388 yet, but we probably can safely assume that
1389 CE will relocate us in 64k blocks, so leaving
1391 reloc_data[total_relocs].extra = 0;
1394 case BITS_AND_SHIFT (26, 2):
1395 reloc_data[total_relocs].type = 5;
1398 case BITS_AND_SHIFT (24, 2):
1399 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1400 Those ARM_xxx definitions should go in proper
1402 if (relocs[i]->howto->type == 0
1403 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1404 || relocs[i]->howto->type == 5)
1405 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1406 that has already been fully processed during a
1407 previous link stage, so ignore it here. */
1411 /* xgettext:c-format */
1412 einfo (_("%XError: %d-bit reloc in dll\n"),
1413 relocs[i]->howto->bitsize);
1419 /* Warning: the allocated symbols are remembered in BFD and
1420 reused later, so don't free them! */
1424 /* At this point, we have total_relocs relocation addresses in
1425 reloc_addresses, which are all suitable for the .reloc section.
1426 We must now create the new sections. */
1427 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1429 for (i = 0; i < total_relocs; i++)
1431 bfd_vma this_page = (reloc_data[i].vma >> 12);
1433 if (this_page != sec_page)
1435 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1437 sec_page = this_page;
1442 if (reloc_data[i].type == 4)
1446 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1447 reloc_d = xmalloc (reloc_sz);
1448 sec_page = (bfd_vma) -1;
1450 page_ptr = (bfd_vma) -1;
1453 for (i = 0; i < total_relocs; i++)
1455 bfd_vma rva = reloc_data[i].vma - image_base;
1456 bfd_vma this_page = (rva & ~0xfff);
1458 if (this_page != sec_page)
1460 while (reloc_sz & 3)
1461 reloc_d[reloc_sz++] = 0;
1463 if (page_ptr != (bfd_vma) -1)
1464 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1466 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1467 page_ptr = reloc_sz;
1469 sec_page = this_page;
1473 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1474 reloc_d + reloc_sz);
1477 if (reloc_data[i].type == 4)
1479 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1486 while (reloc_sz & 3)
1487 reloc_d[reloc_sz++] = 0;
1489 if (page_ptr != (bfd_vma) -1)
1490 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1492 while (reloc_sz < reloc_s->size)
1493 reloc_d[reloc_sz++] = 0;
1496 /* Given the exiting def_file structure, print out a .DEF file that
1497 corresponds to it. */
1500 quoteput (char *s, FILE *f, int needs_quotes)
1504 for (cp = s; *cp; cp++)
1519 if (*s == '"' || *s == '\\')
1533 pe_dll_generate_def_file (const char *pe_out_def_filename)
1536 FILE *out = fopen (pe_out_def_filename, "w");
1539 /* xgettext:c-format */
1540 einfo (_("%s: Can't open output def file %s\n"),
1541 program_name, pe_out_def_filename);
1545 if (pe_def_file->name)
1547 if (pe_def_file->is_dll)
1548 fprintf (out, "LIBRARY ");
1550 fprintf (out, "NAME ");
1552 quoteput (pe_def_file->name, out, 1);
1554 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1556 fprintf (out, " BASE=0x");
1557 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1559 fprintf (out, "\n");
1562 if (pe_def_file->description)
1564 fprintf (out, "DESCRIPTION ");
1565 quoteput (pe_def_file->description, out, 1);
1566 fprintf (out, "\n");
1569 if (pe_def_file->version_minor != -1)
1570 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1571 pe_def_file->version_minor);
1572 else if (pe_def_file->version_major != -1)
1573 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1575 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1576 fprintf (out, "\n");
1578 if (pe_def_file->stack_commit != -1)
1579 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1580 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1581 else if (pe_def_file->stack_reserve != -1)
1582 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1584 if (pe_def_file->heap_commit != -1)
1585 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1586 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1587 else if (pe_def_file->heap_reserve != -1)
1588 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1590 if (pe_def_file->num_section_defs > 0)
1592 fprintf (out, "\nSECTIONS\n\n");
1594 for (i = 0; i < pe_def_file->num_section_defs; i++)
1597 quoteput (pe_def_file->section_defs[i].name, out, 0);
1599 if (pe_def_file->section_defs[i].class)
1601 fprintf (out, " CLASS ");
1602 quoteput (pe_def_file->section_defs[i].class, out, 0);
1605 if (pe_def_file->section_defs[i].flag_read)
1606 fprintf (out, " READ");
1608 if (pe_def_file->section_defs[i].flag_write)
1609 fprintf (out, " WRITE");
1611 if (pe_def_file->section_defs[i].flag_execute)
1612 fprintf (out, " EXECUTE");
1614 if (pe_def_file->section_defs[i].flag_shared)
1615 fprintf (out, " SHARED");
1617 fprintf (out, "\n");
1621 if (pe_def_file->num_exports > 0)
1623 fprintf (out, "EXPORTS\n");
1625 for (i = 0; i < pe_def_file->num_exports; i++)
1627 def_file_export *e = pe_def_file->exports + i;
1629 quoteput (e->name, out, 0);
1631 if (e->internal_name && strcmp (e->internal_name, e->name))
1633 fprintf (out, " = ");
1634 quoteput (e->internal_name, out, 0);
1637 if (e->ordinal != -1)
1638 fprintf (out, " @%d", e->ordinal);
1640 if (e->flag_private)
1641 fprintf (out, " PRIVATE");
1643 if (e->flag_constant)
1644 fprintf (out, " CONSTANT");
1647 fprintf (out, " NONAME");
1650 fprintf (out, " DATA");
1652 fprintf (out, "\n");
1656 if (pe_def_file->num_imports > 0)
1658 fprintf (out, "\nIMPORTS\n\n");
1660 for (i = 0; i < pe_def_file->num_imports; i++)
1662 def_file_import *im = pe_def_file->imports + i;
1665 if (im->internal_name
1666 && (!im->name || strcmp (im->internal_name, im->name)))
1668 quoteput (im->internal_name, out, 0);
1669 fprintf (out, " = ");
1672 quoteput (im->module->name, out, 0);
1676 quoteput (im->name, out, 0);
1678 fprintf (out, "%d", im->ordinal);
1680 fprintf (out, "\n");
1685 fprintf (out, _("; no contents available\n"));
1687 if (fclose (out) == EOF)
1688 /* xgettext:c-format */
1689 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1692 /* Generate the import library. */
1694 static asymbol **symtab;
1697 static int tmp_seq2;
1698 static const char *dll_filename;
1699 static char *dll_symname;
1701 #define UNDSEC (asection *) &bfd_und_section
1704 quick_section (bfd *abfd, const char *name, int flags, int align)
1709 sec = bfd_make_section_old_way (abfd, name);
1710 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1711 bfd_set_section_alignment (abfd, sec, align);
1712 /* Remember to undo this before trying to link internally! */
1713 sec->output_section = sec;
1715 sym = bfd_make_empty_symbol (abfd);
1716 symtab[symptr++] = sym;
1717 sym->name = sec->name;
1719 sym->flags = BSF_LOCAL;
1726 quick_symbol (bfd *abfd,
1735 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1740 sym = bfd_make_empty_symbol (abfd);
1745 symtab[symptr++] = sym;
1748 static arelent *reltab = 0;
1749 static int relcount = 0, relsize = 0;
1752 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1754 if (relcount >= relsize - 1)
1758 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1760 reltab = xmalloc (relsize * sizeof (arelent));
1762 reltab[relcount].address = address;
1763 reltab[relcount].addend = 0;
1764 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1765 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1770 save_relocs (asection *sec)
1774 sec->relocation = reltab;
1775 sec->reloc_count = relcount;
1776 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1777 for (i = 0; i < relcount; i++)
1778 sec->orelocation[i] = sec->relocation + i;
1779 sec->orelocation[relcount] = 0;
1780 sec->flags |= SEC_RELOC;
1782 relcount = relsize = 0;
1785 /* .section .idata$2
1786 .global __head_my_dll
1803 make_head (bfd *parent)
1805 asection *id2, *id5, *id4;
1806 unsigned char *d2, *d5, *d4;
1810 oname = xmalloc (20);
1811 sprintf (oname, "d%06d.o", tmp_seq);
1814 abfd = bfd_create (oname, parent);
1815 bfd_find_target (pe_details->object_target, abfd);
1816 bfd_make_writable (abfd);
1818 bfd_set_format (abfd, bfd_object);
1819 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1822 symtab = xmalloc (6 * sizeof (asymbol *));
1823 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1824 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1825 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1826 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1827 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1829 /* OK, pay attention here. I got confused myself looking back at
1830 it. We create a four-byte section to mark the beginning of the
1831 list, and we include an offset of 4 in the section, so that the
1832 pointer to the list points to the *end* of this section, which is
1833 the start of the list of sections from other objects. */
1835 bfd_set_section_size (abfd, id2, 20);
1839 if (pe_use_nul_prefixed_import_tables)
1840 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1841 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1842 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1843 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1846 if (pe_use_nul_prefixed_import_tables)
1847 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1849 bfd_set_section_size (abfd, id5, 0);
1850 d5 = xmalloc (PE_IDATA5_SIZE);
1852 memset (d5, 0, PE_IDATA5_SIZE);
1853 if (pe_use_nul_prefixed_import_tables)
1854 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1856 bfd_set_section_size (abfd, id4, 0);
1857 d4 = xmalloc (PE_IDATA4_SIZE);
1859 memset (d4, 0, PE_IDATA4_SIZE);
1861 bfd_set_symtab (abfd, symtab, symptr);
1863 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1864 if (pe_use_nul_prefixed_import_tables)
1866 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1867 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1871 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1872 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1875 bfd_make_readable (abfd);
1879 /* .section .idata$4
1886 .global __my_dll_iname
1891 make_tail (bfd *parent)
1893 asection *id4, *id5, *id7;
1894 unsigned char *d4, *d5, *d7;
1899 oname = xmalloc (20);
1900 sprintf (oname, "d%06d.o", tmp_seq);
1903 abfd = bfd_create (oname, parent);
1904 bfd_find_target (pe_details->object_target, abfd);
1905 bfd_make_writable (abfd);
1907 bfd_set_format (abfd, bfd_object);
1908 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1911 symtab = xmalloc (5 * sizeof (asymbol *));
1912 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1913 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1914 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1915 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1917 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1918 d4 = xmalloc (PE_IDATA4_SIZE);
1920 memset (d4, 0, PE_IDATA4_SIZE);
1922 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1923 d5 = xmalloc (PE_IDATA5_SIZE);
1925 memset (d5, 0, PE_IDATA5_SIZE);
1927 len = strlen (dll_filename) + 1;
1930 bfd_set_section_size (abfd, id7, len);
1933 strcpy ((char *) d7, dll_filename);
1934 /* If len was odd, the above
1935 strcpy leaves behind an undefined byte. That is harmless,
1936 but we set it to 0 just so the binary dumps are pretty. */
1939 bfd_set_symtab (abfd, symtab, symptr);
1941 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1942 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1943 bfd_set_section_contents (abfd, id7, d7, 0, len);
1945 bfd_make_readable (abfd);
1951 .global ___imp_function
1952 .global __imp__function
1954 jmp *__imp__function:
1968 .asciz "function" xlate? (add underscore, kill at) */
1970 static const unsigned char jmp_ix86_bytes[] =
1972 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1980 .dw __imp_function */
1982 static const unsigned char jmp_sh_bytes[] =
1984 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1988 lui $t0,<high:__imp_function>
1989 lw $t0,<low:__imp_function>
1993 static const unsigned char jmp_mips_bytes[] =
1995 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1996 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1999 static const unsigned char jmp_arm_bytes[] =
2001 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2002 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2008 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2010 asection *tx, *id7, *id5, *id4, *id6;
2011 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2015 const unsigned char *jmp_bytes = NULL;
2016 int jmp_byte_count = 0;
2018 /* Include the jump stub section only if it is needed. A jump
2019 stub is needed if the symbol being imported <sym> is a function
2020 symbol and there is at least one undefined reference to that
2021 symbol. In other words, if all the import references to <sym> are
2022 explicitly through _declspec(dllimport) then the jump stub is not
2024 if (include_jmp_stub)
2026 switch (pe_details->pe_arch)
2029 jmp_bytes = jmp_ix86_bytes;
2030 jmp_byte_count = sizeof (jmp_ix86_bytes);
2033 jmp_bytes = jmp_sh_bytes;
2034 jmp_byte_count = sizeof (jmp_sh_bytes);
2037 jmp_bytes = jmp_mips_bytes;
2038 jmp_byte_count = sizeof (jmp_mips_bytes);
2041 case PE_ARCH_arm_epoc:
2042 case PE_ARCH_arm_wince:
2043 jmp_bytes = jmp_arm_bytes;
2044 jmp_byte_count = sizeof (jmp_arm_bytes);
2051 oname = xmalloc (20);
2052 sprintf (oname, "d%06d.o", tmp_seq);
2055 abfd = bfd_create (oname, parent);
2056 bfd_find_target (pe_details->object_target, abfd);
2057 bfd_make_writable (abfd);
2059 bfd_set_format (abfd, bfd_object);
2060 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2063 symtab = xmalloc (11 * sizeof (asymbol *));
2064 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
2065 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2066 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2067 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2068 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2070 if (*exp->internal_name == '@')
2072 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2074 if (include_jmp_stub)
2075 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2076 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2078 /* Fastcall applies only to functions,
2079 so no need for auto-import symbol. */
2083 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2085 if (include_jmp_stub)
2086 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2088 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2090 /* Symbol to reference ord/name of imported
2091 data symbol, used to implement auto-import. */
2093 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2096 if (pe_dll_compat_implib)
2097 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2100 if (include_jmp_stub)
2102 bfd_set_section_size (abfd, tx, jmp_byte_count);
2103 td = xmalloc (jmp_byte_count);
2105 memcpy (td, jmp_bytes, jmp_byte_count);
2107 switch (pe_details->pe_arch)
2110 #ifdef pe_use_x86_64
2111 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2113 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2117 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2120 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2121 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2122 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2125 case PE_ARCH_arm_epoc:
2126 case PE_ARCH_arm_wince:
2127 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2135 bfd_set_section_size (abfd, tx, 0);
2137 bfd_set_section_size (abfd, id7, 4);
2141 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2144 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2145 d5 = xmalloc (PE_IDATA5_SIZE);
2147 memset (d5, 0, PE_IDATA5_SIZE);
2149 if (exp->flag_noname)
2151 d5[0] = exp->ordinal;
2152 d5[1] = exp->ordinal >> 8;
2153 d5[PE_IDATA5_SIZE - 1] = 0x80;
2157 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2161 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2162 d4 = xmalloc (PE_IDATA4_SIZE);
2164 memset (d4, 0, PE_IDATA4_SIZE);
2166 if (exp->flag_noname)
2168 d4[0] = exp->ordinal;
2169 d4[1] = exp->ordinal >> 8;
2170 d4[PE_IDATA4_SIZE - 1] = 0x80;
2174 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2178 if (exp->flag_noname)
2181 bfd_set_section_size (abfd, id6, 0);
2185 /* { short, asciz } */
2186 len = 2 + strlen (exp->name) + 1;
2189 bfd_set_section_size (abfd, id6, len);
2192 memset (d6, 0, len);
2193 d6[0] = exp->hint & 0xff;
2194 d6[1] = exp->hint >> 8;
2195 strcpy ((char *) d6 + 2, exp->name);
2198 bfd_set_symtab (abfd, symtab, symptr);
2200 if (include_jmp_stub)
2201 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2202 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2203 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2204 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2205 if (!exp->flag_noname)
2206 bfd_set_section_contents (abfd, id6, d6, 0, len);
2208 bfd_make_readable (abfd);
2213 make_singleton_name_imp (const char *import, bfd *parent)
2215 /* Name thunks go to idata$4. */
2221 oname = xmalloc (20);
2222 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2225 abfd = bfd_create (oname, parent);
2226 bfd_find_target (pe_details->object_target, abfd);
2227 bfd_make_writable (abfd);
2229 bfd_set_format (abfd, bfd_object);
2230 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2233 symtab = xmalloc (3 * sizeof (asymbol *));
2234 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2235 quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2237 /* We need space for the real thunk and for the null terminator. */
2238 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2239 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2241 memset (d5, 0, PE_IDATA5_SIZE * 2);
2242 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2245 bfd_set_symtab (abfd, symtab, symptr);
2247 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2249 bfd_make_readable (abfd);
2254 make_singleton_name_thunk (const char *import, bfd *parent)
2256 /* Name thunks go to idata$4. */
2262 oname = xmalloc (20);
2263 sprintf (oname, "nmth%06d.o", tmp_seq);
2266 abfd = bfd_create (oname, parent);
2267 bfd_find_target (pe_details->object_target, abfd);
2268 bfd_make_writable (abfd);
2270 bfd_set_format (abfd, bfd_object);
2271 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2274 symtab = xmalloc (3 * sizeof (asymbol *));
2275 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2276 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2277 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2279 /* We need space for the real thunk and for the null terminator. */
2280 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2281 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2283 memset (d4, 0, PE_IDATA4_SIZE * 2);
2284 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2287 bfd_set_symtab (abfd, symtab, symptr);
2289 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2291 bfd_make_readable (abfd);
2296 make_import_fixup_mark (arelent *rel)
2298 /* We convert reloc to symbol, for later reference. */
2300 static char *fixup_name = NULL;
2301 static size_t buffer_len = 0;
2303 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2305 bfd *abfd = bfd_asymbol_bfd (sym);
2306 struct bfd_link_hash_entry *bh;
2310 fixup_name = xmalloc (384);
2314 if (strlen (sym->name) + 25 > buffer_len)
2315 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2316 bigger than 20 digits long, we've got worse problems than
2317 overflowing this buffer... */
2320 /* New buffer size is length of symbol, plus 25, but
2321 then rounded up to the nearest multiple of 128. */
2322 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2323 fixup_name = xmalloc (buffer_len);
2326 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2329 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2330 current_sec, /* sym->section, */
2331 rel->address, NULL, TRUE, FALSE, &bh);
2336 /* .section .idata$2
2337 .rva __nm_thnk_SYM (singleton thunk with name of func)
2340 .rva __my_dll_iname (name of dll)
2341 .rva __fuNN_SYM (pointer to reference (address) in text) */
2344 make_import_fixup_entry (const char *name,
2345 const char *fixup_name,
2346 const char *dll_symname,
2354 oname = xmalloc (20);
2355 sprintf (oname, "fu%06d.o", tmp_seq);
2358 abfd = bfd_create (oname, parent);
2359 bfd_find_target (pe_details->object_target, abfd);
2360 bfd_make_writable (abfd);
2362 bfd_set_format (abfd, bfd_object);
2363 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2366 symtab = xmalloc (6 * sizeof (asymbol *));
2367 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2369 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2370 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2371 /* For relocator v2 we have to use the .idata$5 element and not
2373 if (link_info.pei386_runtime_pseudo_reloc == 2)
2374 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2376 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2378 bfd_set_section_size (abfd, id2, 20);
2383 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2384 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2385 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2388 bfd_set_symtab (abfd, symtab, symptr);
2390 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2392 bfd_make_readable (abfd);
2396 /* .section .rdata_runtime_pseudo_reloc
2398 .rva __fuNN_SYM (pointer to reference (address) in text) */
2401 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2402 const char *fixup_name,
2403 bfd_vma addend ATTRIBUTE_UNUSED,
2408 unsigned char *rt_rel_d;
2411 oname = xmalloc (20);
2412 sprintf (oname, "rtr%06d.o", tmp_seq);
2415 abfd = bfd_create (oname, parent);
2416 bfd_find_target (pe_details->object_target, abfd);
2417 bfd_make_writable (abfd);
2419 bfd_set_format (abfd, bfd_object);
2420 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2423 if (link_info.pei386_runtime_pseudo_reloc == 2)
2425 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2429 symtab = xmalloc (2 * sizeof (asymbol *));
2431 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2432 SEC_HAS_CONTENTS, 2);
2434 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2436 if (link_info.pei386_runtime_pseudo_reloc == 2)
2439 if (! runtime_pseudp_reloc_v2_init)
2442 runtime_pseudp_reloc_v2_init = 1;
2444 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2446 bfd_set_section_size (abfd, rt_rel, size);
2447 rt_rel_d = xmalloc (size);
2448 rt_rel->contents = rt_rel_d;
2449 memset (rt_rel_d, 0, size);
2450 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2451 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2452 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2454 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2455 save_relocs (rt_rel);
2457 bfd_set_symtab (abfd, symtab, symptr);
2459 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2463 bfd_set_section_size (abfd, rt_rel, 8);
2464 rt_rel_d = xmalloc (8);
2465 rt_rel->contents = rt_rel_d;
2466 memset (rt_rel_d, 0, 8);
2468 bfd_put_32 (abfd, addend, rt_rel_d);
2469 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2471 save_relocs (rt_rel);
2473 bfd_set_symtab (abfd, symtab, symptr);
2475 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2477 bfd_make_readable (abfd);
2482 .rva __pei386_runtime_relocator */
2485 pe_create_runtime_relocator_reference (bfd *parent)
2487 asection *extern_rt_rel;
2488 unsigned char *extern_rt_rel_d;
2492 oname = xmalloc (20);
2493 sprintf (oname, "ertr%06d.o", tmp_seq);
2496 abfd = bfd_create (oname, parent);
2497 bfd_find_target (pe_details->object_target, abfd);
2498 bfd_make_writable (abfd);
2500 bfd_set_format (abfd, bfd_object);
2501 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2504 symtab = xmalloc (2 * sizeof (asymbol *));
2505 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2507 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2510 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2511 extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2512 extern_rt_rel->contents = extern_rt_rel_d;
2514 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2515 save_relocs (extern_rt_rel);
2517 bfd_set_symtab (abfd, symtab, symptr);
2519 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2521 bfd_make_readable (abfd);
2526 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2529 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2530 struct bfd_link_hash_entry *name_thunk_sym;
2531 struct bfd_link_hash_entry *name_imp_sym;
2532 const char *name = sym->name;
2533 char *fixup_name = make_import_fixup_mark (rel);
2535 int need_import_table = 1;
2537 sprintf (buf, U ("_imp_%s"), name);
2538 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2540 sprintf (buf, U ("_nm_thnk_%s"), name);
2542 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2544 /* For version 2 pseudo relocation we don't need to add an import
2545 if the import symbol is already present. */
2546 if (link_info.pei386_runtime_pseudo_reloc == 2
2548 && name_imp_sym->type == bfd_link_hash_defined)
2549 need_import_table = 0;
2551 if (need_import_table == 1
2552 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2554 bfd *b = make_singleton_name_thunk (name, link_info.output_bfd);
2555 add_bfd_to_link (b, b->filename, &link_info);
2557 /* If we ever use autoimport, we have to cast text section writable.
2558 But not for version 2. */
2559 if (link_info.pei386_runtime_pseudo_reloc != 2)
2561 config.text_read_only = FALSE;
2562 link_info.output_bfd->flags &= ~WP_TEXT;
2564 if (link_info.pei386_runtime_pseudo_reloc == 2)
2566 b = make_singleton_name_imp (name, link_info.output_bfd);
2567 add_bfd_to_link (b, b->filename, &link_info);
2571 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2572 && need_import_table == 1)
2574 extern char * pe_data_import_dll;
2575 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2577 b = make_import_fixup_entry (name, fixup_name, dll_symname,
2578 link_info.output_bfd);
2579 add_bfd_to_link (b, b->filename, &link_info);
2582 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2583 || link_info.pei386_runtime_pseudo_reloc == 2)
2585 if (pe_dll_extra_pe_debug)
2586 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2587 fixup_name, (int) addend);
2589 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2590 link_info.output_bfd);
2591 add_bfd_to_link (b, b->filename, &link_info);
2593 if (runtime_pseudo_relocs_created == 0)
2595 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2596 add_bfd_to_link (b, b->filename, &link_info);
2598 runtime_pseudo_relocs_created++;
2600 else if (addend != 0)
2602 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2603 s->owner, s, rel->address, sym->name);
2610 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2619 dll_filename = (def->name) ? def->name : dll_name;
2620 dll_symname = xstrdup (dll_filename);
2621 for (i = 0; dll_symname[i]; i++)
2622 if (!ISALNUM (dll_symname[i]))
2623 dll_symname[i] = '_';
2625 unlink_if_ordinary (impfilename);
2627 outarch = bfd_openw (impfilename, 0);
2631 /* xgettext:c-format */
2632 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2636 /* xgettext:c-format */
2637 info_msg (_("Creating library file: %s\n"), impfilename);
2639 bfd_set_format (outarch, bfd_archive);
2640 outarch->has_armap = 1;
2642 /* Work out a reasonable size of things to put onto one line. */
2643 ar_head = make_head (outarch);
2645 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2646 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2648 /* Iterate the exclude list. */
2649 struct exclude_list_struct *ex;
2651 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2653 if (ex->type != EXCLUDEFORIMPLIB)
2655 found = (strcmp (ex->string, ibfd->filename) == 0);
2657 /* If it matched, we must open a fresh BFD for it (the original
2658 input BFD is still needed for the DLL's final link) and add
2659 it into the archive member chain. */
2662 bfd *newbfd = bfd_openr (ibfd->my_archive
2663 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2666 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2669 if (ibfd->my_archive)
2671 /* Must now iterate through archive until we find the
2672 required member. A minor shame that we'll open the
2673 archive once per member that we require from it, and
2674 leak those archive bfds rather than reuse them. */
2675 bfd *arbfd = newbfd;
2676 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2678 einfo (_("%X%s(%s): can't find member in non-archive file"),
2679 ibfd->my_archive->filename, ibfd->filename);
2683 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2685 if (strcmp (newbfd->filename, ibfd->filename) == 0)
2690 einfo (_("%X%s(%s): can't find member in archive"),
2691 ibfd->my_archive->filename, ibfd->filename);
2695 newbfd->archive_next = head;
2700 for (i = 0; i < def->num_exports; i++)
2702 /* The import library doesn't know about the internal name. */
2703 char *internal = def->exports[i].internal_name;
2706 /* Don't add PRIVATE entries to import lib. */
2707 if (pe_def_file->exports[i].flag_private)
2709 def->exports[i].internal_name = def->exports[i].name;
2710 n = make_one (def->exports + i, outarch,
2711 ! (def->exports + i)->flag_data);
2712 n->archive_next = head;
2714 def->exports[i].internal_name = internal;
2717 ar_tail = make_tail (outarch);
2719 if (ar_head == NULL || ar_tail == NULL)
2722 /* Now stick them all into the archive. */
2723 ar_head->archive_next = head;
2724 ar_tail->archive_next = ar_head;
2727 if (! bfd_set_archive_head (outarch, head))
2728 einfo ("%Xbfd_set_archive_head: %E\n");
2730 if (! bfd_close (outarch))
2731 einfo ("%Xbfd_close %s: %E\n", impfilename);
2733 while (head != NULL)
2735 bfd *n = head->archive_next;
2742 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2744 lang_input_statement_type *fake_file;
2746 fake_file = lang_add_input_file (name,
2747 lang_input_file_is_fake_enum,
2749 fake_file->the_bfd = abfd;
2750 ldlang_add_file (fake_file);
2752 if (!bfd_link_add_symbols (abfd, link_info))
2753 einfo ("%Xaddsym %s: %E\n", name);
2757 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2759 def_file_module *module;
2761 pe_dll_id_target (bfd_get_target (output_bfd));
2766 for (module = pe_def_file->modules; module; module = module->next)
2770 dll_filename = module->name;
2771 dll_symname = xstrdup (module->name);
2772 for (i = 0; dll_symname[i]; i++)
2773 if (!ISALNUM (dll_symname[i]))
2774 dll_symname[i] = '_';
2778 for (i = 0; i < pe_def_file->num_imports; i++)
2779 if (pe_def_file->imports[i].module == module)
2781 def_file_export exp;
2782 struct bfd_link_hash_entry *blhe;
2783 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2784 /* See if we need this import. */
2785 size_t len = strlen (pe_def_file->imports[i].internal_name);
2786 char *name = xmalloc (len + 2 + 6);
2787 bfd_boolean include_jmp_stub = FALSE;
2790 sprintf (name, "%s",
2791 pe_def_file->imports[i].internal_name);
2793 sprintf (name, "%s%s",U (""),
2794 pe_def_file->imports[i].internal_name);
2796 blhe = bfd_link_hash_lookup (link_info->hash, name,
2797 FALSE, FALSE, FALSE);
2799 /* Include the jump stub for <sym> only if the <sym>
2801 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2804 sprintf (name, "%s%s", "__imp_",
2805 pe_def_file->imports[i].internal_name);
2807 sprintf (name, "%s%s%s", "__imp_", U (""),
2808 pe_def_file->imports[i].internal_name);
2810 blhe = bfd_link_hash_lookup (link_info->hash, name,
2811 FALSE, FALSE, FALSE);
2814 include_jmp_stub = TRUE;
2818 if (blhe && blhe->type == bfd_link_hash_undefined)
2824 bfd *ar_head = make_head (output_bfd);
2825 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2828 exp.internal_name = pe_def_file->imports[i].internal_name;
2829 exp.name = pe_def_file->imports[i].name;
2830 exp.ordinal = pe_def_file->imports[i].ordinal;
2831 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2832 exp.flag_private = 0;
2833 exp.flag_constant = 0;
2834 exp.flag_data = pe_def_file->imports[i].data;
2835 exp.flag_noname = exp.name ? 0 : 1;
2836 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2837 add_bfd_to_link (one, one->filename, link_info);
2842 bfd *ar_tail = make_tail (output_bfd);
2843 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2850 /* We were handed a *.DLL file. Parse it and turn it into a set of
2851 IMPORTS directives in the def file. Return TRUE if the file was
2852 handled, FALSE if not. */
2855 pe_get16 (bfd *abfd, int where)
2859 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2860 bfd_bread (b, (bfd_size_type) 2, abfd);
2861 return b[0] + (b[1] << 8);
2865 pe_get32 (bfd *abfd, int where)
2869 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2870 bfd_bread (b, (bfd_size_type) 4, abfd);
2871 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2877 unsigned char *b = ptr;
2879 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2883 pe_implied_import_dll (const char *filename)
2886 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2887 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2888 bfd_vma exp_funcbase;
2889 unsigned char *expdata;
2891 bfd_vma name_rvas, ordinals, nexp, ordbase;
2892 const char *dll_name;
2893 /* Initialization with start > end guarantees that is_data
2894 will not be set by mistake, and avoids compiler warning. */
2895 bfd_vma data_start = 1;
2896 bfd_vma data_end = 0;
2897 bfd_vma rdata_start = 1;
2898 bfd_vma rdata_end = 0;
2899 bfd_vma bss_start = 1;
2900 bfd_vma bss_end = 0;
2902 /* No, I can't use bfd here. kernel32.dll puts its export table in
2903 the middle of the .rdata section. */
2904 dll = bfd_openr (filename, pe_details->target_name);
2907 einfo ("%Xopen %s: %E\n", filename);
2911 /* PEI dlls seem to be bfd_objects. */
2912 if (!bfd_check_format (dll, bfd_object))
2914 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2918 /* Get pe_header, optional header and numbers of export entries. */
2919 pe_header_offset = pe_get32 (dll, 0x3c);
2920 opthdr_ofs = pe_header_offset + 4 + 20;
2921 #ifdef pe_use_x86_64
2922 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2924 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2927 if (num_entries < 1) /* No exports. */
2930 #ifdef pe_use_x86_64
2931 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2932 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2934 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2935 export_size = pe_get32 (dll, opthdr_ofs + 100);
2938 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2939 secptr = (pe_header_offset + 4 + 20 +
2940 pe_get16 (dll, pe_header_offset + 4 + 16));
2943 /* Get the rva and size of the export section. */
2944 for (i = 0; i < nsections; i++)
2947 bfd_vma secptr1 = secptr + 40 * i;
2948 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2949 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
2950 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
2952 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2953 bfd_bread (sname, (bfd_size_type) 8, dll);
2955 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2957 expptr = fptr + (export_rva - vaddr);
2958 if (export_rva + export_size > vaddr + vsize)
2959 export_size = vsize - (export_rva - vaddr);
2964 /* Scan sections and store the base and size of the
2965 data and bss segments in data/base_start/end. */
2966 for (i = 0; i < nsections; i++)
2968 bfd_vma secptr1 = secptr + 40 * i;
2969 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
2970 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2971 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
2975 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2976 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2978 if (strcmp(sec_name,".data") == 0)
2981 data_end = vaddr + vsize;
2983 if (pe_dll_extra_pe_debug)
2984 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2985 __FUNCTION__, sec_name, (unsigned long) vaddr,
2986 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2988 else if (strcmp(sec_name,".rdata") == 0)
2990 rdata_start = vaddr;
2991 rdata_end = vaddr + vsize;
2993 if (pe_dll_extra_pe_debug)
2994 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2995 __FUNCTION__, sec_name, (unsigned long) vaddr,
2996 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2998 else if (strcmp (sec_name,".bss") == 0)
3001 bss_end = vaddr + vsize;
3003 if (pe_dll_extra_pe_debug)
3004 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3005 __FUNCTION__, sec_name, (unsigned long) vaddr,
3006 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3010 expdata = xmalloc (export_size);
3011 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3012 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3013 erva = (char *) expdata - export_rva;
3015 if (pe_def_file == 0)
3016 pe_def_file = def_file_empty ();
3018 nexp = pe_as32 (expdata + 24);
3019 name_rvas = pe_as32 (expdata + 32);
3020 ordinals = pe_as32 (expdata + 36);
3021 ordbase = pe_as32 (expdata + 16);
3022 exp_funcbase = pe_as32 (expdata + 28);
3024 /* Use internal dll name instead of filename
3025 to enable symbolic dll linking. */
3026 dll_name = erva + pe_as32 (expdata + 12);
3028 /* Check to see if the dll has already been added to
3029 the definition list and if so return without error.
3030 This avoids multiple symbol definitions. */
3031 if (def_get_module (pe_def_file, dll_name))
3033 if (pe_dll_extra_pe_debug)
3034 printf ("%s is already loaded\n", dll_name);
3038 /* Iterate through the list of symbols. */
3039 for (i = 0; i < nexp; i++)
3041 /* Pointer to the names vector. */
3042 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3043 def_file_import *imp;
3044 /* Pointer to the function address vector. */
3045 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3048 /* Skip unwanted symbols, which are
3049 exported in buggy auto-import releases. */
3050 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3052 /* is_data is true if the address is in the data, rdata or bss
3055 (func_rva >= data_start && func_rva < data_end)
3056 || (func_rva >= rdata_start && func_rva < rdata_end)
3057 || (func_rva >= bss_start && func_rva < bss_end);
3059 imp = def_file_add_import (pe_def_file, erva + name_rva,
3061 /* Mark symbol type. */
3062 imp->data = is_data;
3064 if (pe_dll_extra_pe_debug)
3065 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3066 __FUNCTION__, dll_name, erva + name_rva,
3067 (unsigned long) func_rva, is_data ? "(data)" : "");
3075 pe_output_file_set_long_section_names (bfd *abfd)
3077 if (pe_use_coff_long_section_names < 0)
3079 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3080 einfo (_("%XError: can't use long section names on this arch\n"));
3083 /* These are the main functions, called from the emulation. The first
3084 is called after the bfds are read, so we can guess at how much space
3085 we need. The second is called after everything is placed, so we
3086 can put the right values in place. */
3089 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3091 pe_dll_id_target (bfd_get_target (abfd));
3092 pe_output_file_set_long_section_names (abfd);
3093 process_def_file_and_drectve (abfd, info);
3095 if (pe_def_file->num_exports == 0 && !info->shared)
3098 generate_edata (abfd, info);
3099 build_filler_bfd (1);
3100 pe_output_file_set_long_section_names (filler_bfd);
3104 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3106 pe_dll_id_target (bfd_get_target (abfd));
3107 pe_output_file_set_long_section_names (abfd);
3108 build_filler_bfd (0);
3109 pe_output_file_set_long_section_names (filler_bfd);
3113 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3115 pe_dll_id_target (bfd_get_target (abfd));
3116 pe_output_file_set_long_section_names (abfd);
3117 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3119 generate_reloc (abfd, info);
3122 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3124 /* Resize the sections. */
3125 lang_reset_memory_regions ();
3126 lang_size_sections (NULL, TRUE);
3128 /* Redo special stuff. */
3129 ldemul_after_allocation ();
3131 /* Do the assignments again. */
3132 lang_do_assignments ();
3135 fill_edata (abfd, info);
3137 if (info->shared && !info->pie)
3138 pe_data (abfd)->dll = 1;
3140 edata_s->contents = edata_d;
3141 reloc_s->contents = reloc_d;
3145 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3147 pe_dll_id_target (bfd_get_target (abfd));
3148 pe_output_file_set_long_section_names (abfd);
3149 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3151 generate_reloc (abfd, info);
3154 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3156 /* Resize the sections. */
3157 lang_reset_memory_regions ();
3158 lang_size_sections (NULL, TRUE);
3160 /* Redo special stuff. */
3161 ldemul_after_allocation ();
3163 /* Do the assignments again. */
3164 lang_do_assignments ();
3166 reloc_s->contents = reloc_d;
3170 pe_bfd_is_dll (bfd *abfd)
3172 return (bfd_get_format (abfd) == bfd_object
3174 && pe_data (abfd)->dll);