1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2019 Free Software Foundation, Inc.
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"
41 #include "coff/internal.h"
42 #include "../bfd/libcoff.h"
47 #define PE_IDATA4_SIZE 8
48 #define PE_IDATA5_SIZE 8
51 #define AOUTSZ PEPAOUTSZ
52 #define PEAOUTHDR PEPAOUTHDR
60 #ifndef PE_IDATA4_SIZE
61 #define PE_IDATA4_SIZE 4
64 #ifndef PE_IDATA5_SIZE
65 #define PE_IDATA5_SIZE 4
68 /* This file turns a regular Windows PE image into a DLL. Because of
69 the complexity of this operation, it has been broken down into a
70 number of separate modules which are all called by the main function
71 at the end of this file. This function is not re-entrant and is
72 normally only called once, so static variables are used to reduce
73 the number of parameters and return values required.
75 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
77 /* Auto-import feature by Paul Sokolovsky
81 1. With this feature on, DLL clients can import variables from DLL
82 without any concern from their side (for example, without any source
85 2. This is done completely in bounds of the PE specification (to be fair,
86 there's a place where it pokes nose out of, but in practice it works).
87 So, resulting module can be used with any other PE compiler/linker.
89 3. Auto-import is fully compatible with standard import method and they
90 can be mixed together.
92 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
93 reference to it; load time: negligible; virtual/physical memory: should be
94 less than effect of DLL relocation, and I sincerely hope it doesn't affect
95 DLL sharability (too much).
99 The obvious and only way to get rid of dllimport insanity is to make client
100 access variable directly in the DLL, bypassing extra dereference. I.e.,
101 whenever client contains something like
105 address of dll_var in the command should be relocated to point into loaded
106 DLL. The aim is to make OS loader do so, and than make ld help with that.
107 Import section of PE made following way: there's a vector of structures
108 each describing imports from particular DLL. Each such structure points
109 to two other parallel vectors: one holding imported names, and one which
110 will hold address of corresponding imported name. So, the solution is
111 de-vectorize these structures, making import locations be sparse and
112 pointing directly into code. Before continuing, it is worth a note that,
113 while authors strives to make PE act ELF-like, there're some other people
114 make ELF act PE-like: elfvector, ;-) .
118 For each reference of data symbol to be imported from DLL (to set of which
119 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
120 import fixup entry is generated. That entry is of type
121 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
122 fixup entry contains pointer to symbol's address within .text section
123 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
124 (so, DLL name is referenced by multiple entries), and pointer to symbol
125 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
126 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
127 containing imported name. Here comes that "on the edge" problem mentioned
128 above: PE specification rambles that name vector (OriginalFirstThunk)
129 should run in parallel with addresses vector (FirstThunk), i.e. that they
130 should have same number of elements and terminated with zero. We violate
131 this, since FirstThunk points directly into machine code. But in practice,
132 OS loader implemented the sane way: it goes through OriginalFirstThunk and
133 puts addresses to FirstThunk, not something else. It once again should be
134 noted that dll and symbol name structures are reused across fixup entries
135 and should be there anyway to support standard import stuff, so sustained
136 overhead is 20 bytes per reference. Other question is whether having several
137 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
138 done even by native compiler/linker (libth32's functions are in fact reside
139 in windows9x kernel32.dll, so if you use it, you have two
140 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
141 referencing the same PE structures several times is valid. The answer is why
142 not, prohibiting that (detecting violation) would require more work on
143 behalf of loader than not doing it.
145 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
147 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
149 /* For emultempl/pe.em. */
151 def_file * pe_def_file = 0;
152 int pe_dll_export_everything = 0;
153 int pe_dll_exclude_all_symbols = 0;
154 int pe_dll_do_default_excludes = 1;
155 int pe_dll_kill_ats = 0;
156 int pe_dll_stdcall_aliases = 0;
157 int pe_dll_warn_dup_exports = 0;
158 int pe_dll_compat_implib = 0;
159 int pe_dll_extra_pe_debug = 0;
160 int pe_use_nul_prefixed_import_tables = 0;
161 int pe_use_coff_long_section_names = -1;
162 int pe_leading_underscore = -1;
164 /* Static variables and types. */
166 static bfd_vma image_base;
167 static bfd *filler_bfd;
168 static struct bfd_section *edata_s, *reloc_s;
169 static unsigned char *edata_d, *reloc_d;
170 static size_t edata_sz, reloc_sz;
171 static int runtime_pseudo_relocs_created = 0;
172 static bfd_boolean runtime_pseudp_reloc_v2_init = FALSE;
179 autofilter_entry_type;
183 const char *target_name;
184 const char *object_target;
185 unsigned int imagebase_reloc;
188 bfd_boolean underscored;
189 const autofilter_entry_type* autofilter_symbollist;
193 static const autofilter_entry_type autofilter_symbollist_generic[] =
195 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
196 /* Entry point symbols. */
197 { STRING_COMMA_LEN ("DllMain") },
198 { STRING_COMMA_LEN ("DllMainCRTStartup") },
199 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
200 /* Runtime pseudo-reloc. */
201 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
202 { STRING_COMMA_LEN ("do_pseudo_reloc") },
206 static const autofilter_entry_type autofilter_symbollist_i386[] =
208 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
209 /* Entry point symbols, and entry hooks. */
210 { STRING_COMMA_LEN ("cygwin_crt0") },
212 { STRING_COMMA_LEN ("DllMain") },
213 { STRING_COMMA_LEN ("DllEntryPoint") },
214 { STRING_COMMA_LEN ("DllMainCRTStartup") },
215 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
216 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
217 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
219 { STRING_COMMA_LEN ("DllMain@12") },
220 { STRING_COMMA_LEN ("DllEntryPoint@0") },
221 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
222 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
223 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
224 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
225 { STRING_COMMA_LEN ("cygwin_attach_dll") },
227 { STRING_COMMA_LEN ("cygwin_premain0") },
228 { STRING_COMMA_LEN ("cygwin_premain1") },
229 { STRING_COMMA_LEN ("cygwin_premain2") },
230 { STRING_COMMA_LEN ("cygwin_premain3") },
231 /* Runtime pseudo-reloc. */
232 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
233 { STRING_COMMA_LEN ("do_pseudo_reloc") },
234 /* Global vars that should not be exported. */
235 { STRING_COMMA_LEN ("impure_ptr") },
236 { STRING_COMMA_LEN ("_impure_ptr") },
237 { STRING_COMMA_LEN ("_fmode") },
238 { STRING_COMMA_LEN ("environ") },
239 { STRING_COMMA_LEN ("__dso_handle") },
243 #define PE_ARCH_i386 1
245 #define PE_ARCH_mips 3
246 #define PE_ARCH_arm 4
247 #define PE_ARCH_arm_wince 5
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 "pei-arm-wince-little",
312 "pe-arm-wince-little",
313 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
317 autofilter_symbollist_generic
319 { NULL, NULL, 0, 0, 0, FALSE, NULL }
322 static const pe_details_type *pe_details;
324 /* Do not specify library suffix explicitly, to allow for dllized versions. */
325 static const autofilter_entry_type autofilter_liblist[] =
327 { STRING_COMMA_LEN ("libcegcc") },
328 { STRING_COMMA_LEN ("libcygwin") },
329 { STRING_COMMA_LEN ("libgcc") },
330 { STRING_COMMA_LEN ("libgcc_s") },
331 { STRING_COMMA_LEN ("libstdc++") },
332 { STRING_COMMA_LEN ("libmingw32") },
333 { STRING_COMMA_LEN ("libmingwex") },
334 { STRING_COMMA_LEN ("libg2c") },
335 { STRING_COMMA_LEN ("libsupc++") },
336 { STRING_COMMA_LEN ("libobjc") },
337 { STRING_COMMA_LEN ("libgcj") },
338 { STRING_COMMA_LEN ("libmsvcrt") },
339 { STRING_COMMA_LEN ("libmsvcrt-os") },
340 { STRING_COMMA_LEN ("libucrtbase") },
344 /* Regardless of the suffix issue mentioned above, we must ensure that
345 we do not falsely match on a leading substring, such as when libtool
346 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
347 This routine ensures that the leading part of the name matches and that
348 it is followed by only an optional version suffix and a file extension,
349 returning zero if so or -1 if not. */
350 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
352 if (filename_ncmp (libname, afptr->name, afptr->len))
355 libname += afptr->len;
357 /* Be liberal in interpreting what counts as a version suffix; we
358 accept anything that has a dash to separate it from the name and
359 begins with a digit. */
360 if (libname[0] == '-')
362 if (!ISDIGIT (*++libname))
364 /* Ensure the filename has an extension. */
365 while (*++libname != '.')
369 else if (libname[0] != '.')
375 static const autofilter_entry_type autofilter_objlist[] =
377 { STRING_COMMA_LEN ("crt0.o") },
378 { STRING_COMMA_LEN ("crt1.o") },
379 { STRING_COMMA_LEN ("crt2.o") },
380 { STRING_COMMA_LEN ("dllcrt1.o") },
381 { STRING_COMMA_LEN ("dllcrt2.o") },
382 { STRING_COMMA_LEN ("gcrt0.o") },
383 { STRING_COMMA_LEN ("gcrt1.o") },
384 { STRING_COMMA_LEN ("gcrt2.o") },
385 { STRING_COMMA_LEN ("crtbegin.o") },
386 { STRING_COMMA_LEN ("crtend.o") },
390 static const autofilter_entry_type autofilter_symbolprefixlist[] =
392 /* _imp_ is treated specially, as it is always underscored. */
393 /* { STRING_COMMA_LEN ("_imp_") }, */
394 /* Don't export some c++ symbols. */
395 { STRING_COMMA_LEN ("__rtti_") },
396 { STRING_COMMA_LEN ("__builtin_") },
397 /* Don't re-export auto-imported symbols. */
398 { STRING_COMMA_LEN ("__nm_") },
399 /* Don't export symbols specifying internal DLL layout. */
400 { STRING_COMMA_LEN ("_head_") },
401 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
402 /* Don't export section labels or artificial symbols
404 { STRING_COMMA_LEN (".") },
408 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
410 { STRING_COMMA_LEN ("_iname") },
411 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
415 #define U(str) (pe_details->underscored ? "_" str : str)
418 pe_dll_id_target (const char *target)
422 for (i = 0; pe_detail_list[i].target_name; i++)
423 if (strcmp (pe_detail_list[i].target_name, target) == 0
424 || strcmp (pe_detail_list[i].object_target, target) == 0)
426 int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */
428 bfd_get_target_info (target, NULL, NULL, &u, NULL);
431 pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE);
432 pe_details = pe_detail_list + i;
433 pe_leading_underscore = (u != 0 ? 1 : 0);
436 einfo (_("%X%P: unsupported PEI architecture: %s\n"), target);
440 /* Helper functions for qsort. Relocs must be sorted so that we can write
441 them out by pages. */
452 reloc_sort (const void *va, const void *vb)
454 bfd_vma a = ((const reloc_data_type *) va)->vma;
455 bfd_vma b = ((const reloc_data_type *) vb)->vma;
457 return (a > b) ? 1 : ((a < b) ? -1 : 0);
461 pe_export_sort (const void *va, const void *vb)
463 const def_file_export *a = va;
464 const def_file_export *b = vb;
472 return strcmp (an, bn);
475 /* Read and process the .DEF file. */
477 /* These correspond to the entries in pe_def_file->exports[]. I use
478 exported_symbol_sections[i] to tag whether or not the symbol was
479 defined, since we can't export symbols we don't have. */
481 static bfd_vma *exported_symbol_offsets;
482 static struct bfd_section **exported_symbol_sections;
483 static int export_table_size;
484 static int count_exported;
485 static int count_exported_byname;
486 static int count_with_ordinals;
487 static const char *dll_name;
488 static int min_ordinal, max_ordinal;
489 static int *exported_symbols;
491 typedef struct exclude_list_struct
494 struct exclude_list_struct *next;
499 static struct exclude_list_struct *excludes = 0;
502 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
505 char *exclude_string;
507 local_copy = xstrdup (new_excludes);
509 exclude_string = strtok (local_copy, ",:");
510 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
512 struct exclude_list_struct *new_exclude;
514 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
515 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
516 strcpy (new_exclude->string, exclude_string);
517 new_exclude->type = type;
518 new_exclude->next = excludes;
519 excludes = new_exclude;
526 is_import (const char* n)
528 return (CONST_STRNEQ (n, "__imp_"));
531 /* abfd is a bfd containing n (or NULL)
532 It can be used for contextual checks. */
535 auto_export (bfd *abfd, def_file *d, const char *n)
538 struct exclude_list_struct *ex;
539 const autofilter_entry_type *afptr;
540 const char * libname = NULL;
542 if (abfd && abfd->my_archive)
543 libname = lbasename (abfd->my_archive->filename);
545 key.name = key.its_name = (char *) n;
547 /* Return false if n is in the d->exports table. */
548 if (bsearch (&key, d->exports, d->num_exports,
549 sizeof (pe_def_file->exports[0]), pe_export_sort))
552 if (pe_dll_do_default_excludes)
557 if (pe_dll_extra_pe_debug)
558 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
559 n, abfd, abfd->my_archive);
561 /* First of all, make context checks:
562 Don't export anything from standard libs. */
565 afptr = autofilter_liblist;
569 if (libnamencmp (libname, afptr) == 0 )
575 /* Next, exclude symbols from certain startup objects. */
577 if (abfd && (p = lbasename (abfd->filename)))
579 afptr = autofilter_objlist;
582 if (strcmp (p, afptr->name) == 0)
588 /* Don't try to blindly exclude all symbols
589 that begin with '__'; this was tried and
590 it is too restrictive. Instead we have
591 a target specific list to use: */
592 afptr = pe_details->autofilter_symbollist;
596 if (strcmp (n, afptr->name) == 0)
602 /* Next, exclude symbols starting with ... */
603 afptr = autofilter_symbolprefixlist;
606 if (strncmp (n, afptr->name, afptr->len) == 0)
612 /* Finally, exclude symbols ending with ... */
614 afptr = autofilter_symbolsuffixlist;
617 if ((len >= afptr->len)
618 /* Add 1 to insure match with trailing '\0'. */
619 && strncmp (n + len - afptr->len, afptr->name,
620 afptr->len + 1) == 0)
627 for (ex = excludes; ex; ex = ex->next)
629 if (ex->type == EXCLUDELIBS)
632 && ((filename_cmp (libname, ex->string) == 0)
633 || (strcasecmp ("ALL", ex->string) == 0)))
636 else if (ex->type == EXCLUDEFORIMPLIB)
638 if (filename_cmp (abfd->filename, ex->string) == 0)
641 else if (strcmp (n, ex->string) == 0)
649 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
652 struct bfd_link_hash_entry *blhe;
654 struct bfd_section *s;
655 def_file_export *e = 0;
656 bfd_boolean resort_needed;
659 pe_def_file = def_file_empty ();
661 /* First, run around to all the objects looking for the .drectve
662 sections, and push those into the def file too. */
663 for (b = info->input_bfds; b; b = b->link.next)
665 s = bfd_get_section_by_name (b, ".drectve");
669 char *buf = xmalloc (size);
671 bfd_get_section_contents (b, s, buf, 0, size);
672 def_file_add_directive (pe_def_file, buf, size);
677 /* Process aligned common symbol information from the
678 .drectve sections now; common symbol allocation is
679 done before final link, so it will be too late to
680 process them in process_embedded_commands() called
681 from _bfd_coff_link_input_bfd(). */
682 if (pe_def_file->aligncomms)
684 def_file_aligncomm *ac = pe_def_file->aligncomms;
687 struct coff_link_hash_entry *sym_hash;
688 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
689 ac->symbol_name, FALSE, FALSE, FALSE);
690 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
691 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
693 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
699 /* If we are building an executable and there is nothing
700 to export, we do not build an export table at all. */
701 if (bfd_link_executable (info) && pe_def_file->num_exports == 0
702 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
705 /* Now, maybe export everything else the default way. */
706 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
707 && !pe_dll_exclude_all_symbols)
709 for (b = info->input_bfds; b; b = b->link.next)
714 if (!bfd_generic_link_read_symbols (b))
716 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
720 symbols = bfd_get_outsymbols (b);
721 nsyms = bfd_get_symcount (b);
723 for (j = 0; j < nsyms; j++)
725 /* We should export symbols which are either global or not
726 anything at all. (.bss data is the latter)
727 We should not export undefined symbols. */
728 bfd_boolean would_export
729 = (symbols[j]->section != bfd_und_section_ptr
730 && ((symbols[j]->flags & BSF_GLOBAL)
731 || (symbols[j]->flags == 0)));
732 if (link_info.version_info && would_export)
734 = !bfd_hide_sym_by_version (link_info.version_info,
738 const char *sn = symbols[j]->name;
740 /* We should not re-export imported stuff. */
746 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
747 sprintf (name, "%s%s", "__imp_", sn);
749 blhe = bfd_link_hash_lookup (info->hash, name,
750 FALSE, FALSE, FALSE);
753 if (blhe && blhe->type == bfd_link_hash_defined)
757 if (pe_details->underscored && *sn == '_')
760 if (auto_export (b, pe_def_file, sn))
765 p = def_file_add_export (pe_def_file, sn, 0, -1,
767 /* Fill data flag properly, from dlltool.c. */
769 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
777 #define NE pe_def_file->num_exports
779 /* Don't create an empty export table. */
783 resort_needed = FALSE;
785 /* Canonicalize the export list. */
788 for (i = 0; i < NE; i++)
790 /* Check for fastcall/stdcall-decoration, but ignore
791 C++ mangled names. */
792 if (pe_def_file->exports[i].name[0] != '?'
793 && strchr (pe_def_file->exports[i].name, '@'))
795 /* This will preserve internal_name, which may have been
796 pointing to the same memory as name, or might not
798 int lead_at = (*pe_def_file->exports[i].name == '@');
799 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
800 char *tmp_at = strrchr (tmp, '@');
805 einfo (_("%X%P: cannot export %s: invalid export name\n"),
806 pe_def_file->exports[i].name);
807 pe_def_file->exports[i].name = tmp;
808 resort_needed = TRUE;
813 /* Re-sort the exports table as we have possibly changed the order
814 by removing leading @. */
816 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
819 if (pe_dll_stdcall_aliases)
821 for (i = 0; i < NE; i++)
823 if (is_import (pe_def_file->exports[i].name))
826 if (strchr (pe_def_file->exports[i].name, '@'))
829 int lead_at = (*pe_def_file->exports[i].name == '@');
830 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
832 *(strchr (tmp, '@')) = 0;
833 if (auto_export (NULL, pe_def_file, tmp))
834 def_file_add_export (pe_def_file, tmp,
835 pe_def_file->exports[i].internal_name,
843 /* Convenience, but watch out for it changing. */
844 e = pe_def_file->exports;
846 for (i = 0, j = 0; i < NE; i++)
848 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
850 /* This is a duplicate. */
851 if (e[j - 1].ordinal != -1
852 && e[i].ordinal != -1
853 && e[j - 1].ordinal != e[i].ordinal)
855 if (pe_dll_warn_dup_exports)
856 /* xgettext:c-format */
857 einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
858 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
862 if (pe_dll_warn_dup_exports)
863 /* xgettext:c-format */
864 einfo (_("%P: warning, duplicate EXPORT: %s\n"),
868 if (e[i].ordinal != -1)
869 e[j - 1].ordinal = e[i].ordinal;
870 e[j - 1].flag_private |= e[i].flag_private;
871 e[j - 1].flag_constant |= e[i].flag_constant;
872 e[j - 1].flag_noname |= e[i].flag_noname;
873 e[j - 1].flag_data |= e[i].flag_data;
876 if (e[i].internal_name)
877 free (e[i].internal_name);
879 free (e[i].its_name);
888 pe_def_file->num_exports = j; /* == NE */
890 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
891 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
893 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
897 count_exported_byname = 0;
898 count_with_ordinals = 0;
900 for (i = 0; i < NE; i++)
902 char *int_name = pe_def_file->exports[i].internal_name;
905 /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
906 lang_add_gc_name (int_name);
908 name = xmalloc (strlen (int_name) + 2);
909 if (pe_details->underscored && int_name[0] != '@')
912 strcpy (name + 1, int_name);
914 /* PR 19803: The alias must be preserved as well. */
915 lang_add_gc_name (xstrdup (name));
918 strcpy (name, int_name);
920 blhe = bfd_link_hash_lookup (info->hash,
925 && (blhe->type == bfd_link_hash_defined
926 || (blhe->type == bfd_link_hash_common)))
929 if (!pe_def_file->exports[i].flag_noname)
930 count_exported_byname++;
932 /* Only fill in the sections. The actual offsets are computed
933 in fill_exported_offsets() after common symbols are laid
935 if (blhe->type == bfd_link_hash_defined)
936 exported_symbol_sections[i] = blhe->u.def.section;
938 exported_symbol_sections[i] = blhe->u.c.p->section;
940 if (pe_def_file->exports[i].ordinal != -1)
942 if (max_ordinal < pe_def_file->exports[i].ordinal)
943 max_ordinal = pe_def_file->exports[i].ordinal;
944 if (min_ordinal > pe_def_file->exports[i].ordinal)
945 min_ordinal = pe_def_file->exports[i].ordinal;
946 count_with_ordinals++;
949 /* Check for forward exports. These are indicated in DEF files by an
950 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
951 but we must take care not to be fooled when the user wants to export
952 a symbol that actually really has a dot in it, so we only check
953 for them here, after real defined symbols have already been matched. */
954 else if (strchr (int_name, '.'))
957 if (!pe_def_file->exports[i].flag_noname)
958 count_exported_byname++;
960 pe_def_file->exports[i].flag_forward = 1;
962 if (pe_def_file->exports[i].ordinal != -1)
964 if (max_ordinal < pe_def_file->exports[i].ordinal)
965 max_ordinal = pe_def_file->exports[i].ordinal;
966 if (min_ordinal > pe_def_file->exports[i].ordinal)
967 min_ordinal = pe_def_file->exports[i].ordinal;
968 count_with_ordinals++;
971 else if (blhe && blhe->type == bfd_link_hash_undefined)
973 /* xgettext:c-format */
974 einfo (_("%X%P: cannot export %s: symbol not defined\n"),
979 /* xgettext:c-format */
980 einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
982 blhe->type, bfd_link_hash_defined);
986 /* xgettext:c-format */
987 einfo (_("%X%P: cannot export %s: symbol not found\n"),
994 /* Build the bfd that will contain .edata and .reloc sections. */
997 build_filler_bfd (int include_edata)
999 lang_input_statement_type *filler_file;
1000 filler_file = lang_add_input_file ("dll stuff",
1001 lang_input_file_is_fake_enum,
1003 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
1004 link_info.output_bfd);
1005 if (filler_bfd == NULL
1006 || !bfd_set_arch_mach (filler_bfd,
1007 bfd_get_arch (link_info.output_bfd),
1008 bfd_get_mach (link_info.output_bfd)))
1010 einfo (_("%F%P: can not create BFD: %E\n"));
1016 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
1018 || !bfd_set_section_flags (edata_s, (SEC_HAS_CONTENTS
1024 einfo (_("%X%P: can not create .edata section: %E\n"));
1027 bfd_set_section_size (edata_s, edata_sz);
1030 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1032 || !bfd_set_section_flags (reloc_s, (SEC_HAS_CONTENTS
1038 einfo (_("%X%P: can not create .reloc section: %E\n"));
1042 bfd_set_section_size (reloc_s, 0);
1044 ldlang_add_file (filler_file);
1047 /* Gather all the exported symbols and build the .edata section. */
1050 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1052 int i, next_ordinal;
1053 int name_table_size = 0;
1056 /* First, we need to know how many exported symbols there are,
1057 and what the range of ordinals is. */
1058 if (pe_def_file->name)
1059 dll_name = pe_def_file->name;
1062 dll_name = abfd->filename;
1064 for (dlnp = dll_name; *dlnp; dlnp++)
1065 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1066 dll_name = dlnp + 1;
1069 if (count_with_ordinals && max_ordinal > count_exported)
1071 if (min_ordinal > max_ordinal - count_exported + 1)
1072 min_ordinal = max_ordinal - count_exported + 1;
1077 max_ordinal = count_exported;
1080 export_table_size = max_ordinal - min_ordinal + 1;
1081 exported_symbols = xmalloc (export_table_size * sizeof (int));
1082 for (i = 0; i < export_table_size; i++)
1083 exported_symbols[i] = -1;
1085 /* Now we need to assign ordinals to those that don't have them. */
1086 for (i = 0; i < NE; i++)
1088 if (exported_symbol_sections[i]
1089 || pe_def_file->exports[i].flag_forward)
1091 if (pe_def_file->exports[i].ordinal != -1)
1093 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1094 int pi = exported_symbols[ei];
1098 /* xgettext:c-format */
1099 einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
1100 pe_def_file->exports[i].ordinal,
1101 pe_def_file->exports[i].name,
1102 pe_def_file->exports[pi].name);
1104 exported_symbols[ei] = i;
1106 if (pe_def_file->exports[i].its_name)
1107 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1109 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1112 /* Reserve space for the forward name. */
1113 if (pe_def_file->exports[i].flag_forward)
1115 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1119 next_ordinal = min_ordinal;
1120 for (i = 0; i < NE; i++)
1121 if ((exported_symbol_sections[i]
1122 || pe_def_file->exports[i].flag_forward)
1123 && pe_def_file->exports[i].ordinal == -1)
1125 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1128 exported_symbols[next_ordinal - min_ordinal] = i;
1129 pe_def_file->exports[i].ordinal = next_ordinal;
1132 /* PR 12969: Check for more than 1^16 ordinals. */
1133 if (max_ordinal > 65535 || next_ordinal > 65535)
1134 /* xgettext:c-format */
1135 einfo(_("%X%P: error: export ordinal too large: %d\n"),
1136 max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
1138 /* OK, now we can allocate some memory. */
1139 edata_sz = (40 /* directory */
1140 + 4 * export_table_size /* addresses */
1141 + 4 * count_exported_byname /* name ptrs */
1142 + 2 * count_exported_byname /* ordinals */
1143 + name_table_size + strlen (dll_name) + 1);
1146 /* Fill the exported symbol offsets. The preliminary work has already
1147 been done in process_def_file_and_drectve(). */
1150 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1153 struct bfd_link_hash_entry *blhe;
1155 for (i = 0; i < pe_def_file->num_exports; i++)
1159 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1160 if (pe_details->underscored
1161 && *pe_def_file->exports[i].internal_name != '@')
1164 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1167 strcpy (name, pe_def_file->exports[i].internal_name);
1169 blhe = bfd_link_hash_lookup (info->hash,
1171 FALSE, FALSE, TRUE);
1173 if (blhe && blhe->type == bfd_link_hash_defined)
1174 exported_symbol_offsets[i] = blhe->u.def.value;
1181 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1184 unsigned char *edirectory;
1185 unsigned char *eaddresses;
1186 unsigned char *enameptrs;
1187 unsigned char *eordinals;
1190 edata_d = xmalloc (edata_sz);
1192 /* Note use of array pointer math here. */
1193 edirectory = edata_d;
1194 eaddresses = edirectory + 40;
1195 enameptrs = eaddresses + 4 * export_table_size;
1196 eordinals = enameptrs + 4 * count_exported_byname;
1197 enamestr = (char *) eordinals + 2 * count_exported_byname;
1199 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1200 + edata_s->output_section->vma - image_base)
1202 memset (edata_d, 0, edata_sz);
1204 if (pe_data (abfd)->insert_timestamp)
1205 H_PUT_32 (abfd, time (0), edata_d + 4);
1207 if (pe_def_file->version_major != -1)
1209 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1210 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1213 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1214 strcpy (enamestr, dll_name);
1215 enamestr += strlen (enamestr) + 1;
1216 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1217 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1218 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1219 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1220 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1221 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1223 fill_exported_offsets (abfd, info);
1225 /* Ok, now for the filling in part.
1226 Scan alphabetically - ie the ordering in the exports[] table,
1227 rather than by ordinal - the ordering in the exported_symbol[]
1228 table. See dlltool.c and:
1229 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1230 for more information. */
1232 for (s = 0; s < NE; s++)
1234 struct bfd_section *ssec = exported_symbol_sections[s];
1235 if (pe_def_file->exports[s].ordinal != -1
1236 && (pe_def_file->exports[s].flag_forward || ssec != NULL))
1238 int ord = pe_def_file->exports[s].ordinal;
1240 if (pe_def_file->exports[s].flag_forward)
1242 bfd_put_32 (abfd, ERVA (enamestr),
1243 eaddresses + 4 * (ord - min_ordinal));
1245 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1246 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1250 bfd_vma srva = (exported_symbol_offsets[s]
1251 + ssec->output_section->vma
1252 + ssec->output_offset);
1254 bfd_put_32 (abfd, srva - image_base,
1255 eaddresses + 4 * (ord - min_ordinal));
1258 if (!pe_def_file->exports[s].flag_noname)
1260 char *ename = pe_def_file->exports[s].name;
1261 if (pe_def_file->exports[s].its_name)
1262 ename = pe_def_file->exports[s].its_name;
1264 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1266 strcpy (enamestr, ename);
1267 enamestr += strlen (enamestr) + 1;
1268 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1270 pe_def_file->exports[s].hint = hint++;
1277 static struct bfd_section *current_sec;
1280 pe_walk_relocs (struct bfd_link_info *info,
1282 const char *symname,
1283 struct bfd_hash_table *import_hash,
1284 void (*cb) (arelent *, asection *, char *, const char *))
1289 for (b = info->input_bfds; b; b = b->link.next)
1293 if (!bfd_generic_link_read_symbols (b))
1295 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1299 symbols = bfd_get_outsymbols (b);
1301 for (s = b->sections; s; s = s->next)
1304 int relsize, nrelocs, i;
1305 int flags = bfd_section_flags (s);
1307 /* Skip discarded linkonce sections. */
1308 if (flags & SEC_LINK_ONCE
1309 && s->output_section == bfd_abs_section_ptr)
1314 relsize = bfd_get_reloc_upper_bound (b, s);
1315 relocs = xmalloc (relsize);
1316 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1318 for (i = 0; i < nrelocs; i++)
1320 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1322 /* Warning: the callback needs to be passed NAME directly. */
1325 if (bfd_hash_lookup (import_hash, sym->name, FALSE, FALSE))
1327 strcpy (name, sym->name);
1328 cb (relocs[i], s, name, symname);
1333 if (strcmp (name, sym->name) == 0)
1334 cb (relocs[i], s, name, symname);
1340 /* Warning: the allocated symbols are remembered in BFD and reused
1341 later, so don't free them! */
1342 /* free (symbols); */
1348 pe_find_data_imports (const char *symhead,
1349 void (*cb) (arelent *, asection *, char *, const char *))
1351 struct bfd_link_hash_entry *undef;
1352 const size_t headlen = strlen (symhead);
1355 struct bfd_hash_table *import_hash;
1357 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1358 if (undef->type == bfd_link_hash_undefined)
1360 size_t len = strlen (undef->root.string);
1367 /* For the pseudo-relocation support version 2, we can collect the symbols
1368 that are subject to auto-import and adjust the relocations en masse. */
1369 if (link_info.pei386_runtime_pseudo_reloc == 2)
1372 = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
1373 if (!bfd_hash_table_init (import_hash,
1375 sizeof (struct bfd_hash_entry)))
1376 einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
1381 /* We are being a bit cunning here. The buffer will have space for
1382 prefixes at the beginning. The prefix is modified here and in a
1383 number of functions called from this function. */
1384 #define PREFIX_LEN 32
1385 buf = xmalloc (PREFIX_LEN + namelen + 1);
1386 name = buf + PREFIX_LEN;
1388 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1389 if (undef->type == bfd_link_hash_undefined)
1391 struct bfd_link_hash_entry *sym;
1394 if (pe_dll_extra_pe_debug)
1395 printf ("%s:%s\n", __FUNCTION__, undef->root.string);
1397 strcpy (name, undef->root.string);
1398 impname = name - (sizeof "__imp_" - 1);
1399 memcpy (impname, "__imp_", sizeof "__imp_" - 1);
1401 sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
1403 if (sym && sym->type == bfd_link_hash_defined)
1406 bfd_hash_lookup (import_hash, undef->root.string, TRUE, FALSE);
1409 bfd *b = sym->u.def.section->owner;
1410 const char *symname = NULL;
1414 if (!bfd_generic_link_read_symbols (b))
1416 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1420 symbols = bfd_get_outsymbols (b);
1421 nsyms = bfd_get_symcount (b);
1423 for (i = 0; i < nsyms; i++)
1424 if (strncmp (symbols[i]->name, symhead, headlen) == 0)
1426 if (pe_dll_extra_pe_debug)
1427 printf ("->%s\n", symbols[i]->name);
1429 symname = symbols[i]->name + headlen;
1433 /* If the symobl isn't part of an import table, there is no
1434 point in building a fixup, this would give rise to link
1435 errors for mangled symbols instead of the original one. */
1437 pe_walk_relocs (&link_info, name, symname, NULL, cb);
1442 /* Let's differentiate it somehow from defined. */
1443 undef->type = bfd_link_hash_defweak;
1444 undef->u.def.value = sym->u.def.value;
1445 undef->u.def.section = sym->u.def.section;
1447 /* We replace the original name with the __imp_ prefixed one, this
1448 1) may trash memory 2) leads to duplicate symbols. But this is
1449 better than having a misleading name that can confuse GDB. */
1450 undef->root.string = sym->root.string;
1452 if (link_info.pei386_auto_import == -1)
1454 static bfd_boolean warned = FALSE;
1456 info_msg (_("Info: resolving %s by linking to %s "
1457 "(auto-import)\n"), name, impname);
1459 /* PR linker/4844. */
1462 einfo (_("%P: warning: auto-importing has been activated "
1463 "without --enable-auto-import specified on the "
1464 "command line; this should work unless it "
1465 "involves constant data structures referencing "
1466 "symbols from auto-imported DLLs\n"));
1473 /* If we have the import hash table, walk the relocations only once. */
1476 pe_walk_relocs (&link_info, name, NULL, import_hash, cb);
1477 bfd_hash_table_free (import_hash);
1484 /* Gather all the relocations and build the .reloc section. */
1487 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1490 /* For .reloc stuff. */
1491 reloc_data_type *reloc_data;
1492 int total_relocs = 0;
1494 bfd_vma sec_page = (bfd_vma) -1;
1495 bfd_vma page_ptr, page_count;
1498 struct bfd_section *s;
1501 for (b = info->input_bfds; b; b = b->link.next)
1502 for (s = b->sections; s; s = s->next)
1503 total_relocs += s->reloc_count;
1505 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1509 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link.next)
1512 int relsize, nrelocs;
1514 for (s = b->sections; s; s = s->next)
1516 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1519 /* If it's not loaded, we don't need to relocate it this way. */
1520 if (!(s->output_section->flags & SEC_LOAD))
1523 /* I don't know why there would be a reloc for these, but I've
1524 seen it happen - DJ */
1525 if (s->output_section == bfd_abs_section_ptr)
1528 if (s->output_section->vma == 0)
1530 /* Huh? Shouldn't happen, but punt if it does. */
1531 einfo (_("%P: zero vma section reloc detected: `%s' #%d f=%d\n"),
1532 s->output_section->name, s->output_section->index,
1533 s->output_section->flags);
1537 if (!bfd_generic_link_read_symbols (b))
1539 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1543 symbols = bfd_get_outsymbols (b);
1544 relsize = bfd_get_reloc_upper_bound (b, s);
1545 relocs = xmalloc (relsize);
1546 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1548 for (i = 0; i < nrelocs; i++)
1550 if (pe_dll_extra_pe_debug)
1552 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1553 printf ("rel: %s\n", sym->name);
1555 if (!relocs[i]->howto->pc_relative
1556 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1558 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1560 /* Don't create relocs for undefined weak symbols. */
1561 if (sym->flags == BSF_WEAK)
1563 struct bfd_link_hash_entry *blhe
1564 = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1565 FALSE, FALSE, FALSE);
1566 if (blhe && blhe->type == bfd_link_hash_undefweak)
1568 /* Check aux sym and see if it is defined or not. */
1569 struct coff_link_hash_entry *h, *h2;
1570 h = (struct coff_link_hash_entry *)blhe;
1571 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1573 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1574 [h->aux->x_sym.x_tagndx.l];
1575 /* We don't want a base reloc if the aux sym is not
1576 found, undefined, or if it is the constant ABS
1577 zero default value. (We broaden that slightly by
1578 not testing the value, just the section; there's
1579 no reason we'd want a reference to any absolute
1580 address to get relocated during rebasing). */
1581 if (!h2 || h2->root.type == bfd_link_hash_undefined
1582 || h2->root.u.def.section == bfd_abs_section_ptr)
1585 else if (!blhe || blhe->type != bfd_link_hash_defined)
1588 /* Nor for Dwarf FDE references to discarded sections. */
1589 else if (bfd_is_abs_section (sym->section->output_section))
1591 /* We only ignore relocs from .eh_frame sections, as
1592 they are discarded by the final link rather than
1593 resolved against the kept section. */
1594 if (!strcmp (s->name, ".eh_frame"))
1598 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1600 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1602 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1603 relocs[i]->howto->rightshift)
1605 #ifdef pe_use_x86_64
1606 case BITS_AND_SHIFT (64, 0):
1607 reloc_data[total_relocs].type = 10;
1611 case BITS_AND_SHIFT (32, 0):
1612 reloc_data[total_relocs].type = 3;
1615 case BITS_AND_SHIFT (16, 0):
1616 reloc_data[total_relocs].type = 2;
1619 case BITS_AND_SHIFT (16, 16):
1620 reloc_data[total_relocs].type = 4;
1621 /* FIXME: we can't know the symbol's right value
1622 yet, but we probably can safely assume that
1623 CE will relocate us in 64k blocks, so leaving
1625 reloc_data[total_relocs].extra = 0;
1628 case BITS_AND_SHIFT (26, 2):
1629 reloc_data[total_relocs].type = 5;
1632 case BITS_AND_SHIFT (24, 2):
1633 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1634 Those ARM_xxx definitions should go in proper
1636 if (relocs[i]->howto->type == 0
1637 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1638 || relocs[i]->howto->type == 5)
1639 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1640 that has already been fully processed during a
1641 previous link stage, so ignore it here. */
1645 /* xgettext:c-format */
1646 einfo (_("%X%P: error: %d-bit reloc in dll\n"),
1647 relocs[i]->howto->bitsize);
1653 /* Warning: the allocated symbols are remembered in BFD and
1654 reused later, so don't free them! */
1658 /* At this point, we have total_relocs relocation addresses in
1659 reloc_addresses, which are all suitable for the .reloc section.
1660 We must now create the new sections. */
1661 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1663 for (i = 0; i < total_relocs; i++)
1665 bfd_vma this_page = (reloc_data[i].vma >> 12);
1667 if (this_page != sec_page)
1669 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1671 sec_page = this_page;
1676 if (reloc_data[i].type == 4)
1680 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1681 reloc_d = xmalloc (reloc_sz);
1682 sec_page = (bfd_vma) -1;
1684 page_ptr = (bfd_vma) -1;
1687 for (i = 0; i < total_relocs; i++)
1689 bfd_vma rva = reloc_data[i].vma - image_base;
1690 bfd_vma this_page = (rva & ~0xfff);
1692 if (this_page != sec_page)
1694 while (reloc_sz & 3)
1695 reloc_d[reloc_sz++] = 0;
1697 if (page_ptr != (bfd_vma) -1)
1698 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1700 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1701 page_ptr = reloc_sz;
1703 sec_page = this_page;
1707 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1708 reloc_d + reloc_sz);
1711 if (reloc_data[i].type == 4)
1713 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1720 while (reloc_sz & 3)
1721 reloc_d[reloc_sz++] = 0;
1723 if (page_ptr != (bfd_vma) -1)
1724 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1726 while (reloc_sz < reloc_s->size)
1727 reloc_d[reloc_sz++] = 0;
1730 /* Given the exiting def_file structure, print out a .DEF file that
1731 corresponds to it. */
1734 quoteput (char *s, FILE *f, int needs_quotes)
1738 for (cp = s; *cp; cp++)
1753 if (*s == '"' || *s == '\\')
1767 pe_dll_generate_def_file (const char *pe_out_def_filename)
1770 FILE *out = fopen (pe_out_def_filename, "w");
1773 /* xgettext:c-format */
1774 einfo (_("%P: can't open output def file %s\n"),
1775 pe_out_def_filename);
1779 if (pe_def_file->name)
1781 if (pe_def_file->is_dll)
1782 fprintf (out, "LIBRARY ");
1784 fprintf (out, "NAME ");
1786 quoteput (pe_def_file->name, out, 1);
1788 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1790 fprintf (out, " BASE=0x");
1791 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1793 fprintf (out, "\n");
1796 if (pe_def_file->description)
1798 fprintf (out, "DESCRIPTION ");
1799 quoteput (pe_def_file->description, out, 1);
1800 fprintf (out, "\n");
1803 if (pe_def_file->version_minor != -1)
1804 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1805 pe_def_file->version_minor);
1806 else if (pe_def_file->version_major != -1)
1807 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1809 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1810 fprintf (out, "\n");
1812 if (pe_def_file->stack_commit != -1)
1813 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1814 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1815 else if (pe_def_file->stack_reserve != -1)
1816 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1818 if (pe_def_file->heap_commit != -1)
1819 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1820 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1821 else if (pe_def_file->heap_reserve != -1)
1822 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1824 if (pe_def_file->num_section_defs > 0)
1826 fprintf (out, "\nSECTIONS\n\n");
1828 for (i = 0; i < pe_def_file->num_section_defs; i++)
1831 quoteput (pe_def_file->section_defs[i].name, out, 0);
1833 if (pe_def_file->section_defs[i].class)
1835 fprintf (out, " CLASS ");
1836 quoteput (pe_def_file->section_defs[i].class, out, 0);
1839 if (pe_def_file->section_defs[i].flag_read)
1840 fprintf (out, " READ");
1842 if (pe_def_file->section_defs[i].flag_write)
1843 fprintf (out, " WRITE");
1845 if (pe_def_file->section_defs[i].flag_execute)
1846 fprintf (out, " EXECUTE");
1848 if (pe_def_file->section_defs[i].flag_shared)
1849 fprintf (out, " SHARED");
1851 fprintf (out, "\n");
1855 if (pe_def_file->num_exports > 0)
1857 fprintf (out, "EXPORTS\n");
1859 for (i = 0; i < pe_def_file->num_exports; i++)
1861 def_file_export *e = pe_def_file->exports + i;
1863 quoteput (e->name, out, 0);
1865 if (e->internal_name && strcmp (e->internal_name, e->name))
1867 fprintf (out, " = ");
1868 quoteput (e->internal_name, out, 0);
1871 if (e->ordinal != -1)
1872 fprintf (out, " @%d", e->ordinal);
1874 if (e->flag_private)
1875 fprintf (out, " PRIVATE");
1877 if (e->flag_constant)
1878 fprintf (out, " CONSTANT");
1881 fprintf (out, " NONAME");
1884 fprintf (out, " DATA");
1886 fprintf (out, "\n");
1890 if (pe_def_file->num_imports > 0)
1892 fprintf (out, "\nIMPORTS\n\n");
1894 for (i = 0; i < pe_def_file->num_imports; i++)
1896 def_file_import *im = pe_def_file->imports + i;
1899 if (im->internal_name
1900 && (!im->name || strcmp (im->internal_name, im->name)))
1902 quoteput (im->internal_name, out, 0);
1903 fprintf (out, " = ");
1906 quoteput (im->module->name, out, 0);
1910 quoteput (im->name, out, 0);
1912 fprintf (out, "%d", im->ordinal);
1916 fprintf (out, " == ");
1917 quoteput (im->its_name, out, 0);
1920 fprintf (out, "\n");
1925 fprintf (out, _("; no contents available\n"));
1927 if (fclose (out) == EOF)
1928 /* xgettext:c-format */
1929 einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename);
1932 /* Generate the import library. */
1934 static asymbol **symtab;
1937 static const char *dll_filename;
1938 static char *dll_symname;
1940 #define UNDSEC bfd_und_section_ptr
1943 quick_section (bfd *abfd, const char *name, int flags, int align)
1948 sec = bfd_make_section_old_way (abfd, name);
1949 bfd_set_section_flags (sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1950 bfd_set_section_alignment (sec, align);
1951 /* Remember to undo this before trying to link internally! */
1952 sec->output_section = sec;
1954 sym = bfd_make_empty_symbol (abfd);
1955 symtab[symptr++] = sym;
1956 sym->name = sec->name;
1958 sym->flags = BSF_LOCAL;
1965 quick_symbol (bfd *abfd,
1974 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1979 sym = bfd_make_empty_symbol (abfd);
1984 symtab[symptr++] = sym;
1987 static arelent *reltab = 0;
1988 static int relcount = 0, relsize = 0;
1991 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1993 if (relcount >= relsize - 1)
1997 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1999 reltab = xmalloc (relsize * sizeof (arelent));
2001 reltab[relcount].address = address;
2002 reltab[relcount].addend = 0;
2003 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
2004 reltab[relcount].sym_ptr_ptr = symtab + symidx;
2009 save_relocs (asection *sec)
2013 sec->relocation = reltab;
2014 sec->reloc_count = relcount;
2015 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
2016 for (i = 0; i < relcount; i++)
2017 sec->orelocation[i] = sec->relocation + i;
2018 sec->orelocation[relcount] = 0;
2019 sec->flags |= SEC_RELOC;
2021 relcount = relsize = 0;
2024 /* .section .idata$2
2025 .global __head_my_dll
2042 make_head (bfd *parent)
2044 asection *id2, *id5, *id4;
2045 unsigned char *d2, *d5, *d4;
2049 oname = xmalloc (20);
2050 sprintf (oname, "d%06d.o", tmp_seq);
2053 abfd = bfd_create (oname, parent);
2054 bfd_find_target (pe_details->object_target, abfd);
2055 bfd_make_writable (abfd);
2057 bfd_set_format (abfd, bfd_object);
2058 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2061 symtab = xmalloc (6 * sizeof (asymbol *));
2062 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2063 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2064 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2065 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2066 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2068 /* OK, pay attention here. I got confused myself looking back at
2069 it. We create a four-byte section to mark the beginning of the
2070 list, and we include an offset of 4 in the section, so that the
2071 pointer to the list points to the *end* of this section, which is
2072 the start of the list of sections from other objects. */
2074 bfd_set_section_size (id2, 20);
2078 if (pe_use_nul_prefixed_import_tables)
2079 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
2080 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2081 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
2082 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
2085 if (pe_use_nul_prefixed_import_tables)
2086 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2088 bfd_set_section_size (id5, 0);
2089 d5 = xmalloc (PE_IDATA5_SIZE);
2091 memset (d5, 0, PE_IDATA5_SIZE);
2092 if (pe_use_nul_prefixed_import_tables)
2093 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2095 bfd_set_section_size (id4, 0);
2096 d4 = xmalloc (PE_IDATA4_SIZE);
2098 memset (d4, 0, PE_IDATA4_SIZE);
2100 bfd_set_symtab (abfd, symtab, symptr);
2102 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2103 if (pe_use_nul_prefixed_import_tables)
2105 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2106 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2110 bfd_set_section_contents (abfd, id5, d5, 0, 0);
2111 bfd_set_section_contents (abfd, id4, d4, 0, 0);
2114 bfd_make_readable (abfd);
2118 /* .section .idata$4
2125 .global __my_dll_iname
2130 make_tail (bfd *parent)
2132 asection *id4, *id5, *id7;
2133 unsigned char *d4, *d5, *d7;
2138 oname = xmalloc (20);
2139 sprintf (oname, "d%06d.o", tmp_seq);
2142 abfd = bfd_create (oname, parent);
2143 bfd_find_target (pe_details->object_target, abfd);
2144 bfd_make_writable (abfd);
2146 bfd_set_format (abfd, bfd_object);
2147 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2150 symtab = xmalloc (5 * sizeof (asymbol *));
2151 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2152 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2153 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2154 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
2156 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2157 d4 = xmalloc (PE_IDATA4_SIZE);
2159 memset (d4, 0, PE_IDATA4_SIZE);
2161 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2162 d5 = xmalloc (PE_IDATA5_SIZE);
2164 memset (d5, 0, PE_IDATA5_SIZE);
2166 len = strlen (dll_filename) + 1;
2169 bfd_set_section_size (id7, len);
2172 strcpy ((char *) d7, dll_filename);
2173 /* If len was odd, the above
2174 strcpy leaves behind an undefined byte. That is harmless,
2175 but we set it to 0 just so the binary dumps are pretty. */
2178 bfd_set_symtab (abfd, symtab, symptr);
2180 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2181 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2182 bfd_set_section_contents (abfd, id7, d7, 0, len);
2184 bfd_make_readable (abfd);
2190 .global ___imp_function
2191 .global __imp__function
2193 jmp *__imp__function:
2207 .asciz "function" xlate? (add underscore, kill at) */
2209 static const unsigned char jmp_ix86_bytes[] =
2211 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2219 .dw __imp_function */
2221 static const unsigned char jmp_sh_bytes[] =
2223 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2227 lui $t0,<high:__imp_function>
2228 lw $t0,<low:__imp_function>
2232 static const unsigned char jmp_mips_bytes[] =
2234 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2235 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2238 static const unsigned char jmp_arm_bytes[] =
2240 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2241 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2247 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2249 asection *tx, *id7, *id5, *id4, *id6;
2250 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2254 const unsigned char *jmp_bytes = NULL;
2255 int jmp_byte_count = 0;
2257 /* Include the jump stub section only if it is needed. A jump
2258 stub is needed if the symbol being imported <sym> is a function
2259 symbol and there is at least one undefined reference to that
2260 symbol. In other words, if all the import references to <sym> are
2261 explicitly through _declspec(dllimport) then the jump stub is not
2263 if (include_jmp_stub)
2265 switch (pe_details->pe_arch)
2268 jmp_bytes = jmp_ix86_bytes;
2269 jmp_byte_count = sizeof (jmp_ix86_bytes);
2272 jmp_bytes = jmp_sh_bytes;
2273 jmp_byte_count = sizeof (jmp_sh_bytes);
2276 jmp_bytes = jmp_mips_bytes;
2277 jmp_byte_count = sizeof (jmp_mips_bytes);
2280 case PE_ARCH_arm_wince:
2281 jmp_bytes = jmp_arm_bytes;
2282 jmp_byte_count = sizeof (jmp_arm_bytes);
2289 oname = xmalloc (20);
2290 sprintf (oname, "d%06d.o", tmp_seq);
2293 abfd = bfd_create (oname, parent);
2294 bfd_find_target (pe_details->object_target, abfd);
2295 bfd_make_writable (abfd);
2297 bfd_set_format (abfd, bfd_object);
2298 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2301 symtab = xmalloc (12 * sizeof (asymbol *));
2303 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2304 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2305 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2306 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2307 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2309 if (*exp->internal_name == '@')
2311 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2313 if (include_jmp_stub)
2314 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2315 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2317 /* Fastcall applies only to functions,
2318 so no need for auto-import symbol. */
2322 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2324 if (include_jmp_stub)
2325 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2327 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2329 /* Symbol to reference ord/name of imported
2330 data symbol, used to implement auto-import. */
2332 quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
2335 if (pe_dll_compat_implib)
2336 quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
2339 if (include_jmp_stub)
2341 bfd_set_section_size (tx, jmp_byte_count);
2342 td = xmalloc (jmp_byte_count);
2344 memcpy (td, jmp_bytes, jmp_byte_count);
2346 switch (pe_details->pe_arch)
2349 #ifdef pe_use_x86_64
2350 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2352 /* Mark this object as SAFESEH compatible. */
2353 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2355 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2359 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2362 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2363 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2364 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2367 case PE_ARCH_arm_wince:
2368 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2376 bfd_set_section_size (tx, 0);
2378 bfd_set_section_size (id7, 4);
2382 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2385 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2386 d5 = xmalloc (PE_IDATA5_SIZE);
2388 memset (d5, 0, PE_IDATA5_SIZE);
2390 if (exp->flag_noname)
2392 d5[0] = exp->ordinal;
2393 d5[1] = exp->ordinal >> 8;
2394 d5[PE_IDATA5_SIZE - 1] = 0x80;
2398 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2402 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2403 d4 = xmalloc (PE_IDATA4_SIZE);
2405 memset (d4, 0, PE_IDATA4_SIZE);
2407 if (exp->flag_noname)
2409 d4[0] = exp->ordinal;
2410 d4[1] = exp->ordinal >> 8;
2411 d4[PE_IDATA4_SIZE - 1] = 0x80;
2415 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2419 if (exp->flag_noname)
2422 bfd_set_section_size (id6, 0);
2428 /* { short, asciz } */
2430 len = 2 + strlen (exp->its_name) + 1;
2432 len = 2 + strlen (exp->name) + 1;
2435 bfd_set_section_size (id6, len);
2438 memset (d6, 0, len);
2440 /* PR 20880: Use exp->hint as a backup, just in case exp->ordinal
2441 contains an invalid value (-1). */
2442 ord = (exp->ordinal >= 0) ? exp->ordinal : exp->hint;
2447 strcpy ((char*) d6 + 2, exp->its_name);
2449 strcpy ((char *) d6 + 2, exp->name);
2452 bfd_set_symtab (abfd, symtab, symptr);
2454 if (include_jmp_stub)
2455 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2456 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2457 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2458 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2459 if (!exp->flag_noname)
2460 bfd_set_section_contents (abfd, id6, d6, 0, len);
2462 bfd_make_readable (abfd);
2467 make_singleton_name_thunk (const char *import, bfd *parent)
2469 /* Name thunks go to idata$4. */
2475 oname = xmalloc (20);
2476 sprintf (oname, "nmth%06d.o", tmp_seq);
2479 abfd = bfd_create (oname, parent);
2480 bfd_find_target (pe_details->object_target, abfd);
2481 bfd_make_writable (abfd);
2483 bfd_set_format (abfd, bfd_object);
2484 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2487 symtab = xmalloc (3 * sizeof (asymbol *));
2488 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2489 quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2490 quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2492 /* We need space for the real thunk and for the null terminator. */
2493 bfd_set_section_size (id4, PE_IDATA4_SIZE * 2);
2494 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2496 memset (d4, 0, PE_IDATA4_SIZE * 2);
2497 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2500 bfd_set_symtab (abfd, symtab, symptr);
2502 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2504 bfd_make_readable (abfd);
2509 make_import_fixup_mark (arelent *rel, char *name)
2511 /* We convert reloc to symbol, for later reference. */
2512 static unsigned int counter;
2513 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2514 bfd *abfd = bfd_asymbol_bfd (sym);
2515 struct bfd_link_hash_entry *bh;
2516 char *fixup_name, buf[26];
2519 /* "name" buffer has space before the symbol name for prefixes. */
2520 sprintf (buf, "__fu%d_", counter++);
2521 prefix_len = strlen (buf);
2522 fixup_name = name - prefix_len;
2523 memcpy (fixup_name, buf, prefix_len);
2526 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2527 current_sec, /* sym->section, */
2528 rel->address, NULL, TRUE, FALSE, &bh);
2530 return bh->root.string;
2533 /* .section .idata$2
2534 .rva __nm_thnk_SYM (singleton thunk with name of func)
2537 .rva __my_dll_iname (name of dll)
2538 .rva __fuNN_SYM (pointer to reference (address) in text) */
2541 make_import_fixup_entry (const char *name,
2542 const char *fixup_name,
2543 const char *symname,
2551 oname = xmalloc (20);
2552 sprintf (oname, "fu%06d.o", tmp_seq);
2555 abfd = bfd_create (oname, parent);
2556 bfd_find_target (pe_details->object_target, abfd);
2557 bfd_make_writable (abfd);
2559 bfd_set_format (abfd, bfd_object);
2560 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2563 symtab = xmalloc (6 * sizeof (asymbol *));
2564 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2566 quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2567 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2568 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2570 bfd_set_section_size (id2, 20);
2575 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2576 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2577 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2580 bfd_set_symtab (abfd, symtab, symptr);
2582 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2584 bfd_make_readable (abfd);
2588 /* .section .rdata_runtime_pseudo_reloc
2590 .rva __fuNN_SYM (pointer to reference (address) in text) */
2593 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2594 const char *fixup_name,
2595 bfd_vma addend ATTRIBUTE_UNUSED,
2600 unsigned char *rt_rel_d;
2605 oname = xmalloc (20);
2606 sprintf (oname, "rtr%06d.o", tmp_seq);
2609 abfd = bfd_create (oname, parent);
2610 bfd_find_target (pe_details->object_target, abfd);
2611 bfd_make_writable (abfd);
2613 bfd_set_format (abfd, bfd_object);
2614 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2616 if (link_info.pei386_runtime_pseudo_reloc == 2)
2618 if (runtime_pseudp_reloc_v2_init)
2619 size = 3 * sizeof (asymbol *);
2621 size = 6 * sizeof (asymbol *);
2624 size = 2 * sizeof (asymbol *);
2627 symtab = xmalloc (size);
2630 = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2632 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2634 if (link_info.pei386_runtime_pseudo_reloc == 2)
2637 if (!runtime_pseudp_reloc_v2_init)
2640 runtime_pseudp_reloc_v2_init = TRUE;
2643 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2645 bfd_set_section_size (rt_rel, size);
2646 rt_rel_d = xmalloc (size);
2647 rt_rel->contents = rt_rel_d;
2648 memset (rt_rel_d, 0, size);
2649 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2650 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2651 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2653 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2654 save_relocs (rt_rel);
2656 bfd_set_symtab (abfd, symtab, symptr);
2658 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2662 bfd_set_section_size (rt_rel, 8);
2663 rt_rel_d = xmalloc (8);
2664 rt_rel->contents = rt_rel_d;
2665 memset (rt_rel_d, 0, 8);
2667 bfd_put_32 (abfd, addend, rt_rel_d);
2668 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2670 save_relocs (rt_rel);
2672 bfd_set_symtab (abfd, symtab, symptr);
2674 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2677 bfd_make_readable (abfd);
2682 .rva __pei386_runtime_relocator */
2685 pe_create_runtime_relocator_reference (bfd *parent)
2687 asection *extern_rt_rel;
2688 unsigned char *extern_rt_rel_d;
2692 oname = xmalloc (20);
2693 sprintf (oname, "ertr%06d.o", tmp_seq);
2696 abfd = bfd_create (oname, parent);
2697 bfd_find_target (pe_details->object_target, abfd);
2698 bfd_make_writable (abfd);
2700 bfd_set_format (abfd, bfd_object);
2701 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2704 symtab = xmalloc (2 * sizeof (asymbol *));
2705 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2707 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2710 bfd_set_section_size (extern_rt_rel, PE_IDATA5_SIZE);
2711 extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
2712 extern_rt_rel->contents = extern_rt_rel_d;
2714 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2715 save_relocs (extern_rt_rel);
2717 bfd_set_symtab (abfd, symtab, symptr);
2719 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2721 bfd_make_readable (abfd);
2726 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name,
2727 const char *symname)
2729 const char *fixup_name = make_import_fixup_mark (rel, name);
2732 /* This is the original implementation of the auto-import feature, which
2733 primarily relied on the OS loader to patch things up with some help
2734 from the pseudo-relocator to overcome the main limitation. See the
2735 comment at the beginning of the file for an overview of the feature. */
2736 if (link_info.pei386_runtime_pseudo_reloc != 2)
2738 struct bfd_link_hash_entry *name_thunk_sym;
2739 /* name buffer is allocated with space at beginning for prefixes. */
2740 char *thname = name - (sizeof "__nm_thnk_" - 1);
2741 memcpy (thname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2742 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, thname, 0, 0, 1);
2744 if (!(name_thunk_sym && name_thunk_sym->type == bfd_link_hash_defined))
2746 b = make_singleton_name_thunk (name, link_info.output_bfd);
2747 add_bfd_to_link (b, b->filename, &link_info);
2749 /* If we ever use autoimport, we have to cast text section writable. */
2750 config.text_read_only = FALSE;
2751 link_info.output_bfd->flags &= ~WP_TEXT;
2754 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc == 1)
2756 b = make_import_fixup_entry (name, fixup_name, symname,
2757 link_info.output_bfd);
2758 add_bfd_to_link (b, b->filename, &link_info);
2762 /* In the original implementation, the pseudo-relocator was only used when
2763 the addend was not null. In the new implementation, the OS loader is
2764 completely bypassed and the pseudo-relocator does the entire work. */
2765 if ((addend != 0 && link_info.pei386_runtime_pseudo_reloc == 1)
2766 || link_info.pei386_runtime_pseudo_reloc == 2)
2768 if (pe_dll_extra_pe_debug)
2769 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2770 fixup_name, (int) addend);
2772 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2773 link_info.output_bfd);
2774 add_bfd_to_link (b, b->filename, &link_info);
2776 if (runtime_pseudo_relocs_created++ == 0)
2778 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2779 add_bfd_to_link (b, b->filename, &link_info);
2783 else if (addend != 0)
2784 einfo (_("%X%P: %C: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
2785 s->owner, s, rel->address, (*rel->sym_ptr_ptr)->name);
2789 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2798 dll_filename = (def->name) ? def->name : dll_name;
2799 dll_symname = xstrdup (dll_filename);
2800 for (i = 0; dll_symname[i]; i++)
2801 if (!ISALNUM (dll_symname[i]))
2802 dll_symname[i] = '_';
2804 unlink_if_ordinary (impfilename);
2806 outarch = bfd_openw (impfilename, 0);
2810 /* xgettext:c-format */
2811 einfo (_("%X%P: can't open .lib file: %s\n"), impfilename);
2816 /* xgettext:c-format */
2817 info_msg (_("Creating library file: %s\n"), impfilename);
2819 bfd_set_format (outarch, bfd_archive);
2820 outarch->has_armap = 1;
2822 /* Work out a reasonable size of things to put onto one line. */
2823 ar_head = make_head (outarch);
2825 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2826 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
2828 /* Iterate the exclude list. */
2829 struct exclude_list_struct *ex;
2831 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2833 if (ex->type != EXCLUDEFORIMPLIB)
2835 found = (filename_cmp (ex->string, ibfd->filename) == 0);
2837 /* If it matched, we must open a fresh BFD for it (the original
2838 input BFD is still needed for the DLL's final link) and add
2839 it into the archive member chain. */
2842 bfd *newbfd = bfd_openr (ibfd->my_archive
2843 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2846 einfo (_("%X%P: bfd_openr %s: %E\n"), ibfd->filename);
2849 if (ibfd->my_archive)
2851 /* Must now iterate through archive until we find the
2852 required member. A minor shame that we'll open the
2853 archive once per member that we require from it, and
2854 leak those archive bfds rather than reuse them. */
2855 bfd *arbfd = newbfd;
2856 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2858 einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
2859 ibfd->my_archive->filename, ibfd->filename);
2863 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2865 if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
2870 einfo (_("%X%P: %s(%s): can't find member in archive"),
2871 ibfd->my_archive->filename, ibfd->filename);
2875 newbfd->archive_next = head;
2880 for (i = 0; i < def->num_exports; i++)
2882 /* The import library doesn't know about the internal name. */
2883 char *internal = def->exports[i].internal_name;
2886 /* Don't add PRIVATE entries to import lib. */
2887 if (pe_def_file->exports[i].flag_private)
2890 def->exports[i].internal_name = def->exports[i].name;
2892 /* PR 19803: If a symbol has been discard due to garbage
2893 collection then do not create any exports for it. */
2895 struct coff_link_hash_entry *h;
2897 h = coff_link_hash_lookup (coff_hash_table (info), internal,
2898 FALSE, FALSE, FALSE);
2900 /* If the symbol is hidden and undefined then it
2901 has been swept up by garbage collection. */
2902 && h->symbol_class == C_HIDDEN
2903 && h->root.u.def.section == bfd_und_section_ptr)
2906 /* If necessary, check with an underscore prefix as well. */
2907 if (pe_details->underscored && internal[0] != '@')
2911 name = xmalloc (strlen (internal) + 2);
2912 sprintf (name, "_%s", internal);
2914 h = coff_link_hash_lookup (coff_hash_table (info), name,
2915 FALSE, FALSE, FALSE);
2919 /* If the symbol is hidden and undefined then it
2920 has been swept up by garbage collection. */
2921 && h->symbol_class == C_HIDDEN
2922 && h->root.u.def.section == bfd_und_section_ptr)
2927 n = make_one (def->exports + i, outarch,
2928 ! (def->exports + i)->flag_data);
2929 n->archive_next = head;
2931 def->exports[i].internal_name = internal;
2934 ar_tail = make_tail (outarch);
2936 if (ar_head == NULL || ar_tail == NULL)
2939 /* Now stick them all into the archive. */
2940 ar_head->archive_next = head;
2941 ar_tail->archive_next = ar_head;
2944 if (! bfd_set_archive_head (outarch, head))
2945 einfo ("%X%P: bfd_set_archive_head: %E\n");
2947 if (! bfd_close (outarch))
2948 einfo ("%X%P: bfd_close %s: %E\n", impfilename);
2950 while (head != NULL)
2952 bfd *n = head->archive_next;
2958 static int undef_count = 0;
2966 static struct key_value *udef_table;
2968 static int undef_sort_cmp (const void *l1, const void *r1)
2970 const struct key_value *l = l1;
2971 const struct key_value *r = r1;
2973 return strcmp (l->key, r->key);
2976 static struct bfd_link_hash_entry *
2977 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
2979 struct bfd_link_hash_entry *h = NULL;
2980 struct key_value *kv;
2981 struct key_value key;
2982 char *at, *lname = xmalloc (strlen (name) + 3);
2984 strcpy (lname, name);
2986 at = strchr (lname + (lname[0] == '@'), '@');
2991 kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
2996 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2997 if (h->type == bfd_link_hash_undefined)
3001 if (lname[0] == '?')
3004 if (at || lname[0] == '@')
3006 if (lname[0] == '@')
3008 if (pe_details->underscored)
3011 strcpy (lname, lname + 1);
3013 kv = bsearch (&key, udef_table, undef_count,
3014 sizeof (struct key_value), undef_sort_cmp);
3017 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3018 if (h->type == bfd_link_hash_undefined)
3023 *strchr (lname, '@') = 0;
3025 kv = bsearch (&key, udef_table, undef_count,
3026 sizeof (struct key_value), undef_sort_cmp);
3029 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3030 if (h->type == bfd_link_hash_undefined)
3036 strcat (lname, "@");
3038 kv = bsearch (&key, udef_table, undef_count,
3039 sizeof (struct key_value), undef_sort_cmp);
3043 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3044 if (h->type == bfd_link_hash_undefined)
3048 if (lname[0] == '_' && pe_details->underscored)
3052 memmove (lname + 1, lname, strlen (lname) + 1);
3057 kv = bsearch (&key, udef_table, undef_count,
3058 sizeof (struct key_value), undef_sort_cmp);
3062 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3063 if (h->type == bfd_link_hash_undefined)
3075 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
3076 void *inf ATTRIBUTE_UNUSED)
3078 if (h->type == bfd_link_hash_undefined)
3084 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
3086 if (h->type == bfd_link_hash_undefined)
3090 udef_table[undef_count].key = xstrdup (h->root.string);
3091 at = strchr (udef_table[undef_count].key
3092 + (udef_table[undef_count].key[0] == '@'), '@');
3095 udef_table[undef_count].oname = h->root.string;
3102 pe_create_undef_table (void)
3106 /* count undefined symbols */
3108 bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
3110 /* create and fill the corresponding table */
3111 udef_table = xmalloc (undef_count * sizeof (struct key_value));
3114 bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
3117 qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
3121 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
3123 lang_input_statement_type *fake_file;
3125 fake_file = lang_add_input_file (name,
3126 lang_input_file_is_fake_enum,
3128 fake_file->the_bfd = abfd;
3129 ldlang_add_file (fake_file);
3131 if (!bfd_link_add_symbols (abfd, linfo))
3132 einfo (_("%X%P: add symbols %s: %E\n"), name);
3136 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
3139 def_file_module *module;
3140 def_file_import *imp;
3142 pe_dll_id_target (bfd_get_target (output_bfd));
3147 imp = pe_def_file->imports;
3149 pe_create_undef_table ();
3151 for (module = pe_def_file->modules; module; module = module->next)
3153 int do_this_dll = 0;
3155 for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
3157 if (i >= pe_def_file->num_imports)
3160 dll_filename = module->name;
3161 dll_symname = xstrdup (module->name);
3162 for (j = 0; dll_symname[j]; j++)
3163 if (!ISALNUM (dll_symname[j]))
3164 dll_symname[j] = '_';
3166 for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3168 def_file_export exp;
3169 struct bfd_link_hash_entry *blhe;
3170 int lead_at = (*imp[i].internal_name == '@');
3171 /* See if we need this import. */
3172 size_t len = strlen (imp[i].internal_name);
3173 char *name = xmalloc (len + 2 + 6);
3174 bfd_boolean include_jmp_stub = FALSE;
3175 bfd_boolean is_cdecl = FALSE;
3176 bfd_boolean is_undef = FALSE;
3178 if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3182 sprintf (name, "%s", imp[i].internal_name);
3184 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3186 blhe = bfd_link_hash_lookup (linfo->hash, name,
3187 FALSE, FALSE, FALSE);
3189 /* Include the jump stub for <sym> only if the <sym>
3191 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3194 sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3196 sprintf (name, "%s%s%s", "__imp_", U (""),
3197 imp[i].internal_name);
3199 blhe = bfd_link_hash_lookup (linfo->hash, name,
3200 FALSE, FALSE, FALSE);
3202 is_undef = (blhe->type == bfd_link_hash_undefined);
3206 include_jmp_stub = TRUE;
3207 is_undef = (blhe->type == bfd_link_hash_undefined);
3210 if (is_cdecl && (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)))
3212 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3213 blhe = pe_find_cdecl_alias_match (linfo, name);
3214 include_jmp_stub = TRUE;
3216 is_undef = (blhe->type == bfd_link_hash_undefined);
3227 bfd *ar_head = make_head (output_bfd);
3228 add_bfd_to_link (ar_head, ar_head->filename, linfo);
3231 exp.internal_name = imp[i].internal_name;
3232 exp.name = imp[i].name;
3233 exp.its_name = imp[i].its_name;
3234 exp.ordinal = imp[i].ordinal;
3235 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3236 exp.flag_private = 0;
3237 exp.flag_constant = 0;
3238 exp.flag_data = imp[i].data;
3239 exp.flag_noname = exp.name ? 0 : 1;
3240 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
3241 add_bfd_to_link (one, one->filename, linfo);
3246 bfd *ar_tail = make_tail (output_bfd);
3247 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
3256 free (udef_table[undef_count].key);
3261 /* We were handed a *.DLL file. Parse it and turn it into a set of
3262 IMPORTS directives in the def file. Return TRUE if the file was
3263 handled, FALSE if not. */
3266 pe_get16 (bfd *abfd, int where)
3270 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3271 bfd_bread (b, (bfd_size_type) 2, abfd);
3272 return b[0] + (b[1] << 8);
3276 pe_get32 (bfd *abfd, int where)
3280 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3281 bfd_bread (b, (bfd_size_type) 4, abfd);
3282 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3288 unsigned char *b = ptr;
3290 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3294 pe_implied_import_dll (const char *filename)
3297 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3298 bfd_vma export_rva, export_size, nsections, secptr, expptr;
3299 bfd_vma exp_funcbase;
3300 unsigned char *expdata;
3302 bfd_vma name_rvas, nexp;
3303 const char *dllname;
3304 /* Initialization with start > end guarantees that is_data
3305 will not be set by mistake, and avoids compiler warning. */
3306 bfd_vma data_start = 1;
3307 bfd_vma data_end = 0;
3308 bfd_vma rdata_start = 1;
3309 bfd_vma rdata_end = 0;
3310 bfd_vma bss_start = 1;
3311 bfd_vma bss_end = 0;
3314 /* No, I can't use bfd here. kernel32.dll puts its export table in
3315 the middle of the .rdata section. */
3316 dll = bfd_openr (filename, pe_details->target_name);
3319 einfo (_("%X%P: open %s: %E\n"), filename);
3323 /* PEI dlls seem to be bfd_objects. */
3324 if (!bfd_check_format (dll, bfd_object))
3326 einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename);
3330 /* Get pe_header, optional header and numbers of directory entries. */
3331 pe_header_offset = pe_get32 (dll, 0x3c);
3332 opthdr_ofs = pe_header_offset + 4 + 20;
3333 #ifdef pe_use_x86_64
3334 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3336 num_entries = pe_get32 (dll, opthdr_ofs + 92);
3339 /* No import or export directory entry. */
3340 if (num_entries < 1)
3343 #ifdef pe_use_x86_64
3344 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3345 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3347 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3348 export_size = pe_get32 (dll, opthdr_ofs + 100);
3351 /* No export table - nothing to export. */
3352 if (export_size == 0)
3355 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3356 secptr = (pe_header_offset + 4 + 20 +
3357 pe_get16 (dll, pe_header_offset + 4 + 16));
3360 /* Get the rva and size of the export section. */
3361 for (i = 0; i < nsections; i++)
3364 bfd_vma secptr1 = secptr + 40 * i;
3365 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3366 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3367 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3369 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3370 bfd_bread (sname, (bfd_size_type) 8, dll);
3372 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3374 expptr = fptr + (export_rva - vaddr);
3375 if (export_rva + export_size > vaddr + vsize)
3376 export_size = vsize - (export_rva - vaddr);
3381 /* Scan sections and store the base and size of the
3382 data and bss segments in data/base_start/end. */
3383 for (i = 0; i < nsections; i++)
3385 bfd_vma secptr1 = secptr + 40 * i;
3386 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3387 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3388 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3392 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3393 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3395 if (strcmp(sec_name,".data") == 0)
3398 data_end = vaddr + vsize;
3400 if (pe_dll_extra_pe_debug)
3401 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3402 __FUNCTION__, sec_name, (unsigned long) vaddr,
3403 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3405 else if (strcmp(sec_name,".rdata") == 0)
3407 rdata_start = vaddr;
3408 rdata_end = vaddr + vsize;
3410 if (pe_dll_extra_pe_debug)
3411 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3412 __FUNCTION__, sec_name, (unsigned long) vaddr,
3413 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3415 else if (strcmp (sec_name,".bss") == 0)
3418 bss_end = vaddr + vsize;
3420 if (pe_dll_extra_pe_debug)
3421 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3422 __FUNCTION__, sec_name, (unsigned long) vaddr,
3423 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3427 expdata = xmalloc (export_size);
3428 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3429 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3430 erva = (char *) expdata - export_rva;
3432 if (pe_def_file == 0)
3433 pe_def_file = def_file_empty ();
3435 nexp = pe_as32 (expdata + 24);
3436 name_rvas = pe_as32 (expdata + 32);
3437 exp_funcbase = pe_as32 (expdata + 28);
3439 /* Use internal dll name instead of filename
3440 to enable symbolic dll linking. */
3441 dllname = erva + pe_as32 (expdata + 12);
3443 /* Check to see if the dll has already been added to
3444 the definition list and if so return without error.
3445 This avoids multiple symbol definitions. */
3446 if (def_get_module (pe_def_file, dllname))
3448 if (pe_dll_extra_pe_debug)
3449 printf ("%s is already loaded\n", dllname);
3453 /* This is an optimized version of the insertion loop, which avoids lots of
3454 calls to realloc and memmove from def_file_add_import. */
3455 if ((from = def_file_add_import_from (pe_def_file, nexp,
3456 erva + pe_as32 (erva + name_rvas),
3457 dllname, 0, NULL, NULL)) >= 0)
3459 for (i = 0; i < nexp; i++)
3461 /* Pointer to the names vector. */
3462 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3463 def_file_import *imp;
3464 /* Pointer to the function address vector. */
3465 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3466 /* is_data is true if the address is in the data, rdata or bss
3469 (func_rva >= data_start && func_rva < data_end)
3470 || (func_rva >= rdata_start && func_rva < rdata_end)
3471 || (func_rva >= bss_start && func_rva < bss_end);
3473 imp = def_file_add_import_at (pe_def_file, from + i, erva + name_rva,
3474 dllname, i, NULL, NULL);
3475 /* Mark symbol type. */
3476 imp->data = is_data;
3478 if (pe_dll_extra_pe_debug)
3479 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3480 __FUNCTION__, dllname, erva + name_rva,
3481 (unsigned long) func_rva, is_data ? "(data)" : "");
3487 /* Iterate through the list of symbols. */
3488 for (i = 0; i < nexp; i++)
3490 /* Pointer to the names vector. */
3491 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3492 def_file_import *imp;
3493 /* Pointer to the function address vector. */
3494 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3497 /* Skip unwanted symbols, which are
3498 exported in buggy auto-import releases. */
3499 if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
3502 /* is_data is true if the address is in the data, rdata or bss
3505 (func_rva >= data_start && func_rva < data_end)
3506 || (func_rva >= rdata_start && func_rva < rdata_end)
3507 || (func_rva >= bss_start && func_rva < bss_end);
3509 imp = def_file_add_import (pe_def_file, erva + name_rva,
3510 dllname, i, NULL, NULL, &is_dup);
3511 /* Mark symbol type. */
3513 imp->data = is_data;
3515 if (pe_dll_extra_pe_debug)
3516 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3517 __FUNCTION__, dllname, erva + name_rva,
3518 (unsigned long) func_rva, is_data ? "(data)" : "");
3526 pe_output_file_set_long_section_names (bfd *abfd)
3528 if (pe_use_coff_long_section_names < 0)
3530 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3531 einfo (_("%X%P: error: can't use long section names on this arch\n"));
3534 /* These are the main functions, called from the emulation. The first
3535 is called after the bfds are read, so we can guess at how much space
3536 we need. The second is called after everything is placed, so we
3537 can put the right values in place. */
3540 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3542 pe_dll_id_target (bfd_get_target (abfd));
3543 pe_output_file_set_long_section_names (abfd);
3544 process_def_file_and_drectve (abfd, info);
3546 if (pe_def_file->num_exports == 0 && !bfd_link_pic (info))
3549 generate_edata (abfd, info);
3550 build_filler_bfd (1);
3551 pe_output_file_set_long_section_names (filler_bfd);
3555 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3557 pe_dll_id_target (bfd_get_target (abfd));
3558 pe_output_file_set_long_section_names (abfd);
3559 build_filler_bfd (0);
3560 pe_output_file_set_long_section_names (filler_bfd);
3564 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3566 pe_dll_id_target (bfd_get_target (abfd));
3567 pe_output_file_set_long_section_names (abfd);
3568 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3570 generate_reloc (abfd, info);
3573 bfd_set_section_size (reloc_s, reloc_sz);
3575 /* Resize the sections. */
3576 lang_reset_memory_regions ();
3577 lang_size_sections (NULL, TRUE);
3579 /* Redo special stuff. */
3580 ldemul_after_allocation ();
3582 /* Do the assignments again. */
3583 lang_do_assignments (lang_final_phase_enum);
3586 fill_edata (abfd, info);
3588 if (bfd_link_dll (info))
3589 pe_data (abfd)->dll = 1;
3591 edata_s->contents = edata_d;
3592 reloc_s->contents = reloc_d;
3596 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3598 pe_dll_id_target (bfd_get_target (abfd));
3599 pe_output_file_set_long_section_names (abfd);
3600 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3602 generate_reloc (abfd, info);
3605 bfd_set_section_size (reloc_s, reloc_sz);
3607 /* Resize the sections. */
3608 lang_reset_memory_regions ();
3609 lang_size_sections (NULL, TRUE);
3611 /* Redo special stuff. */
3612 ldemul_after_allocation ();
3614 /* Do the assignments again. */
3615 lang_do_assignments (lang_final_phase_enum);
3617 reloc_s->contents = reloc_d;
3621 pe_bfd_is_dll (bfd *abfd)
3623 return (bfd_get_format (abfd) == bfd_object
3625 && pe_data (abfd)->dll);