1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2019 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;
164 /* Static variables and types. */
166 static bfd_vma image_base
;
167 static bfd
*filler_bfd
;
168 static struct bfd_section
*edata_s
, *reloc_s
;
169 static unsigned char *edata_d
, *reloc_d
;
170 static size_t edata_sz
, reloc_sz
;
171 static int runtime_pseudo_relocs_created
= 0;
172 static bfd_boolean runtime_pseudp_reloc_v2_init
= FALSE
;
179 autofilter_entry_type
;
183 const char *target_name
;
184 const char *object_target
;
185 unsigned int imagebase_reloc
;
188 bfd_boolean underscored
;
189 const autofilter_entry_type
* autofilter_symbollist
;
193 static const autofilter_entry_type autofilter_symbollist_generic
[] =
195 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
196 /* Entry point symbols. */
197 { STRING_COMMA_LEN ("DllMain") },
198 { STRING_COMMA_LEN ("DllMainCRTStartup") },
199 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
200 /* Runtime pseudo-reloc. */
201 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
202 { STRING_COMMA_LEN ("do_pseudo_reloc") },
206 static const autofilter_entry_type autofilter_symbollist_i386
[] =
208 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
209 /* Entry point symbols, and entry hooks. */
210 { STRING_COMMA_LEN ("cygwin_crt0") },
212 { STRING_COMMA_LEN ("DllMain") },
213 { STRING_COMMA_LEN ("DllEntryPoint") },
214 { STRING_COMMA_LEN ("DllMainCRTStartup") },
215 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
216 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
217 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
219 { STRING_COMMA_LEN ("DllMain@12") },
220 { STRING_COMMA_LEN ("DllEntryPoint@0") },
221 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
222 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
223 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
224 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
225 { STRING_COMMA_LEN ("cygwin_attach_dll") },
227 { STRING_COMMA_LEN ("cygwin_premain0") },
228 { STRING_COMMA_LEN ("cygwin_premain1") },
229 { STRING_COMMA_LEN ("cygwin_premain2") },
230 { STRING_COMMA_LEN ("cygwin_premain3") },
231 /* Runtime pseudo-reloc. */
232 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
233 { STRING_COMMA_LEN ("do_pseudo_reloc") },
234 /* Global vars that should not be exported. */
235 { STRING_COMMA_LEN ("impure_ptr") },
236 { STRING_COMMA_LEN ("_impure_ptr") },
237 { STRING_COMMA_LEN ("_fmode") },
238 { STRING_COMMA_LEN ("environ") },
239 { STRING_COMMA_LEN ("__dso_handle") },
243 #define PE_ARCH_i386 1
245 #define PE_ARCH_mips 3
246 #define PE_ARCH_arm 4
247 #define PE_ARCH_arm_wince 5
249 /* Don't make it constant as underscore mode gets possibly overriden
250 by target or -(no-)leading-underscore option. */
251 static pe_details_type pe_detail_list
[] =
270 autofilter_symbollist_i386
280 autofilter_symbollist_i386
286 16 /* R_SH_IMAGEBASE */,
290 autofilter_symbollist_generic
299 autofilter_symbollist_generic
308 autofilter_symbollist_generic
311 "pei-arm-wince-little",
312 "pe-arm-wince-little",
313 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
317 autofilter_symbollist_generic
319 { NULL
, NULL
, 0, 0, 0, FALSE
, NULL
}
322 static const pe_details_type
*pe_details
;
324 /* Do not specify library suffix explicitly, to allow for dllized versions. */
325 static const autofilter_entry_type autofilter_liblist
[] =
327 { STRING_COMMA_LEN ("libcegcc") },
328 { STRING_COMMA_LEN ("libcygwin") },
329 { STRING_COMMA_LEN ("libgcc") },
330 { STRING_COMMA_LEN ("libgcc_s") },
331 { STRING_COMMA_LEN ("libstdc++") },
332 { STRING_COMMA_LEN ("libmingw32") },
333 { STRING_COMMA_LEN ("libmingwex") },
334 { STRING_COMMA_LEN ("libg2c") },
335 { STRING_COMMA_LEN ("libsupc++") },
336 { STRING_COMMA_LEN ("libobjc") },
337 { STRING_COMMA_LEN ("libgcj") },
338 { STRING_COMMA_LEN ("libmsvcrt") },
339 { STRING_COMMA_LEN ("libmsvcrt-os") },
340 { STRING_COMMA_LEN ("libucrtbase") },
344 /* Regardless of the suffix issue mentioned above, we must ensure that
345 we do not falsely match on a leading substring, such as when libtool
346 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
347 This routine ensures that the leading part of the name matches and that
348 it is followed by only an optional version suffix and a file extension,
349 returning zero if so or -1 if not. */
350 static int libnamencmp (const char *libname
, const autofilter_entry_type
*afptr
)
352 if (filename_ncmp (libname
, afptr
->name
, afptr
->len
))
355 libname
+= afptr
->len
;
357 /* Be liberal in interpreting what counts as a version suffix; we
358 accept anything that has a dash to separate it from the name and
359 begins with a digit. */
360 if (libname
[0] == '-')
362 if (!ISDIGIT (*++libname
))
364 /* Ensure the filename has an extension. */
365 while (*++libname
!= '.')
369 else if (libname
[0] != '.')
375 static const autofilter_entry_type autofilter_objlist
[] =
377 { STRING_COMMA_LEN ("crt0.o") },
378 { STRING_COMMA_LEN ("crt1.o") },
379 { STRING_COMMA_LEN ("crt2.o") },
380 { STRING_COMMA_LEN ("dllcrt1.o") },
381 { STRING_COMMA_LEN ("dllcrt2.o") },
382 { STRING_COMMA_LEN ("gcrt0.o") },
383 { STRING_COMMA_LEN ("gcrt1.o") },
384 { STRING_COMMA_LEN ("gcrt2.o") },
385 { STRING_COMMA_LEN ("crtbegin.o") },
386 { STRING_COMMA_LEN ("crtend.o") },
390 static const autofilter_entry_type autofilter_symbolprefixlist
[] =
392 /* _imp_ is treated specially, as it is always underscored. */
393 /* { STRING_COMMA_LEN ("_imp_") }, */
394 /* Don't export some c++ symbols. */
395 { STRING_COMMA_LEN ("__rtti_") },
396 { STRING_COMMA_LEN ("__builtin_") },
397 /* Don't re-export auto-imported symbols. */
398 { STRING_COMMA_LEN ("__nm_") },
399 /* Don't export symbols specifying internal DLL layout. */
400 { STRING_COMMA_LEN ("_head_") },
401 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
402 /* Don't export section labels or artificial symbols
404 { STRING_COMMA_LEN (".") },
408 static const autofilter_entry_type autofilter_symbolsuffixlist
[] =
410 { STRING_COMMA_LEN ("_iname") },
411 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
415 #define U(str) (pe_details->underscored ? "_" str : str)
418 pe_dll_id_target (const char *target
)
422 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
423 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
424 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
426 int u
= pe_leading_underscore
; /* Underscoring mode. -1 for use default. */
428 bfd_get_target_info (target
, NULL
, NULL
, &u
, NULL
);
431 pe_detail_list
[i
].underscored
= (u
!= 0 ? TRUE
: FALSE
);
432 pe_details
= pe_detail_list
+ i
;
433 pe_leading_underscore
= (u
!= 0 ? 1 : 0);
436 einfo (_("%X%P: unsupported PEI architecture: %s\n"), target
);
440 /* Helper functions for qsort. Relocs must be sorted so that we can write
441 them out by pages. */
453 reloc_sort (const void *va
, const void *vb
)
455 const reloc_data_type
*a
= (const reloc_data_type
*) va
;
456 const reloc_data_type
*b
= (const reloc_data_type
*) vb
;
470 pe_export_sort (const void *va
, const void *vb
)
472 const def_file_export
*a
= va
;
473 const def_file_export
*b
= vb
;
481 return strcmp (an
, bn
);
484 /* Read and process the .DEF file. */
486 /* These correspond to the entries in pe_def_file->exports[]. I use
487 exported_symbol_sections[i] to tag whether or not the symbol was
488 defined, since we can't export symbols we don't have. */
490 static bfd_vma
*exported_symbol_offsets
;
491 static struct bfd_section
**exported_symbol_sections
;
492 static int export_table_size
;
493 static int count_exported
;
494 static int count_exported_byname
;
495 static int count_with_ordinals
;
496 static const char *dll_name
;
497 static int min_ordinal
, max_ordinal
;
498 static int *exported_symbols
;
500 typedef struct exclude_list_struct
503 struct exclude_list_struct
*next
;
508 static struct exclude_list_struct
*excludes
= 0;
511 pe_dll_add_excludes (const char *new_excludes
, const exclude_type type
)
514 char *exclude_string
;
516 local_copy
= xstrdup (new_excludes
);
518 exclude_string
= strtok (local_copy
, ",:");
519 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
521 struct exclude_list_struct
*new_exclude
;
523 new_exclude
= xmalloc (sizeof (struct exclude_list_struct
));
524 new_exclude
->string
= xmalloc (strlen (exclude_string
) + 1);
525 strcpy (new_exclude
->string
, exclude_string
);
526 new_exclude
->type
= type
;
527 new_exclude
->next
= excludes
;
528 excludes
= new_exclude
;
535 is_import (const char* n
)
537 return (CONST_STRNEQ (n
, "__imp_"));
540 /* abfd is a bfd containing n (or NULL)
541 It can be used for contextual checks. */
544 auto_export (bfd
*abfd
, def_file
*d
, const char *n
)
547 struct exclude_list_struct
*ex
;
548 const autofilter_entry_type
*afptr
;
549 const char * libname
= NULL
;
551 if (abfd
&& abfd
->my_archive
)
552 libname
= lbasename (abfd
->my_archive
->filename
);
554 key
.name
= key
.its_name
= (char *) n
;
556 /* Return false if n is in the d->exports table. */
557 if (bsearch (&key
, d
->exports
, d
->num_exports
,
558 sizeof (pe_def_file
->exports
[0]), pe_export_sort
))
561 if (pe_dll_do_default_excludes
)
566 if (pe_dll_extra_pe_debug
)
567 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
568 n
, abfd
, abfd
->my_archive
);
570 /* First of all, make context checks:
571 Don't export anything from standard libs. */
574 afptr
= autofilter_liblist
;
578 if (libnamencmp (libname
, afptr
) == 0 )
584 /* Next, exclude symbols from certain startup objects. */
586 if (abfd
&& (p
= lbasename (abfd
->filename
)))
588 afptr
= autofilter_objlist
;
591 if (strcmp (p
, afptr
->name
) == 0)
597 /* Don't try to blindly exclude all symbols
598 that begin with '__'; this was tried and
599 it is too restrictive. Instead we have
600 a target specific list to use: */
601 afptr
= pe_details
->autofilter_symbollist
;
605 if (strcmp (n
, afptr
->name
) == 0)
611 /* Next, exclude symbols starting with ... */
612 afptr
= autofilter_symbolprefixlist
;
615 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
621 /* Finally, exclude symbols ending with ... */
623 afptr
= autofilter_symbolsuffixlist
;
626 if ((len
>= afptr
->len
)
627 /* Add 1 to insure match with trailing '\0'. */
628 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
629 afptr
->len
+ 1) == 0)
636 for (ex
= excludes
; ex
; ex
= ex
->next
)
638 if (ex
->type
== EXCLUDELIBS
)
641 && ((filename_cmp (libname
, ex
->string
) == 0)
642 || (strcasecmp ("ALL", ex
->string
) == 0)))
645 else if (ex
->type
== EXCLUDEFORIMPLIB
)
647 if (filename_cmp (abfd
->filename
, ex
->string
) == 0)
650 else if (strcmp (n
, ex
->string
) == 0)
658 process_def_file_and_drectve (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
661 struct bfd_link_hash_entry
*blhe
;
663 struct bfd_section
*s
;
664 def_file_export
*e
= 0;
665 bfd_boolean resort_needed
;
668 pe_def_file
= def_file_empty ();
670 /* First, run around to all the objects looking for the .drectve
671 sections, and push those into the def file too. */
672 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
674 s
= bfd_get_section_by_name (b
, ".drectve");
678 char *buf
= xmalloc (size
);
680 bfd_get_section_contents (b
, s
, buf
, 0, size
);
681 def_file_add_directive (pe_def_file
, buf
, size
);
686 /* Process aligned common symbol information from the
687 .drectve sections now; common symbol allocation is
688 done before final link, so it will be too late to
689 process them in process_embedded_commands() called
690 from _bfd_coff_link_input_bfd(). */
691 if (pe_def_file
->aligncomms
)
693 def_file_aligncomm
*ac
= pe_def_file
->aligncomms
;
696 struct coff_link_hash_entry
*sym_hash
;
697 sym_hash
= coff_link_hash_lookup (coff_hash_table (info
),
698 ac
->symbol_name
, FALSE
, FALSE
, FALSE
);
699 if (sym_hash
&& sym_hash
->root
.type
== bfd_link_hash_common
700 && sym_hash
->root
.u
.c
.p
->alignment_power
< (unsigned) ac
->alignment
)
702 sym_hash
->root
.u
.c
.p
->alignment_power
= (unsigned) ac
->alignment
;
708 /* If we are building an executable and there is nothing
709 to export, we do not build an export table at all. */
710 if (bfd_link_executable (info
) && pe_def_file
->num_exports
== 0
711 && (!pe_dll_export_everything
|| pe_dll_exclude_all_symbols
))
714 /* Now, maybe export everything else the default way. */
715 if ((pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
716 && !pe_dll_exclude_all_symbols
)
718 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
723 if (!bfd_generic_link_read_symbols (b
))
725 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
729 symbols
= bfd_get_outsymbols (b
);
730 nsyms
= bfd_get_symcount (b
);
732 for (j
= 0; j
< nsyms
; j
++)
734 /* We should export symbols which are either global or not
735 anything at all. (.bss data is the latter)
736 We should not export undefined symbols. */
737 bfd_boolean would_export
738 = (symbols
[j
]->section
!= bfd_und_section_ptr
739 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
740 || (symbols
[j
]->flags
== 0)));
741 if (link_info
.version_info
&& would_export
)
743 = !bfd_hide_sym_by_version (link_info
.version_info
,
747 const char *sn
= symbols
[j
]->name
;
749 /* We should not re-export imported stuff. */
755 name
= xmalloc (strlen ("__imp_") + strlen (sn
) + 1);
756 sprintf (name
, "%s%s", "__imp_", sn
);
758 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
759 FALSE
, FALSE
, FALSE
);
762 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
766 if (pe_details
->underscored
&& *sn
== '_')
769 if (auto_export (b
, pe_def_file
, sn
))
774 p
= def_file_add_export (pe_def_file
, sn
, 0, -1,
776 /* Fill data flag properly, from dlltool.c. */
778 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
786 #define NE pe_def_file->num_exports
788 /* Don't create an empty export table. */
792 resort_needed
= FALSE
;
794 /* Canonicalize the export list. */
797 for (i
= 0; i
< NE
; i
++)
799 /* Check for fastcall/stdcall-decoration, but ignore
800 C++ mangled names. */
801 if (pe_def_file
->exports
[i
].name
[0] != '?'
802 && strchr (pe_def_file
->exports
[i
].name
, '@'))
804 /* This will preserve internal_name, which may have been
805 pointing to the same memory as name, or might not
807 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
808 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
809 char *tmp_at
= strrchr (tmp
, '@');
814 einfo (_("%X%P: cannot export %s: invalid export name\n"),
815 pe_def_file
->exports
[i
].name
);
816 pe_def_file
->exports
[i
].name
= tmp
;
817 resort_needed
= TRUE
;
822 /* Re-sort the exports table as we have possibly changed the order
823 by removing leading @. */
825 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]),
828 if (pe_dll_stdcall_aliases
)
830 for (i
= 0; i
< NE
; i
++)
832 if (is_import (pe_def_file
->exports
[i
].name
))
835 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
838 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
839 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
841 *(strchr (tmp
, '@')) = 0;
842 if (auto_export (NULL
, pe_def_file
, tmp
))
843 def_file_add_export (pe_def_file
, tmp
,
844 pe_def_file
->exports
[i
].internal_name
,
852 /* Convenience, but watch out for it changing. */
853 e
= pe_def_file
->exports
;
855 for (i
= 0, j
= 0; i
< NE
; i
++)
857 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
859 /* This is a duplicate. */
860 if (e
[j
- 1].ordinal
!= -1
861 && e
[i
].ordinal
!= -1
862 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
864 if (pe_dll_warn_dup_exports
)
865 /* xgettext:c-format */
866 einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
867 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
871 if (pe_dll_warn_dup_exports
)
872 /* xgettext:c-format */
873 einfo (_("%P: warning, duplicate EXPORT: %s\n"),
877 if (e
[i
].ordinal
!= -1)
878 e
[j
- 1].ordinal
= e
[i
].ordinal
;
879 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
880 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
881 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
882 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
885 if (e
[i
].internal_name
)
886 free (e
[i
].internal_name
);
888 free (e
[i
].its_name
);
897 pe_def_file
->num_exports
= j
; /* == NE */
899 exported_symbol_offsets
= xmalloc (NE
* sizeof (bfd_vma
));
900 exported_symbol_sections
= xmalloc (NE
* sizeof (struct bfd_section
*));
902 memset (exported_symbol_sections
, 0, NE
* sizeof (struct bfd_section
*));
906 count_exported_byname
= 0;
907 count_with_ordinals
= 0;
909 for (i
= 0; i
< NE
; i
++)
911 char *int_name
= pe_def_file
->exports
[i
].internal_name
;
914 /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
915 lang_add_gc_name (int_name
);
917 name
= xmalloc (strlen (int_name
) + 2);
918 if (pe_details
->underscored
&& int_name
[0] != '@')
921 strcpy (name
+ 1, int_name
);
923 /* PR 19803: The alias must be preserved as well. */
924 lang_add_gc_name (xstrdup (name
));
927 strcpy (name
, int_name
);
929 blhe
= bfd_link_hash_lookup (info
->hash
,
934 && (blhe
->type
== bfd_link_hash_defined
935 || (blhe
->type
== bfd_link_hash_common
)))
938 if (!pe_def_file
->exports
[i
].flag_noname
)
939 count_exported_byname
++;
941 /* Only fill in the sections. The actual offsets are computed
942 in fill_exported_offsets() after common symbols are laid
944 if (blhe
->type
== bfd_link_hash_defined
)
945 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
947 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
949 if (pe_def_file
->exports
[i
].ordinal
!= -1)
951 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
952 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
953 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
954 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
955 count_with_ordinals
++;
958 /* Check for forward exports. These are indicated in DEF files by an
959 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
960 but we must take care not to be fooled when the user wants to export
961 a symbol that actually really has a dot in it, so we only check
962 for them here, after real defined symbols have already been matched. */
963 else if (strchr (int_name
, '.'))
966 if (!pe_def_file
->exports
[i
].flag_noname
)
967 count_exported_byname
++;
969 pe_def_file
->exports
[i
].flag_forward
= 1;
971 if (pe_def_file
->exports
[i
].ordinal
!= -1)
973 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
974 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
975 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
976 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
977 count_with_ordinals
++;
980 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
982 /* xgettext:c-format */
983 einfo (_("%X%P: cannot export %s: symbol not defined\n"),
988 /* xgettext:c-format */
989 einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
991 blhe
->type
, bfd_link_hash_defined
);
995 /* xgettext:c-format */
996 einfo (_("%X%P: cannot export %s: symbol not found\n"),
1003 /* Build the bfd that will contain .edata and .reloc sections. */
1006 build_filler_bfd (int include_edata
)
1008 lang_input_statement_type
*filler_file
;
1009 filler_file
= lang_add_input_file ("dll stuff",
1010 lang_input_file_is_fake_enum
,
1012 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff",
1013 link_info
.output_bfd
);
1014 if (filler_bfd
== NULL
1015 || !bfd_set_arch_mach (filler_bfd
,
1016 bfd_get_arch (link_info
.output_bfd
),
1017 bfd_get_mach (link_info
.output_bfd
)))
1019 einfo (_("%F%P: can not create BFD: %E\n"));
1025 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
1027 || !bfd_set_section_flags (edata_s
, (SEC_HAS_CONTENTS
1033 einfo (_("%X%P: can not create .edata section: %E\n"));
1036 bfd_set_section_size (edata_s
, edata_sz
);
1039 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
1041 || !bfd_set_section_flags (reloc_s
, (SEC_HAS_CONTENTS
1047 einfo (_("%X%P: can not create .reloc section: %E\n"));
1051 bfd_set_section_size (reloc_s
, 0);
1053 ldlang_add_file (filler_file
);
1056 /* Gather all the exported symbols and build the .edata section. */
1059 generate_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1061 int i
, next_ordinal
;
1062 int name_table_size
= 0;
1065 /* First, we need to know how many exported symbols there are,
1066 and what the range of ordinals is. */
1067 if (pe_def_file
->name
)
1068 dll_name
= pe_def_file
->name
;
1071 dll_name
= abfd
->filename
;
1073 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
1074 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
1075 dll_name
= dlnp
+ 1;
1078 if (count_with_ordinals
&& max_ordinal
> count_exported
)
1080 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
1081 min_ordinal
= max_ordinal
- count_exported
+ 1;
1086 max_ordinal
= count_exported
;
1089 export_table_size
= max_ordinal
- min_ordinal
+ 1;
1090 exported_symbols
= xmalloc (export_table_size
* sizeof (int));
1091 for (i
= 0; i
< export_table_size
; i
++)
1092 exported_symbols
[i
] = -1;
1094 /* Now we need to assign ordinals to those that don't have them. */
1095 for (i
= 0; i
< NE
; i
++)
1097 if (exported_symbol_sections
[i
]
1098 || pe_def_file
->exports
[i
].flag_forward
)
1100 if (pe_def_file
->exports
[i
].ordinal
!= -1)
1102 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
1103 int pi
= exported_symbols
[ei
];
1107 /* xgettext:c-format */
1108 einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
1109 pe_def_file
->exports
[i
].ordinal
,
1110 pe_def_file
->exports
[i
].name
,
1111 pe_def_file
->exports
[pi
].name
);
1113 exported_symbols
[ei
] = i
;
1115 if (pe_def_file
->exports
[i
].its_name
)
1116 name_table_size
+= strlen (pe_def_file
->exports
[i
].its_name
) + 1;
1118 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
1121 /* Reserve space for the forward name. */
1122 if (pe_def_file
->exports
[i
].flag_forward
)
1124 name_table_size
+= strlen (pe_def_file
->exports
[i
].internal_name
) + 1;
1128 next_ordinal
= min_ordinal
;
1129 for (i
= 0; i
< NE
; i
++)
1130 if ((exported_symbol_sections
[i
]
1131 || pe_def_file
->exports
[i
].flag_forward
)
1132 && pe_def_file
->exports
[i
].ordinal
== -1)
1134 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
1137 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
1138 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
1141 /* PR 12969: Check for more than 1^16 ordinals. */
1142 if (max_ordinal
> 65535 || next_ordinal
> 65535)
1143 /* xgettext:c-format */
1144 einfo(_("%X%P: error: export ordinal too large: %d\n"),
1145 max_ordinal
> next_ordinal
? max_ordinal
: next_ordinal
);
1147 /* OK, now we can allocate some memory. */
1148 edata_sz
= (40 /* directory */
1149 + 4 * export_table_size
/* addresses */
1150 + 4 * count_exported_byname
/* name ptrs */
1151 + 2 * count_exported_byname
/* ordinals */
1152 + name_table_size
+ strlen (dll_name
) + 1);
1155 /* Fill the exported symbol offsets. The preliminary work has already
1156 been done in process_def_file_and_drectve(). */
1159 fill_exported_offsets (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
1162 struct bfd_link_hash_entry
*blhe
;
1164 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1168 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
1169 if (pe_details
->underscored
1170 && *pe_def_file
->exports
[i
].internal_name
!= '@')
1173 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
1176 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
1178 blhe
= bfd_link_hash_lookup (info
->hash
,
1180 FALSE
, FALSE
, TRUE
);
1182 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
1183 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
1190 fill_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1193 unsigned char *edirectory
;
1194 unsigned char *eaddresses
;
1195 unsigned char *enameptrs
;
1196 unsigned char *eordinals
;
1199 edata_d
= xmalloc (edata_sz
);
1201 /* Note use of array pointer math here. */
1202 edirectory
= edata_d
;
1203 eaddresses
= edirectory
+ 40;
1204 enameptrs
= eaddresses
+ 4 * export_table_size
;
1205 eordinals
= enameptrs
+ 4 * count_exported_byname
;
1206 enamestr
= (char *) eordinals
+ 2 * count_exported_byname
;
1208 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1209 + edata_s->output_section->vma - image_base)
1211 memset (edata_d
, 0, edata_sz
);
1213 if (pe_data (abfd
)->insert_timestamp
)
1214 H_PUT_32 (abfd
, time (0), edata_d
+ 4);
1216 if (pe_def_file
->version_major
!= -1)
1218 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
1219 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
1222 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
1223 strcpy (enamestr
, dll_name
);
1224 enamestr
+= strlen (enamestr
) + 1;
1225 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
1226 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
1227 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
1228 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
1229 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
1230 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
1232 fill_exported_offsets (abfd
, info
);
1234 /* Ok, now for the filling in part.
1235 Scan alphabetically - ie the ordering in the exports[] table,
1236 rather than by ordinal - the ordering in the exported_symbol[]
1237 table. See dlltool.c and:
1238 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1239 for more information. */
1241 for (s
= 0; s
< NE
; s
++)
1243 struct bfd_section
*ssec
= exported_symbol_sections
[s
];
1244 if (pe_def_file
->exports
[s
].ordinal
!= -1
1245 && (pe_def_file
->exports
[s
].flag_forward
|| ssec
!= NULL
))
1247 int ord
= pe_def_file
->exports
[s
].ordinal
;
1249 if (pe_def_file
->exports
[s
].flag_forward
)
1251 bfd_put_32 (abfd
, ERVA (enamestr
),
1252 eaddresses
+ 4 * (ord
- min_ordinal
));
1254 strcpy (enamestr
, pe_def_file
->exports
[s
].internal_name
);
1255 enamestr
+= strlen (pe_def_file
->exports
[s
].internal_name
) + 1;
1259 bfd_vma srva
= (exported_symbol_offsets
[s
]
1260 + ssec
->output_section
->vma
1261 + ssec
->output_offset
);
1263 bfd_put_32 (abfd
, srva
- image_base
,
1264 eaddresses
+ 4 * (ord
- min_ordinal
));
1267 if (!pe_def_file
->exports
[s
].flag_noname
)
1269 char *ename
= pe_def_file
->exports
[s
].name
;
1270 if (pe_def_file
->exports
[s
].its_name
)
1271 ename
= pe_def_file
->exports
[s
].its_name
;
1273 bfd_put_32 (abfd
, ERVA (enamestr
), enameptrs
);
1275 strcpy (enamestr
, ename
);
1276 enamestr
+= strlen (enamestr
) + 1;
1277 bfd_put_16 (abfd
, ord
- min_ordinal
, eordinals
);
1279 pe_def_file
->exports
[s
].hint
= hint
++;
1286 static struct bfd_section
*current_sec
;
1289 pe_walk_relocs (struct bfd_link_info
*info
,
1291 const char *symname
,
1292 struct bfd_hash_table
*import_hash
,
1293 void (*cb
) (arelent
*, asection
*, char *, const char *))
1298 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
1302 if (!bfd_generic_link_read_symbols (b
))
1304 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
1308 symbols
= bfd_get_outsymbols (b
);
1310 for (s
= b
->sections
; s
; s
= s
->next
)
1313 int relsize
, nrelocs
, i
;
1314 int flags
= bfd_section_flags (s
);
1316 /* Skip discarded linkonce sections. */
1317 if (flags
& SEC_LINK_ONCE
1318 && s
->output_section
== bfd_abs_section_ptr
)
1323 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1324 relocs
= xmalloc (relsize
);
1325 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1327 for (i
= 0; i
< nrelocs
; i
++)
1329 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1331 /* Warning: the callback needs to be passed NAME directly. */
1334 if (bfd_hash_lookup (import_hash
, sym
->name
, FALSE
, FALSE
))
1336 strcpy (name
, sym
->name
);
1337 cb (relocs
[i
], s
, name
, symname
);
1342 if (strcmp (name
, sym
->name
) == 0)
1343 cb (relocs
[i
], s
, name
, symname
);
1349 /* Warning: the allocated symbols are remembered in BFD and reused
1350 later, so don't free them! */
1351 /* free (symbols); */
1357 pe_find_data_imports (const char *symhead
,
1358 void (*cb
) (arelent
*, asection
*, char *, const char *))
1360 struct bfd_link_hash_entry
*undef
;
1361 const size_t headlen
= strlen (symhead
);
1364 struct bfd_hash_table
*import_hash
;
1366 for (undef
= link_info
.hash
->undefs
; undef
; undef
= undef
->u
.undef
.next
)
1367 if (undef
->type
== bfd_link_hash_undefined
)
1369 size_t len
= strlen (undef
->root
.string
);
1376 /* For the pseudo-relocation support version 2, we can collect the symbols
1377 that are subject to auto-import and adjust the relocations en masse. */
1378 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
1381 = (struct bfd_hash_table
*) xmalloc (sizeof (struct bfd_hash_table
));
1382 if (!bfd_hash_table_init (import_hash
,
1384 sizeof (struct bfd_hash_entry
)))
1385 einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
1390 /* We are being a bit cunning here. The buffer will have space for
1391 prefixes at the beginning. The prefix is modified here and in a
1392 number of functions called from this function. */
1393 #define PREFIX_LEN 32
1394 buf
= xmalloc (PREFIX_LEN
+ namelen
+ 1);
1395 name
= buf
+ PREFIX_LEN
;
1397 for (undef
= link_info
.hash
->undefs
; undef
; undef
= undef
->u
.undef
.next
)
1398 if (undef
->type
== bfd_link_hash_undefined
)
1400 struct bfd_link_hash_entry
*sym
;
1403 if (pe_dll_extra_pe_debug
)
1404 printf ("%s:%s\n", __FUNCTION__
, undef
->root
.string
);
1406 strcpy (name
, undef
->root
.string
);
1407 impname
= name
- (sizeof "__imp_" - 1);
1408 memcpy (impname
, "__imp_", sizeof "__imp_" - 1);
1410 sym
= bfd_link_hash_lookup (link_info
.hash
, impname
, 0, 0, 1);
1412 if (sym
&& sym
->type
== bfd_link_hash_defined
)
1415 bfd_hash_lookup (import_hash
, undef
->root
.string
, TRUE
, FALSE
);
1418 bfd
*b
= sym
->u
.def
.section
->owner
;
1419 const char *symname
= NULL
;
1423 if (!bfd_generic_link_read_symbols (b
))
1425 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
1429 symbols
= bfd_get_outsymbols (b
);
1430 nsyms
= bfd_get_symcount (b
);
1432 for (i
= 0; i
< nsyms
; i
++)
1433 if (strncmp (symbols
[i
]->name
, symhead
, headlen
) == 0)
1435 if (pe_dll_extra_pe_debug
)
1436 printf ("->%s\n", symbols
[i
]->name
);
1438 symname
= symbols
[i
]->name
+ headlen
;
1442 /* If the symobl isn't part of an import table, there is no
1443 point in building a fixup, this would give rise to link
1444 errors for mangled symbols instead of the original one. */
1446 pe_walk_relocs (&link_info
, name
, symname
, NULL
, cb
);
1451 /* Let's differentiate it somehow from defined. */
1452 undef
->type
= bfd_link_hash_defweak
;
1453 undef
->u
.def
.value
= sym
->u
.def
.value
;
1454 undef
->u
.def
.section
= sym
->u
.def
.section
;
1456 /* We replace the original name with the __imp_ prefixed one, this
1457 1) may trash memory 2) leads to duplicate symbols. But this is
1458 better than having a misleading name that can confuse GDB. */
1459 undef
->root
.string
= sym
->root
.string
;
1461 if (link_info
.pei386_auto_import
== -1)
1463 static bfd_boolean warned
= FALSE
;
1465 info_msg (_("Info: resolving %s by linking to %s "
1466 "(auto-import)\n"), name
, impname
);
1468 /* PR linker/4844. */
1471 einfo (_("%P: warning: auto-importing has been activated "
1472 "without --enable-auto-import specified on the "
1473 "command line; this should work unless it "
1474 "involves constant data structures referencing "
1475 "symbols from auto-imported DLLs\n"));
1482 /* If we have the import hash table, walk the relocations only once. */
1485 pe_walk_relocs (&link_info
, name
, NULL
, import_hash
, cb
);
1486 bfd_hash_table_free (import_hash
);
1493 /* Gather all the relocations and build the .reloc section. */
1496 generate_reloc (bfd
*abfd
, struct bfd_link_info
*info
)
1499 /* For .reloc stuff. */
1500 reloc_data_type
*reloc_data
;
1501 int total_relocs
= 0;
1503 bfd_vma sec_page
= (bfd_vma
) -1;
1504 bfd_vma page_ptr
, page_count
;
1507 struct bfd_section
*s
;
1510 for (b
= info
->input_bfds
; b
; b
= b
->link
.next
)
1511 for (s
= b
->sections
; s
; s
= s
->next
)
1512 total_relocs
+= s
->reloc_count
;
1514 reloc_data
= xmalloc (total_relocs
* sizeof (reloc_data_type
));
1518 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link
.next
)
1521 int relsize
, nrelocs
;
1523 for (s
= b
->sections
; s
; s
= s
->next
)
1525 bfd_vma sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1528 /* If it's not loaded, we don't need to relocate it this way. */
1529 if (!(s
->output_section
->flags
& SEC_LOAD
))
1532 /* I don't know why there would be a reloc for these, but I've
1533 seen it happen - DJ */
1534 if (s
->output_section
== bfd_abs_section_ptr
)
1537 if (s
->output_section
->vma
== 0)
1539 /* Huh? Shouldn't happen, but punt if it does. */
1540 einfo (_("%P: zero vma section reloc detected: `%s' #%d f=%d\n"),
1541 s
->output_section
->name
, s
->output_section
->index
,
1542 s
->output_section
->flags
);
1546 if (!bfd_generic_link_read_symbols (b
))
1548 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b
);
1552 symbols
= bfd_get_outsymbols (b
);
1553 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1554 relocs
= xmalloc (relsize
);
1555 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1557 for (i
= 0; i
< nrelocs
; i
++)
1559 if (pe_dll_extra_pe_debug
)
1561 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1562 printf ("rel: %s\n", sym
->name
);
1564 if (!relocs
[i
]->howto
->pc_relative
1565 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1567 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1569 /* Don't create relocs for undefined weak symbols. */
1570 if (sym
->flags
== BSF_WEAK
)
1572 struct bfd_link_hash_entry
*blhe
1573 = bfd_wrapped_link_hash_lookup (abfd
, info
, sym
->name
,
1574 FALSE
, FALSE
, FALSE
);
1575 if (blhe
&& blhe
->type
== bfd_link_hash_undefweak
)
1577 /* Check aux sym and see if it is defined or not. */
1578 struct coff_link_hash_entry
*h
, *h2
;
1579 h
= (struct coff_link_hash_entry
*)blhe
;
1580 if (h
->symbol_class
!= C_NT_WEAK
|| h
->numaux
!= 1)
1582 h2
= h
->auxbfd
->tdata
.coff_obj_data
->sym_hashes
1583 [h
->aux
->x_sym
.x_tagndx
.l
];
1584 /* We don't want a base reloc if the aux sym is not
1585 found, undefined, or if it is the constant ABS
1586 zero default value. (We broaden that slightly by
1587 not testing the value, just the section; there's
1588 no reason we'd want a reference to any absolute
1589 address to get relocated during rebasing). */
1590 if (!h2
|| h2
->root
.type
== bfd_link_hash_undefined
1591 || h2
->root
.u
.def
.section
== bfd_abs_section_ptr
)
1594 else if (!blhe
|| blhe
->type
!= bfd_link_hash_defined
)
1597 /* Nor for Dwarf FDE references to discarded sections. */
1598 else if (bfd_is_abs_section (sym
->section
->output_section
))
1600 /* We only ignore relocs from .eh_frame sections, as
1601 they are discarded by the final link rather than
1602 resolved against the kept section. */
1603 if (!strcmp (s
->name
, ".eh_frame"))
1607 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1608 reloc_data
[total_relocs
].idx
= total_relocs
;
1610 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1612 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1613 relocs
[i
]->howto
->rightshift
)
1615 #ifdef pe_use_x86_64
1616 case BITS_AND_SHIFT (64, 0):
1617 reloc_data
[total_relocs
].type
= 10;
1621 case BITS_AND_SHIFT (32, 0):
1622 reloc_data
[total_relocs
].type
= 3;
1625 case BITS_AND_SHIFT (16, 0):
1626 reloc_data
[total_relocs
].type
= 2;
1629 case BITS_AND_SHIFT (16, 16):
1630 reloc_data
[total_relocs
].type
= 4;
1631 /* FIXME: we can't know the symbol's right value
1632 yet, but we probably can safely assume that
1633 CE will relocate us in 64k blocks, so leaving
1635 reloc_data
[total_relocs
].extra
= 0;
1638 case BITS_AND_SHIFT (26, 2):
1639 reloc_data
[total_relocs
].type
= 5;
1642 case BITS_AND_SHIFT (24, 2):
1643 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1644 Those ARM_xxx definitions should go in proper
1646 if (relocs
[i
]->howto
->type
== 0
1647 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1648 || relocs
[i
]->howto
->type
== 5)
1649 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1650 that has already been fully processed during a
1651 previous link stage, so ignore it here. */
1655 /* xgettext:c-format */
1656 einfo (_("%X%P: error: %d-bit reloc in dll\n"),
1657 relocs
[i
]->howto
->bitsize
);
1663 /* Warning: the allocated symbols are remembered in BFD and
1664 reused later, so don't free them! */
1668 /* At this point, we have total_relocs relocation addresses in
1669 reloc_addresses, which are all suitable for the .reloc section.
1670 We must now create the new sections. */
1671 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1673 for (i
= 0; i
< total_relocs
; i
++)
1675 bfd_vma this_page
= (reloc_data
[i
].vma
>> 12);
1677 if (this_page
!= sec_page
)
1679 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1681 sec_page
= this_page
;
1686 if (reloc_data
[i
].type
== 4)
1690 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1691 reloc_d
= xmalloc (reloc_sz
);
1692 sec_page
= (bfd_vma
) -1;
1694 page_ptr
= (bfd_vma
) -1;
1697 for (i
= 0; i
< total_relocs
; i
++)
1699 bfd_vma rva
= reloc_data
[i
].vma
- image_base
;
1700 bfd_vma this_page
= (rva
& ~0xfff);
1702 if (this_page
!= sec_page
)
1704 while (reloc_sz
& 3)
1705 reloc_d
[reloc_sz
++] = 0;
1707 if (page_ptr
!= (bfd_vma
) -1)
1708 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1710 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1711 page_ptr
= reloc_sz
;
1713 sec_page
= this_page
;
1717 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1718 reloc_d
+ reloc_sz
);
1721 if (reloc_data
[i
].type
== 4)
1723 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1730 while (reloc_sz
& 3)
1731 reloc_d
[reloc_sz
++] = 0;
1733 if (page_ptr
!= (bfd_vma
) -1)
1734 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1736 while (reloc_sz
< reloc_s
->size
)
1737 reloc_d
[reloc_sz
++] = 0;
1740 /* Given the exiting def_file structure, print out a .DEF file that
1741 corresponds to it. */
1744 quoteput (char *s
, FILE *f
, int needs_quotes
)
1748 for (cp
= s
; *cp
; cp
++)
1763 if (*s
== '"' || *s
== '\\')
1777 pe_dll_generate_def_file (const char *pe_out_def_filename
)
1780 FILE *out
= fopen (pe_out_def_filename
, "w");
1783 /* xgettext:c-format */
1784 einfo (_("%P: can't open output def file %s\n"),
1785 pe_out_def_filename
);
1789 if (pe_def_file
->name
)
1791 if (pe_def_file
->is_dll
)
1792 fprintf (out
, "LIBRARY ");
1794 fprintf (out
, "NAME ");
1796 quoteput (pe_def_file
->name
, out
, 1);
1798 if (pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
)
1800 fprintf (out
, " BASE=0x");
1801 fprintf_vma (out
, ((bfd_vma
) pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
));
1803 fprintf (out
, "\n");
1806 if (pe_def_file
->description
)
1808 fprintf (out
, "DESCRIPTION ");
1809 quoteput (pe_def_file
->description
, out
, 1);
1810 fprintf (out
, "\n");
1813 if (pe_def_file
->version_minor
!= -1)
1814 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1815 pe_def_file
->version_minor
);
1816 else if (pe_def_file
->version_major
!= -1)
1817 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1819 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1820 fprintf (out
, "\n");
1822 if (pe_def_file
->stack_commit
!= -1)
1823 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1824 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1825 else if (pe_def_file
->stack_reserve
!= -1)
1826 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1828 if (pe_def_file
->heap_commit
!= -1)
1829 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1830 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1831 else if (pe_def_file
->heap_reserve
!= -1)
1832 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1834 if (pe_def_file
->num_section_defs
> 0)
1836 fprintf (out
, "\nSECTIONS\n\n");
1838 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1841 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1843 if (pe_def_file
->section_defs
[i
].class)
1845 fprintf (out
, " CLASS ");
1846 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1849 if (pe_def_file
->section_defs
[i
].flag_read
)
1850 fprintf (out
, " READ");
1852 if (pe_def_file
->section_defs
[i
].flag_write
)
1853 fprintf (out
, " WRITE");
1855 if (pe_def_file
->section_defs
[i
].flag_execute
)
1856 fprintf (out
, " EXECUTE");
1858 if (pe_def_file
->section_defs
[i
].flag_shared
)
1859 fprintf (out
, " SHARED");
1861 fprintf (out
, "\n");
1865 if (pe_def_file
->num_exports
> 0)
1867 fprintf (out
, "EXPORTS\n");
1869 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1871 def_file_export
*e
= pe_def_file
->exports
+ i
;
1873 quoteput (e
->name
, out
, 0);
1875 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1877 fprintf (out
, " = ");
1878 quoteput (e
->internal_name
, out
, 0);
1881 if (e
->ordinal
!= -1)
1882 fprintf (out
, " @%d", e
->ordinal
);
1884 if (e
->flag_private
)
1885 fprintf (out
, " PRIVATE");
1887 if (e
->flag_constant
)
1888 fprintf (out
, " CONSTANT");
1891 fprintf (out
, " NONAME");
1894 fprintf (out
, " DATA");
1896 fprintf (out
, "\n");
1900 if (pe_def_file
->num_imports
> 0)
1902 fprintf (out
, "\nIMPORTS\n\n");
1904 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1906 def_file_import
*im
= pe_def_file
->imports
+ i
;
1909 if (im
->internal_name
1910 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1912 quoteput (im
->internal_name
, out
, 0);
1913 fprintf (out
, " = ");
1916 quoteput (im
->module
->name
, out
, 0);
1920 quoteput (im
->name
, out
, 0);
1922 fprintf (out
, "%d", im
->ordinal
);
1926 fprintf (out
, " == ");
1927 quoteput (im
->its_name
, out
, 0);
1930 fprintf (out
, "\n");
1935 fprintf (out
, _("; no contents available\n"));
1937 if (fclose (out
) == EOF
)
1938 /* xgettext:c-format */
1939 einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename
);
1942 /* Generate the import library. */
1944 static asymbol
**symtab
;
1947 static const char *dll_filename
;
1948 static char *dll_symname
;
1950 #define UNDSEC bfd_und_section_ptr
1953 quick_section (bfd
*abfd
, const char *name
, int flags
, int align
)
1958 sec
= bfd_make_section_old_way (abfd
, name
);
1959 bfd_set_section_flags (sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1960 bfd_set_section_alignment (sec
, align
);
1961 /* Remember to undo this before trying to link internally! */
1962 sec
->output_section
= sec
;
1964 sym
= bfd_make_empty_symbol (abfd
);
1965 symtab
[symptr
++] = sym
;
1966 sym
->name
= sec
->name
;
1968 sym
->flags
= BSF_LOCAL
;
1975 quick_symbol (bfd
*abfd
,
1984 char *name
= xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1989 sym
= bfd_make_empty_symbol (abfd
);
1994 symtab
[symptr
++] = sym
;
1997 static arelent
*reltab
= 0;
1998 static int relcount
= 0, relsize
= 0;
2001 quick_reloc (bfd
*abfd
, bfd_size_type address
, int which_howto
, int symidx
)
2003 if (relcount
>= relsize
- 1)
2007 reltab
= xrealloc (reltab
, relsize
* sizeof (arelent
));
2009 reltab
= xmalloc (relsize
* sizeof (arelent
));
2011 reltab
[relcount
].address
= address
;
2012 reltab
[relcount
].addend
= 0;
2013 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
2014 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
2019 save_relocs (asection
*sec
)
2023 sec
->relocation
= reltab
;
2024 sec
->reloc_count
= relcount
;
2025 sec
->orelocation
= xmalloc ((relcount
+ 1) * sizeof (arelent
*));
2026 for (i
= 0; i
< relcount
; i
++)
2027 sec
->orelocation
[i
] = sec
->relocation
+ i
;
2028 sec
->orelocation
[relcount
] = 0;
2029 sec
->flags
|= SEC_RELOC
;
2031 relcount
= relsize
= 0;
2034 /* .section .idata$2
2035 .global __head_my_dll
2052 make_head (bfd
*parent
)
2054 asection
*id2
, *id5
, *id4
;
2055 unsigned char *d2
, *d5
, *d4
;
2059 oname
= xmalloc (20);
2060 sprintf (oname
, "d%06d.o", tmp_seq
);
2063 abfd
= bfd_create (oname
, parent
);
2064 bfd_find_target (pe_details
->object_target
, abfd
);
2065 bfd_make_writable (abfd
);
2067 bfd_set_format (abfd
, bfd_object
);
2068 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2071 symtab
= xmalloc (6 * sizeof (asymbol
*));
2072 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2073 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2074 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2075 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2076 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2078 /* OK, pay attention here. I got confused myself looking back at
2079 it. We create a four-byte section to mark the beginning of the
2080 list, and we include an offset of 4 in the section, so that the
2081 pointer to the list points to the *end* of this section, which is
2082 the start of the list of sections from other objects. */
2084 bfd_set_section_size (id2
, 20);
2088 if (pe_use_nul_prefixed_import_tables
)
2089 d2
[0] = d2
[16] = PE_IDATA5_SIZE
; /* Reloc addend. */
2090 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2091 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
2092 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
2095 if (pe_use_nul_prefixed_import_tables
)
2096 bfd_set_section_size (id5
, PE_IDATA5_SIZE
);
2098 bfd_set_section_size (id5
, 0);
2099 d5
= xmalloc (PE_IDATA5_SIZE
);
2101 memset (d5
, 0, PE_IDATA5_SIZE
);
2102 if (pe_use_nul_prefixed_import_tables
)
2103 bfd_set_section_size (id4
, PE_IDATA4_SIZE
);
2105 bfd_set_section_size (id4
, 0);
2106 d4
= xmalloc (PE_IDATA4_SIZE
);
2108 memset (d4
, 0, PE_IDATA4_SIZE
);
2110 bfd_set_symtab (abfd
, symtab
, symptr
);
2112 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2113 if (pe_use_nul_prefixed_import_tables
)
2115 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2116 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2120 bfd_set_section_contents (abfd
, id5
, d5
, 0, 0);
2121 bfd_set_section_contents (abfd
, id4
, d4
, 0, 0);
2124 bfd_make_readable (abfd
);
2128 /* .section .idata$4
2135 .global __my_dll_iname
2140 make_tail (bfd
*parent
)
2142 asection
*id4
, *id5
, *id7
;
2143 unsigned char *d4
, *d5
, *d7
;
2148 oname
= xmalloc (20);
2149 sprintf (oname
, "d%06d.o", tmp_seq
);
2152 abfd
= bfd_create (oname
, parent
);
2153 bfd_find_target (pe_details
->object_target
, abfd
);
2154 bfd_make_writable (abfd
);
2156 bfd_set_format (abfd
, bfd_object
);
2157 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2160 symtab
= xmalloc (5 * sizeof (asymbol
*));
2161 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2162 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2163 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2164 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
2166 bfd_set_section_size (id4
, PE_IDATA4_SIZE
);
2167 d4
= xmalloc (PE_IDATA4_SIZE
);
2169 memset (d4
, 0, PE_IDATA4_SIZE
);
2171 bfd_set_section_size (id5
, PE_IDATA5_SIZE
);
2172 d5
= xmalloc (PE_IDATA5_SIZE
);
2174 memset (d5
, 0, PE_IDATA5_SIZE
);
2176 len
= strlen (dll_filename
) + 1;
2179 bfd_set_section_size (id7
, len
);
2182 strcpy ((char *) d7
, dll_filename
);
2183 /* If len was odd, the above
2184 strcpy leaves behind an undefined byte. That is harmless,
2185 but we set it to 0 just so the binary dumps are pretty. */
2188 bfd_set_symtab (abfd
, symtab
, symptr
);
2190 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2191 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2192 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
2194 bfd_make_readable (abfd
);
2200 .global ___imp_function
2201 .global __imp__function
2203 jmp *__imp__function:
2217 .asciz "function" xlate? (add underscore, kill at) */
2219 static const unsigned char jmp_ix86_bytes
[] =
2221 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2229 .dw __imp_function */
2231 static const unsigned char jmp_sh_bytes
[] =
2233 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2237 lui $t0,<high:__imp_function>
2238 lw $t0,<low:__imp_function>
2242 static const unsigned char jmp_mips_bytes
[] =
2244 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2245 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2248 static const unsigned char jmp_arm_bytes
[] =
2250 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2251 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2257 make_one (def_file_export
*exp
, bfd
*parent
, bfd_boolean include_jmp_stub
)
2259 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
2260 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
2264 const unsigned char *jmp_bytes
= NULL
;
2265 int jmp_byte_count
= 0;
2267 /* Include the jump stub section only if it is needed. A jump
2268 stub is needed if the symbol being imported <sym> is a function
2269 symbol and there is at least one undefined reference to that
2270 symbol. In other words, if all the import references to <sym> are
2271 explicitly through _declspec(dllimport) then the jump stub is not
2273 if (include_jmp_stub
)
2275 switch (pe_details
->pe_arch
)
2278 jmp_bytes
= jmp_ix86_bytes
;
2279 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
2282 jmp_bytes
= jmp_sh_bytes
;
2283 jmp_byte_count
= sizeof (jmp_sh_bytes
);
2286 jmp_bytes
= jmp_mips_bytes
;
2287 jmp_byte_count
= sizeof (jmp_mips_bytes
);
2290 case PE_ARCH_arm_wince
:
2291 jmp_bytes
= jmp_arm_bytes
;
2292 jmp_byte_count
= sizeof (jmp_arm_bytes
);
2299 oname
= xmalloc (20);
2300 sprintf (oname
, "d%06d.o", tmp_seq
);
2303 abfd
= bfd_create (oname
, parent
);
2304 bfd_find_target (pe_details
->object_target
, abfd
);
2305 bfd_make_writable (abfd
);
2307 bfd_set_format (abfd
, bfd_object
);
2308 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2311 symtab
= xmalloc (12 * sizeof (asymbol
*));
2313 tx
= quick_section (abfd
, ".text", SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
, 2);
2314 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2315 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2316 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2317 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
2319 if (*exp
->internal_name
== '@')
2321 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2323 if (include_jmp_stub
)
2324 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
2325 quick_symbol (abfd
, "__imp_", exp
->internal_name
, "", id5
,
2327 /* Fastcall applies only to functions,
2328 so no need for auto-import symbol. */
2332 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2334 if (include_jmp_stub
)
2335 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
,
2337 quick_symbol (abfd
, "__imp_", U (""), exp
->internal_name
, id5
,
2339 /* Symbol to reference ord/name of imported
2340 data symbol, used to implement auto-import. */
2342 quick_symbol (abfd
, "__nm_", U (""), exp
->internal_name
, id6
,
2345 if (pe_dll_compat_implib
)
2346 quick_symbol (abfd
, "___imp_", exp
->internal_name
, "", id5
,
2349 if (include_jmp_stub
)
2351 bfd_set_section_size (tx
, jmp_byte_count
);
2352 td
= xmalloc (jmp_byte_count
);
2354 memcpy (td
, jmp_bytes
, jmp_byte_count
);
2356 switch (pe_details
->pe_arch
)
2359 #ifdef pe_use_x86_64
2360 quick_reloc (abfd
, 2, BFD_RELOC_32_PCREL
, 2);
2362 /* Mark this object as SAFESEH compatible. */
2363 quick_symbol (abfd
, "", "@feat.00", "", bfd_abs_section_ptr
,
2365 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
2369 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2372 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
2373 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
2374 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
2377 case PE_ARCH_arm_wince
:
2378 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2386 bfd_set_section_size (tx
, 0);
2388 bfd_set_section_size (id7
, 4);
2392 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 5);
2395 bfd_set_section_size (id5
, PE_IDATA5_SIZE
);
2396 d5
= xmalloc (PE_IDATA5_SIZE
);
2398 memset (d5
, 0, PE_IDATA5_SIZE
);
2400 if (exp
->flag_noname
)
2402 d5
[0] = exp
->ordinal
;
2403 d5
[1] = exp
->ordinal
>> 8;
2404 d5
[PE_IDATA5_SIZE
- 1] = 0x80;
2408 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2412 bfd_set_section_size (id4
, PE_IDATA4_SIZE
);
2413 d4
= xmalloc (PE_IDATA4_SIZE
);
2415 memset (d4
, 0, PE_IDATA4_SIZE
);
2417 if (exp
->flag_noname
)
2419 d4
[0] = exp
->ordinal
;
2420 d4
[1] = exp
->ordinal
>> 8;
2421 d4
[PE_IDATA4_SIZE
- 1] = 0x80;
2425 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2429 if (exp
->flag_noname
)
2432 bfd_set_section_size (id6
, 0);
2438 /* { short, asciz } */
2440 len
= 2 + strlen (exp
->its_name
) + 1;
2442 len
= 2 + strlen (exp
->name
) + 1;
2445 bfd_set_section_size (id6
, len
);
2448 memset (d6
, 0, len
);
2450 /* PR 20880: Use exp->hint as a backup, just in case exp->ordinal
2451 contains an invalid value (-1). */
2452 ord
= (exp
->ordinal
>= 0) ? exp
->ordinal
: exp
->hint
;
2457 strcpy ((char*) d6
+ 2, exp
->its_name
);
2459 strcpy ((char *) d6
+ 2, exp
->name
);
2462 bfd_set_symtab (abfd
, symtab
, symptr
);
2464 if (include_jmp_stub
)
2465 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
2466 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
2467 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2468 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2469 if (!exp
->flag_noname
)
2470 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
2472 bfd_make_readable (abfd
);
2477 make_singleton_name_thunk (const char *import
, bfd
*parent
)
2479 /* Name thunks go to idata$4. */
2485 oname
= xmalloc (20);
2486 sprintf (oname
, "nmth%06d.o", tmp_seq
);
2489 abfd
= bfd_create (oname
, parent
);
2490 bfd_find_target (pe_details
->object_target
, abfd
);
2491 bfd_make_writable (abfd
);
2493 bfd_set_format (abfd
, bfd_object
);
2494 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2497 symtab
= xmalloc (3 * sizeof (asymbol
*));
2498 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2499 quick_symbol (abfd
, "__nm_thnk_", import
, "", id4
, BSF_GLOBAL
, 0);
2500 quick_symbol (abfd
, "__nm_", import
, "", UNDSEC
, BSF_GLOBAL
, 0);
2502 /* We need space for the real thunk and for the null terminator. */
2503 bfd_set_section_size (id4
, PE_IDATA4_SIZE
* 2);
2504 d4
= xmalloc (PE_IDATA4_SIZE
* 2);
2506 memset (d4
, 0, PE_IDATA4_SIZE
* 2);
2507 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2510 bfd_set_symtab (abfd
, symtab
, symptr
);
2512 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
* 2);
2514 bfd_make_readable (abfd
);
2519 make_import_fixup_mark (arelent
*rel
, char *name
)
2521 /* We convert reloc to symbol, for later reference. */
2522 static unsigned int counter
;
2523 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2524 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2525 struct bfd_link_hash_entry
*bh
;
2526 char *fixup_name
, buf
[26];
2529 /* "name" buffer has space before the symbol name for prefixes. */
2530 sprintf (buf
, "__fu%d_", counter
++);
2531 prefix_len
= strlen (buf
);
2532 fixup_name
= name
- prefix_len
;
2533 memcpy (fixup_name
, buf
, prefix_len
);
2536 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2537 current_sec
, /* sym->section, */
2538 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2540 return bh
->root
.string
;
2543 /* .section .idata$2
2544 .rva __nm_thnk_SYM (singleton thunk with name of func)
2547 .rva __my_dll_iname (name of dll)
2548 .rva __fuNN_SYM (pointer to reference (address) in text) */
2551 make_import_fixup_entry (const char *name
,
2552 const char *fixup_name
,
2553 const char *symname
,
2561 oname
= xmalloc (20);
2562 sprintf (oname
, "fu%06d.o", tmp_seq
);
2565 abfd
= bfd_create (oname
, parent
);
2566 bfd_find_target (pe_details
->object_target
, abfd
);
2567 bfd_make_writable (abfd
);
2569 bfd_set_format (abfd
, bfd_object
);
2570 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2573 symtab
= xmalloc (6 * sizeof (asymbol
*));
2574 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2576 quick_symbol (abfd
, "__nm_thnk_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2577 quick_symbol (abfd
, U (""), symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2578 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2580 bfd_set_section_size (id2
, 20);
2585 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2586 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2587 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2590 bfd_set_symtab (abfd
, symtab
, symptr
);
2592 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2594 bfd_make_readable (abfd
);
2598 /* .section .rdata_runtime_pseudo_reloc
2600 .rva __fuNN_SYM (pointer to reference (address) in text) */
2603 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED
,
2604 const char *fixup_name
,
2605 bfd_vma addend ATTRIBUTE_UNUSED
,
2610 unsigned char *rt_rel_d
;
2615 oname
= xmalloc (20);
2616 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2619 abfd
= bfd_create (oname
, parent
);
2620 bfd_find_target (pe_details
->object_target
, abfd
);
2621 bfd_make_writable (abfd
);
2623 bfd_set_format (abfd
, bfd_object
);
2624 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2626 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2628 if (runtime_pseudp_reloc_v2_init
)
2629 size
= 3 * sizeof (asymbol
*);
2631 size
= 6 * sizeof (asymbol
*);
2634 size
= 2 * sizeof (asymbol
*);
2637 symtab
= xmalloc (size
);
2640 = quick_section (abfd
, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS
, 2);
2642 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2644 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2647 if (!runtime_pseudp_reloc_v2_init
)
2650 runtime_pseudp_reloc_v2_init
= TRUE
;
2653 quick_symbol (abfd
, "__imp_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2655 bfd_set_section_size (rt_rel
, size
);
2656 rt_rel_d
= xmalloc (size
);
2657 rt_rel
->contents
= rt_rel_d
;
2658 memset (rt_rel_d
, 0, size
);
2659 quick_reloc (abfd
, size
- 8, BFD_RELOC_RVA
, 1);
2660 quick_reloc (abfd
, size
- 12, BFD_RELOC_RVA
, 2);
2661 bfd_put_32 (abfd
, bitsize
, rt_rel_d
+ (size
- 4));
2663 bfd_put_32 (abfd
, 1, rt_rel_d
+ 8);
2664 save_relocs (rt_rel
);
2666 bfd_set_symtab (abfd
, symtab
, symptr
);
2668 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, size
);
2672 bfd_set_section_size (rt_rel
, 8);
2673 rt_rel_d
= xmalloc (8);
2674 rt_rel
->contents
= rt_rel_d
;
2675 memset (rt_rel_d
, 0, 8);
2677 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2678 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2680 save_relocs (rt_rel
);
2682 bfd_set_symtab (abfd
, symtab
, symptr
);
2684 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2687 bfd_make_readable (abfd
);
2692 .rva __pei386_runtime_relocator */
2695 pe_create_runtime_relocator_reference (bfd
*parent
)
2697 asection
*extern_rt_rel
;
2698 unsigned char *extern_rt_rel_d
;
2702 oname
= xmalloc (20);
2703 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2706 abfd
= bfd_create (oname
, parent
);
2707 bfd_find_target (pe_details
->object_target
, abfd
);
2708 bfd_make_writable (abfd
);
2710 bfd_set_format (abfd
, bfd_object
);
2711 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2714 symtab
= xmalloc (2 * sizeof (asymbol
*));
2715 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2717 quick_symbol (abfd
, "", U ("_pei386_runtime_relocator"), "", UNDSEC
,
2720 bfd_set_section_size (extern_rt_rel
, PE_IDATA5_SIZE
);
2721 extern_rt_rel_d
= xcalloc (1, PE_IDATA5_SIZE
);
2722 extern_rt_rel
->contents
= extern_rt_rel_d
;
2724 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2725 save_relocs (extern_rt_rel
);
2727 bfd_set_symtab (abfd
, symtab
, symptr
);
2729 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, PE_IDATA5_SIZE
);
2731 bfd_make_readable (abfd
);
2736 pe_create_import_fixup (arelent
*rel
, asection
*s
, bfd_vma addend
, char *name
,
2737 const char *symname
)
2739 const char *fixup_name
= make_import_fixup_mark (rel
, name
);
2742 /* This is the original implementation of the auto-import feature, which
2743 primarily relied on the OS loader to patch things up with some help
2744 from the pseudo-relocator to overcome the main limitation. See the
2745 comment at the beginning of the file for an overview of the feature. */
2746 if (link_info
.pei386_runtime_pseudo_reloc
!= 2)
2748 struct bfd_link_hash_entry
*name_thunk_sym
;
2749 /* name buffer is allocated with space at beginning for prefixes. */
2750 char *thname
= name
- (sizeof "__nm_thnk_" - 1);
2751 memcpy (thname
, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2752 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, thname
, 0, 0, 1);
2754 if (!(name_thunk_sym
&& name_thunk_sym
->type
== bfd_link_hash_defined
))
2756 b
= make_singleton_name_thunk (name
, link_info
.output_bfd
);
2757 add_bfd_to_link (b
, b
->filename
, &link_info
);
2759 /* If we ever use autoimport, we have to cast text section writable. */
2760 config
.text_read_only
= FALSE
;
2761 link_info
.output_bfd
->flags
&= ~WP_TEXT
;
2764 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
== 1)
2766 b
= make_import_fixup_entry (name
, fixup_name
, symname
,
2767 link_info
.output_bfd
);
2768 add_bfd_to_link (b
, b
->filename
, &link_info
);
2772 /* In the original implementation, the pseudo-relocator was only used when
2773 the addend was not null. In the new implementation, the OS loader is
2774 completely bypassed and the pseudo-relocator does the entire work. */
2775 if ((addend
!= 0 && link_info
.pei386_runtime_pseudo_reloc
== 1)
2776 || link_info
.pei386_runtime_pseudo_reloc
== 2)
2778 if (pe_dll_extra_pe_debug
)
2779 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2780 fixup_name
, (int) addend
);
2782 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, rel
->howto
->bitsize
,
2783 link_info
.output_bfd
);
2784 add_bfd_to_link (b
, b
->filename
, &link_info
);
2786 if (runtime_pseudo_relocs_created
++ == 0)
2788 b
= pe_create_runtime_relocator_reference (link_info
.output_bfd
);
2789 add_bfd_to_link (b
, b
->filename
, &link_info
);
2793 else if (addend
!= 0)
2794 einfo (_("%X%P: %C: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
2795 s
->owner
, s
, rel
->address
, (*rel
->sym_ptr_ptr
)->name
);
2799 pe_dll_generate_implib (def_file
*def
, const char *impfilename
, struct bfd_link_info
*info
)
2808 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2809 dll_symname
= xstrdup (dll_filename
);
2810 for (i
= 0; dll_symname
[i
]; i
++)
2811 if (!ISALNUM (dll_symname
[i
]))
2812 dll_symname
[i
] = '_';
2814 unlink_if_ordinary (impfilename
);
2816 outarch
= bfd_openw (impfilename
, 0);
2820 /* xgettext:c-format */
2821 einfo (_("%X%P: can't open .lib file: %s\n"), impfilename
);
2826 /* xgettext:c-format */
2827 info_msg (_("Creating library file: %s\n"), impfilename
);
2829 bfd_set_format (outarch
, bfd_archive
);
2830 outarch
->has_armap
= 1;
2832 /* Work out a reasonable size of things to put onto one line. */
2833 ar_head
= make_head (outarch
);
2835 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2836 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link
.next
)
2838 /* Iterate the exclude list. */
2839 struct exclude_list_struct
*ex
;
2841 for (ex
= excludes
, found
= 0; ex
&& !found
; ex
= ex
->next
)
2843 if (ex
->type
!= EXCLUDEFORIMPLIB
)
2845 found
= (filename_cmp (ex
->string
, ibfd
->filename
) == 0);
2847 /* If it matched, we must open a fresh BFD for it (the original
2848 input BFD is still needed for the DLL's final link) and add
2849 it into the archive member chain. */
2852 bfd
*newbfd
= bfd_openr (ibfd
->my_archive
2853 ? ibfd
->my_archive
->filename
: ibfd
->filename
, NULL
);
2856 einfo (_("%X%P: bfd_openr %s: %E\n"), ibfd
->filename
);
2859 if (ibfd
->my_archive
)
2861 /* Must now iterate through archive until we find the
2862 required member. A minor shame that we'll open the
2863 archive once per member that we require from it, and
2864 leak those archive bfds rather than reuse them. */
2865 bfd
*arbfd
= newbfd
;
2866 if (!bfd_check_format_matches (arbfd
, bfd_archive
, NULL
))
2868 einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
2869 ibfd
->my_archive
->filename
, ibfd
->filename
);
2873 while ((newbfd
= bfd_openr_next_archived_file (arbfd
, newbfd
)) != 0)
2875 if (filename_cmp (newbfd
->filename
, ibfd
->filename
) == 0)
2880 einfo (_("%X%P: %s(%s): can't find member in archive"),
2881 ibfd
->my_archive
->filename
, ibfd
->filename
);
2885 newbfd
->archive_next
= head
;
2890 for (i
= 0; i
< def
->num_exports
; i
++)
2892 /* The import library doesn't know about the internal name. */
2893 char *internal
= def
->exports
[i
].internal_name
;
2896 /* Don't add PRIVATE entries to import lib. */
2897 if (pe_def_file
->exports
[i
].flag_private
)
2900 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2902 /* PR 19803: If a symbol has been discard due to garbage
2903 collection then do not create any exports for it. */
2905 struct coff_link_hash_entry
*h
;
2907 h
= coff_link_hash_lookup (coff_hash_table (info
), internal
,
2908 FALSE
, FALSE
, FALSE
);
2910 /* If the symbol is hidden and undefined then it
2911 has been swept up by garbage collection. */
2912 && h
->symbol_class
== C_HIDDEN
2913 && h
->root
.u
.def
.section
== bfd_und_section_ptr
)
2916 /* If necessary, check with an underscore prefix as well. */
2917 if (pe_details
->underscored
&& internal
[0] != '@')
2921 name
= xmalloc (strlen (internal
) + 2);
2922 sprintf (name
, "_%s", internal
);
2924 h
= coff_link_hash_lookup (coff_hash_table (info
), name
,
2925 FALSE
, FALSE
, FALSE
);
2929 /* If the symbol is hidden and undefined then it
2930 has been swept up by garbage collection. */
2931 && h
->symbol_class
== C_HIDDEN
2932 && h
->root
.u
.def
.section
== bfd_und_section_ptr
)
2937 n
= make_one (def
->exports
+ i
, outarch
,
2938 ! (def
->exports
+ i
)->flag_data
);
2939 n
->archive_next
= head
;
2941 def
->exports
[i
].internal_name
= internal
;
2944 ar_tail
= make_tail (outarch
);
2946 if (ar_head
== NULL
|| ar_tail
== NULL
)
2949 /* Now stick them all into the archive. */
2950 ar_head
->archive_next
= head
;
2951 ar_tail
->archive_next
= ar_head
;
2954 if (! bfd_set_archive_head (outarch
, head
))
2955 einfo ("%X%P: bfd_set_archive_head: %E\n");
2957 if (! bfd_close (outarch
))
2958 einfo ("%X%P: bfd_close %s: %E\n", impfilename
);
2960 while (head
!= NULL
)
2962 bfd
*n
= head
->archive_next
;
2968 static int undef_count
= 0;
2976 static struct key_value
*udef_table
;
2978 static int undef_sort_cmp (const void *l1
, const void *r1
)
2980 const struct key_value
*l
= l1
;
2981 const struct key_value
*r
= r1
;
2983 return strcmp (l
->key
, r
->key
);
2986 static struct bfd_link_hash_entry
*
2987 pe_find_cdecl_alias_match (struct bfd_link_info
*linfo
, char *name
)
2989 struct bfd_link_hash_entry
*h
= NULL
;
2990 struct key_value
*kv
;
2991 struct key_value key
;
2992 char *at
, *lname
= xmalloc (strlen (name
) + 3);
2994 strcpy (lname
, name
);
2996 at
= strchr (lname
+ (lname
[0] == '@'), '@');
3001 kv
= bsearch (&key
, udef_table
, undef_count
, sizeof (struct key_value
),
3006 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
3007 if (h
->type
== bfd_link_hash_undefined
)
3011 if (lname
[0] == '?')
3014 if (at
|| lname
[0] == '@')
3016 if (lname
[0] == '@')
3018 if (pe_details
->underscored
)
3021 strcpy (lname
, lname
+ 1);
3023 kv
= bsearch (&key
, udef_table
, undef_count
,
3024 sizeof (struct key_value
), undef_sort_cmp
);
3027 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
3028 if (h
->type
== bfd_link_hash_undefined
)
3033 *strchr (lname
, '@') = 0;
3035 kv
= bsearch (&key
, udef_table
, undef_count
,
3036 sizeof (struct key_value
), undef_sort_cmp
);
3039 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
3040 if (h
->type
== bfd_link_hash_undefined
)
3046 strcat (lname
, "@");
3048 kv
= bsearch (&key
, udef_table
, undef_count
,
3049 sizeof (struct key_value
), undef_sort_cmp
);
3053 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
3054 if (h
->type
== bfd_link_hash_undefined
)
3058 if (lname
[0] == '_' && pe_details
->underscored
)
3062 memmove (lname
+ 1, lname
, strlen (lname
) + 1);
3067 kv
= bsearch (&key
, udef_table
, undef_count
,
3068 sizeof (struct key_value
), undef_sort_cmp
);
3072 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
3073 if (h
->type
== bfd_link_hash_undefined
)
3085 pe_undef_count (struct bfd_link_hash_entry
*h ATTRIBUTE_UNUSED
,
3086 void *inf ATTRIBUTE_UNUSED
)
3088 if (h
->type
== bfd_link_hash_undefined
)
3094 pe_undef_fill (struct bfd_link_hash_entry
*h
, void *inf ATTRIBUTE_UNUSED
)
3096 if (h
->type
== bfd_link_hash_undefined
)
3100 udef_table
[undef_count
].key
= xstrdup (h
->root
.string
);
3101 at
= strchr (udef_table
[undef_count
].key
3102 + (udef_table
[undef_count
].key
[0] == '@'), '@');
3105 udef_table
[undef_count
].oname
= h
->root
.string
;
3112 pe_create_undef_table (void)
3116 /* count undefined symbols */
3118 bfd_link_hash_traverse (link_info
.hash
, pe_undef_count
, "");
3120 /* create and fill the corresponding table */
3121 udef_table
= xmalloc (undef_count
* sizeof (struct key_value
));
3124 bfd_link_hash_traverse (link_info
.hash
, pe_undef_fill
, "");
3127 qsort (udef_table
, undef_count
, sizeof (struct key_value
), undef_sort_cmp
);
3131 add_bfd_to_link (bfd
*abfd
, const char *name
, struct bfd_link_info
*linfo
)
3133 lang_input_statement_type
*fake_file
;
3135 fake_file
= lang_add_input_file (name
,
3136 lang_input_file_is_fake_enum
,
3138 fake_file
->the_bfd
= abfd
;
3139 ldlang_add_file (fake_file
);
3141 if (!bfd_link_add_symbols (abfd
, linfo
))
3142 einfo (_("%X%P: add symbols %s: %E\n"), name
);
3146 pe_process_import_defs (bfd
*output_bfd
, struct bfd_link_info
*linfo
)
3149 def_file_module
*module
;
3150 def_file_import
*imp
;
3152 pe_dll_id_target (bfd_get_target (output_bfd
));
3157 imp
= pe_def_file
->imports
;
3159 pe_create_undef_table ();
3161 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
3163 int do_this_dll
= 0;
3165 for (i
= 0; i
< pe_def_file
->num_imports
&& imp
[i
].module
!= module
; i
++)
3167 if (i
>= pe_def_file
->num_imports
)
3170 dll_filename
= module
->name
;
3171 dll_symname
= xstrdup (module
->name
);
3172 for (j
= 0; dll_symname
[j
]; j
++)
3173 if (!ISALNUM (dll_symname
[j
]))
3174 dll_symname
[j
] = '_';
3176 for (; i
< pe_def_file
->num_imports
&& imp
[i
].module
== module
; i
++)
3178 def_file_export exp
;
3179 struct bfd_link_hash_entry
*blhe
;
3180 int lead_at
= (*imp
[i
].internal_name
== '@');
3181 /* See if we need this import. */
3182 size_t len
= strlen (imp
[i
].internal_name
);
3183 char *name
= xmalloc (len
+ 2 + 6);
3184 bfd_boolean include_jmp_stub
= FALSE
;
3185 bfd_boolean is_cdecl
= FALSE
;
3186 bfd_boolean is_undef
= FALSE
;
3188 if (!lead_at
&& strchr (imp
[i
].internal_name
, '@') == NULL
)
3192 sprintf (name
, "%s", imp
[i
].internal_name
);
3194 sprintf (name
, "%s%s",U (""), imp
[i
].internal_name
);
3196 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
3197 FALSE
, FALSE
, FALSE
);
3199 /* Include the jump stub for <sym> only if the <sym>
3201 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
3204 sprintf (name
, "%s%s", "__imp_", imp
[i
].internal_name
);
3206 sprintf (name
, "%s%s%s", "__imp_", U (""),
3207 imp
[i
].internal_name
);
3209 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
3210 FALSE
, FALSE
, FALSE
);
3212 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3216 include_jmp_stub
= TRUE
;
3217 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3220 if (is_cdecl
&& (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
)))
3222 sprintf (name
, "%s%s",U (""), imp
[i
].internal_name
);
3223 blhe
= pe_find_cdecl_alias_match (linfo
, name
);
3224 include_jmp_stub
= TRUE
;
3226 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3237 bfd
*ar_head
= make_head (output_bfd
);
3238 add_bfd_to_link (ar_head
, ar_head
->filename
, linfo
);
3241 exp
.internal_name
= imp
[i
].internal_name
;
3242 exp
.name
= imp
[i
].name
;
3243 exp
.its_name
= imp
[i
].its_name
;
3244 exp
.ordinal
= imp
[i
].ordinal
;
3245 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
3246 exp
.flag_private
= 0;
3247 exp
.flag_constant
= 0;
3248 exp
.flag_data
= imp
[i
].data
;
3249 exp
.flag_noname
= exp
.name
? 0 : 1;
3250 one
= make_one (&exp
, output_bfd
, (! exp
.flag_data
) && include_jmp_stub
);
3251 add_bfd_to_link (one
, one
->filename
, linfo
);
3256 bfd
*ar_tail
= make_tail (output_bfd
);
3257 add_bfd_to_link (ar_tail
, ar_tail
->filename
, linfo
);
3266 free (udef_table
[undef_count
].key
);
3271 /* We were handed a *.DLL file. Parse it and turn it into a set of
3272 IMPORTS directives in the def file. Return TRUE if the file was
3273 handled, FALSE if not. */
3276 pe_get16 (bfd
*abfd
, int where
)
3280 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
3281 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
3282 return b
[0] + (b
[1] << 8);
3286 pe_get32 (bfd
*abfd
, int where
)
3290 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
3291 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
3292 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
3298 unsigned char *b
= ptr
;
3300 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
3304 pe_implied_import_dll (const char *filename
)
3307 bfd_vma pe_header_offset
, opthdr_ofs
, num_entries
, i
;
3308 bfd_vma export_rva
, export_size
, nsections
, secptr
, expptr
;
3309 bfd_vma exp_funcbase
;
3310 unsigned char *expdata
;
3312 bfd_vma name_rvas
, nexp
;
3313 const char *dllname
;
3314 /* Initialization with start > end guarantees that is_data
3315 will not be set by mistake, and avoids compiler warning. */
3316 bfd_vma data_start
= 1;
3317 bfd_vma data_end
= 0;
3318 bfd_vma rdata_start
= 1;
3319 bfd_vma rdata_end
= 0;
3320 bfd_vma bss_start
= 1;
3321 bfd_vma bss_end
= 0;
3324 /* No, I can't use bfd here. kernel32.dll puts its export table in
3325 the middle of the .rdata section. */
3326 dll
= bfd_openr (filename
, pe_details
->target_name
);
3329 einfo (_("%X%P: open %s: %E\n"), filename
);
3333 /* PEI dlls seem to be bfd_objects. */
3334 if (!bfd_check_format (dll
, bfd_object
))
3336 einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename
);
3340 /* Get pe_header, optional header and numbers of directory entries. */
3341 pe_header_offset
= pe_get32 (dll
, 0x3c);
3342 opthdr_ofs
= pe_header_offset
+ 4 + 20;
3343 #ifdef pe_use_x86_64
3344 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3346 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
3349 /* No import or export directory entry. */
3350 if (num_entries
< 1)
3353 #ifdef pe_use_x86_64
3354 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96 + 4 * 4);
3355 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100 + 4 * 4);
3357 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
3358 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
3361 /* No export table - nothing to export. */
3362 if (export_size
== 0)
3365 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
3366 secptr
= (pe_header_offset
+ 4 + 20 +
3367 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
3370 /* Get the rva and size of the export section. */
3371 for (i
= 0; i
< nsections
; i
++)
3374 bfd_vma secptr1
= secptr
+ 40 * i
;
3375 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3376 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 16);
3377 bfd_vma fptr
= pe_get32 (dll
, secptr1
+ 20);
3379 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
3380 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
3382 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
3384 expptr
= fptr
+ (export_rva
- vaddr
);
3385 if (export_rva
+ export_size
> vaddr
+ vsize
)
3386 export_size
= vsize
- (export_rva
- vaddr
);
3391 /* Scan sections and store the base and size of the
3392 data and bss segments in data/base_start/end. */
3393 for (i
= 0; i
< nsections
; i
++)
3395 bfd_vma secptr1
= secptr
+ 40 * i
;
3396 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 8);
3397 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3398 bfd_vma flags
= pe_get32 (dll
, secptr1
+ 36);
3402 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
3403 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
3405 if (strcmp(sec_name
,".data") == 0)
3408 data_end
= vaddr
+ vsize
;
3410 if (pe_dll_extra_pe_debug
)
3411 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3412 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3413 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3415 else if (strcmp(sec_name
,".rdata") == 0)
3417 rdata_start
= vaddr
;
3418 rdata_end
= vaddr
+ vsize
;
3420 if (pe_dll_extra_pe_debug
)
3421 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3422 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3423 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3425 else if (strcmp (sec_name
,".bss") == 0)
3428 bss_end
= vaddr
+ vsize
;
3430 if (pe_dll_extra_pe_debug
)
3431 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3432 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3433 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3437 expdata
= xmalloc (export_size
);
3438 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
3439 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
3440 erva
= (char *) expdata
- export_rva
;
3442 if (pe_def_file
== 0)
3443 pe_def_file
= def_file_empty ();
3445 nexp
= pe_as32 (expdata
+ 24);
3446 name_rvas
= pe_as32 (expdata
+ 32);
3447 exp_funcbase
= pe_as32 (expdata
+ 28);
3449 /* Use internal dll name instead of filename
3450 to enable symbolic dll linking. */
3451 dllname
= erva
+ pe_as32 (expdata
+ 12);
3453 /* Check to see if the dll has already been added to
3454 the definition list and if so return without error.
3455 This avoids multiple symbol definitions. */
3456 if (def_get_module (pe_def_file
, dllname
))
3458 if (pe_dll_extra_pe_debug
)
3459 printf ("%s is already loaded\n", dllname
);
3463 /* This is an optimized version of the insertion loop, which avoids lots of
3464 calls to realloc and memmove from def_file_add_import. */
3465 if ((from
= def_file_add_import_from (pe_def_file
, nexp
,
3466 erva
+ pe_as32 (erva
+ name_rvas
),
3467 dllname
, 0, NULL
, NULL
)) >= 0)
3469 for (i
= 0; i
< nexp
; i
++)
3471 /* Pointer to the names vector. */
3472 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3473 def_file_import
*imp
;
3474 /* Pointer to the function address vector. */
3475 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3476 /* is_data is true if the address is in the data, rdata or bss
3479 (func_rva
>= data_start
&& func_rva
< data_end
)
3480 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3481 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3483 imp
= def_file_add_import_at (pe_def_file
, from
+ i
, erva
+ name_rva
,
3484 dllname
, i
, NULL
, NULL
);
3485 /* Mark symbol type. */
3486 imp
->data
= is_data
;
3488 if (pe_dll_extra_pe_debug
)
3489 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3490 __FUNCTION__
, dllname
, erva
+ name_rva
,
3491 (unsigned long) func_rva
, is_data
? "(data)" : "");
3497 /* Iterate through the list of symbols. */
3498 for (i
= 0; i
< nexp
; i
++)
3500 /* Pointer to the names vector. */
3501 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3502 def_file_import
*imp
;
3503 /* Pointer to the function address vector. */
3504 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3507 /* Skip unwanted symbols, which are
3508 exported in buggy auto-import releases. */
3509 if (! CONST_STRNEQ (erva
+ name_rva
, "__nm_"))
3512 /* is_data is true if the address is in the data, rdata or bss
3515 (func_rva
>= data_start
&& func_rva
< data_end
)
3516 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3517 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3519 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
3520 dllname
, i
, NULL
, NULL
, &is_dup
);
3521 /* Mark symbol type. */
3523 imp
->data
= is_data
;
3525 if (pe_dll_extra_pe_debug
)
3526 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3527 __FUNCTION__
, dllname
, erva
+ name_rva
,
3528 (unsigned long) func_rva
, is_data
? "(data)" : "");
3536 pe_output_file_set_long_section_names (bfd
*abfd
)
3538 if (pe_use_coff_long_section_names
< 0)
3540 if (!bfd_coff_set_long_section_names (abfd
, pe_use_coff_long_section_names
))
3541 einfo (_("%X%P: error: can't use long section names on this arch\n"));
3544 /* These are the main functions, called from the emulation. The first
3545 is called after the bfds are read, so we can guess at how much space
3546 we need. The second is called after everything is placed, so we
3547 can put the right values in place. */
3550 pe_dll_build_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3552 pe_dll_id_target (bfd_get_target (abfd
));
3553 pe_output_file_set_long_section_names (abfd
);
3554 process_def_file_and_drectve (abfd
, info
);
3556 if (pe_def_file
->num_exports
== 0 && !bfd_link_pic (info
))
3559 generate_edata (abfd
, info
);
3560 build_filler_bfd (1);
3561 pe_output_file_set_long_section_names (filler_bfd
);
3565 pe_exe_build_sections (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3567 pe_dll_id_target (bfd_get_target (abfd
));
3568 pe_output_file_set_long_section_names (abfd
);
3569 build_filler_bfd (0);
3570 pe_output_file_set_long_section_names (filler_bfd
);
3574 pe_dll_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3576 pe_dll_id_target (bfd_get_target (abfd
));
3577 pe_output_file_set_long_section_names (abfd
);
3578 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3580 generate_reloc (abfd
, info
);
3583 bfd_set_section_size (reloc_s
, reloc_sz
);
3585 /* Resize the sections. */
3586 lang_reset_memory_regions ();
3587 lang_size_sections (NULL
, TRUE
);
3589 /* Redo special stuff. */
3590 ldemul_after_allocation ();
3592 /* Do the assignments again. */
3593 lang_do_assignments (lang_final_phase_enum
);
3596 fill_edata (abfd
, info
);
3598 if (bfd_link_dll (info
))
3599 pe_data (abfd
)->dll
= 1;
3601 edata_s
->contents
= edata_d
;
3602 reloc_s
->contents
= reloc_d
;
3606 pe_exe_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3608 pe_dll_id_target (bfd_get_target (abfd
));
3609 pe_output_file_set_long_section_names (abfd
);
3610 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3612 generate_reloc (abfd
, info
);
3615 bfd_set_section_size (reloc_s
, reloc_sz
);
3617 /* Resize the sections. */
3618 lang_reset_memory_regions ();
3619 lang_size_sections (NULL
, TRUE
);
3621 /* Redo special stuff. */
3622 ldemul_after_allocation ();
3624 /* Do the assignments again. */
3625 lang_do_assignments (lang_final_phase_enum
);
3627 reloc_s
->contents
= reloc_d
;
3631 pe_bfd_is_dll (bfd
*abfd
)
3633 return (bfd_get_format (abfd
) == bfd_object
3635 && pe_data (abfd
)->dll
);