1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2025 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"
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;
163 int pe_dll_enable_reloc_section
= 1;
165 /* Static variables and types. */
167 static bfd_vma image_base
;
168 static bfd
*filler_bfd
;
169 static struct bfd_section
*edata_s
, *reloc_s
;
170 static unsigned char *edata_d
, *reloc_d
;
171 static unsigned char *reloc_d
= NULL
;
172 static size_t edata_sz
, reloc_sz
= 0;
173 static int runtime_pseudo_relocs_created
= 0;
174 static bool runtime_pseudp_reloc_v2_init
= false;
181 autofilter_entry_type
;
185 const char *target_name
;
186 const char *object_target
;
187 unsigned int imagebase_reloc
;
188 unsigned int secrel_reloc_lo
;
189 unsigned int secrel_reloc_hi
;
190 unsigned int section_reloc
;
194 const autofilter_entry_type
* autofilter_symbollist
;
198 static const autofilter_entry_type autofilter_symbollist_generic
[] =
200 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
201 /* Entry point symbols. */
202 { STRING_COMMA_LEN ("DllMain") },
203 { STRING_COMMA_LEN ("DllMainCRTStartup") },
204 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
205 /* Runtime pseudo-reloc. */
206 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
207 { STRING_COMMA_LEN ("do_pseudo_reloc") },
211 static const autofilter_entry_type autofilter_symbollist_i386
[] =
213 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
214 /* Entry point symbols, and entry hooks. */
215 { STRING_COMMA_LEN ("cygwin_crt0") },
217 { STRING_COMMA_LEN ("DllMain") },
218 { STRING_COMMA_LEN ("DllEntryPoint") },
219 { STRING_COMMA_LEN ("DllMainCRTStartup") },
220 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
221 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
222 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
224 { STRING_COMMA_LEN ("DllMain@12") },
225 { STRING_COMMA_LEN ("DllEntryPoint@0") },
226 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
227 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
228 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
229 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
230 { STRING_COMMA_LEN ("cygwin_attach_dll") },
232 { STRING_COMMA_LEN ("cygwin_premain0") },
233 { STRING_COMMA_LEN ("cygwin_premain1") },
234 { STRING_COMMA_LEN ("cygwin_premain2") },
235 { STRING_COMMA_LEN ("cygwin_premain3") },
236 /* Runtime pseudo-reloc. */
237 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
238 { STRING_COMMA_LEN ("do_pseudo_reloc") },
239 /* Global vars that should not be exported. */
240 { STRING_COMMA_LEN ("impure_ptr") },
241 { STRING_COMMA_LEN ("_impure_ptr") },
242 { STRING_COMMA_LEN ("_fmode") },
243 { STRING_COMMA_LEN ("environ") },
244 { STRING_COMMA_LEN ("__dso_handle") },
248 #define PE_ARCH_i386 1
250 #define PE_ARCH_mips 3
251 #define PE_ARCH_arm 4
252 #define PE_ARCH_arm_wince 5
253 #define PE_ARCH_aarch64 6
255 /* Don't make it constant as underscore mode gets possibly overriden
256 by target or -(no-)leading-underscore option. */
257 static pe_details_type pe_detail_list
[] =
263 3 /* R_AMD64_IMAGEBASE */,
264 11 /* R_AMD64_SECREL32 */,
265 12 /* R_AMD64_SECREL7 */,
266 10 /* R_AMD64_SECTION */,
271 11, 11 /* R_SECREL32 */,
281 autofilter_symbollist_i386
287 3 /* R_AMD64_IMAGEBASE */,
288 11 /* R_AMD64_SECREL32 */,
289 12 /* R_AMD64_SECREL7 */,
290 10 /* R_AMD64_SECTION */,
294 autofilter_symbollist_i386
301 11, 11 /* R_SECREL32 */,
306 autofilter_symbollist_i386
312 16 /* R_SH_IMAGEBASE */,
313 ~0, 0, ~0, /* none */
317 autofilter_symbollist_generic
323 ~0, 0, ~0, /* none */
327 autofilter_symbollist_generic
333 ~0, 0, ~0, /* none */
337 autofilter_symbollist_generic
340 "pei-arm-wince-little",
341 "pe-arm-wince-little",
342 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
343 15, 15, /* ARM_SECREL (dito) */
344 14, /* ARM_SECTION (dito) */
348 autofilter_symbollist_generic
351 "pei-aarch64-little",
353 2, /* IMAGE_REL_ARM64_ADDR32NB */
354 8, /* IMAGE_REL_ARM64_SECREL */
355 11, /* IMAGE_REL_ARM64_SECREL_LOW12L */
356 13, /* IMAGE_REL_ARM64_SECTION */
360 autofilter_symbollist_generic
362 { NULL
, NULL
, 0, 0, 0, 0, 0, 0, false, NULL
}
365 static const pe_details_type
*pe_details
;
367 /* Do not specify library suffix explicitly, to allow for dllized versions. */
368 static const autofilter_entry_type autofilter_liblist
[] =
370 { STRING_COMMA_LEN ("libcegcc") },
371 { STRING_COMMA_LEN ("libcygwin") },
372 { STRING_COMMA_LEN ("libgcc") },
373 { STRING_COMMA_LEN ("libgcc_s") },
374 { STRING_COMMA_LEN ("libstdc++") },
375 { STRING_COMMA_LEN ("libmingw32") },
376 { STRING_COMMA_LEN ("libmingwex") },
377 { STRING_COMMA_LEN ("libg2c") },
378 { STRING_COMMA_LEN ("libsupc++") },
379 { STRING_COMMA_LEN ("libobjc") },
380 { STRING_COMMA_LEN ("libgcj") },
381 { STRING_COMMA_LEN ("libmsvcrt") },
382 { STRING_COMMA_LEN ("libmsvcrt-os") },
383 { STRING_COMMA_LEN ("libucrt") },
384 { STRING_COMMA_LEN ("libucrtbase") },
385 { STRING_COMMA_LEN ("libpthread") },
386 { STRING_COMMA_LEN ("libwinpthread") },
390 /* Regardless of the suffix issue mentioned above, we must ensure that
391 we do not falsely match on a leading substring, such as when libtool
392 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
393 This routine ensures that the leading part of the name matches and that
394 it is followed by only an optional version suffix and a file extension,
395 returning zero if so or -1 if not. */
396 static int libnamencmp (const char *libname
, const autofilter_entry_type
*afptr
)
398 if (filename_ncmp (libname
, afptr
->name
, afptr
->len
))
401 libname
+= afptr
->len
;
403 /* Be liberal in interpreting what counts as a version suffix; we
404 accept anything that has a dash to separate it from the name and
405 begins with a digit. */
406 if (libname
[0] == '-')
408 if (!ISDIGIT (*++libname
))
410 /* Ensure the filename has an extension. */
411 while (*++libname
!= '.')
415 else if (libname
[0] != '.')
421 static const autofilter_entry_type autofilter_objlist
[] =
423 { STRING_COMMA_LEN ("crt0.o") },
424 { STRING_COMMA_LEN ("crt1.o") },
425 { STRING_COMMA_LEN ("crt2.o") },
426 { STRING_COMMA_LEN ("dllcrt1.o") },
427 { STRING_COMMA_LEN ("dllcrt2.o") },
428 { STRING_COMMA_LEN ("gcrt0.o") },
429 { STRING_COMMA_LEN ("gcrt1.o") },
430 { STRING_COMMA_LEN ("gcrt2.o") },
431 { STRING_COMMA_LEN ("crtbegin.o") },
432 { STRING_COMMA_LEN ("crtend.o") },
436 static const autofilter_entry_type autofilter_symbolprefixlist
[] =
438 /* _imp_ is treated specially, as it is always underscored. */
439 /* { STRING_COMMA_LEN ("_imp_") }, */
440 /* Don't export some c++ symbols. */
441 { STRING_COMMA_LEN ("__rtti_") },
442 { STRING_COMMA_LEN ("__builtin_") },
443 /* Don't re-export auto-imported symbols. */
444 { STRING_COMMA_LEN ("__nm_") },
445 /* Don't export symbols specifying internal DLL layout. */
446 { STRING_COMMA_LEN ("_head_") },
447 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
448 /* Don't export section labels or artificial symbols
450 { STRING_COMMA_LEN (".") },
454 static const autofilter_entry_type autofilter_symbolsuffixlist
[] =
456 { STRING_COMMA_LEN ("_iname") },
457 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
461 #define U(str) (pe_details->underscored ? "_" str : str)
464 pe_dll_id_target (const char *target
)
468 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
469 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
470 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
472 int u
= pe_leading_underscore
; /* Underscoring mode. -1 for use default. */
474 bfd_get_target_info (target
, NULL
, NULL
, &u
, NULL
);
477 pe_detail_list
[i
].underscored
= u
!= 0;
478 pe_details
= pe_detail_list
+ i
;
479 pe_leading_underscore
= (u
!= 0 ? 1 : 0);
482 einfo (_("%X%P: unsupported PEI architecture: %s\n"), target
);
486 /* Helper functions for qsort. Relocs must be sorted so that we can write
487 them out by pages. */
499 reloc_sort (const void *va
, const void *vb
)
501 const reloc_data_type
*a
= (const reloc_data_type
*) va
;
502 const reloc_data_type
*b
= (const reloc_data_type
*) vb
;
516 pe_export_sort (const void *va
, const void *vb
)
518 const def_file_export
*a
= va
;
519 const def_file_export
*b
= vb
;
527 return strcmp (an
, bn
);
530 /* Read and process the .DEF file. */
532 /* These correspond to the entries in pe_def_file->exports[]. I use
533 exported_symbol_sections[i] to tag whether or not the symbol was
534 defined, since we can't export symbols we don't have. */
536 static bfd_vma
*exported_symbol_offsets
;
537 static struct bfd_section
**exported_symbol_sections
;
538 static int export_table_size
;
539 static int count_exported
;
540 static int count_exported_byname
;
541 static int count_with_ordinals
;
542 static const char *dll_filename
;
543 static int min_ordinal
, max_ordinal
;
544 static int *exported_symbols
;
546 typedef struct exclude_list_struct
549 struct exclude_list_struct
*next
;
554 static struct exclude_list_struct
*excludes
= 0;
557 pe_dll_add_excludes (const char *new_excludes
, const exclude_type type
)
560 char *exclude_string
;
562 local_copy
= xstrdup (new_excludes
);
564 exclude_string
= strtok (local_copy
, ",:");
565 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
567 struct exclude_list_struct
*new_exclude
;
569 new_exclude
= xmalloc (sizeof (struct exclude_list_struct
));
570 new_exclude
->string
= xmalloc (strlen (exclude_string
) + 1);
571 strcpy (new_exclude
->string
, exclude_string
);
572 new_exclude
->type
= type
;
573 new_exclude
->next
= excludes
;
574 excludes
= new_exclude
;
581 is_import (const char* n
)
583 return (startswith (n
, "__imp_"));
586 /* abfd is a bfd containing n (or NULL)
587 It can be used for contextual checks. */
590 auto_export (bfd
*abfd
, def_file
*d
, const char *n
)
593 struct exclude_list_struct
*ex
;
594 const autofilter_entry_type
*afptr
;
595 const char * libname
= NULL
;
597 if (abfd
&& abfd
->my_archive
)
598 libname
= lbasename (bfd_get_filename (abfd
->my_archive
));
600 key
.name
= key
.its_name
= (char *) n
;
602 /* Return false if n is in the d->exports table. */
603 if (d
->num_exports
!= 0
604 && bsearch (&key
, d
->exports
, d
->num_exports
,
605 sizeof (pe_def_file
->exports
[0]), pe_export_sort
))
608 if (pe_dll_do_default_excludes
)
613 if (pe_dll_extra_pe_debug
)
614 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
615 n
, abfd
, abfd
->my_archive
);
617 /* First of all, make context checks:
618 Don't export anything from standard libs. */
621 afptr
= autofilter_liblist
;
625 if (libnamencmp (libname
, afptr
) == 0 )
631 /* Next, exclude symbols from certain startup objects. */
633 if (abfd
&& (p
= lbasename (bfd_get_filename (abfd
))))
635 afptr
= autofilter_objlist
;
638 if (strcmp (p
, afptr
->name
) == 0)
644 /* Don't try to blindly exclude all symbols
645 that begin with '__'; this was tried and
646 it is too restrictive. Instead we have
647 a target specific list to use: */
648 afptr
= pe_details
->autofilter_symbollist
;
652 if (strcmp (n
, afptr
->name
) == 0)
658 /* Next, exclude symbols starting with ... */
659 afptr
= autofilter_symbolprefixlist
;
662 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
668 /* Finally, exclude symbols ending with ... */
670 afptr
= autofilter_symbolsuffixlist
;
673 if ((len
>= afptr
->len
)
674 /* Add 1 to insure match with trailing '\0'. */
675 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
676 afptr
->len
+ 1) == 0)
683 for (ex
= excludes
; ex
; ex
= ex
->next
)
685 if (ex
->type
== EXCLUDELIBS
)
688 && ((filename_cmp (libname
, ex
->string
) == 0)
689 || (strcasecmp ("ALL", ex
->string
) == 0)))
692 else if (ex
->type
== EXCLUDEFORIMPLIB
)
694 if (filename_cmp (bfd_get_filename (abfd
), ex
->string
) == 0)
697 else if (strcmp (n
, ex
->string
) == 0)
705 process_def_file_and_drectve (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
709 struct bfd_link_hash_entry
*blhe
;
711 struct bfd_section
*s
;
712 def_file_export
*e
= 0;
716 pe_def_file
= def_file_empty ();
718 /* First, run around to all the objects looking for the .drectve
719 sections, and push those into the def file too. */
720 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
722 s
= bfd_get_section_by_name (b
, ".drectve");
726 char *buf
= xmalloc (size
);
728 bfd_get_section_contents (b
, s
, buf
, 0, size
);
729 def_file_add_directive (pe_def_file
, buf
, size
);
734 /* Process aligned common symbol information from the
735 .drectve sections now; common symbol allocation is
736 done before final link, so it will be too late to
737 process them in process_embedded_commands() called
738 from _bfd_coff_link_input_bfd(). */
739 if (pe_def_file
->aligncomms
)
741 def_file_aligncomm
*ac
= pe_def_file
->aligncomms
;
744 struct coff_link_hash_entry
*sym_hash
;
745 sym_hash
= coff_link_hash_lookup (coff_hash_table (info
),
746 ac
->symbol_name
, false, false, false);
747 if (sym_hash
&& sym_hash
->root
.type
== bfd_link_hash_common
748 && sym_hash
->root
.u
.c
.p
->alignment_power
< (unsigned) ac
->alignment
)
750 sym_hash
->root
.u
.c
.p
->alignment_power
= (unsigned) ac
->alignment
;
756 if (pe_def_file
->exclude_symbols
)
758 for (ui
= 0; ui
< pe_def_file
->num_exclude_symbols
; ui
++)
760 pe_dll_add_excludes (pe_def_file
->exclude_symbols
[ui
].symbol_name
,
765 /* If we are building an executable and there is nothing
766 to export, we do not build an export table at all. */
767 if (bfd_link_executable (info
) && pe_def_file
->num_exports
== 0
768 && (!pe_dll_export_everything
|| pe_dll_exclude_all_symbols
))
771 /* Now, maybe export everything else the default way. */
772 if ((pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
773 && !pe_dll_exclude_all_symbols
)
775 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
780 if (!bfd_generic_link_read_symbols (b
))
782 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
786 symbols
= bfd_get_outsymbols (b
);
787 nsyms
= bfd_get_symcount (b
);
789 for (j
= 0; j
< nsyms
; j
++)
791 /* We should export symbols which are either global or not
792 anything at all. (.bss data is the latter)
793 We should not export undefined symbols. */
795 = (symbols
[j
]->section
!= bfd_und_section_ptr
796 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
797 || (symbols
[j
]->flags
== 0)));
798 if (link_info
.version_info
&& would_export
)
800 = !bfd_hide_sym_by_version (link_info
.version_info
,
804 const char *sn
= symbols
[j
]->name
;
806 /* We should not re-export imported stuff. */
812 name
= xmalloc (strlen ("__imp_") + strlen (sn
) + 1);
813 sprintf (name
, "%s%s", "__imp_", sn
);
815 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
816 false, false, false);
819 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
823 if (pe_details
->underscored
&& *sn
== '_')
826 if (auto_export (b
, pe_def_file
, sn
))
831 p
= def_file_add_export (pe_def_file
, sn
, 0, -1,
833 /* Fill data flag properly, from dlltool.c. */
835 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
843 #define NE pe_def_file->num_exports
845 /* Don't create an empty export table. */
849 resort_needed
= false;
851 /* Canonicalize the export list. */
854 for (i
= 0; i
< NE
; i
++)
856 /* Check for fastcall/stdcall-decoration, but ignore
857 C++ mangled names. */
858 if (pe_def_file
->exports
[i
].name
[0] != '?'
859 && strchr (pe_def_file
->exports
[i
].name
, '@'))
861 /* This will preserve internal_name, which may have been
862 pointing to the same memory as name, or might not
864 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
865 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
866 char *tmp_at
= strrchr (tmp
, '@');
871 einfo (_("%X%P: cannot export %s: invalid export name\n"),
872 pe_def_file
->exports
[i
].name
);
873 pe_def_file
->exports
[i
].name
= tmp
;
874 resort_needed
= true;
879 /* Re-sort the exports table as we have possibly changed the order
880 by removing leading @. */
882 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]),
885 if (pe_dll_stdcall_aliases
)
887 for (i
= 0; i
< NE
; i
++)
889 if (is_import (pe_def_file
->exports
[i
].name
))
892 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
895 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
896 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
898 *(strchr (tmp
, '@')) = 0;
899 if (auto_export (NULL
, pe_def_file
, tmp
))
900 def_file_add_export (pe_def_file
, tmp
,
901 pe_def_file
->exports
[i
].internal_name
,
909 /* Convenience, but watch out for it changing. */
910 e
= pe_def_file
->exports
;
912 for (i
= 0, j
= 0; i
< NE
; i
++)
914 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
916 /* This is a duplicate. */
917 if (e
[j
- 1].ordinal
!= -1
918 && e
[i
].ordinal
!= -1
919 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
921 if (pe_dll_warn_dup_exports
)
922 /* xgettext:c-format */
923 einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
924 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
928 if (pe_dll_warn_dup_exports
)
929 /* xgettext:c-format */
930 einfo (_("%P: warning, duplicate EXPORT: %s\n"),
934 if (e
[i
].ordinal
!= -1)
935 e
[j
- 1].ordinal
= e
[i
].ordinal
;
936 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
937 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
938 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
939 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
941 free (e
[i
].internal_name
);
942 free (e
[i
].its_name
);
951 pe_def_file
->num_exports
= j
; /* == NE */
953 exported_symbol_offsets
= xmalloc (NE
* sizeof (bfd_vma
));
954 exported_symbol_sections
= xmalloc (NE
* sizeof (struct bfd_section
*));
956 memset (exported_symbol_sections
, 0, NE
* sizeof (struct bfd_section
*));
960 count_exported_byname
= 0;
961 count_with_ordinals
= 0;
963 for (i
= 0; i
< NE
; i
++)
965 char *int_name
= pe_def_file
->exports
[i
].internal_name
;
968 /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
969 lang_add_gc_name (int_name
);
971 name
= xmalloc (strlen (int_name
) + 2);
972 if (pe_details
->underscored
&& int_name
[0] != '@')
975 strcpy (name
+ 1, int_name
);
977 /* PR 19803: The alias must be preserved as well. */
978 lang_add_gc_name (xstrdup (name
));
981 strcpy (name
, int_name
);
983 blhe
= bfd_link_hash_lookup (info
->hash
,
988 && (blhe
->type
== bfd_link_hash_defined
989 || (blhe
->type
== bfd_link_hash_common
)))
992 if (!pe_def_file
->exports
[i
].flag_noname
)
993 count_exported_byname
++;
995 /* Only fill in the sections. The actual offsets are computed
996 in fill_exported_offsets() after common symbols are laid
998 if (blhe
->type
== bfd_link_hash_defined
)
999 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
1001 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
1003 if (pe_def_file
->exports
[i
].ordinal
!= -1)
1005 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
1006 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
1007 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
1008 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
1009 count_with_ordinals
++;
1012 /* Check for forward exports. These are indicated in DEF files by an
1013 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
1014 but we must take care not to be fooled when the user wants to export
1015 a symbol that actually really has a dot in it, so we only check
1016 for them here, after real defined symbols have already been matched. */
1017 else if (strchr (int_name
, '.'))
1020 if (!pe_def_file
->exports
[i
].flag_noname
)
1021 count_exported_byname
++;
1023 pe_def_file
->exports
[i
].flag_forward
= 1;
1025 if (pe_def_file
->exports
[i
].ordinal
!= -1)
1027 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
1028 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
1029 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
1030 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
1031 count_with_ordinals
++;
1034 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
1036 /* xgettext:c-format */
1037 einfo (_("%X%P: cannot export %s: symbol not defined\n"),
1042 /* xgettext:c-format */
1043 einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
1045 blhe
->type
, bfd_link_hash_defined
);
1049 /* xgettext:c-format */
1050 einfo (_("%X%P: cannot export %s: symbol not found\n"),
1057 /* Build the bfd that will contain .edata and .reloc sections. */
1060 build_filler_bfd (bool include_edata
)
1062 lang_input_statement_type
*filler_file
;
1064 filler_file
= lang_add_input_file ("dll stuff",
1065 lang_input_file_is_fake_enum
,
1067 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff",
1068 link_info
.output_bfd
);
1069 if (filler_bfd
== NULL
1070 || !bfd_set_arch_mach (filler_bfd
,
1071 bfd_get_arch (link_info
.output_bfd
),
1072 bfd_get_mach (link_info
.output_bfd
)))
1074 einfo (_("%F%P: can not create BFD: %E\n"));
1080 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
1082 || !bfd_set_section_flags (edata_s
, (SEC_HAS_CONTENTS
1088 einfo (_("%X%P: can not create .edata section: %E\n"));
1091 bfd_set_section_size (edata_s
, edata_sz
);
1094 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
1096 || !bfd_set_section_flags (reloc_s
, (SEC_HAS_CONTENTS
1102 einfo (_("%X%P: can not create .reloc section: %E\n"));
1106 bfd_set_section_size (reloc_s
, 0);
1108 ldlang_add_file (filler_file
);
1111 /* Gather all the exported symbols and build the .edata section. */
1114 generate_edata (void)
1116 int i
, next_ordinal
;
1117 int name_table_size
= 0;
1119 /* First, we need to know how many exported symbols there are,
1120 and what the range of ordinals is. */
1121 if (count_with_ordinals
&& max_ordinal
> count_exported
)
1123 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
1124 min_ordinal
= max_ordinal
- count_exported
+ 1;
1129 max_ordinal
= count_exported
;
1132 export_table_size
= max_ordinal
- min_ordinal
+ 1;
1133 exported_symbols
= xmalloc (export_table_size
* sizeof (int));
1134 for (i
= 0; i
< export_table_size
; i
++)
1135 exported_symbols
[i
] = -1;
1137 /* Now we need to assign ordinals to those that don't have them. */
1138 for (i
= 0; i
< NE
; i
++)
1140 if (exported_symbol_sections
[i
]
1141 || pe_def_file
->exports
[i
].flag_forward
)
1143 if (pe_def_file
->exports
[i
].ordinal
!= -1)
1145 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
1146 int pi
= exported_symbols
[ei
];
1150 /* xgettext:c-format */
1151 einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
1152 pe_def_file
->exports
[i
].ordinal
,
1153 pe_def_file
->exports
[i
].name
,
1154 pe_def_file
->exports
[pi
].name
);
1156 exported_symbols
[ei
] = i
;
1158 if (pe_def_file
->exports
[i
].its_name
)
1159 name_table_size
+= strlen (pe_def_file
->exports
[i
].its_name
) + 1;
1161 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
1164 /* Reserve space for the forward name. */
1165 if (pe_def_file
->exports
[i
].flag_forward
)
1167 name_table_size
+= strlen (pe_def_file
->exports
[i
].internal_name
) + 1;
1171 next_ordinal
= min_ordinal
;
1172 for (i
= 0; i
< NE
; i
++)
1173 if ((exported_symbol_sections
[i
]
1174 || pe_def_file
->exports
[i
].flag_forward
)
1175 && pe_def_file
->exports
[i
].ordinal
== -1)
1177 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
1180 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
1181 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
1184 /* PR 12969: Check for more than 1^16 ordinals. */
1185 if (max_ordinal
> 65535 || next_ordinal
> 65535)
1186 /* xgettext:c-format */
1187 einfo(_("%X%P: error: export ordinal too large: %d\n"),
1188 max_ordinal
> next_ordinal
? max_ordinal
: next_ordinal
);
1190 /* OK, now we can allocate some memory. */
1191 edata_sz
= (40 /* directory */
1192 + 4 * export_table_size
/* addresses */
1193 + 4 * count_exported_byname
/* name ptrs */
1194 + 2 * count_exported_byname
/* ordinals */
1195 + name_table_size
+ strlen (dll_filename
) + 1);
1198 /* Fill the exported symbol offsets. The preliminary work has already
1199 been done in process_def_file_and_drectve(). */
1202 fill_exported_offsets (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
1205 struct bfd_link_hash_entry
*blhe
;
1207 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1211 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
1212 if (pe_details
->underscored
1213 && *pe_def_file
->exports
[i
].internal_name
!= '@')
1216 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
1219 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
1221 blhe
= bfd_link_hash_lookup (info
->hash
,
1223 false, false, true);
1225 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
1226 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
1233 fill_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1236 unsigned char *edirectory
;
1237 unsigned char *eaddresses
;
1238 unsigned char *enameptrs
;
1239 unsigned char *eordinals
;
1242 edata_d
= xmalloc (edata_sz
);
1244 /* Note use of array pointer math here. */
1245 edirectory
= edata_d
;
1246 eaddresses
= edirectory
+ 40;
1247 enameptrs
= eaddresses
+ 4 * export_table_size
;
1248 eordinals
= enameptrs
+ 4 * count_exported_byname
;
1249 enamestr
= (char *) eordinals
+ 2 * count_exported_byname
;
1251 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1252 + edata_s->output_section->vma - image_base)
1254 memset (edata_d
, 0, edata_sz
);
1256 if (pe_data (abfd
)->timestamp
== -1)
1258 time_t now
= bfd_get_current_time (0);
1259 H_PUT_32 (abfd
, now
, edata_d
+ 4);
1262 H_PUT_32 (abfd
, pe_data (abfd
)->timestamp
, edata_d
+ 4);
1264 if (pe_def_file
->version_major
!= -1)
1266 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
1267 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
1270 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
1271 strcpy (enamestr
, dll_filename
);
1272 enamestr
+= strlen (enamestr
) + 1;
1273 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
1274 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
1275 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
1276 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
1277 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
1278 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
1280 fill_exported_offsets (abfd
, info
);
1282 /* Ok, now for the filling in part.
1283 Scan alphabetically - ie the ordering in the exports[] table,
1284 rather than by ordinal - the ordering in the exported_symbol[]
1285 table. See dlltool.c and:
1286 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1287 for more information. */
1289 for (s
= 0; s
< NE
; s
++)
1291 struct bfd_section
*ssec
= exported_symbol_sections
[s
];
1292 if (pe_def_file
->exports
[s
].ordinal
!= -1
1293 && (pe_def_file
->exports
[s
].flag_forward
|| ssec
!= NULL
))
1295 int ord
= pe_def_file
->exports
[s
].ordinal
;
1297 if (pe_def_file
->exports
[s
].flag_forward
)
1299 bfd_put_32 (abfd
, ERVA (enamestr
),
1300 eaddresses
+ 4 * (ord
- min_ordinal
));
1302 strcpy (enamestr
, pe_def_file
->exports
[s
].internal_name
);
1303 enamestr
+= strlen (pe_def_file
->exports
[s
].internal_name
) + 1;
1307 bfd_vma srva
= (exported_symbol_offsets
[s
]
1308 + ssec
->output_section
->vma
1309 + ssec
->output_offset
);
1311 bfd_put_32 (abfd
, srva
- image_base
,
1312 eaddresses
+ 4 * (ord
- min_ordinal
));
1315 if (!pe_def_file
->exports
[s
].flag_noname
)
1317 char *ename
= pe_def_file
->exports
[s
].name
;
1318 if (pe_def_file
->exports
[s
].its_name
)
1319 ename
= pe_def_file
->exports
[s
].its_name
;
1321 bfd_put_32 (abfd
, ERVA (enamestr
), enameptrs
);
1323 strcpy (enamestr
, ename
);
1324 enamestr
+= strlen (enamestr
) + 1;
1325 bfd_put_16 (abfd
, ord
- min_ordinal
, eordinals
);
1327 pe_def_file
->exports
[s
].hint
= hint
++;
1334 static struct bfd_section
*current_sec
;
1337 pe_walk_relocs (struct bfd_link_info
*info
,
1339 const char *symname
,
1340 struct bfd_hash_table
*import_hash
,
1341 void (*cb
) (arelent
*, asection
*, char *, const char *))
1346 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
1350 if (!bfd_generic_link_read_symbols (b
))
1352 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
1356 symbols
= bfd_get_outsymbols (b
);
1358 for (s
= b
->sections
; s
; s
= s
->next
)
1361 int relsize
, nrelocs
, i
;
1362 int flags
= bfd_section_flags (s
);
1364 /* Skip discarded linkonce sections. */
1365 if (flags
& SEC_LINK_ONCE
1366 && s
->output_section
== bfd_abs_section_ptr
)
1371 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1372 relocs
= xmalloc (relsize
);
1373 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1375 for (i
= 0; i
< nrelocs
; i
++)
1377 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1379 /* Warning: the callback needs to be passed NAME directly. */
1382 if (bfd_hash_lookup (import_hash
, sym
->name
, false, false))
1384 strcpy (name
, sym
->name
);
1385 cb (relocs
[i
], s
, name
, symname
);
1390 if (strcmp (name
, sym
->name
) == 0)
1391 cb (relocs
[i
], s
, name
, symname
);
1397 /* Warning: the allocated symbols are remembered in BFD and reused
1398 later, so don't free them! */
1399 /* free (symbols); */
1405 pe_find_data_imports (const char *symhead
,
1406 void (*cb
) (arelent
*, asection
*, char *, const char *))
1408 struct bfd_link_hash_entry
*undef
;
1409 const size_t headlen
= strlen (symhead
);
1412 struct bfd_hash_table
*import_hash
;
1414 for (undef
= link_info
.hash
->undefs
; undef
; undef
= undef
->u
.undef
.next
)
1415 if (undef
->type
== bfd_link_hash_undefined
)
1417 size_t len
= strlen (undef
->root
.string
);
1424 /* For the pseudo-relocation support version 2, we can collect the symbols
1425 that are subject to auto-import and adjust the relocations en masse. */
1426 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
1429 = (struct bfd_hash_table
*) xmalloc (sizeof (struct bfd_hash_table
));
1430 if (!bfd_hash_table_init (import_hash
,
1432 sizeof (struct bfd_hash_entry
)))
1433 einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
1438 /* We are being a bit cunning here. The buffer will have space for
1439 prefixes at the beginning. The prefix is modified here and in a
1440 number of functions called from this function. */
1441 #define PREFIX_LEN 32
1442 buf
= xmalloc (PREFIX_LEN
+ namelen
+ 1);
1443 name
= buf
+ PREFIX_LEN
;
1445 for (undef
= link_info
.hash
->undefs
; undef
; undef
= undef
->u
.undef
.next
)
1446 if (undef
->type
== bfd_link_hash_undefined
)
1448 struct bfd_link_hash_entry
*sym
;
1451 if (pe_dll_extra_pe_debug
)
1452 printf ("%s:%s\n", __func__
, undef
->root
.string
);
1454 strcpy (name
, undef
->root
.string
);
1455 impname
= name
- (sizeof "__imp_" - 1);
1456 memcpy (impname
, "__imp_", sizeof "__imp_" - 1);
1458 sym
= bfd_link_hash_lookup (link_info
.hash
, impname
, 0, 0, 1);
1460 if (sym
&& sym
->type
== bfd_link_hash_defined
)
1463 bfd_hash_lookup (import_hash
, undef
->root
.string
, true, false);
1466 bfd
*b
= sym
->u
.def
.section
->owner
;
1467 const char *symname
= NULL
;
1471 if (!bfd_generic_link_read_symbols (b
))
1473 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
1477 symbols
= bfd_get_outsymbols (b
);
1478 nsyms
= bfd_get_symcount (b
);
1480 for (i
= 0; i
< nsyms
; i
++)
1481 if (strncmp (symbols
[i
]->name
, symhead
, headlen
) == 0)
1483 if (pe_dll_extra_pe_debug
)
1484 printf ("->%s\n", symbols
[i
]->name
);
1486 symname
= symbols
[i
]->name
+ headlen
;
1490 /* If the symobl isn't part of an import table, there is no
1491 point in building a fixup, this would give rise to link
1492 errors for mangled symbols instead of the original one. */
1494 pe_walk_relocs (&link_info
, name
, symname
, NULL
, cb
);
1499 /* Let's differentiate it somehow from defined. */
1500 undef
->type
= bfd_link_hash_defweak
;
1501 undef
->u
.def
.value
= sym
->u
.def
.value
;
1502 undef
->u
.def
.section
= sym
->u
.def
.section
;
1504 /* We replace the original name with the __imp_ prefixed one, this
1505 1) may trash memory 2) leads to duplicate symbols. But this is
1506 better than having a misleading name that can confuse GDB. */
1507 undef
->root
.string
= sym
->root
.string
;
1509 if (link_info
.pei386_auto_import
== -1)
1511 static bool warned
= false;
1513 info_msg (_("Info: resolving %s by linking to %s "
1514 "(auto-import)\n"), name
, impname
);
1516 /* PR linker/4844. */
1519 einfo (_("%P: warning: auto-importing has been activated "
1520 "without --enable-auto-import specified on the "
1521 "command line; this should work unless it "
1522 "involves constant data structures referencing "
1523 "symbols from auto-imported DLLs\n"));
1530 /* If we have the import hash table, walk the relocations only once. */
1533 pe_walk_relocs (&link_info
, name
, NULL
, import_hash
, cb
);
1534 bfd_hash_table_free (import_hash
);
1541 /* Gather all the relocations and build the .reloc section. */
1544 generate_reloc (bfd
*abfd
, struct bfd_link_info
*info
)
1546 /* For .reloc stuff. */
1547 reloc_data_type
*reloc_data
;
1548 int total_relocs
= 0;
1550 bfd_vma sec_page
= (bfd_vma
) -1;
1553 struct bfd_section
*s
;
1555 if (reloc_s
== NULL
|| reloc_s
->output_section
== bfd_abs_section_ptr
)
1558 /* Set an upper bound for the total number of relocations we will have to generate. */
1560 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
1561 for (s
= b
->sections
; s
; s
= s
->next
)
1562 total_relocs
+= s
->reloc_count
;
1564 reloc_data
= xmalloc (total_relocs
* sizeof (reloc_data_type
));
1567 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
1570 int relsize
, nrelocs
;
1573 if (!bfd_generic_link_read_symbols (b
))
1575 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
1579 symbols
= bfd_get_outsymbols (b
);
1581 for (s
= b
->sections
; s
; s
= s
->next
)
1585 /* If the section is not going to be output, then ignore it. */
1586 if (s
->output_section
== NULL
)
1588 /* FIXME: This should not happen. Convert to the correct
1589 form here, but really, this should be investigated. */
1590 s
->output_section
= bfd_abs_section_ptr
;
1594 /* I don't know why there would be a reloc for these, but I've
1595 seen it happen - DJ */
1596 if (s
->output_section
== bfd_abs_section_ptr
)
1599 /* If it's not loaded, we don't need to relocate it this way. */
1600 if (!(s
->output_section
->flags
& SEC_LOAD
))
1603 /* This happens when linking with --just-symbols=<file>
1604 so do not generate an error. */
1605 if (s
->output_section
->vma
== 0)
1608 sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1610 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1611 relocs
= xmalloc (relsize
);
1612 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1614 for (i
= 0; i
< nrelocs
; i
++)
1616 if (pe_dll_extra_pe_debug
)
1618 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1619 printf ("rel: %s\n", sym
->name
);
1621 if (!relocs
[i
]->howto
->pc_relative
1622 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
1623 && (relocs
[i
]->howto
->type
< pe_details
->secrel_reloc_lo
1624 || relocs
[i
]->howto
->type
> pe_details
->secrel_reloc_hi
)
1625 && relocs
[i
]->howto
->type
!= pe_details
->section_reloc
)
1627 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1628 const struct bfd_link_hash_entry
*blhe
1629 = bfd_wrapped_link_hash_lookup (abfd
, info
, sym
->name
,
1630 false, false, false);
1632 /* Don't create relocs for undefined weak symbols. */
1633 if (sym
->flags
== BSF_WEAK
)
1635 if (blhe
&& blhe
->type
== bfd_link_hash_undefweak
)
1637 /* Check aux sym and see if it is defined or not. */
1638 struct coff_link_hash_entry
*h
, *h2
;
1639 h
= (struct coff_link_hash_entry
*)blhe
;
1640 if (h
->symbol_class
!= C_NT_WEAK
|| h
->numaux
!= 1)
1642 h2
= h
->auxbfd
->tdata
.coff_obj_data
->sym_hashes
1643 [h
->aux
->x_sym
.x_tagndx
.u32
];
1644 /* We don't want a base reloc if the aux sym is not
1645 found, undefined, or if it is the constant ABS
1646 zero default value. (We broaden that slightly by
1647 not testing the value, just the section; there's
1648 no reason we'd want a reference to any absolute
1649 address to get relocated during rebasing). */
1650 if (!h2
|| h2
->root
.type
== bfd_link_hash_undefined
1651 || h2
->root
.u
.def
.section
== bfd_abs_section_ptr
)
1654 else if (!blhe
|| blhe
->type
!= bfd_link_hash_defined
)
1657 /* Nor for Dwarf FDE references to discarded sections. */
1658 else if (bfd_is_abs_section (sym
->section
->output_section
))
1660 /* We only ignore relocs from .eh_frame sections, as
1661 they are discarded by the final link rather than
1662 resolved against the kept section. */
1663 if (!strcmp (s
->name
, ".eh_frame"))
1666 /* Nor for absolute symbols. */
1667 else if (blhe
&& ldexp_is_final_sym_absolute (blhe
)
1668 && (!blhe
->linker_def
1669 || (strcmp (sym
->name
, "__image_base__")
1670 && strcmp (sym
->name
, U ("__ImageBase")))))
1673 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1674 reloc_data
[total_relocs
].idx
= total_relocs
;
1676 /* Since we're only about to determine .reloc's size,
1677 subsequent output section VMA calculations will shift up
1678 sections at this or higher addresses. Relocations for
1679 such sections would hence end up not being correct. */
1680 if (reloc_data
[total_relocs
].vma
1681 >= reloc_s
->output_section
->vma
)
1682 einfo (_("%P: base relocation for section `%s' above "
1683 ".reloc section\n"), s
->output_section
->name
);
1685 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1687 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1688 relocs
[i
]->howto
->rightshift
)
1691 case BITS_AND_SHIFT (64, 0):
1692 reloc_data
[total_relocs
].type
= IMAGE_REL_BASED_DIR64
;
1696 case BITS_AND_SHIFT (32, 0):
1697 reloc_data
[total_relocs
].type
= IMAGE_REL_BASED_HIGHLOW
;
1700 case BITS_AND_SHIFT (16, 0):
1701 reloc_data
[total_relocs
].type
= IMAGE_REL_BASED_LOW
;
1704 case BITS_AND_SHIFT (16, 16):
1705 reloc_data
[total_relocs
].type
= IMAGE_REL_BASED_HIGHADJ
;
1706 /* FIXME: we can't know the symbol's right value
1707 yet, but we probably can safely assume that
1708 CE will relocate us in 64k blocks, so leaving
1710 reloc_data
[total_relocs
].extra
= 0;
1713 case BITS_AND_SHIFT (26, 2):
1714 reloc_data
[total_relocs
].type
=
1715 IMAGE_REL_BASED_ARM_MOV32
;
1718 case BITS_AND_SHIFT (24, 2):
1719 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1720 Those ARM_xxx definitions should go in proper
1722 if (relocs
[i
]->howto
->type
== 0
1723 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1724 || relocs
[i
]->howto
->type
== 5)
1725 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1726 that has already been fully processed during a
1727 previous link stage, so ignore it here. */
1731 /* xgettext:c-format */
1732 einfo (_("%X%P: error: %d-bit reloc in dll\n"),
1733 relocs
[i
]->howto
->bitsize
);
1740 /* Warning: the allocated symbols are remembered in BFD and
1741 reused later, so don't free them! */
1745 /* This can happen for example when LTO has eliminated all code. */
1746 if (total_relocs
== 0)
1749 /* At this point, we have total_relocs relocation addresses in
1750 reloc_addresses, which are all suitable for the .reloc section.
1751 We must now create the new sections. */
1752 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1754 for (i
= 0; i
< total_relocs
; i
++)
1756 bfd_vma this_page
= (reloc_data
[i
].vma
>> 12);
1758 if (this_page
!= sec_page
)
1760 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1762 sec_page
= this_page
;
1767 if (reloc_data
[i
].type
== IMAGE_REL_BASED_HIGHADJ
)
1771 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1772 reloc_d
= xmalloc (reloc_sz
);
1774 page_ptr
= sec_page
= (bfd_vma
) -1;
1777 for (i
= 0; i
< total_relocs
; i
++)
1779 bfd_vma rva
= reloc_data
[i
].vma
- image_base
;
1780 bfd_vma this_page
= (rva
& ~0xfff);
1782 if (this_page
!= sec_page
)
1784 while (reloc_sz
& 3)
1785 reloc_d
[reloc_sz
++] = 0;
1787 if (page_ptr
!= (bfd_vma
) -1)
1788 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1790 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1791 page_ptr
= reloc_sz
;
1793 sec_page
= this_page
;
1796 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1797 reloc_d
+ reloc_sz
);
1800 if (reloc_data
[i
].type
== IMAGE_REL_BASED_HIGHADJ
)
1802 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1807 while (reloc_sz
& 3)
1808 reloc_d
[reloc_sz
++] = 0;
1810 if (page_ptr
!= (bfd_vma
) -1)
1811 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1814 /* Given the exiting def_file structure, print out a .DEF file that
1815 corresponds to it. */
1818 quoteput (char *s
, FILE *f
, int needs_quotes
)
1822 for (cp
= s
; *cp
; cp
++)
1837 if (*s
== '"' || *s
== '\\')
1851 pe_dll_generate_def_file (const char *pe_out_def_filename
)
1854 FILE *out
= fopen (pe_out_def_filename
, "w");
1857 /* xgettext:c-format */
1858 einfo (_("%P: can't open output def file %s\n"),
1859 pe_out_def_filename
);
1863 if (pe_def_file
->name
)
1865 if (pe_def_file
->is_dll
)
1866 fprintf (out
, "LIBRARY ");
1868 fprintf (out
, "NAME ");
1870 quoteput (pe_def_file
->name
, out
, 1);
1872 if (pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
)
1873 fprintf (out
, " BASE=0x%" PRIx64
,
1874 (uint64_t) pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
);
1875 fprintf (out
, "\n");
1878 if (pe_def_file
->description
)
1880 fprintf (out
, "DESCRIPTION ");
1881 quoteput (pe_def_file
->description
, out
, 1);
1882 fprintf (out
, "\n");
1885 if (pe_def_file
->version_minor
!= -1)
1886 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1887 pe_def_file
->version_minor
);
1888 else if (pe_def_file
->version_major
!= -1)
1889 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1891 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1892 fprintf (out
, "\n");
1894 if (pe_def_file
->stack_commit
!= -1)
1895 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1896 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1897 else if (pe_def_file
->stack_reserve
!= -1)
1898 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1900 if (pe_def_file
->heap_commit
!= -1)
1901 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1902 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1903 else if (pe_def_file
->heap_reserve
!= -1)
1904 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1906 if (pe_def_file
->num_section_defs
> 0)
1908 fprintf (out
, "\nSECTIONS\n\n");
1910 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1913 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1915 if (pe_def_file
->section_defs
[i
].class)
1917 fprintf (out
, " CLASS ");
1918 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1921 if (pe_def_file
->section_defs
[i
].flag_read
)
1922 fprintf (out
, " READ");
1924 if (pe_def_file
->section_defs
[i
].flag_write
)
1925 fprintf (out
, " WRITE");
1927 if (pe_def_file
->section_defs
[i
].flag_execute
)
1928 fprintf (out
, " EXECUTE");
1930 if (pe_def_file
->section_defs
[i
].flag_shared
)
1931 fprintf (out
, " SHARED");
1933 fprintf (out
, "\n");
1937 if (pe_def_file
->num_exports
> 0)
1939 fprintf (out
, "EXPORTS\n");
1941 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1943 def_file_export
*e
= pe_def_file
->exports
+ i
;
1945 quoteput (e
->name
, out
, 0);
1947 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1949 fprintf (out
, " = ");
1950 quoteput (e
->internal_name
, out
, 0);
1953 if (e
->ordinal
!= -1)
1954 fprintf (out
, " @%d", e
->ordinal
);
1956 if (e
->flag_private
)
1957 fprintf (out
, " PRIVATE");
1959 if (e
->flag_constant
)
1960 fprintf (out
, " CONSTANT");
1963 fprintf (out
, " NONAME");
1966 fprintf (out
, " DATA");
1968 fprintf (out
, "\n");
1972 if (pe_def_file
->num_imports
> 0)
1974 fprintf (out
, "\nIMPORTS\n\n");
1976 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1978 def_file_import
*im
= pe_def_file
->imports
+ i
;
1981 if (im
->internal_name
1982 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1984 quoteput (im
->internal_name
, out
, 0);
1985 fprintf (out
, " = ");
1988 quoteput (im
->module
->name
, out
, 0);
1992 quoteput (im
->name
, out
, 0);
1994 fprintf (out
, "%d", im
->ordinal
);
1998 fprintf (out
, " == ");
1999 quoteput (im
->its_name
, out
, 0);
2002 fprintf (out
, "\n");
2007 fprintf (out
, _("; no contents available\n"));
2009 if (fclose (out
) == EOF
)
2010 /* xgettext:c-format */
2011 einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename
);
2014 /* Generate the import library. */
2016 static asymbol
**symtab
;
2019 static char *dll_symname
;
2021 #define UNDSEC bfd_und_section_ptr
2024 quick_section (bfd
*abfd
, const char *name
, int flags
, int align
)
2029 sec
= bfd_make_section_old_way (abfd
, name
);
2030 bfd_set_section_flags (sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
2031 bfd_set_section_alignment (sec
, align
);
2032 /* Remember to undo this before trying to link internally! */
2033 sec
->output_section
= sec
;
2035 sym
= bfd_make_empty_symbol (abfd
);
2036 symtab
[symptr
++] = sym
;
2037 sym
->name
= sec
->name
;
2039 sym
->flags
= BSF_LOCAL
;
2046 quick_symbol (bfd
*abfd
,
2055 char *name
= xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
2060 sym
= bfd_make_empty_symbol (abfd
);
2065 symtab
[symptr
++] = sym
;
2068 static arelent
*reltab
= 0;
2069 static int relcount
= 0, relsize
= 0;
2072 quick_reloc (bfd
*abfd
, bfd_size_type address
, int which_howto
, int symidx
)
2074 if (relcount
>= relsize
- 1)
2078 reltab
= xrealloc (reltab
, relsize
* sizeof (arelent
));
2080 reltab
= xmalloc (relsize
* sizeof (arelent
));
2082 reltab
[relcount
].address
= address
;
2083 reltab
[relcount
].addend
= 0;
2084 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
2085 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
2090 save_relocs (asection
*sec
)
2094 sec
->relocation
= reltab
;
2095 sec
->reloc_count
= relcount
;
2096 sec
->orelocation
= xmalloc ((relcount
+ 1) * sizeof (arelent
*));
2097 for (i
= 0; i
< relcount
; i
++)
2098 sec
->orelocation
[i
] = sec
->relocation
+ i
;
2099 sec
->orelocation
[relcount
] = 0;
2100 sec
->flags
|= SEC_RELOC
;
2102 relcount
= relsize
= 0;
2105 /* .section .idata$2
2106 .global __head_my_dll
2123 make_head (bfd
*parent
)
2125 asection
*id2
, *id5
, *id4
;
2126 unsigned char *d2
, *d5
, *d4
;
2130 oname
= xasprintf ("%s_d%06d.o", dll_symname
, tmp_seq
);
2133 abfd
= bfd_create (oname
, parent
);
2135 bfd_find_target (pe_details
->object_target
, abfd
);
2136 bfd_make_writable (abfd
);
2138 bfd_set_format (abfd
, bfd_object
);
2139 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2142 symtab
= xmalloc (6 * sizeof (asymbol
*));
2143 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2144 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2145 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2146 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2147 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2149 /* OK, pay attention here. I got confused myself looking back at
2150 it. We create a four-byte section to mark the beginning of the
2151 list, and we include an offset of 4 in the section, so that the
2152 pointer to the list points to the *end* of this section, which is
2153 the start of the list of sections from other objects. */
2155 bfd_set_section_size (id2
, 20);
2159 if (pe_use_nul_prefixed_import_tables
)
2160 d2
[0] = d2
[16] = PE_IDATA5_SIZE
; /* Reloc addend. */
2161 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2162 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
2163 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
2166 if (pe_use_nul_prefixed_import_tables
)
2167 bfd_set_section_size (id5
, PE_IDATA5_SIZE
);
2169 bfd_set_section_size (id5
, 0);
2170 d5
= xmalloc (PE_IDATA5_SIZE
);
2172 memset (d5
, 0, PE_IDATA5_SIZE
);
2173 if (pe_use_nul_prefixed_import_tables
)
2174 bfd_set_section_size (id4
, PE_IDATA4_SIZE
);
2176 bfd_set_section_size (id4
, 0);
2177 d4
= xmalloc (PE_IDATA4_SIZE
);
2179 memset (d4
, 0, PE_IDATA4_SIZE
);
2181 bfd_set_symtab (abfd
, symtab
, symptr
);
2183 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2184 if (pe_use_nul_prefixed_import_tables
)
2186 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2187 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2191 bfd_set_section_contents (abfd
, id5
, d5
, 0, 0);
2192 bfd_set_section_contents (abfd
, id4
, d4
, 0, 0);
2195 bfd_make_readable (abfd
);
2199 /* .section .idata$4
2206 .global __my_dll_iname
2211 make_tail (bfd
*parent
)
2213 asection
*id4
, *id5
, *id7
;
2214 unsigned char *d4
, *d5
, *d7
;
2219 oname
= xasprintf ("%s_d%06d.o", dll_symname
, tmp_seq
);
2222 abfd
= bfd_create (oname
, parent
);
2224 bfd_find_target (pe_details
->object_target
, abfd
);
2225 bfd_make_writable (abfd
);
2227 bfd_set_format (abfd
, bfd_object
);
2228 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2231 symtab
= xmalloc (5 * sizeof (asymbol
*));
2232 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2233 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2234 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2235 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
2237 bfd_set_section_size (id4
, PE_IDATA4_SIZE
);
2238 d4
= xmalloc (PE_IDATA4_SIZE
);
2240 memset (d4
, 0, PE_IDATA4_SIZE
);
2242 bfd_set_section_size (id5
, PE_IDATA5_SIZE
);
2243 d5
= xmalloc (PE_IDATA5_SIZE
);
2245 memset (d5
, 0, PE_IDATA5_SIZE
);
2247 len
= strlen (dll_filename
) + 1;
2250 bfd_set_section_size (id7
, len
);
2253 strcpy ((char *) d7
, dll_filename
);
2254 /* If len was odd, the above
2255 strcpy leaves behind an undefined byte. That is harmless,
2256 but we set it to 0 just so the binary dumps are pretty. */
2259 bfd_set_symtab (abfd
, symtab
, symptr
);
2261 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2262 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2263 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
2265 bfd_make_readable (abfd
);
2271 .global ___imp_function
2272 .global __imp__function
2274 jmp *__imp__function:
2288 .asciz "function" xlate? (add underscore, kill at) */
2290 static const unsigned char jmp_ix86_bytes
[] =
2292 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2295 static const unsigned char jmp_aarch64_bytes
[] =
2297 0x10, 0x00, 0x00, 0x90, /* adrp x16, 0 */
2298 0x10, 0x02, 0x00, 0x91, /* add x16, x16, #0x0 */
2299 0x10, 0x02, 0x40, 0xf9, /* ldr x16, [x16] */
2300 0x00, 0x02, 0x1f, 0xd6 /* br x16 */
2308 .dw __imp_function */
2310 static const unsigned char jmp_sh_bytes
[] =
2312 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2316 lui $t0,<high:__imp_function>
2317 lw $t0,<low:__imp_function>
2321 static const unsigned char jmp_mips_bytes
[] =
2323 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2324 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2327 static const unsigned char jmp_arm_bytes
[] =
2329 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2330 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2336 make_one (def_file_export
*exp
, bfd
*parent
, bool include_jmp_stub
)
2338 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
2339 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
2343 const unsigned char *jmp_bytes
= NULL
;
2344 int jmp_byte_count
= 0;
2345 const char *internal_name
= exp
->internal_name
;
2347 if (!exp
->flag_noname
)
2349 /* Check for a decorated symbol name */
2350 struct decoration_hash_entry
*entry
;
2352 entry
= (struct decoration_hash_entry
*)
2353 bfd_hash_lookup (&(coff_hash_table (&link_info
)->decoration_hash
),
2354 internal_name
, false, false);
2357 if (entry
->decorated_link
)
2359 internal_name
= entry
->decorated_link
->root
.string
;
2361 if (pe_details
->underscored
&& internal_name
[0] == '_')
2366 einfo (_("%P: error: NULL decorated name for %s\n"), internal_name
);
2371 /* Include the jump stub section only if it is needed. A jump
2372 stub is needed if the symbol being imported <sym> is a function
2373 symbol and there is at least one undefined reference to that
2374 symbol. In other words, if all the import references to <sym> are
2375 explicitly through _declspec(dllimport) then the jump stub is not
2377 if (include_jmp_stub
)
2379 switch (pe_details
->pe_arch
)
2382 jmp_bytes
= jmp_ix86_bytes
;
2383 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
2386 jmp_bytes
= jmp_sh_bytes
;
2387 jmp_byte_count
= sizeof (jmp_sh_bytes
);
2390 jmp_bytes
= jmp_mips_bytes
;
2391 jmp_byte_count
= sizeof (jmp_mips_bytes
);
2394 case PE_ARCH_arm_wince
:
2395 jmp_bytes
= jmp_arm_bytes
;
2396 jmp_byte_count
= sizeof (jmp_arm_bytes
);
2398 case PE_ARCH_aarch64
:
2399 jmp_bytes
= jmp_aarch64_bytes
;
2400 jmp_byte_count
= sizeof (jmp_aarch64_bytes
);
2407 oname
= xasprintf ("%s_d%06d.o", dll_symname
, tmp_seq
);
2410 abfd
= bfd_create (oname
, parent
);
2412 bfd_find_target (pe_details
->object_target
, abfd
);
2413 bfd_make_writable (abfd
);
2415 bfd_set_format (abfd
, bfd_object
);
2416 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2419 symtab
= xmalloc (12 * sizeof (asymbol
*));
2421 tx
= quick_section (abfd
, ".text", SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
, 2);
2422 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2423 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2424 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2425 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
2427 if (*internal_name
== '@')
2429 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2431 if (include_jmp_stub
)
2432 quick_symbol (abfd
, "", internal_name
, "", tx
, BSF_GLOBAL
, 0);
2433 quick_symbol (abfd
, "__imp_", internal_name
, "", id5
,
2435 /* Fastcall applies only to functions,
2436 so no need for auto-import symbol. */
2440 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2442 if (include_jmp_stub
)
2443 quick_symbol (abfd
, U (""), internal_name
, "", tx
,
2445 quick_symbol (abfd
, "__imp_", U (""), internal_name
, id5
,
2447 /* Symbol to reference ord/name of imported
2448 data symbol, used to implement auto-import. */
2450 quick_symbol (abfd
, "__nm_", U (""), internal_name
, id6
,
2453 if (pe_dll_compat_implib
)
2454 quick_symbol (abfd
, "___imp_", internal_name
, "", id5
,
2457 if (include_jmp_stub
)
2459 bfd_set_section_size (tx
, jmp_byte_count
);
2460 td
= xmalloc (jmp_byte_count
);
2462 memcpy (td
, jmp_bytes
, jmp_byte_count
);
2464 switch (pe_details
->pe_arch
)
2468 quick_reloc (abfd
, 2, BFD_RELOC_32_PCREL
, 2);
2470 /* Mark this object as SAFESEH compatible. */
2471 quick_symbol (abfd
, "", "@feat.00", "", bfd_abs_section_ptr
,
2473 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
2477 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2480 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
2481 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
2482 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
2485 case PE_ARCH_arm_wince
:
2486 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2488 case PE_ARCH_aarch64
:
2489 quick_reloc (abfd
, 0, BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL
, 2);
2490 quick_reloc (abfd
, 4, BFD_RELOC_AARCH64_ADD_LO12
, 2);
2498 bfd_set_section_size (tx
, 0);
2500 bfd_set_section_size (id7
, 4);
2504 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 5);
2507 bfd_set_section_size (id5
, PE_IDATA5_SIZE
);
2508 d5
= xmalloc (PE_IDATA5_SIZE
);
2510 memset (d5
, 0, PE_IDATA5_SIZE
);
2512 if (exp
->flag_noname
)
2514 d5
[0] = exp
->ordinal
;
2515 d5
[1] = exp
->ordinal
>> 8;
2516 d5
[PE_IDATA5_SIZE
- 1] = 0x80;
2520 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2524 bfd_set_section_size (id4
, PE_IDATA4_SIZE
);
2525 d4
= xmalloc (PE_IDATA4_SIZE
);
2527 memset (d4
, 0, PE_IDATA4_SIZE
);
2529 if (exp
->flag_noname
)
2531 d4
[0] = exp
->ordinal
;
2532 d4
[1] = exp
->ordinal
>> 8;
2533 d4
[PE_IDATA4_SIZE
- 1] = 0x80;
2537 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2541 if (exp
->flag_noname
)
2544 bfd_set_section_size (id6
, 0);
2548 /* { short, asciz } = { hint, name } */
2550 len
= 2 + strlen (exp
->its_name
) + 1;
2552 len
= 2 + strlen (exp
->name
) + 1;
2555 bfd_set_section_size (id6
, len
);
2558 memset (d6
, 0, len
);
2559 d6
[0] = exp
->hint
& 0xff;
2560 d6
[1] = exp
->hint
>> 8;
2562 strcpy ((char*) d6
+ 2, exp
->its_name
);
2564 strcpy ((char *) d6
+ 2, exp
->name
);
2567 bfd_set_symtab (abfd
, symtab
, symptr
);
2569 if (include_jmp_stub
)
2570 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
2571 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
2572 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2573 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2574 if (!exp
->flag_noname
)
2575 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
2577 bfd_make_readable (abfd
);
2582 make_singleton_name_thunk (const char *import
, bfd
*parent
)
2584 /* Name thunks go to idata$4. */
2590 oname
= xasprintf ("%s_nmth%06d.o", dll_symname
, tmp_seq
);
2593 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 (3 * sizeof (asymbol
*));
2603 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2604 quick_symbol (abfd
, "__nm_thnk_", import
, "", id4
, BSF_GLOBAL
, 0);
2605 quick_symbol (abfd
, "__nm_", import
, "", UNDSEC
, BSF_GLOBAL
, 0);
2607 /* We need space for the real thunk and for the null terminator. */
2608 bfd_set_section_size (id4
, PE_IDATA4_SIZE
* 2);
2609 d4
= xmalloc (PE_IDATA4_SIZE
* 2);
2611 memset (d4
, 0, PE_IDATA4_SIZE
* 2);
2612 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2615 bfd_set_symtab (abfd
, symtab
, symptr
);
2617 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
* 2);
2619 bfd_make_readable (abfd
);
2624 make_import_fixup_mark (arelent
*rel
, char *name
)
2626 /* We convert reloc to symbol, for later reference. */
2627 static unsigned int counter
;
2628 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2629 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2630 struct bfd_link_hash_entry
*bh
;
2631 char *fixup_name
, buf
[256];
2634 /* "name" buffer has space before the symbol name for prefixes. */
2635 sprintf (buf
, "__fu%d_", counter
++);
2636 prefix_len
= strlen (buf
);
2637 fixup_name
= name
- prefix_len
;
2638 memcpy (fixup_name
, buf
, prefix_len
);
2641 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2642 current_sec
, /* sym->section, */
2643 rel
->address
, NULL
, true, false, &bh
);
2645 return bh
->root
.string
;
2648 /* .section .idata$2
2649 .rva __nm_thnk_SYM (singleton thunk with name of func)
2652 .rva __my_dll_iname (name of dll)
2653 .rva __fuNN_SYM (pointer to reference (address) in text) */
2656 make_import_fixup_entry (const char *name
,
2657 const char *fixup_name
,
2658 const char *symname
,
2666 oname
= xasprintf ("%s_fu%06d.o", dll_symname
, tmp_seq
);
2669 abfd
= bfd_create (oname
, parent
);
2671 bfd_find_target (pe_details
->object_target
, abfd
);
2672 bfd_make_writable (abfd
);
2674 bfd_set_format (abfd
, bfd_object
);
2675 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2678 symtab
= xmalloc (6 * sizeof (asymbol
*));
2679 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2681 quick_symbol (abfd
, "__nm_thnk_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2682 quick_symbol (abfd
, U (""), symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2683 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2685 bfd_set_section_size (id2
, 20);
2690 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2691 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2692 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2695 bfd_set_symtab (abfd
, symtab
, symptr
);
2697 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2699 bfd_make_readable (abfd
);
2703 /* .section .rdata_runtime_pseudo_reloc
2705 .rva __fuNN_SYM (pointer to reference (address) in text) */
2708 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED
,
2709 const char *fixup_name
,
2710 bfd_vma addend ATTRIBUTE_UNUSED
,
2715 unsigned char *rt_rel_d
;
2720 oname
= xasprintf ("%s_rtr%06d.o", dll_symname
, tmp_seq
);
2723 abfd
= bfd_create (oname
, parent
);
2725 bfd_find_target (pe_details
->object_target
, abfd
);
2726 bfd_make_writable (abfd
);
2728 bfd_set_format (abfd
, bfd_object
);
2729 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2731 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2733 if (runtime_pseudp_reloc_v2_init
)
2734 size
= 3 * sizeof (asymbol
*);
2736 size
= 6 * sizeof (asymbol
*);
2739 size
= 2 * sizeof (asymbol
*);
2742 symtab
= xmalloc (size
);
2745 = quick_section (abfd
, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS
, 2);
2746 bfd_coff_set_long_section_names (abfd
, true);
2748 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2750 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2753 if (!runtime_pseudp_reloc_v2_init
)
2756 runtime_pseudp_reloc_v2_init
= true;
2759 quick_symbol (abfd
, "__imp_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2761 bfd_set_section_size (rt_rel
, size
);
2762 rt_rel_d
= xmalloc (size
);
2763 rt_rel
->contents
= rt_rel_d
;
2764 memset (rt_rel_d
, 0, size
);
2765 quick_reloc (abfd
, size
- 8, BFD_RELOC_RVA
, 1);
2766 quick_reloc (abfd
, size
- 12, BFD_RELOC_RVA
, 2);
2767 bfd_put_32 (abfd
, bitsize
, rt_rel_d
+ (size
- 4));
2769 bfd_put_32 (abfd
, 1, rt_rel_d
+ 8);
2770 save_relocs (rt_rel
);
2772 bfd_set_symtab (abfd
, symtab
, symptr
);
2774 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, size
);
2778 bfd_set_section_size (rt_rel
, 8);
2779 rt_rel_d
= xmalloc (8);
2780 rt_rel
->contents
= rt_rel_d
;
2781 memset (rt_rel_d
, 0, 8);
2783 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2784 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2786 save_relocs (rt_rel
);
2788 bfd_set_symtab (abfd
, symtab
, symptr
);
2790 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2793 bfd_make_readable (abfd
);
2798 .rva __pei386_runtime_relocator */
2801 pe_create_runtime_relocator_reference (bfd
*parent
)
2803 asection
*extern_rt_rel
;
2804 unsigned char *extern_rt_rel_d
;
2808 oname
= xasprintf ("%s_ertr%06d.o", dll_symname
, tmp_seq
);
2811 abfd
= bfd_create (oname
, parent
);
2813 bfd_find_target (pe_details
->object_target
, abfd
);
2814 bfd_make_writable (abfd
);
2816 bfd_set_format (abfd
, bfd_object
);
2817 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2820 symtab
= xmalloc (2 * sizeof (asymbol
*));
2821 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2823 quick_symbol (abfd
, "", U ("_pei386_runtime_relocator"), "", UNDSEC
,
2826 bfd_set_section_size (extern_rt_rel
, PE_IDATA5_SIZE
);
2827 extern_rt_rel_d
= xcalloc (1, PE_IDATA5_SIZE
);
2828 extern_rt_rel
->contents
= extern_rt_rel_d
;
2830 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2831 save_relocs (extern_rt_rel
);
2833 bfd_set_symtab (abfd
, symtab
, symptr
);
2835 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, PE_IDATA5_SIZE
);
2837 bfd_make_readable (abfd
);
2842 pe_create_import_fixup (arelent
*rel
, asection
*s
, bfd_vma addend
, char *name
,
2843 const char *symname
)
2845 const char *fixup_name
= make_import_fixup_mark (rel
, name
);
2848 /* This is the original implementation of the auto-import feature, which
2849 primarily relied on the OS loader to patch things up with some help
2850 from the pseudo-relocator to overcome the main limitation. See the
2851 comment at the beginning of the file for an overview of the feature. */
2852 if (link_info
.pei386_runtime_pseudo_reloc
!= 2)
2854 struct bfd_link_hash_entry
*name_thunk_sym
;
2855 /* name buffer is allocated with space at beginning for prefixes. */
2856 char *thname
= name
- (sizeof "__nm_thnk_" - 1);
2857 memcpy (thname
, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2858 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, thname
, 0, 0, 1);
2860 if (!(name_thunk_sym
&& name_thunk_sym
->type
== bfd_link_hash_defined
))
2862 b
= make_singleton_name_thunk (name
, link_info
.output_bfd
);
2863 add_bfd_to_link (b
, bfd_get_filename (b
), &link_info
);
2865 /* If we ever use autoimport, we have to cast text section writable. */
2866 config
.text_read_only
= false;
2867 link_info
.output_bfd
->flags
&= ~WP_TEXT
;
2870 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
== 1)
2872 b
= make_import_fixup_entry (name
, fixup_name
, symname
,
2873 link_info
.output_bfd
);
2874 add_bfd_to_link (b
, bfd_get_filename (b
), &link_info
);
2878 /* In the original implementation, the pseudo-relocator was only used when
2879 the addend was not null. In the new implementation, the OS loader is
2880 completely bypassed and the pseudo-relocator does the entire work. */
2881 if ((addend
!= 0 && link_info
.pei386_runtime_pseudo_reloc
== 1)
2882 || link_info
.pei386_runtime_pseudo_reloc
== 2)
2884 if (pe_dll_extra_pe_debug
)
2885 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2886 fixup_name
, (int) addend
);
2888 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
,
2889 rel
->howto
->bitsize
,
2890 link_info
.output_bfd
);
2891 add_bfd_to_link (b
, bfd_get_filename (b
), &link_info
);
2893 if (runtime_pseudo_relocs_created
++ == 0)
2895 b
= pe_create_runtime_relocator_reference (link_info
.output_bfd
);
2896 add_bfd_to_link (b
, bfd_get_filename (b
), &link_info
);
2900 else if (addend
!= 0)
2901 einfo (_("%X%P: %H: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
2902 s
->owner
, s
, rel
->address
, (*rel
->sym_ptr_ptr
)->name
);
2906 pe_dll_generate_implib (def_file
*def
, const char *impfilename
, struct bfd_link_info
*info
)
2915 unlink_if_ordinary (impfilename
);
2917 outarch
= bfd_openw (impfilename
, 0);
2921 /* xgettext:c-format */
2922 einfo (_("%X%P: can't open .lib file: %s\n"), impfilename
);
2927 /* xgettext:c-format */
2928 info_msg (_("Creating library file: %s\n"), impfilename
);
2930 bfd_set_format (outarch
, bfd_archive
);
2931 outarch
->has_armap
= 1;
2933 /* Work out a reasonable size of things to put onto one line. */
2934 ar_head
= make_head (outarch
);
2936 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2937 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link
.next
)
2939 /* Iterate the exclude list. */
2940 struct exclude_list_struct
*ex
;
2942 for (ex
= excludes
, found
= 0; ex
&& !found
; ex
= ex
->next
)
2944 if (ex
->type
!= EXCLUDEFORIMPLIB
)
2946 found
= (filename_cmp (ex
->string
, bfd_get_filename (ibfd
)) == 0);
2948 /* If it matched, we must open a fresh BFD for it (the original
2949 input BFD is still needed for the DLL's final link) and add
2950 it into the archive member chain. */
2953 bfd
*newbfd
= bfd_openr (ibfd
->my_archive
2954 ? bfd_get_filename (ibfd
->my_archive
)
2955 : bfd_get_filename (ibfd
), NULL
);
2958 einfo (_("%X%P: bfd_openr %s: %E\n"), bfd_get_filename (ibfd
));
2961 if (ibfd
->my_archive
)
2963 /* Must now iterate through archive until we find the
2964 required member. A minor shame that we'll open the
2965 archive once per member that we require from it, and
2966 leak those archive bfds rather than reuse them. */
2967 bfd
*arbfd
= newbfd
;
2968 if (!bfd_check_format_matches (arbfd
, bfd_archive
, NULL
))
2970 einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
2971 bfd_get_filename (ibfd
->my_archive
),
2972 bfd_get_filename (ibfd
));
2976 while ((newbfd
= bfd_openr_next_archived_file (arbfd
, newbfd
)) != 0)
2978 if (filename_cmp (bfd_get_filename (newbfd
),
2979 bfd_get_filename (ibfd
)) == 0)
2984 einfo (_("%X%P: %s(%s): can't find member in archive"),
2985 bfd_get_filename (ibfd
->my_archive
),
2986 bfd_get_filename (ibfd
));
2990 newbfd
->archive_next
= head
;
2995 for (i
= 0; i
< def
->num_exports
; i
++)
2997 /* The import library doesn't know about the internal name. */
2998 char *internal
= def
->exports
[i
].internal_name
;
3001 /* Don't add PRIVATE entries to import lib. */
3002 if (pe_def_file
->exports
[i
].flag_private
)
3005 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
3007 /* PR 19803: If a symbol has been discard due to garbage
3008 collection then do not create any exports for it. */
3010 struct coff_link_hash_entry
*h
;
3012 h
= coff_link_hash_lookup (coff_hash_table (info
), internal
,
3013 false, false, false);
3015 /* If the symbol is hidden and undefined then it
3016 has been swept up by garbage collection. */
3017 && h
->symbol_class
== C_HIDDEN
3018 && h
->root
.u
.def
.section
== bfd_und_section_ptr
)
3021 /* If necessary, check with an underscore prefix as well. */
3022 if (pe_details
->underscored
&& internal
[0] != '@')
3026 name
= xmalloc (strlen (internal
) + 2);
3027 sprintf (name
, "_%s", internal
);
3029 h
= coff_link_hash_lookup (coff_hash_table (info
), name
,
3030 false, false, false);
3034 /* If the symbol is hidden and undefined then it
3035 has been swept up by garbage collection. */
3036 && h
->symbol_class
== C_HIDDEN
3037 && h
->root
.u
.def
.section
== bfd_und_section_ptr
)
3042 n
= make_one (def
->exports
+ i
, outarch
, !(def
->exports
+ i
)->flag_data
);
3043 n
->archive_next
= head
;
3045 def
->exports
[i
].internal_name
= internal
;
3048 ar_tail
= make_tail (outarch
);
3050 if (ar_head
== NULL
|| ar_tail
== NULL
)
3053 /* Now stick them all into the archive. */
3054 ar_head
->archive_next
= head
;
3055 ar_tail
->archive_next
= ar_head
;
3058 if (! bfd_set_archive_head (outarch
, head
))
3059 einfo ("%X%P: bfd_set_archive_head: %E\n");
3061 if (! bfd_close (outarch
))
3062 einfo ("%X%P: bfd_close %s: %E\n", impfilename
);
3065 static int undef_count
= 0;
3073 static struct key_value
*udef_table
;
3075 static int undef_sort_cmp (const void *l1
, const void *r1
)
3077 const struct key_value
*l
= l1
;
3078 const struct key_value
*r
= r1
;
3080 return strcmp (l
->key
, r
->key
);
3083 static struct bfd_link_hash_entry
*
3084 pe_find_cdecl_alias_match (struct bfd_link_info
*linfo
, char *name
)
3086 struct bfd_link_hash_entry
*h
= NULL
;
3087 struct key_value
*kv
;
3088 struct key_value key
;
3089 char *at
, *lname
= xmalloc (strlen (name
) + 3);
3091 strcpy (lname
, name
);
3093 at
= strchr (lname
+ (lname
[0] == '@'), '@');
3098 kv
= bsearch (&key
, udef_table
, undef_count
, sizeof (struct key_value
),
3103 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, false, false, false);
3104 if (h
->type
== bfd_link_hash_undefined
)
3108 if (lname
[0] == '?')
3111 if (at
|| lname
[0] == '@')
3113 if (lname
[0] == '@')
3115 if (pe_details
->underscored
)
3118 /* Use memmove rather than strcpy as that
3119 can handle overlapping buffers. */
3120 memmove (lname
, lname
+ 1, strlen (lname
));
3122 kv
= bsearch (&key
, udef_table
, undef_count
,
3123 sizeof (struct key_value
), undef_sort_cmp
);
3126 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, false, false, false);
3127 if (h
->type
== bfd_link_hash_undefined
)
3132 *strchr (lname
, '@') = 0;
3134 kv
= bsearch (&key
, udef_table
, undef_count
,
3135 sizeof (struct key_value
), undef_sort_cmp
);
3138 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, false, false, false);
3139 if (h
->type
== bfd_link_hash_undefined
)
3145 strcat (lname
, "@");
3147 kv
= bsearch (&key
, udef_table
, undef_count
,
3148 sizeof (struct key_value
), undef_sort_cmp
);
3152 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, false, false, false);
3153 if (h
->type
== bfd_link_hash_undefined
)
3157 if (lname
[0] == '_' && pe_details
->underscored
)
3161 memmove (lname
+ 1, lname
, strlen (lname
) + 1);
3166 kv
= bsearch (&key
, udef_table
, undef_count
,
3167 sizeof (struct key_value
), undef_sort_cmp
);
3171 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, false, false, false);
3172 if (h
->type
== bfd_link_hash_undefined
)
3184 pe_undef_count (struct bfd_link_hash_entry
*h ATTRIBUTE_UNUSED
,
3185 void *inf ATTRIBUTE_UNUSED
)
3187 if (h
->type
== bfd_link_hash_undefined
)
3193 pe_undef_fill (struct bfd_link_hash_entry
*h
, void *inf ATTRIBUTE_UNUSED
)
3195 if (h
->type
== bfd_link_hash_undefined
)
3199 udef_table
[undef_count
].key
= xstrdup (h
->root
.string
);
3200 at
= strchr (udef_table
[undef_count
].key
3201 + (udef_table
[undef_count
].key
[0] == '@'), '@');
3204 udef_table
[undef_count
].oname
= h
->root
.string
;
3211 pe_create_undef_table (void)
3215 /* count undefined symbols */
3217 bfd_link_hash_traverse (link_info
.hash
, pe_undef_count
, "");
3219 /* create and fill the corresponding table */
3220 udef_table
= xmalloc (undef_count
* sizeof (struct key_value
));
3223 bfd_link_hash_traverse (link_info
.hash
, pe_undef_fill
, "");
3226 qsort (udef_table
, undef_count
, sizeof (struct key_value
), undef_sort_cmp
);
3230 add_bfd_to_link (bfd
*abfd
, const char *name
, struct bfd_link_info
*linfo
)
3232 lang_input_statement_type
*fake_file
;
3234 fake_file
= lang_add_input_file (name
,
3235 lang_input_file_is_fake_enum
,
3237 fake_file
->the_bfd
= abfd
;
3238 ldlang_add_file (fake_file
);
3240 if (!bfd_link_add_symbols (abfd
, linfo
))
3241 einfo (_("%X%P: add symbols %s: %E\n"), name
);
3245 pe_process_import_defs (bfd
*output_bfd
, struct bfd_link_info
*linfo
)
3247 pe_dll_id_target (bfd_get_target (output_bfd
));
3252 def_file_module
*module
;
3253 def_file_import
*imp
;
3255 imp
= pe_def_file
->imports
;
3257 pe_create_undef_table ();
3259 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
3261 int do_this_dll
= 0;
3263 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
3264 if (imp
[i
].module
== module
)
3266 if (i
>= pe_def_file
->num_imports
)
3269 dll_filename
= module
->name
;
3270 dll_symname
= xstrdup (module
->name
);
3271 for (j
= 0; dll_symname
[j
]; j
++)
3272 if (!ISALNUM (dll_symname
[j
]))
3273 dll_symname
[j
] = '_';
3275 for (; i
< pe_def_file
->num_imports
&& imp
[i
].module
== module
; i
++)
3277 def_file_export exp
;
3278 struct bfd_link_hash_entry
*blhe
;
3279 int lead_at
= (*imp
[i
].internal_name
== '@');
3280 /* See if we need this import. */
3281 size_t len
= strlen (imp
[i
].internal_name
);
3282 char *name
= xmalloc (len
+ 2 + 6);
3283 bool include_jmp_stub
= false;
3284 bool is_cdecl
= false;
3285 bool is_undef
= false;
3287 if (!lead_at
&& strchr (imp
[i
].internal_name
, '@') == NULL
)
3291 sprintf (name
, "%s", imp
[i
].internal_name
);
3293 sprintf (name
, "%s%s",U (""), imp
[i
].internal_name
);
3295 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
3296 false, false, false);
3298 /* Include the jump stub for <sym> only if the <sym>
3300 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
3303 sprintf (name
, "%s%s", "__imp_", imp
[i
].internal_name
);
3305 sprintf (name
, "%s%s%s", "__imp_", U (""),
3306 imp
[i
].internal_name
);
3308 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
3309 false, false, false);
3311 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3313 if (is_cdecl
&& (!blhe
|| !is_undef
))
3315 blhe
= pe_find_cdecl_alias_match (linfo
, name
+ 6);
3316 include_jmp_stub
= true;
3318 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3323 include_jmp_stub
= true;
3324 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3335 bfd
*ar_head
= make_head (output_bfd
);
3336 add_bfd_to_link (ar_head
, bfd_get_filename (ar_head
),
3340 exp
.internal_name
= imp
[i
].internal_name
;
3341 exp
.name
= imp
[i
].name
;
3342 exp
.its_name
= imp
[i
].its_name
;
3343 exp
.ordinal
= imp
[i
].ordinal
;
3344 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
3345 exp
.flag_private
= 0;
3346 exp
.flag_constant
= 0;
3347 exp
.flag_data
= imp
[i
].data
;
3348 exp
.flag_noname
= exp
.name
? 0 : 1;
3349 one
= make_one (&exp
, output_bfd
,
3350 !exp
.flag_data
&& include_jmp_stub
);
3351 add_bfd_to_link (one
, bfd_get_filename (one
), linfo
);
3356 bfd
*ar_tail
= make_tail (output_bfd
);
3357 add_bfd_to_link (ar_tail
, bfd_get_filename (ar_tail
), linfo
);
3366 free (udef_table
[undef_count
].key
);
3371 if (pe_def_file
&& pe_def_file
->name
)
3372 dll_filename
= pe_def_file
->name
;
3375 dll_filename
= bfd_get_filename (output_bfd
);
3376 for (const char *p
= dll_filename
; *p
; p
++)
3377 if (*p
== '\\' || *p
== '/' || *p
== ':')
3378 dll_filename
= p
+ 1;
3380 dll_symname
= xstrdup (dll_filename
);
3381 for (int i
= 0; dll_symname
[i
]; i
++)
3382 if (!ISALNUM (dll_symname
[i
]))
3383 dll_symname
[i
] = '_';
3386 /* We were handed a *.DLL file. Parse it and turn it into a set of
3387 IMPORTS directives in the def file. Return TRUE if the file was
3388 handled, FALSE if not. */
3391 pe_get16 (bfd
*abfd
, int where
, bool *fail
)
3395 if (bfd_seek (abfd
, where
, SEEK_SET
) != 0
3396 || bfd_read (b
, 2, abfd
) != 2)
3401 return b
[0] + (b
[1] << 8);
3405 pe_get32 (bfd
*abfd
, int where
, bool *fail
)
3409 if (bfd_seek (abfd
, where
, SEEK_SET
) != 0
3410 || bfd_read (b
, 4, abfd
) != 4)
3415 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + ((unsigned) b
[3] << 24);
3421 unsigned char *b
= ptr
;
3423 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + ((unsigned) b
[3] << 24);
3427 pe_implied_import_dll (const char *filename
)
3430 bfd_vma pe_header_offset
, opthdr_ofs
, num_entries
, i
;
3431 bfd_vma export_rva
, export_size
, nsections
, secptr
, expptr
;
3432 bfd_vma exp_funcbase
;
3433 unsigned char *expdata
;
3435 bfd_vma name_rvas
, nexp
;
3436 const char *dllname
;
3437 /* Initialization with start > end guarantees that is_data
3438 will not be set by mistake, and avoids compiler warning. */
3439 bfd_vma data_start
= 1;
3440 bfd_vma data_end
= 0;
3441 bfd_vma rdata_start
= 1;
3442 bfd_vma rdata_end
= 0;
3443 bfd_vma bss_start
= 1;
3444 bfd_vma bss_end
= 0;
3447 /* No, I can't use bfd here. kernel32.dll puts its export table in
3448 the middle of the .rdata section. */
3449 dll
= bfd_openr (filename
, pe_details
->target_name
);
3452 einfo (_("%X%P: open %s: %E\n"), filename
);
3456 track_dependency_files (filename
);
3458 /* PEI dlls seem to be bfd_objects. */
3459 if (!bfd_check_format (dll
, bfd_object
))
3462 einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename
);
3466 /* Get pe_header, optional header and numbers of directory entries. */
3468 pe_header_offset
= pe_get32 (dll
, 0x3c, &fail
);
3471 opthdr_ofs
= pe_header_offset
+ 4 + 20;
3473 /* NumberOfRvaAndSizes. */
3474 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92 + 4 * 4, &fail
);
3476 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92, &fail
);
3481 /* No import or export directory entry. */
3482 if (num_entries
< 1)
3486 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96 + 4 * 4, &fail
);
3487 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100 + 4 * 4, &fail
);
3489 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96, &fail
);
3490 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100, &fail
);
3495 /* No export table - nothing to export. */
3496 if (export_size
== 0)
3499 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2, &fail
);
3500 secptr
= (pe_header_offset
+ 4 + 20 +
3501 pe_get16 (dll
, pe_header_offset
+ 4 + 16, &fail
));
3506 /* Get the rva and size of the export section. */
3507 for (i
= 0; i
< nsections
; i
++)
3510 bfd_vma secptr1
= secptr
+ 40 * i
;
3511 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12, &fail
);
3512 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 16, &fail
);
3513 bfd_vma fptr
= pe_get32 (dll
, secptr1
+ 20, &fail
);
3516 || bfd_seek (dll
, secptr1
, SEEK_SET
) != 0
3517 || bfd_read (sname
, 8, dll
) != 8)
3520 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
3522 expptr
= fptr
+ (export_rva
- vaddr
);
3523 if (export_rva
+ export_size
> vaddr
+ vsize
)
3524 export_size
= vsize
- (export_rva
- vaddr
);
3529 /* Scan sections and store the base and size of the
3530 data and bss segments in data/base_start/end. */
3531 for (i
= 0; i
< nsections
; i
++)
3533 bfd_vma secptr1
= secptr
+ 40 * i
;
3534 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 8, &fail
);
3535 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12, &fail
);
3536 bfd_vma flags
= pe_get32 (dll
, secptr1
+ 36, &fail
);
3541 || bfd_seek (dll
, secptr1
+ 0, SEEK_SET
) != 0
3542 || bfd_read (sec_name
, 8, dll
) != 8)
3545 if (strcmp(sec_name
,".data") == 0)
3548 data_end
= vaddr
+ vsize
;
3550 if (pe_dll_extra_pe_debug
)
3551 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3552 __func__
, sec_name
, (unsigned long) vaddr
,
3553 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3555 else if (strcmp(sec_name
,".rdata") == 0)
3557 rdata_start
= vaddr
;
3558 rdata_end
= vaddr
+ vsize
;
3560 if (pe_dll_extra_pe_debug
)
3561 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3562 __func__
, sec_name
, (unsigned long) vaddr
,
3563 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3565 else if (strcmp (sec_name
,".bss") == 0)
3568 bss_end
= vaddr
+ vsize
;
3570 if (pe_dll_extra_pe_debug
)
3571 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3572 __func__
, sec_name
, (unsigned long) vaddr
,
3573 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3577 expdata
= xmalloc (export_size
);
3578 if (bfd_seek (dll
, expptr
, SEEK_SET
) != 0
3579 || bfd_read (expdata
, export_size
, dll
) != export_size
)
3581 erva
= (char *) expdata
- export_rva
;
3583 if (pe_def_file
== 0)
3584 pe_def_file
= def_file_empty ();
3586 nexp
= pe_as32 (expdata
+ 24);
3587 name_rvas
= pe_as32 (expdata
+ 32);
3588 exp_funcbase
= pe_as32 (expdata
+ 28);
3590 /* Use internal dll name instead of filename
3591 to enable symbolic dll linking. */
3592 dllname
= erva
+ pe_as32 (expdata
+ 12);
3594 /* Check to see if the dll has already been added to
3595 the definition list and if so return without error.
3596 This avoids multiple symbol definitions. */
3597 if (def_get_module (pe_def_file
, dllname
))
3599 if (pe_dll_extra_pe_debug
)
3600 printf ("%s is already loaded\n", dllname
);
3604 /* This is an optimized version of the insertion loop, which avoids lots of
3605 calls to realloc and memmove from def_file_add_import. */
3606 if ((from
= def_file_add_import_from (pe_def_file
, nexp
,
3607 erva
+ pe_as32 (erva
+ name_rvas
),
3608 dllname
, 0, NULL
, NULL
)) >= 0)
3610 for (i
= 0; i
< nexp
; i
++)
3612 /* Pointer to the names vector. */
3613 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3614 def_file_import
*imp
;
3615 /* Pointer to the function address vector. */
3616 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3617 /* is_data is true if the address is in the data, rdata or bss
3620 (func_rva
>= data_start
&& func_rva
< data_end
)
3621 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3622 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3624 imp
= def_file_add_import_at (pe_def_file
, from
+ i
, erva
+ name_rva
,
3625 dllname
, i
, NULL
, NULL
);
3626 /* Mark symbol type. */
3627 imp
->data
= is_data
;
3629 if (pe_dll_extra_pe_debug
)
3630 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3631 __func__
, dllname
, erva
+ name_rva
,
3632 (unsigned long) func_rva
, is_data
? "(data)" : "");
3638 /* Iterate through the list of symbols. */
3639 for (i
= 0; i
< nexp
; i
++)
3641 /* Pointer to the names vector. */
3642 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3643 def_file_import
*imp
;
3644 /* Pointer to the function address vector. */
3645 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3648 /* Skip unwanted symbols, which are
3649 exported in buggy auto-import releases. */
3650 if (! startswith (erva
+ name_rva
, "__nm_"))
3652 bool is_dup
= false;
3653 /* is_data is true if the address is in the data, rdata or bss
3656 (func_rva
>= data_start
&& func_rva
< data_end
)
3657 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3658 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3660 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
3661 dllname
, i
, NULL
, NULL
, &is_dup
);
3662 /* Mark symbol type. */
3664 imp
->data
= is_data
;
3666 if (pe_dll_extra_pe_debug
)
3667 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3668 __func__
, dllname
, erva
+ name_rva
,
3669 (unsigned long) func_rva
, is_data
? "(data)" : "");
3677 pe_output_file_set_long_section_names (bfd
*abfd
)
3679 if (pe_use_coff_long_section_names
< 0)
3681 if (!bfd_coff_set_long_section_names (abfd
, pe_use_coff_long_section_names
))
3682 einfo (_("%X%P: error: can't use long section names on this arch\n"));
3685 /* These are the main functions, called from the emulation. The first
3686 is called after the bfds are read, so we can guess at how much space
3687 we need. The second is called after everything is placed, so we
3688 can put the right values in place. */
3691 pe_dll_build_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3693 pe_dll_id_target (bfd_get_target (abfd
));
3694 pe_output_file_set_long_section_names (abfd
);
3695 process_def_file_and_drectve (abfd
, info
);
3697 if (pe_def_file
->num_exports
== 0
3698 && (!bfd_link_pic (info
) || pe_dll_exclude_all_symbols
))
3700 if (pe_dll_enable_reloc_section
)
3702 build_filler_bfd (false /* edata not needed. */);
3703 pe_output_file_set_long_section_names (filler_bfd
);
3709 build_filler_bfd (true /* edata is needed. */);
3710 pe_output_file_set_long_section_names (filler_bfd
);
3714 pe_exe_build_sections (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3716 pe_dll_id_target (bfd_get_target (abfd
));
3717 pe_output_file_set_long_section_names (abfd
);
3718 build_filler_bfd (0);
3719 pe_output_file_set_long_section_names (filler_bfd
);
3723 pe_dll_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3725 pe_exe_fill_sections (abfd
, info
);
3729 fill_edata (abfd
, info
);
3730 edata_s
->contents
= edata_d
;
3733 if (bfd_link_dll (info
))
3734 pe_data (abfd
)->dll
= 1;
3738 pe_exe_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3740 pe_dll_id_target (bfd_get_target (abfd
));
3741 pe_output_file_set_long_section_names (abfd
);
3742 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3744 generate_reloc (abfd
, info
);
3748 bfd_set_section_size (reloc_s
, reloc_sz
);
3750 /* Resize the sections. */
3751 lang_reset_memory_regions ();
3752 lang_size_sections (NULL
, true);
3754 /* Redo special stuff. */
3755 ldemul_after_allocation ();
3757 /* Do the assignments again. */
3758 lang_do_assignments (lang_final_phase_enum
);
3760 reloc_s
->contents
= reloc_d
;
3764 /* Do not emit an empty reloc section. */
3765 bfd_set_section_flags (reloc_s
, SEC_IN_MEMORY
| SEC_EXCLUDE
);
3766 reloc_s
->output_section
= bfd_abs_section_ptr
;
3771 pe_bfd_is_dll (bfd
*abfd
)
3773 return (bfd_get_format (abfd
) == bfd_object
3775 && pe_data (abfd
)->dll
);