1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2017 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of the GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
25 #include "libiberty.h"
26 #include "filenames.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 through 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;
161 int pe_leading_underscore = -1;
163 /* Static variables and types. */
165 static bfd_vma image_base;
166 static bfd *filler_bfd;
167 static struct bfd_section *edata_s, *reloc_s;
168 static unsigned char *edata_d, *reloc_d;
169 static size_t edata_sz, reloc_sz;
170 static int runtime_pseudo_relocs_created = 0;
171 static int runtime_pseudp_reloc_v2_init = 0;
178 autofilter_entry_type;
182 const char *target_name;
183 const char *object_target;
184 unsigned int imagebase_reloc;
187 bfd_boolean underscored;
188 const autofilter_entry_type* autofilter_symbollist;
192 static const autofilter_entry_type autofilter_symbollist_generic[] =
194 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
195 /* Entry point symbols. */
196 { STRING_COMMA_LEN ("DllMain") },
197 { STRING_COMMA_LEN ("DllMainCRTStartup") },
198 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
199 /* Runtime pseudo-reloc. */
200 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
201 { STRING_COMMA_LEN ("do_pseudo_reloc") },
205 static const autofilter_entry_type autofilter_symbollist_i386[] =
207 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
208 /* Entry point symbols, and entry hooks. */
209 { STRING_COMMA_LEN ("cygwin_crt0") },
211 { STRING_COMMA_LEN ("DllMain") },
212 { STRING_COMMA_LEN ("DllEntryPoint") },
213 { STRING_COMMA_LEN ("DllMainCRTStartup") },
214 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
215 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
216 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
218 { STRING_COMMA_LEN ("DllMain@12") },
219 { STRING_COMMA_LEN ("DllEntryPoint@0") },
220 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
221 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
222 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
223 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
224 { STRING_COMMA_LEN ("cygwin_attach_dll") },
226 { STRING_COMMA_LEN ("cygwin_premain0") },
227 { STRING_COMMA_LEN ("cygwin_premain1") },
228 { STRING_COMMA_LEN ("cygwin_premain2") },
229 { STRING_COMMA_LEN ("cygwin_premain3") },
230 /* Runtime pseudo-reloc. */
231 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
232 { STRING_COMMA_LEN ("do_pseudo_reloc") },
233 /* Global vars that should not be exported. */
234 { STRING_COMMA_LEN ("impure_ptr") },
235 { STRING_COMMA_LEN ("_impure_ptr") },
236 { STRING_COMMA_LEN ("_fmode") },
237 { STRING_COMMA_LEN ("environ") },
238 { STRING_COMMA_LEN ("__dso_handle") },
242 #define PE_ARCH_i386 1
244 #define PE_ARCH_mips 3
245 #define PE_ARCH_arm 4
246 #define PE_ARCH_arm_epoc 5
247 #define PE_ARCH_arm_wince 6
249 /* Don't make it constant as underscore mode gets possibly overriden
250 by target or -(no-)leading-underscore option. */
251 static pe_details_type pe_detail_list[] =
270 autofilter_symbollist_i386
280 autofilter_symbollist_i386
286 16 /* R_SH_IMAGEBASE */,
290 autofilter_symbollist_generic
299 autofilter_symbollist_generic
308 autofilter_symbollist_generic
311 "epoc-pei-arm-little",
312 "epoc-pe-arm-little",
317 autofilter_symbollist_generic
320 "pei-arm-wince-little",
321 "pe-arm-wince-little",
322 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
326 autofilter_symbollist_generic
328 { NULL, NULL, 0, 0, 0, FALSE, NULL }
331 static const pe_details_type *pe_details;
333 /* Do not specify library suffix explicitly, to allow for dllized versions. */
334 static const autofilter_entry_type autofilter_liblist[] =
336 { STRING_COMMA_LEN ("libcegcc") },
337 { STRING_COMMA_LEN ("libcygwin") },
338 { STRING_COMMA_LEN ("libgcc") },
339 { STRING_COMMA_LEN ("libgcc_s") },
340 { STRING_COMMA_LEN ("libstdc++") },
341 { STRING_COMMA_LEN ("libmingw32") },
342 { STRING_COMMA_LEN ("libmingwex") },
343 { STRING_COMMA_LEN ("libg2c") },
344 { STRING_COMMA_LEN ("libsupc++") },
345 { STRING_COMMA_LEN ("libobjc") },
346 { STRING_COMMA_LEN ("libgcj") },
350 /* Regardless of the suffix issue mentioned above, we must ensure that
351 we do not falsely match on a leading substring, such as when libtool
352 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
353 This routine ensures that the leading part of the name matches and that
354 it is followed by only an optional version suffix and a file extension,
355 returning zero if so or -1 if not. */
356 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
358 if (filename_ncmp (libname, afptr->name, afptr->len))
361 libname += afptr->len;
363 /* Be liberal in interpreting what counts as a version suffix; we
364 accept anything that has a dash to separate it from the name and
365 begins with a digit. */
366 if (libname[0] == '-')
368 if (!ISDIGIT (*++libname))
370 /* Ensure the filename has an extension. */
371 while (*++libname != '.')
375 else if (libname[0] != '.')
381 static const autofilter_entry_type autofilter_objlist[] =
383 { STRING_COMMA_LEN ("crt0.o") },
384 { STRING_COMMA_LEN ("crt1.o") },
385 { STRING_COMMA_LEN ("crt2.o") },
386 { STRING_COMMA_LEN ("dllcrt1.o") },
387 { STRING_COMMA_LEN ("dllcrt2.o") },
388 { STRING_COMMA_LEN ("gcrt0.o") },
389 { STRING_COMMA_LEN ("gcrt1.o") },
390 { STRING_COMMA_LEN ("gcrt2.o") },
391 { STRING_COMMA_LEN ("crtbegin.o") },
392 { STRING_COMMA_LEN ("crtend.o") },
396 static const autofilter_entry_type autofilter_symbolprefixlist[] =
398 /* _imp_ is treated specially, as it is always underscored. */
399 /* { STRING_COMMA_LEN ("_imp_") }, */
400 /* Don't export some c++ symbols. */
401 { STRING_COMMA_LEN ("__rtti_") },
402 { STRING_COMMA_LEN ("__builtin_") },
403 /* Don't re-export auto-imported symbols. */
404 { STRING_COMMA_LEN ("__nm_") },
405 /* Don't export symbols specifying internal DLL layout. */
406 { STRING_COMMA_LEN ("_head_") },
407 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
408 /* Don't export section labels or artificial symbols
410 { STRING_COMMA_LEN (".") },
414 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
416 { STRING_COMMA_LEN ("_iname") },
417 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
421 #define U(str) (pe_details->underscored ? "_" str : str)
424 pe_dll_id_target (const char *target)
428 for (i = 0; pe_detail_list[i].target_name; i++)
429 if (strcmp (pe_detail_list[i].target_name, target) == 0
430 || strcmp (pe_detail_list[i].object_target, target) == 0)
432 int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */
434 bfd_get_target_info (target, NULL, NULL, &u, NULL);
437 pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE);
438 pe_details = pe_detail_list + i;
439 pe_leading_underscore = (u != 0 ? 1 : 0);
442 einfo (_("%P%X: Unsupported PEI architecture: %s\n"), target);
446 /* Helper functions for qsort. Relocs must be sorted so that we can write
447 them out by pages. */
458 reloc_sort (const void *va, const void *vb)
460 bfd_vma a = ((const reloc_data_type *) va)->vma;
461 bfd_vma b = ((const reloc_data_type *) vb)->vma;
463 return (a > b) ? 1 : ((a < b) ? -1 : 0);
467 pe_export_sort (const void *va, const void *vb)
469 const def_file_export *a = va;
470 const def_file_export *b = vb;
478 return strcmp (an, bn);
481 /* Read and process the .DEF file. */
483 /* These correspond to the entries in pe_def_file->exports[]. I use
484 exported_symbol_sections[i] to tag whether or not the symbol was
485 defined, since we can't export symbols we don't have. */
487 static bfd_vma *exported_symbol_offsets;
488 static struct bfd_section **exported_symbol_sections;
489 static int export_table_size;
490 static int count_exported;
491 static int count_exported_byname;
492 static int count_with_ordinals;
493 static const char *dll_name;
494 static int min_ordinal, max_ordinal;
495 static int *exported_symbols;
497 typedef struct exclude_list_struct
500 struct exclude_list_struct *next;
505 static struct exclude_list_struct *excludes = 0;
508 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
511 char *exclude_string;
513 local_copy = xstrdup (new_excludes);
515 exclude_string = strtok (local_copy, ",:");
516 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
518 struct exclude_list_struct *new_exclude;
520 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
521 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
522 strcpy (new_exclude->string, exclude_string);
523 new_exclude->type = type;
524 new_exclude->next = excludes;
525 excludes = new_exclude;
532 is_import (const char* n)
534 return (CONST_STRNEQ (n, "__imp_"));
537 /* abfd is a bfd containing n (or NULL)
538 It can be used for contextual checks. */
541 auto_export (bfd *abfd, def_file *d, const char *n)
544 struct exclude_list_struct *ex;
545 const autofilter_entry_type *afptr;
546 const char * libname = NULL;
548 if (abfd && abfd->my_archive)
549 libname = lbasename (abfd->my_archive->filename);
551 key.name = key.its_name = (char *) n;
553 /* Return false if n is in the d->exports table. */
554 if (bsearch (&key, d->exports, d->num_exports,
555 sizeof (pe_def_file->exports[0]), pe_export_sort))
558 if (pe_dll_do_default_excludes)
563 if (pe_dll_extra_pe_debug)
564 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
565 n, abfd, abfd->my_archive);
567 /* First of all, make context checks:
568 Don't export anything from standard libs. */
571 afptr = autofilter_liblist;
575 if (libnamencmp (libname, afptr) == 0 )
581 /* Next, exclude symbols from certain startup objects. */
583 if (abfd && (p = lbasename (abfd->filename)))
585 afptr = autofilter_objlist;
588 if (strcmp (p, afptr->name) == 0)
594 /* Don't try to blindly exclude all symbols
595 that begin with '__'; this was tried and
596 it is too restrictive. Instead we have
597 a target specific list to use: */
598 afptr = pe_details->autofilter_symbollist;
602 if (strcmp (n, afptr->name) == 0)
608 /* Next, exclude symbols starting with ... */
609 afptr = autofilter_symbolprefixlist;
612 if (strncmp (n, afptr->name, afptr->len) == 0)
618 /* Finally, exclude symbols ending with ... */
620 afptr = autofilter_symbolsuffixlist;
623 if ((len >= afptr->len)
624 /* Add 1 to insure match with trailing '\0'. */
625 && strncmp (n + len - afptr->len, afptr->name,
626 afptr->len + 1) == 0)
633 for (ex = excludes; ex; ex = ex->next)
635 if (ex->type == EXCLUDELIBS)
638 && ((filename_cmp (libname, ex->string) == 0)
639 || (strcasecmp ("ALL", ex->string) == 0)))
642 else if (ex->type == EXCLUDEFORIMPLIB)
644 if (filename_cmp (abfd->filename, ex->string) == 0)
647 else if (strcmp (n, ex->string) == 0)
655 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
658 struct bfd_link_hash_entry *blhe;
660 struct bfd_section *s;
661 def_file_export *e = 0;
662 bfd_boolean resort_needed;
665 pe_def_file = def_file_empty ();
667 /* First, run around to all the objects looking for the .drectve
668 sections, and push those into the def file too. */
669 for (b = info->input_bfds; b; b = b->link.next)
671 s = bfd_get_section_by_name (b, ".drectve");
675 char *buf = xmalloc (size);
677 bfd_get_section_contents (b, s, buf, 0, size);
678 def_file_add_directive (pe_def_file, buf, size);
683 /* Process aligned common symbol information from the
684 .drectve sections now; common symbol allocation is
685 done before final link, so it will be too late to
686 process them in process_embedded_commands() called
687 from _bfd_coff_link_input_bfd(). */
688 if (pe_def_file->aligncomms)
690 def_file_aligncomm *ac = pe_def_file->aligncomms;
693 struct coff_link_hash_entry *sym_hash;
694 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
695 ac->symbol_name, FALSE, FALSE, FALSE);
696 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
697 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
699 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
705 /* If we are building an executable and there is nothing
706 to export, we do not build an export table at all. */
707 if (bfd_link_executable (info) && pe_def_file->num_exports == 0
708 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
711 /* Now, maybe export everything else the default way. */
712 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
713 && !pe_dll_exclude_all_symbols)
715 for (b = info->input_bfds; b; b = b->link.next)
720 if (!bfd_generic_link_read_symbols (b))
722 einfo (_("%B%F: could not read symbols: %E\n"), b);
726 symbols = bfd_get_outsymbols (b);
727 nsyms = bfd_get_symcount (b);
729 for (j = 0; j < nsyms; j++)
731 /* We should export symbols which are either global or not
732 anything at all. (.bss data is the latter)
733 We should not export undefined symbols. */
734 bfd_boolean would_export
735 = (symbols[j]->section != bfd_und_section_ptr
736 && ((symbols[j]->flags & BSF_GLOBAL)
737 || (symbols[j]->flags == 0)));
738 if (link_info.version_info && would_export)
740 = !bfd_hide_sym_by_version (link_info.version_info,
744 const char *sn = symbols[j]->name;
746 /* We should not re-export imported stuff. */
752 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
753 sprintf (name, "%s%s", "__imp_", sn);
755 blhe = bfd_link_hash_lookup (info->hash, name,
756 FALSE, FALSE, FALSE);
759 if (blhe && blhe->type == bfd_link_hash_defined)
763 if (pe_details->underscored && *sn == '_')
766 if (auto_export (b, pe_def_file, sn))
771 p = def_file_add_export (pe_def_file, sn, 0, -1,
773 /* Fill data flag properly, from dlltool.c. */
775 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
783 #define NE pe_def_file->num_exports
785 /* Don't create an empty export table. */
789 resort_needed = FALSE;
791 /* Canonicalize the export list. */
794 for (i = 0; i < NE; i++)
796 /* Check for fastcall/stdcall-decoration, but ignore
797 C++ mangled names. */
798 if (pe_def_file->exports[i].name[0] != '?'
799 && strchr (pe_def_file->exports[i].name, '@'))
801 /* This will preserve internal_name, which may have been
802 pointing to the same memory as name, or might not
804 int lead_at = (*pe_def_file->exports[i].name == '@');
805 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
806 char *tmp_at = strrchr (tmp, '@');
811 einfo (_("%P%X: Cannot export %s: invalid export name\n"),
812 pe_def_file->exports[i].name);
813 pe_def_file->exports[i].name = tmp;
814 resort_needed = TRUE;
819 /* Re-sort the exports table as we have possibly changed the order
820 by removing leading @. */
822 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
825 if (pe_dll_stdcall_aliases)
827 for (i = 0; i < NE; i++)
829 if (is_import (pe_def_file->exports[i].name))
832 if (strchr (pe_def_file->exports[i].name, '@'))
835 int lead_at = (*pe_def_file->exports[i].name == '@');
836 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
838 *(strchr (tmp, '@')) = 0;
839 if (auto_export (NULL, pe_def_file, tmp))
840 def_file_add_export (pe_def_file, tmp,
841 pe_def_file->exports[i].internal_name,
849 /* Convenience, but watch out for it changing. */
850 e = pe_def_file->exports;
852 for (i = 0, j = 0; i < NE; i++)
854 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
856 /* This is a duplicate. */
857 if (e[j - 1].ordinal != -1
858 && e[i].ordinal != -1
859 && e[j - 1].ordinal != e[i].ordinal)
861 if (pe_dll_warn_dup_exports)
862 /* xgettext:c-format */
863 einfo (_("%P%X: Error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
864 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
868 if (pe_dll_warn_dup_exports)
869 /* xgettext:c-format */
870 einfo (_("%P: Warning, duplicate EXPORT: %s\n"),
874 if (e[i].ordinal != -1)
875 e[j - 1].ordinal = e[i].ordinal;
876 e[j - 1].flag_private |= e[i].flag_private;
877 e[j - 1].flag_constant |= e[i].flag_constant;
878 e[j - 1].flag_noname |= e[i].flag_noname;
879 e[j - 1].flag_data |= e[i].flag_data;
882 if (e[i].internal_name)
883 free (e[i].internal_name);
885 free (e[i].its_name);
894 pe_def_file->num_exports = j; /* == NE */
896 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
897 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
899 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
903 count_exported_byname = 0;
904 count_with_ordinals = 0;
906 for (i = 0; i < NE; i++)
908 char *int_name = pe_def_file->exports[i].internal_name;
911 /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
912 lang_add_gc_name (int_name);
914 name = xmalloc (strlen (int_name) + 2);
915 if (pe_details->underscored && int_name[0] != '@')
918 strcpy (name + 1, int_name);
920 /* PR 19803: The alias must be preserved as well. */
921 lang_add_gc_name (xstrdup (name));
924 strcpy (name, int_name);
926 blhe = bfd_link_hash_lookup (info->hash,
931 && (blhe->type == bfd_link_hash_defined
932 || (blhe->type == bfd_link_hash_common)))
935 if (!pe_def_file->exports[i].flag_noname)
936 count_exported_byname++;
938 /* Only fill in the sections. The actual offsets are computed
939 in fill_exported_offsets() after common symbols are laid
941 if (blhe->type == bfd_link_hash_defined)
942 exported_symbol_sections[i] = blhe->u.def.section;
944 exported_symbol_sections[i] = blhe->u.c.p->section;
946 if (pe_def_file->exports[i].ordinal != -1)
948 if (max_ordinal < pe_def_file->exports[i].ordinal)
949 max_ordinal = pe_def_file->exports[i].ordinal;
950 if (min_ordinal > pe_def_file->exports[i].ordinal)
951 min_ordinal = pe_def_file->exports[i].ordinal;
952 count_with_ordinals++;
955 /* Check for forward exports. These are indicated in DEF files by an
956 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
957 but we must take care not to be fooled when the user wants to export
958 a symbol that actually really has a dot in it, so we only check
959 for them here, after real defined symbols have already been matched. */
960 else if (strchr (int_name, '.'))
963 if (!pe_def_file->exports[i].flag_noname)
964 count_exported_byname++;
966 pe_def_file->exports[i].flag_forward = 1;
968 if (pe_def_file->exports[i].ordinal != -1)
970 if (max_ordinal < pe_def_file->exports[i].ordinal)
971 max_ordinal = pe_def_file->exports[i].ordinal;
972 if (min_ordinal > pe_def_file->exports[i].ordinal)
973 min_ordinal = pe_def_file->exports[i].ordinal;
974 count_with_ordinals++;
977 else if (blhe && blhe->type == bfd_link_hash_undefined)
979 /* xgettext:c-format */
980 einfo (_("%P%X: Cannot export %s: symbol not defined\n"),
985 /* xgettext:c-format */
986 einfo (_("%P%X: Cannot export %s: symbol wrong type (%d vs %d)\n"),
988 blhe->type, bfd_link_hash_defined);
992 /* xgettext:c-format */
993 einfo (_("%P%X: Cannot export %s: symbol not found\n"),
1000 /* Build the bfd that will contain .edata and .reloc sections. */
1003 build_filler_bfd (int include_edata)
1005 lang_input_statement_type *filler_file;
1006 filler_file = lang_add_input_file ("dll stuff",
1007 lang_input_file_is_fake_enum,
1009 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
1010 link_info.output_bfd);
1011 if (filler_bfd == NULL
1012 || !bfd_set_arch_mach (filler_bfd,
1013 bfd_get_arch (link_info.output_bfd),
1014 bfd_get_mach (link_info.output_bfd)))
1016 einfo (_("%X%P: can not create BFD: %E\n"));
1022 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
1024 || !bfd_set_section_flags (filler_bfd, edata_s,
1031 einfo (_("%X%P: can not create .edata section: %E\n"));
1034 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
1037 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1039 || !bfd_set_section_flags (filler_bfd, reloc_s,
1046 einfo (_("%X%P: can not create .reloc section: %E\n"));
1050 bfd_set_section_size (filler_bfd, reloc_s, 0);
1052 ldlang_add_file (filler_file);
1055 /* Gather all the exported symbols and build the .edata section. */
1058 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1060 int i, next_ordinal;
1061 int name_table_size = 0;
1064 /* First, we need to know how many exported symbols there are,
1065 and what the range of ordinals is. */
1066 if (pe_def_file->name)
1067 dll_name = pe_def_file->name;
1070 dll_name = abfd->filename;
1072 for (dlnp = dll_name; *dlnp; dlnp++)
1073 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1074 dll_name = dlnp + 1;
1077 if (count_with_ordinals && max_ordinal > count_exported)
1079 if (min_ordinal > max_ordinal - count_exported + 1)
1080 min_ordinal = max_ordinal - count_exported + 1;
1085 max_ordinal = count_exported;
1088 export_table_size = max_ordinal - min_ordinal + 1;
1089 exported_symbols = xmalloc (export_table_size * sizeof (int));
1090 for (i = 0; i < export_table_size; i++)
1091 exported_symbols[i] = -1;
1093 /* Now we need to assign ordinals to those that don't have them. */
1094 for (i = 0; i < NE; i++)
1096 if (exported_symbol_sections[i]
1097 || pe_def_file->exports[i].flag_forward)
1099 if (pe_def_file->exports[i].ordinal != -1)
1101 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1102 int pi = exported_symbols[ei];
1106 /* xgettext:c-format */
1107 einfo (_("%P%X: Error: ordinal used twice: %d (%s vs %s)\n"),
1108 pe_def_file->exports[i].ordinal,
1109 pe_def_file->exports[i].name,
1110 pe_def_file->exports[pi].name);
1112 exported_symbols[ei] = i;
1114 if (pe_def_file->exports[i].its_name)
1115 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1117 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1120 /* Reserve space for the forward name. */
1121 if (pe_def_file->exports[i].flag_forward)
1123 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1127 next_ordinal = min_ordinal;
1128 for (i = 0; i < NE; i++)
1129 if ((exported_symbol_sections[i]
1130 || pe_def_file->exports[i].flag_forward)
1131 && pe_def_file->exports[i].ordinal == -1)
1133 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1136 exported_symbols[next_ordinal - min_ordinal] = i;
1137 pe_def_file->exports[i].ordinal = next_ordinal;
1140 /* PR 12969: Check for more than 1^16 ordinals. */
1141 if (max_ordinal > 65535 || next_ordinal > 65535)
1142 /* xgettext:c-format */
1143 einfo(_("%P%X: Error: export ordinal too large: %d\n"),
1144 max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
1146 /* OK, now we can allocate some memory. */
1147 edata_sz = (40 /* directory */
1148 + 4 * export_table_size /* addresses */
1149 + 4 * count_exported_byname /* name ptrs */
1150 + 2 * count_exported_byname /* ordinals */
1151 + name_table_size + strlen (dll_name) + 1);
1154 /* Fill the exported symbol offsets. The preliminary work has already
1155 been done in process_def_file_and_drectve(). */
1158 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1161 struct bfd_link_hash_entry *blhe;
1163 for (i = 0; i < pe_def_file->num_exports; i++)
1167 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1168 if (pe_details->underscored
1169 && *pe_def_file->exports[i].internal_name != '@')
1172 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1175 strcpy (name, pe_def_file->exports[i].internal_name);
1177 blhe = bfd_link_hash_lookup (info->hash,
1179 FALSE, FALSE, TRUE);
1181 if (blhe && blhe->type == bfd_link_hash_defined)
1182 exported_symbol_offsets[i] = blhe->u.def.value;
1189 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1192 unsigned char *edirectory;
1193 unsigned char *eaddresses;
1194 unsigned char *enameptrs;
1195 unsigned char *eordinals;
1198 edata_d = xmalloc (edata_sz);
1200 /* Note use of array pointer math here. */
1201 edirectory = edata_d;
1202 eaddresses = edirectory + 40;
1203 enameptrs = eaddresses + 4 * export_table_size;
1204 eordinals = enameptrs + 4 * count_exported_byname;
1205 enamestr = (char *) eordinals + 2 * count_exported_byname;
1207 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1208 + edata_s->output_section->vma - image_base)
1210 memset (edata_d, 0, edata_sz);
1212 if (pe_data (abfd)->insert_timestamp)
1213 H_PUT_32 (abfd, time (0), edata_d + 4);
1215 if (pe_def_file->version_major != -1)
1217 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1218 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1221 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1222 strcpy (enamestr, dll_name);
1223 enamestr += strlen (enamestr) + 1;
1224 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1225 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1226 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1227 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1228 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1229 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1231 fill_exported_offsets (abfd, info);
1233 /* Ok, now for the filling in part.
1234 Scan alphabetically - ie the ordering in the exports[] table,
1235 rather than by ordinal - the ordering in the exported_symbol[]
1236 table. See dlltool.c and:
1237 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1238 for more information. */
1240 for (s = 0; s < NE; s++)
1242 struct bfd_section *ssec = exported_symbol_sections[s];
1243 if (pe_def_file->exports[s].ordinal != -1
1244 && (pe_def_file->exports[s].flag_forward || ssec != NULL))
1246 int ord = pe_def_file->exports[s].ordinal;
1248 if (pe_def_file->exports[s].flag_forward)
1250 bfd_put_32 (abfd, ERVA (enamestr),
1251 eaddresses + 4 * (ord - min_ordinal));
1253 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1254 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1258 bfd_vma srva = (exported_symbol_offsets[s]
1259 + ssec->output_section->vma
1260 + ssec->output_offset);
1262 bfd_put_32 (abfd, srva - image_base,
1263 eaddresses + 4 * (ord - min_ordinal));
1266 if (!pe_def_file->exports[s].flag_noname)
1268 char *ename = pe_def_file->exports[s].name;
1269 if (pe_def_file->exports[s].its_name)
1270 ename = pe_def_file->exports[s].its_name;
1272 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1274 strcpy (enamestr, ename);
1275 enamestr += strlen (enamestr) + 1;
1276 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1278 pe_def_file->exports[s].hint = hint++;
1285 static struct bfd_section *current_sec;
1288 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1290 int (*cb) (arelent *, asection *, char *))
1295 for (b = info->input_bfds; b; b = b->link.next)
1299 if (!bfd_generic_link_read_symbols (b))
1301 einfo (_("%B%F: could not read symbols: %E\n"), b);
1305 symbols = bfd_get_outsymbols (b);
1307 for (s = b->sections; s; s = s->next)
1310 int relsize, nrelocs, i;
1311 int flags = bfd_get_section_flags (b, s);
1313 /* Skip discarded linkonce sections. */
1314 if (flags & SEC_LINK_ONCE
1315 && s->output_section == bfd_abs_section_ptr)
1320 relsize = bfd_get_reloc_upper_bound (b, s);
1321 relocs = xmalloc (relsize);
1322 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1324 for (i = 0; i < nrelocs; i++)
1326 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1328 if (!strcmp (name, sym->name))
1329 cb (relocs[i], s, name);
1334 /* Warning: the allocated symbols are remembered in BFD and reused
1335 later, so don't free them! */
1336 /* free (symbols); */
1341 /* Gather all the relocations and build the .reloc section. */
1344 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1347 /* For .reloc stuff. */
1348 reloc_data_type *reloc_data;
1349 int total_relocs = 0;
1351 bfd_vma sec_page = (bfd_vma) -1;
1352 bfd_vma page_ptr, page_count;
1355 struct bfd_section *s;
1358 for (b = info->input_bfds; b; b = b->link.next)
1359 for (s = b->sections; s; s = s->next)
1360 total_relocs += s->reloc_count;
1362 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1366 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link.next)
1369 int relsize, nrelocs;
1371 for (s = b->sections; s; s = s->next)
1373 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1376 /* If it's not loaded, we don't need to relocate it this way. */
1377 if (!(s->output_section->flags & SEC_LOAD))
1380 /* I don't know why there would be a reloc for these, but I've
1381 seen it happen - DJ */
1382 if (s->output_section == bfd_abs_section_ptr)
1385 if (s->output_section->vma == 0)
1387 /* Huh? Shouldn't happen, but punt if it does. */
1388 einfo (_("zero vma section reloc detected: `%s' #%d f=%d\n"),
1389 s->output_section->name, s->output_section->index,
1390 s->output_section->flags);
1394 if (!bfd_generic_link_read_symbols (b))
1396 einfo (_("%B%F: could not read symbols: %E\n"), b);
1400 symbols = bfd_get_outsymbols (b);
1401 relsize = bfd_get_reloc_upper_bound (b, s);
1402 relocs = xmalloc (relsize);
1403 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1405 for (i = 0; i < nrelocs; i++)
1407 if (pe_dll_extra_pe_debug)
1409 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1410 printf ("rel: %s\n", sym->name);
1412 if (!relocs[i]->howto->pc_relative
1413 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1415 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1417 /* Don't create relocs for undefined weak symbols. */
1418 if (sym->flags == BSF_WEAK)
1420 struct bfd_link_hash_entry *blhe
1421 = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1422 FALSE, FALSE, FALSE);
1423 if (blhe && blhe->type == bfd_link_hash_undefweak)
1425 /* Check aux sym and see if it is defined or not. */
1426 struct coff_link_hash_entry *h, *h2;
1427 h = (struct coff_link_hash_entry *)blhe;
1428 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1430 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1431 [h->aux->x_sym.x_tagndx.l];
1432 /* We don't want a base reloc if the aux sym is not
1433 found, undefined, or if it is the constant ABS
1434 zero default value. (We broaden that slightly by
1435 not testing the value, just the section; there's
1436 no reason we'd want a reference to any absolute
1437 address to get relocated during rebasing). */
1438 if (!h2 || h2->root.type == bfd_link_hash_undefined
1439 || h2->root.u.def.section == bfd_abs_section_ptr)
1442 else if (!blhe || blhe->type != bfd_link_hash_defined)
1445 /* Nor for Dwarf FDE references to discarded sections. */
1446 else if (bfd_is_abs_section (sym->section->output_section))
1448 /* We only ignore relocs from .eh_frame sections, as
1449 they are discarded by the final link rather than
1450 resolved against the kept section. */
1451 if (!strcmp (s->name, ".eh_frame"))
1455 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1457 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1459 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1460 relocs[i]->howto->rightshift)
1462 #ifdef pe_use_x86_64
1463 case BITS_AND_SHIFT (64, 0):
1464 reloc_data[total_relocs].type = 10;
1468 case BITS_AND_SHIFT (32, 0):
1469 reloc_data[total_relocs].type = 3;
1472 case BITS_AND_SHIFT (16, 0):
1473 reloc_data[total_relocs].type = 2;
1476 case BITS_AND_SHIFT (16, 16):
1477 reloc_data[total_relocs].type = 4;
1478 /* FIXME: we can't know the symbol's right value
1479 yet, but we probably can safely assume that
1480 CE will relocate us in 64k blocks, so leaving
1482 reloc_data[total_relocs].extra = 0;
1485 case BITS_AND_SHIFT (26, 2):
1486 reloc_data[total_relocs].type = 5;
1489 case BITS_AND_SHIFT (24, 2):
1490 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1491 Those ARM_xxx definitions should go in proper
1493 if (relocs[i]->howto->type == 0
1494 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1495 || relocs[i]->howto->type == 5)
1496 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1497 that has already been fully processed during a
1498 previous link stage, so ignore it here. */
1502 /* xgettext:c-format */
1503 einfo (_("%P%X: Error: %d-bit reloc in dll\n"),
1504 relocs[i]->howto->bitsize);
1510 /* Warning: the allocated symbols are remembered in BFD and
1511 reused later, so don't free them! */
1515 /* At this point, we have total_relocs relocation addresses in
1516 reloc_addresses, which are all suitable for the .reloc section.
1517 We must now create the new sections. */
1518 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1520 for (i = 0; i < total_relocs; i++)
1522 bfd_vma this_page = (reloc_data[i].vma >> 12);
1524 if (this_page != sec_page)
1526 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1528 sec_page = this_page;
1533 if (reloc_data[i].type == 4)
1537 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1538 reloc_d = xmalloc (reloc_sz);
1539 sec_page = (bfd_vma) -1;
1541 page_ptr = (bfd_vma) -1;
1544 for (i = 0; i < total_relocs; i++)
1546 bfd_vma rva = reloc_data[i].vma - image_base;
1547 bfd_vma this_page = (rva & ~0xfff);
1549 if (this_page != sec_page)
1551 while (reloc_sz & 3)
1552 reloc_d[reloc_sz++] = 0;
1554 if (page_ptr != (bfd_vma) -1)
1555 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1557 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1558 page_ptr = reloc_sz;
1560 sec_page = this_page;
1564 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1565 reloc_d + reloc_sz);
1568 if (reloc_data[i].type == 4)
1570 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1577 while (reloc_sz & 3)
1578 reloc_d[reloc_sz++] = 0;
1580 if (page_ptr != (bfd_vma) -1)
1581 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1583 while (reloc_sz < reloc_s->size)
1584 reloc_d[reloc_sz++] = 0;
1587 /* Given the exiting def_file structure, print out a .DEF file that
1588 corresponds to it. */
1591 quoteput (char *s, FILE *f, int needs_quotes)
1595 for (cp = s; *cp; cp++)
1610 if (*s == '"' || *s == '\\')
1624 pe_dll_generate_def_file (const char *pe_out_def_filename)
1627 FILE *out = fopen (pe_out_def_filename, "w");
1630 /* xgettext:c-format */
1631 einfo (_("%P: Can't open output def file %s\n"),
1632 pe_out_def_filename);
1636 if (pe_def_file->name)
1638 if (pe_def_file->is_dll)
1639 fprintf (out, "LIBRARY ");
1641 fprintf (out, "NAME ");
1643 quoteput (pe_def_file->name, out, 1);
1645 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1647 fprintf (out, " BASE=0x");
1648 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1650 fprintf (out, "\n");
1653 if (pe_def_file->description)
1655 fprintf (out, "DESCRIPTION ");
1656 quoteput (pe_def_file->description, out, 1);
1657 fprintf (out, "\n");
1660 if (pe_def_file->version_minor != -1)
1661 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1662 pe_def_file->version_minor);
1663 else if (pe_def_file->version_major != -1)
1664 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1666 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1667 fprintf (out, "\n");
1669 if (pe_def_file->stack_commit != -1)
1670 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1671 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1672 else if (pe_def_file->stack_reserve != -1)
1673 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1675 if (pe_def_file->heap_commit != -1)
1676 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1677 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1678 else if (pe_def_file->heap_reserve != -1)
1679 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1681 if (pe_def_file->num_section_defs > 0)
1683 fprintf (out, "\nSECTIONS\n\n");
1685 for (i = 0; i < pe_def_file->num_section_defs; i++)
1688 quoteput (pe_def_file->section_defs[i].name, out, 0);
1690 if (pe_def_file->section_defs[i].class)
1692 fprintf (out, " CLASS ");
1693 quoteput (pe_def_file->section_defs[i].class, out, 0);
1696 if (pe_def_file->section_defs[i].flag_read)
1697 fprintf (out, " READ");
1699 if (pe_def_file->section_defs[i].flag_write)
1700 fprintf (out, " WRITE");
1702 if (pe_def_file->section_defs[i].flag_execute)
1703 fprintf (out, " EXECUTE");
1705 if (pe_def_file->section_defs[i].flag_shared)
1706 fprintf (out, " SHARED");
1708 fprintf (out, "\n");
1712 if (pe_def_file->num_exports > 0)
1714 fprintf (out, "EXPORTS\n");
1716 for (i = 0; i < pe_def_file->num_exports; i++)
1718 def_file_export *e = pe_def_file->exports + i;
1720 quoteput (e->name, out, 0);
1722 if (e->internal_name && strcmp (e->internal_name, e->name))
1724 fprintf (out, " = ");
1725 quoteput (e->internal_name, out, 0);
1728 if (e->ordinal != -1)
1729 fprintf (out, " @%d", e->ordinal);
1731 if (e->flag_private)
1732 fprintf (out, " PRIVATE");
1734 if (e->flag_constant)
1735 fprintf (out, " CONSTANT");
1738 fprintf (out, " NONAME");
1741 fprintf (out, " DATA");
1743 fprintf (out, "\n");
1747 if (pe_def_file->num_imports > 0)
1749 fprintf (out, "\nIMPORTS\n\n");
1751 for (i = 0; i < pe_def_file->num_imports; i++)
1753 def_file_import *im = pe_def_file->imports + i;
1756 if (im->internal_name
1757 && (!im->name || strcmp (im->internal_name, im->name)))
1759 quoteput (im->internal_name, out, 0);
1760 fprintf (out, " = ");
1763 quoteput (im->module->name, out, 0);
1767 quoteput (im->name, out, 0);
1769 fprintf (out, "%d", im->ordinal);
1773 fprintf (out, " == ");
1774 quoteput (im->its_name, out, 0);
1777 fprintf (out, "\n");
1782 fprintf (out, _("; no contents available\n"));
1784 if (fclose (out) == EOF)
1785 /* xgettext:c-format */
1786 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1789 /* Generate the import library. */
1791 static asymbol **symtab;
1794 static int tmp_seq2;
1795 static const char *dll_filename;
1796 static char *dll_symname;
1798 #define UNDSEC bfd_und_section_ptr
1801 quick_section (bfd *abfd, const char *name, int flags, int align)
1806 sec = bfd_make_section_old_way (abfd, name);
1807 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1808 bfd_set_section_alignment (abfd, sec, align);
1809 /* Remember to undo this before trying to link internally! */
1810 sec->output_section = sec;
1812 sym = bfd_make_empty_symbol (abfd);
1813 symtab[symptr++] = sym;
1814 sym->name = sec->name;
1816 sym->flags = BSF_LOCAL;
1823 quick_symbol (bfd *abfd,
1832 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1837 sym = bfd_make_empty_symbol (abfd);
1842 symtab[symptr++] = sym;
1845 static arelent *reltab = 0;
1846 static int relcount = 0, relsize = 0;
1849 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1851 if (relcount >= relsize - 1)
1855 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1857 reltab = xmalloc (relsize * sizeof (arelent));
1859 reltab[relcount].address = address;
1860 reltab[relcount].addend = 0;
1861 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1862 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1867 save_relocs (asection *sec)
1871 sec->relocation = reltab;
1872 sec->reloc_count = relcount;
1873 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1874 for (i = 0; i < relcount; i++)
1875 sec->orelocation[i] = sec->relocation + i;
1876 sec->orelocation[relcount] = 0;
1877 sec->flags |= SEC_RELOC;
1879 relcount = relsize = 0;
1882 /* .section .idata$2
1883 .global __head_my_dll
1900 make_head (bfd *parent)
1902 asection *id2, *id5, *id4;
1903 unsigned char *d2, *d5, *d4;
1907 oname = xmalloc (20);
1908 sprintf (oname, "d%06d.o", tmp_seq);
1911 abfd = bfd_create (oname, parent);
1912 bfd_find_target (pe_details->object_target, abfd);
1913 bfd_make_writable (abfd);
1915 bfd_set_format (abfd, bfd_object);
1916 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1919 symtab = xmalloc (6 * sizeof (asymbol *));
1920 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1921 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1922 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1923 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1924 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1926 /* OK, pay attention here. I got confused myself looking back at
1927 it. We create a four-byte section to mark the beginning of the
1928 list, and we include an offset of 4 in the section, so that the
1929 pointer to the list points to the *end* of this section, which is
1930 the start of the list of sections from other objects. */
1932 bfd_set_section_size (abfd, id2, 20);
1936 if (pe_use_nul_prefixed_import_tables)
1937 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1938 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1939 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1940 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1943 if (pe_use_nul_prefixed_import_tables)
1944 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1946 bfd_set_section_size (abfd, id5, 0);
1947 d5 = xmalloc (PE_IDATA5_SIZE);
1949 memset (d5, 0, PE_IDATA5_SIZE);
1950 if (pe_use_nul_prefixed_import_tables)
1951 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1953 bfd_set_section_size (abfd, id4, 0);
1954 d4 = xmalloc (PE_IDATA4_SIZE);
1956 memset (d4, 0, PE_IDATA4_SIZE);
1958 bfd_set_symtab (abfd, symtab, symptr);
1960 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1961 if (pe_use_nul_prefixed_import_tables)
1963 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1964 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1968 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1969 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1972 bfd_make_readable (abfd);
1976 /* .section .idata$4
1983 .global __my_dll_iname
1988 make_tail (bfd *parent)
1990 asection *id4, *id5, *id7;
1991 unsigned char *d4, *d5, *d7;
1996 oname = xmalloc (20);
1997 sprintf (oname, "d%06d.o", tmp_seq);
2000 abfd = bfd_create (oname, parent);
2001 bfd_find_target (pe_details->object_target, abfd);
2002 bfd_make_writable (abfd);
2004 bfd_set_format (abfd, bfd_object);
2005 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2008 symtab = xmalloc (5 * sizeof (asymbol *));
2009 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2010 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2011 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2012 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
2014 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2015 d4 = xmalloc (PE_IDATA4_SIZE);
2017 memset (d4, 0, PE_IDATA4_SIZE);
2019 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2020 d5 = xmalloc (PE_IDATA5_SIZE);
2022 memset (d5, 0, PE_IDATA5_SIZE);
2024 len = strlen (dll_filename) + 1;
2027 bfd_set_section_size (abfd, id7, len);
2030 strcpy ((char *) d7, dll_filename);
2031 /* If len was odd, the above
2032 strcpy leaves behind an undefined byte. That is harmless,
2033 but we set it to 0 just so the binary dumps are pretty. */
2036 bfd_set_symtab (abfd, symtab, symptr);
2038 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2039 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2040 bfd_set_section_contents (abfd, id7, d7, 0, len);
2042 bfd_make_readable (abfd);
2048 .global ___imp_function
2049 .global __imp__function
2051 jmp *__imp__function:
2065 .asciz "function" xlate? (add underscore, kill at) */
2067 static const unsigned char jmp_ix86_bytes[] =
2069 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2077 .dw __imp_function */
2079 static const unsigned char jmp_sh_bytes[] =
2081 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2085 lui $t0,<high:__imp_function>
2086 lw $t0,<low:__imp_function>
2090 static const unsigned char jmp_mips_bytes[] =
2092 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2093 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2096 static const unsigned char jmp_arm_bytes[] =
2098 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2099 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2105 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2107 asection *tx, *id7, *id5, *id4, *id6;
2108 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2112 const unsigned char *jmp_bytes = NULL;
2113 int jmp_byte_count = 0;
2115 /* Include the jump stub section only if it is needed. A jump
2116 stub is needed if the symbol being imported <sym> is a function
2117 symbol and there is at least one undefined reference to that
2118 symbol. In other words, if all the import references to <sym> are
2119 explicitly through _declspec(dllimport) then the jump stub is not
2121 if (include_jmp_stub)
2123 switch (pe_details->pe_arch)
2126 jmp_bytes = jmp_ix86_bytes;
2127 jmp_byte_count = sizeof (jmp_ix86_bytes);
2130 jmp_bytes = jmp_sh_bytes;
2131 jmp_byte_count = sizeof (jmp_sh_bytes);
2134 jmp_bytes = jmp_mips_bytes;
2135 jmp_byte_count = sizeof (jmp_mips_bytes);
2138 case PE_ARCH_arm_epoc:
2139 case PE_ARCH_arm_wince:
2140 jmp_bytes = jmp_arm_bytes;
2141 jmp_byte_count = sizeof (jmp_arm_bytes);
2148 oname = xmalloc (20);
2149 sprintf (oname, "d%06d.o", tmp_seq);
2152 abfd = bfd_create (oname, parent);
2153 bfd_find_target (pe_details->object_target, abfd);
2154 bfd_make_writable (abfd);
2156 bfd_set_format (abfd, bfd_object);
2157 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2160 symtab = xmalloc (12 * sizeof (asymbol *));
2162 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2163 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2164 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2165 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2166 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2168 if (*exp->internal_name == '@')
2170 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2172 if (include_jmp_stub)
2173 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2174 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2176 /* Fastcall applies only to functions,
2177 so no need for auto-import symbol. */
2181 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2183 if (include_jmp_stub)
2184 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2186 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2188 /* Symbol to reference ord/name of imported
2189 data symbol, used to implement auto-import. */
2191 quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
2194 if (pe_dll_compat_implib)
2195 quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
2198 if (include_jmp_stub)
2200 bfd_set_section_size (abfd, tx, jmp_byte_count);
2201 td = xmalloc (jmp_byte_count);
2203 memcpy (td, jmp_bytes, jmp_byte_count);
2205 switch (pe_details->pe_arch)
2208 #ifdef pe_use_x86_64
2209 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2211 /* Mark this object as SAFESEH compatible. */
2212 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2214 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2218 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2221 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2222 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2223 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2226 case PE_ARCH_arm_epoc:
2227 case PE_ARCH_arm_wince:
2228 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2236 bfd_set_section_size (abfd, tx, 0);
2238 bfd_set_section_size (abfd, id7, 4);
2242 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2245 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2246 d5 = xmalloc (PE_IDATA5_SIZE);
2248 memset (d5, 0, PE_IDATA5_SIZE);
2250 if (exp->flag_noname)
2252 d5[0] = exp->ordinal;
2253 d5[1] = exp->ordinal >> 8;
2254 d5[PE_IDATA5_SIZE - 1] = 0x80;
2258 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2262 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2263 d4 = xmalloc (PE_IDATA4_SIZE);
2265 memset (d4, 0, PE_IDATA4_SIZE);
2267 if (exp->flag_noname)
2269 d4[0] = exp->ordinal;
2270 d4[1] = exp->ordinal >> 8;
2271 d4[PE_IDATA4_SIZE - 1] = 0x80;
2275 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2279 if (exp->flag_noname)
2282 bfd_set_section_size (abfd, id6, 0);
2288 /* { short, asciz } */
2290 len = 2 + strlen (exp->its_name) + 1;
2292 len = 2 + strlen (exp->name) + 1;
2295 bfd_set_section_size (abfd, id6, len);
2298 memset (d6, 0, len);
2300 /* PR 20880: Use exp->hint as a backup, just in case exp->ordinal
2301 contains an invalid value (-1). */
2302 ord = (exp->ordinal >= 0) ? exp->ordinal : exp->hint;
2307 strcpy ((char*) d6 + 2, exp->its_name);
2309 strcpy ((char *) d6 + 2, exp->name);
2312 bfd_set_symtab (abfd, symtab, symptr);
2314 if (include_jmp_stub)
2315 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2316 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2317 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2318 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2319 if (!exp->flag_noname)
2320 bfd_set_section_contents (abfd, id6, d6, 0, len);
2322 bfd_make_readable (abfd);
2327 make_singleton_name_imp (const char *import, bfd *parent)
2329 /* Name thunks go to idata$4. */
2335 oname = xmalloc (20);
2336 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2339 abfd = bfd_create (oname, parent);
2340 bfd_find_target (pe_details->object_target, abfd);
2341 bfd_make_writable (abfd);
2343 bfd_set_format (abfd, bfd_object);
2344 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2347 symtab = xmalloc (3 * sizeof (asymbol *));
2348 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2349 quick_symbol (abfd, "__imp_", import, "", id5, BSF_GLOBAL, 0);
2351 /* We need space for the real thunk and for the null terminator. */
2352 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2353 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2355 memset (d5, 0, PE_IDATA5_SIZE * 2);
2356 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2359 bfd_set_symtab (abfd, symtab, symptr);
2361 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2363 bfd_make_readable (abfd);
2368 make_singleton_name_thunk (const char *import, bfd *parent)
2370 /* Name thunks go to idata$4. */
2376 oname = xmalloc (20);
2377 sprintf (oname, "nmth%06d.o", tmp_seq);
2380 abfd = bfd_create (oname, parent);
2381 bfd_find_target (pe_details->object_target, abfd);
2382 bfd_make_writable (abfd);
2384 bfd_set_format (abfd, bfd_object);
2385 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2388 symtab = xmalloc (3 * sizeof (asymbol *));
2389 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2390 quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2391 quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2393 /* We need space for the real thunk and for the null terminator. */
2394 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2395 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2397 memset (d4, 0, PE_IDATA4_SIZE * 2);
2398 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2401 bfd_set_symtab (abfd, symtab, symptr);
2403 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2405 bfd_make_readable (abfd);
2410 make_import_fixup_mark (arelent *rel, char *name)
2412 /* We convert reloc to symbol, for later reference. */
2413 static unsigned int counter;
2414 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2415 bfd *abfd = bfd_asymbol_bfd (sym);
2416 struct bfd_link_hash_entry *bh;
2417 char *fixup_name, buf[26];
2420 /* "name" buffer has space before the symbol name for prefixes. */
2421 sprintf (buf, "__fu%d_", counter++);
2422 prefix_len = strlen (buf);
2423 fixup_name = name - prefix_len;
2424 memcpy (fixup_name, buf, prefix_len);
2427 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2428 current_sec, /* sym->section, */
2429 rel->address, NULL, TRUE, FALSE, &bh);
2434 /* .section .idata$2
2435 .rva __nm_thnk_SYM (singleton thunk with name of func)
2438 .rva __my_dll_iname (name of dll)
2439 .rva __fuNN_SYM (pointer to reference (address) in text) */
2442 make_import_fixup_entry (const char *name,
2443 const char *fixup_name,
2444 const char *symname,
2452 oname = xmalloc (20);
2453 sprintf (oname, "fu%06d.o", tmp_seq);
2456 abfd = bfd_create (oname, parent);
2457 bfd_find_target (pe_details->object_target, abfd);
2458 bfd_make_writable (abfd);
2460 bfd_set_format (abfd, bfd_object);
2461 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2464 symtab = xmalloc (6 * sizeof (asymbol *));
2465 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2467 quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2468 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2469 /* For relocator v2 we have to use the .idata$5 element and not
2471 if (link_info.pei386_runtime_pseudo_reloc == 2)
2472 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2474 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2476 bfd_set_section_size (abfd, id2, 20);
2481 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2482 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2483 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2486 bfd_set_symtab (abfd, symtab, symptr);
2488 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2490 bfd_make_readable (abfd);
2494 /* .section .rdata_runtime_pseudo_reloc
2496 .rva __fuNN_SYM (pointer to reference (address) in text) */
2499 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2500 const char *fixup_name,
2501 bfd_vma addend ATTRIBUTE_UNUSED,
2506 unsigned char *rt_rel_d;
2509 oname = xmalloc (20);
2510 sprintf (oname, "rtr%06d.o", tmp_seq);
2513 abfd = bfd_create (oname, parent);
2514 bfd_find_target (pe_details->object_target, abfd);
2515 bfd_make_writable (abfd);
2517 bfd_set_format (abfd, bfd_object);
2518 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2521 if (link_info.pei386_runtime_pseudo_reloc == 2)
2523 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2527 symtab = xmalloc (2 * sizeof (asymbol *));
2529 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2530 SEC_HAS_CONTENTS, 2);
2532 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2534 if (link_info.pei386_runtime_pseudo_reloc == 2)
2537 if (! runtime_pseudp_reloc_v2_init)
2540 runtime_pseudp_reloc_v2_init = 1;
2542 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2544 bfd_set_section_size (abfd, rt_rel, size);
2545 rt_rel_d = xmalloc (size);
2546 rt_rel->contents = rt_rel_d;
2547 memset (rt_rel_d, 0, size);
2548 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2549 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2550 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2552 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2553 save_relocs (rt_rel);
2555 bfd_set_symtab (abfd, symtab, symptr);
2557 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2561 bfd_set_section_size (abfd, rt_rel, 8);
2562 rt_rel_d = xmalloc (8);
2563 rt_rel->contents = rt_rel_d;
2564 memset (rt_rel_d, 0, 8);
2566 bfd_put_32 (abfd, addend, rt_rel_d);
2567 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2569 save_relocs (rt_rel);
2571 bfd_set_symtab (abfd, symtab, symptr);
2573 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2575 bfd_make_readable (abfd);
2580 .rva __pei386_runtime_relocator */
2583 pe_create_runtime_relocator_reference (bfd *parent)
2585 asection *extern_rt_rel;
2586 unsigned char *extern_rt_rel_d;
2590 oname = xmalloc (20);
2591 sprintf (oname, "ertr%06d.o", tmp_seq);
2594 abfd = bfd_create (oname, parent);
2595 bfd_find_target (pe_details->object_target, abfd);
2596 bfd_make_writable (abfd);
2598 bfd_set_format (abfd, bfd_object);
2599 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2602 symtab = xmalloc (2 * sizeof (asymbol *));
2603 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2605 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2608 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2609 extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
2610 extern_rt_rel->contents = extern_rt_rel_d;
2612 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2613 save_relocs (extern_rt_rel);
2615 bfd_set_symtab (abfd, symtab, symptr);
2617 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2619 bfd_make_readable (abfd);
2624 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name)
2626 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2627 struct bfd_link_hash_entry *name_thunk_sym;
2628 struct bfd_link_hash_entry *name_imp_sym;
2629 char *fixup_name, *impname;
2631 int need_import_table = 1;
2633 /* name buffer is allocated with space at beginning for prefixes. */
2634 impname = name - (sizeof "__imp_" - 1);
2635 memcpy (impname, "__imp_", sizeof "__imp_" - 1);
2636 name_imp_sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
2638 impname = name - (sizeof "__nm_thnk_" - 1);
2639 memcpy (impname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2640 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
2642 fixup_name = make_import_fixup_mark (rel, name);
2644 /* For version 2 pseudo relocation we don't need to add an import
2645 if the import symbol is already present. */
2646 if (link_info.pei386_runtime_pseudo_reloc == 2
2648 && name_imp_sym->type == bfd_link_hash_defined)
2649 need_import_table = 0;
2651 if (need_import_table == 1
2652 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2654 b = make_singleton_name_thunk (name, link_info.output_bfd);
2655 add_bfd_to_link (b, b->filename, &link_info);
2657 /* If we ever use autoimport, we have to cast text section writable.
2658 But not for version 2. */
2659 if (link_info.pei386_runtime_pseudo_reloc != 2)
2661 config.text_read_only = FALSE;
2662 link_info.output_bfd->flags &= ~WP_TEXT;
2664 if (link_info.pei386_runtime_pseudo_reloc == 2)
2666 b = make_singleton_name_imp (name, link_info.output_bfd);
2667 add_bfd_to_link (b, b->filename, &link_info);
2671 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2672 && need_import_table == 1)
2674 extern char * pe_data_import_dll;
2675 char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2677 b = make_import_fixup_entry (name, fixup_name, symname,
2678 link_info.output_bfd);
2679 add_bfd_to_link (b, b->filename, &link_info);
2682 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2683 || link_info.pei386_runtime_pseudo_reloc == 2)
2685 if (pe_dll_extra_pe_debug)
2686 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2687 fixup_name, (int) addend);
2689 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2690 link_info.output_bfd);
2691 add_bfd_to_link (b, b->filename, &link_info);
2693 if (runtime_pseudo_relocs_created == 0)
2695 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2696 add_bfd_to_link (b, b->filename, &link_info);
2698 runtime_pseudo_relocs_created++;
2700 else if (addend != 0)
2701 einfo (_("%P%X%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2702 s->owner, s, rel->address, sym->name);
2707 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2716 dll_filename = (def->name) ? def->name : dll_name;
2717 dll_symname = xstrdup (dll_filename);
2718 for (i = 0; dll_symname[i]; i++)
2719 if (!ISALNUM (dll_symname[i]))
2720 dll_symname[i] = '_';
2722 unlink_if_ordinary (impfilename);
2724 outarch = bfd_openw (impfilename, 0);
2728 /* xgettext:c-format */
2729 einfo (_("%P%X: Can't open .lib file: %s\n"), impfilename);
2734 /* xgettext:c-format */
2735 info_msg (_("Creating library file: %s\n"), impfilename);
2737 bfd_set_format (outarch, bfd_archive);
2738 outarch->has_armap = 1;
2740 /* Work out a reasonable size of things to put onto one line. */
2741 ar_head = make_head (outarch);
2743 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2744 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
2746 /* Iterate the exclude list. */
2747 struct exclude_list_struct *ex;
2749 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2751 if (ex->type != EXCLUDEFORIMPLIB)
2753 found = (filename_cmp (ex->string, ibfd->filename) == 0);
2755 /* If it matched, we must open a fresh BFD for it (the original
2756 input BFD is still needed for the DLL's final link) and add
2757 it into the archive member chain. */
2760 bfd *newbfd = bfd_openr (ibfd->my_archive
2761 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2764 einfo (_("%P%X: bfd_openr %s: %E\n"), ibfd->filename);
2767 if (ibfd->my_archive)
2769 /* Must now iterate through archive until we find the
2770 required member. A minor shame that we'll open the
2771 archive once per member that we require from it, and
2772 leak those archive bfds rather than reuse them. */
2773 bfd *arbfd = newbfd;
2774 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2776 einfo (_("%P%X: %s(%s): can't find member in non-archive file"),
2777 ibfd->my_archive->filename, ibfd->filename);
2781 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2783 if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
2788 einfo (_("%P%X: %s(%s): can't find member in archive"),
2789 ibfd->my_archive->filename, ibfd->filename);
2793 newbfd->archive_next = head;
2798 for (i = 0; i < def->num_exports; i++)
2800 /* The import library doesn't know about the internal name. */
2801 char *internal = def->exports[i].internal_name;
2804 /* Don't add PRIVATE entries to import lib. */
2805 if (pe_def_file->exports[i].flag_private)
2808 def->exports[i].internal_name = def->exports[i].name;
2810 /* PR 19803: If a symbol has been discard due to garbage
2811 collection then do not create any exports for it. */
2813 struct coff_link_hash_entry *h;
2815 h = coff_link_hash_lookup (coff_hash_table (info), internal,
2816 FALSE, FALSE, FALSE);
2818 /* If the symbol is hidden and undefined then it
2819 has been swept up by garbage collection. */
2820 && h->symbol_class == C_HIDDEN
2821 && h->root.u.def.section == bfd_und_section_ptr)
2824 /* If necessary, check with an underscore prefix as well. */
2825 if (pe_details->underscored && internal[0] != '@')
2829 name = xmalloc (strlen (internal) + 2);
2830 sprintf (name, "_%s", internal);
2832 h = coff_link_hash_lookup (coff_hash_table (info), name,
2833 FALSE, FALSE, FALSE);
2837 /* If the symbol is hidden and undefined then it
2838 has been swept up by garbage collection. */
2839 && h->symbol_class == C_HIDDEN
2840 && h->root.u.def.section == bfd_und_section_ptr)
2845 n = make_one (def->exports + i, outarch,
2846 ! (def->exports + i)->flag_data);
2847 n->archive_next = head;
2849 def->exports[i].internal_name = internal;
2852 ar_tail = make_tail (outarch);
2854 if (ar_head == NULL || ar_tail == NULL)
2857 /* Now stick them all into the archive. */
2858 ar_head->archive_next = head;
2859 ar_tail->archive_next = ar_head;
2862 if (! bfd_set_archive_head (outarch, head))
2863 einfo ("%P%X: bfd_set_archive_head: %E\n");
2865 if (! bfd_close (outarch))
2866 einfo ("%P%X: bfd_close %s: %E\n", impfilename);
2868 while (head != NULL)
2870 bfd *n = head->archive_next;
2876 static int undef_count = 0;
2884 static struct key_value *udef_table;
2886 static int undef_sort_cmp (const void *l1, const void *r1)
2888 const struct key_value *l = l1;
2889 const struct key_value *r = r1;
2891 return strcmp (l->key, r->key);
2894 static struct bfd_link_hash_entry *
2895 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
2897 struct bfd_link_hash_entry *h = NULL;
2898 struct key_value *kv;
2899 struct key_value key;
2900 char *at, *lname = xmalloc (strlen (name) + 3);
2902 strcpy (lname, name);
2904 at = strchr (lname + (lname[0] == '@'), '@');
2909 kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
2914 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2915 if (h->type == bfd_link_hash_undefined)
2919 if (lname[0] == '?')
2922 if (at || lname[0] == '@')
2924 if (lname[0] == '@')
2926 if (pe_details->underscored)
2929 strcpy (lname, lname + 1);
2931 kv = bsearch (&key, udef_table, undef_count,
2932 sizeof (struct key_value), undef_sort_cmp);
2935 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2936 if (h->type == bfd_link_hash_undefined)
2941 *strchr (lname, '@') = 0;
2943 kv = bsearch (&key, udef_table, undef_count,
2944 sizeof (struct key_value), undef_sort_cmp);
2947 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2948 if (h->type == bfd_link_hash_undefined)
2954 strcat (lname, "@");
2956 kv = bsearch (&key, udef_table, undef_count,
2957 sizeof (struct key_value), undef_sort_cmp);
2961 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2962 if (h->type == bfd_link_hash_undefined)
2966 if (lname[0] == '_' && pe_details->underscored)
2970 memmove (lname + 1, lname, strlen (lname) + 1);
2975 kv = bsearch (&key, udef_table, undef_count,
2976 sizeof (struct key_value), undef_sort_cmp);
2980 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2981 if (h->type == bfd_link_hash_undefined)
2993 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
2994 void *inf ATTRIBUTE_UNUSED)
2996 if (h->type == bfd_link_hash_undefined)
3002 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
3004 if (h->type == bfd_link_hash_undefined)
3008 udef_table[undef_count].key = xstrdup (h->root.string);
3009 at = strchr (udef_table[undef_count].key
3010 + (udef_table[undef_count].key[0] == '@'), '@');
3013 udef_table[undef_count].oname = h->root.string;
3020 pe_create_undef_table (void)
3024 /* count undefined symbols */
3026 bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
3028 /* create and fill the corresponding table */
3029 udef_table = xmalloc (undef_count * sizeof (struct key_value));
3032 bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
3035 qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
3039 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
3041 lang_input_statement_type *fake_file;
3043 fake_file = lang_add_input_file (name,
3044 lang_input_file_is_fake_enum,
3046 fake_file->the_bfd = abfd;
3047 ldlang_add_file (fake_file);
3049 if (!bfd_link_add_symbols (abfd, linfo))
3050 einfo (_("%P%X: add symbols %s: %E\n"), name);
3054 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
3057 def_file_module *module;
3058 def_file_import *imp;
3060 pe_dll_id_target (bfd_get_target (output_bfd));
3065 imp = pe_def_file->imports;
3067 pe_create_undef_table ();
3069 for (module = pe_def_file->modules; module; module = module->next)
3071 int do_this_dll = 0;
3073 for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
3075 if (i >= pe_def_file->num_imports)
3078 dll_filename = module->name;
3079 dll_symname = xstrdup (module->name);
3080 for (j = 0; dll_symname[j]; j++)
3081 if (!ISALNUM (dll_symname[j]))
3082 dll_symname[j] = '_';
3084 for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3086 def_file_export exp;
3087 struct bfd_link_hash_entry *blhe;
3088 int lead_at = (*imp[i].internal_name == '@');
3089 /* See if we need this import. */
3090 size_t len = strlen (imp[i].internal_name);
3091 char *name = xmalloc (len + 2 + 6);
3092 bfd_boolean include_jmp_stub = FALSE;
3093 bfd_boolean is_cdecl = FALSE;
3094 bfd_boolean is_undef = FALSE;
3096 if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3100 sprintf (name, "%s", imp[i].internal_name);
3102 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3104 blhe = bfd_link_hash_lookup (linfo->hash, name,
3105 FALSE, FALSE, FALSE);
3107 /* Include the jump stub for <sym> only if the <sym>
3109 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3112 sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3114 sprintf (name, "%s%s%s", "__imp_", U (""),
3115 imp[i].internal_name);
3117 blhe = bfd_link_hash_lookup (linfo->hash, name,
3118 FALSE, FALSE, FALSE);
3120 is_undef = (blhe->type == bfd_link_hash_undefined);
3124 include_jmp_stub = TRUE;
3125 is_undef = (blhe->type == bfd_link_hash_undefined);
3128 if (is_cdecl && (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)))
3130 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3131 blhe = pe_find_cdecl_alias_match (linfo, name);
3132 include_jmp_stub = TRUE;
3134 is_undef = (blhe->type == bfd_link_hash_undefined);
3145 bfd *ar_head = make_head (output_bfd);
3146 add_bfd_to_link (ar_head, ar_head->filename, linfo);
3149 exp.internal_name = imp[i].internal_name;
3150 exp.name = imp[i].name;
3151 exp.its_name = imp[i].its_name;
3152 exp.ordinal = imp[i].ordinal;
3153 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3154 exp.flag_private = 0;
3155 exp.flag_constant = 0;
3156 exp.flag_data = imp[i].data;
3157 exp.flag_noname = exp.name ? 0 : 1;
3158 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
3159 add_bfd_to_link (one, one->filename, linfo);
3164 bfd *ar_tail = make_tail (output_bfd);
3165 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
3174 free (udef_table[undef_count].key);
3179 /* We were handed a *.DLL file. Parse it and turn it into a set of
3180 IMPORTS directives in the def file. Return TRUE if the file was
3181 handled, FALSE if not. */
3184 pe_get16 (bfd *abfd, int where)
3188 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3189 bfd_bread (b, (bfd_size_type) 2, abfd);
3190 return b[0] + (b[1] << 8);
3194 pe_get32 (bfd *abfd, int where)
3198 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3199 bfd_bread (b, (bfd_size_type) 4, abfd);
3200 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3206 unsigned char *b = ptr;
3208 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3212 pe_implied_import_dll (const char *filename)
3215 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3216 bfd_vma export_rva, export_size, nsections, secptr, expptr;
3217 bfd_vma exp_funcbase;
3218 unsigned char *expdata;
3220 bfd_vma name_rvas, nexp;
3221 const char *dllname;
3222 /* Initialization with start > end guarantees that is_data
3223 will not be set by mistake, and avoids compiler warning. */
3224 bfd_vma data_start = 1;
3225 bfd_vma data_end = 0;
3226 bfd_vma rdata_start = 1;
3227 bfd_vma rdata_end = 0;
3228 bfd_vma bss_start = 1;
3229 bfd_vma bss_end = 0;
3231 /* No, I can't use bfd here. kernel32.dll puts its export table in
3232 the middle of the .rdata section. */
3233 dll = bfd_openr (filename, pe_details->target_name);
3236 einfo (_("%P%X: open %s: %E\n"), filename);
3240 /* PEI dlls seem to be bfd_objects. */
3241 if (!bfd_check_format (dll, bfd_object))
3243 einfo (_("%P%X: %s: this doesn't appear to be a DLL\n"), filename);
3247 /* Get pe_header, optional header and numbers of directory entries. */
3248 pe_header_offset = pe_get32 (dll, 0x3c);
3249 opthdr_ofs = pe_header_offset + 4 + 20;
3250 #ifdef pe_use_x86_64
3251 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3253 num_entries = pe_get32 (dll, opthdr_ofs + 92);
3256 /* No import or export directory entry. */
3257 if (num_entries < 1)
3260 #ifdef pe_use_x86_64
3261 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3262 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3264 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3265 export_size = pe_get32 (dll, opthdr_ofs + 100);
3268 /* No export table - nothing to export. */
3269 if (export_size == 0)
3272 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3273 secptr = (pe_header_offset + 4 + 20 +
3274 pe_get16 (dll, pe_header_offset + 4 + 16));
3277 /* Get the rva and size of the export section. */
3278 for (i = 0; i < nsections; i++)
3281 bfd_vma secptr1 = secptr + 40 * i;
3282 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3283 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3284 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3286 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3287 bfd_bread (sname, (bfd_size_type) 8, dll);
3289 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3291 expptr = fptr + (export_rva - vaddr);
3292 if (export_rva + export_size > vaddr + vsize)
3293 export_size = vsize - (export_rva - vaddr);
3298 /* Scan sections and store the base and size of the
3299 data and bss segments in data/base_start/end. */
3300 for (i = 0; i < nsections; i++)
3302 bfd_vma secptr1 = secptr + 40 * i;
3303 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3304 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3305 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3309 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3310 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3312 if (strcmp(sec_name,".data") == 0)
3315 data_end = vaddr + vsize;
3317 if (pe_dll_extra_pe_debug)
3318 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3319 __FUNCTION__, sec_name, (unsigned long) vaddr,
3320 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3322 else if (strcmp(sec_name,".rdata") == 0)
3324 rdata_start = vaddr;
3325 rdata_end = vaddr + vsize;
3327 if (pe_dll_extra_pe_debug)
3328 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3329 __FUNCTION__, sec_name, (unsigned long) vaddr,
3330 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3332 else if (strcmp (sec_name,".bss") == 0)
3335 bss_end = vaddr + vsize;
3337 if (pe_dll_extra_pe_debug)
3338 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3339 __FUNCTION__, sec_name, (unsigned long) vaddr,
3340 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3344 expdata = xmalloc (export_size);
3345 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3346 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3347 erva = (char *) expdata - export_rva;
3349 if (pe_def_file == 0)
3350 pe_def_file = def_file_empty ();
3352 nexp = pe_as32 (expdata + 24);
3353 name_rvas = pe_as32 (expdata + 32);
3354 exp_funcbase = pe_as32 (expdata + 28);
3356 /* Use internal dll name instead of filename
3357 to enable symbolic dll linking. */
3358 dllname = erva + pe_as32 (expdata + 12);
3360 /* Check to see if the dll has already been added to
3361 the definition list and if so return without error.
3362 This avoids multiple symbol definitions. */
3363 if (def_get_module (pe_def_file, dllname))
3365 if (pe_dll_extra_pe_debug)
3366 printf ("%s is already loaded\n", dllname);
3370 /* Iterate through the list of symbols. */
3371 for (i = 0; i < nexp; i++)
3373 /* Pointer to the names vector. */
3374 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3375 def_file_import *imp;
3376 /* Pointer to the function address vector. */
3377 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3380 /* Skip unwanted symbols, which are
3381 exported in buggy auto-import releases. */
3382 if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
3385 /* is_data is true if the address is in the data, rdata or bss
3388 (func_rva >= data_start && func_rva < data_end)
3389 || (func_rva >= rdata_start && func_rva < rdata_end)
3390 || (func_rva >= bss_start && func_rva < bss_end);
3392 imp = def_file_add_import (pe_def_file, erva + name_rva,
3393 dllname, i, NULL, NULL, &is_dup);
3394 /* Mark symbol type. */
3396 imp->data = is_data;
3398 if (pe_dll_extra_pe_debug)
3399 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3400 __FUNCTION__, dllname, erva + name_rva,
3401 (unsigned long) func_rva, is_data ? "(data)" : "");
3409 pe_output_file_set_long_section_names (bfd *abfd)
3411 if (pe_use_coff_long_section_names < 0)
3413 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3414 einfo (_("%P%X: Error: can't use long section names on this arch\n"));
3417 /* These are the main functions, called from the emulation. The first
3418 is called after the bfds are read, so we can guess at how much space
3419 we need. The second is called after everything is placed, so we
3420 can put the right values in place. */
3423 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3425 pe_dll_id_target (bfd_get_target (abfd));
3426 pe_output_file_set_long_section_names (abfd);
3427 process_def_file_and_drectve (abfd, info);
3429 if (pe_def_file->num_exports == 0 && !bfd_link_pic (info))
3432 generate_edata (abfd, info);
3433 build_filler_bfd (1);
3434 pe_output_file_set_long_section_names (filler_bfd);
3438 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3440 pe_dll_id_target (bfd_get_target (abfd));
3441 pe_output_file_set_long_section_names (abfd);
3442 build_filler_bfd (0);
3443 pe_output_file_set_long_section_names (filler_bfd);
3447 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3449 pe_dll_id_target (bfd_get_target (abfd));
3450 pe_output_file_set_long_section_names (abfd);
3451 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3453 generate_reloc (abfd, info);
3456 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3458 /* Resize the sections. */
3459 lang_reset_memory_regions ();
3460 lang_size_sections (NULL, TRUE);
3462 /* Redo special stuff. */
3463 ldemul_after_allocation ();
3465 /* Do the assignments again. */
3466 lang_do_assignments (lang_final_phase_enum);
3469 fill_edata (abfd, info);
3471 if (bfd_link_dll (info))
3472 pe_data (abfd)->dll = 1;
3474 edata_s->contents = edata_d;
3475 reloc_s->contents = reloc_d;
3479 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3481 pe_dll_id_target (bfd_get_target (abfd));
3482 pe_output_file_set_long_section_names (abfd);
3483 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3485 generate_reloc (abfd, info);
3488 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3490 /* Resize the sections. */
3491 lang_reset_memory_regions ();
3492 lang_size_sections (NULL, TRUE);
3494 /* Redo special stuff. */
3495 ldemul_after_allocation ();
3497 /* Do the assignments again. */
3498 lang_do_assignments (lang_final_phase_enum);
3500 reloc_s->contents = reloc_d;
3504 pe_bfd_is_dll (bfd *abfd)
3506 return (bfd_get_format (abfd) == bfd_object
3508 && pe_data (abfd)->dll);