1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009, 2010 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of the GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
26 #include "libiberty.h"
27 #include "safe-ctype.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
46 #define PE_IDATA4_SIZE 8
47 #define PE_IDATA5_SIZE 8
50 #define AOUTSZ PEPAOUTSZ
51 #define PEAOUTHDR PEPAOUTHDR
59 #ifndef PE_IDATA4_SIZE
60 #define PE_IDATA4_SIZE 4
63 #ifndef PE_IDATA5_SIZE
64 #define PE_IDATA5_SIZE 4
67 /* This file turns a regular Windows PE image into a DLL. Because of
68 the complexity of this operation, it has been broken down into a
69 number of separate modules which are all called by the main function
70 at the end of this file. This function is not re-entrant and is
71 normally only called once, so static variables are used to reduce
72 the number of parameters and return values required.
74 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
76 /* Auto-import feature by Paul Sokolovsky
80 1. With this feature on, DLL clients can import variables from DLL
81 without any concern from their side (for example, without any source
84 2. This is done completely in bounds of the PE specification (to be fair,
85 there's a place where it pokes nose out of, but in practice it works).
86 So, resulting module can be used with any other PE compiler/linker.
88 3. Auto-import is fully compatible with standard import method and they
89 can be mixed together.
91 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
92 reference to it; load time: negligible; virtual/physical memory: should be
93 less than effect of DLL relocation, and I sincerely hope it doesn't affect
94 DLL sharability (too much).
98 The obvious and only way to get rid of dllimport insanity is to make client
99 access variable directly in the DLL, bypassing extra dereference. I.e.,
100 whenever client contains something like
104 address of dll_var in the command should be relocated to point into loaded
105 DLL. The aim is to make OS loader do so, and than make ld help with that.
106 Import section of PE made following way: there's a vector of structures
107 each describing imports from particular DLL. Each such structure points
108 to two other parallel vectors: one holding imported names, and one which
109 will hold address of corresponding imported name. So, the solution is
110 de-vectorize these structures, making import locations be sparse and
111 pointing directly into code. Before continuing, it is worth a note that,
112 while authors strives to make PE act ELF-like, there're some other people
113 make ELF act PE-like: elfvector, ;-) .
117 For each reference of data symbol to be imported from DLL (to set of which
118 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
119 import fixup entry is generated. That entry is of type
120 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
121 fixup entry contains pointer to symbol's address within .text section
122 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
123 (so, DLL name is referenced by multiple entries), and pointer to symbol
124 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
125 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
126 containing imported name. Here comes that "on the edge" problem mentioned
127 above: PE specification rambles that name vector (OriginalFirstThunk)
128 should run in parallel with addresses vector (FirstThunk), i.e. that they
129 should have same number of elements and terminated with zero. We violate
130 this, since FirstThunk points directly into machine code. But in practice,
131 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
132 puts addresses to FirstThunk, not something else. It once again should be
133 noted that dll and symbol name structures are reused across fixup entries
134 and should be there anyway to support standard import stuff, so sustained
135 overhead is 20 bytes per reference. Other question is whether having several
136 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
137 done even by native compiler/linker (libth32's functions are in fact reside
138 in windows9x kernel32.dll, so if you use it, you have two
139 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
140 referencing the same PE structures several times is valid. The answer is why
141 not, prohibiting that (detecting violation) would require more work on
142 behalf of loader than not doing it.
144 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
146 static void add_bfd_to_link (bfd
*, const char *, struct bfd_link_info
*);
148 /* For emultempl/pe.em. */
150 def_file
* pe_def_file
= 0;
151 int pe_dll_export_everything
= 0;
152 int pe_dll_exclude_all_symbols
= 0;
153 int pe_dll_do_default_excludes
= 1;
154 int pe_dll_kill_ats
= 0;
155 int pe_dll_stdcall_aliases
= 0;
156 int pe_dll_warn_dup_exports
= 0;
157 int pe_dll_compat_implib
= 0;
158 int pe_dll_extra_pe_debug
= 0;
159 int pe_use_nul_prefixed_import_tables
= 0;
160 int pe_use_coff_long_section_names
= -1;
162 /* Static variables and types. */
164 static bfd_vma image_base
;
165 static bfd
*filler_bfd
;
166 static struct bfd_section
*edata_s
, *reloc_s
;
167 static unsigned char *edata_d
, *reloc_d
;
168 static size_t edata_sz
, reloc_sz
;
169 static int runtime_pseudo_relocs_created
= 0;
170 static int runtime_pseudp_reloc_v2_init
= 0;
177 autofilter_entry_type
;
181 const char *target_name
;
182 const char *object_target
;
183 unsigned int imagebase_reloc
;
186 bfd_boolean underscored
;
187 const autofilter_entry_type
* autofilter_symbollist
;
191 static const autofilter_entry_type autofilter_symbollist_generic
[] =
193 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
194 /* Entry point symbols. */
195 { STRING_COMMA_LEN ("DllMain") },
196 { STRING_COMMA_LEN ("DllMainCRTStartup") },
197 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
198 /* Runtime pseudo-reloc. */
199 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
200 { STRING_COMMA_LEN ("do_pseudo_reloc") },
204 static const autofilter_entry_type autofilter_symbollist_i386
[] =
206 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
207 /* Entry point symbols, and entry hooks. */
208 { STRING_COMMA_LEN ("cygwin_crt0") },
210 { STRING_COMMA_LEN ("DllMain") },
211 { STRING_COMMA_LEN ("DllEntryPoint") },
212 { STRING_COMMA_LEN ("DllMainCRTStartup") },
213 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
214 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
215 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
217 { STRING_COMMA_LEN ("DllMain@12") },
218 { STRING_COMMA_LEN ("DllEntryPoint@0") },
219 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
220 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
221 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
222 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
223 { STRING_COMMA_LEN ("cygwin_attach_dll") },
225 { STRING_COMMA_LEN ("cygwin_premain0") },
226 { STRING_COMMA_LEN ("cygwin_premain1") },
227 { STRING_COMMA_LEN ("cygwin_premain2") },
228 { STRING_COMMA_LEN ("cygwin_premain3") },
229 /* Runtime pseudo-reloc. */
230 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
231 { STRING_COMMA_LEN ("do_pseudo_reloc") },
232 /* Global vars that should not be exported. */
233 { STRING_COMMA_LEN ("impure_ptr") },
234 { STRING_COMMA_LEN ("_impure_ptr") },
235 { STRING_COMMA_LEN ("_fmode") },
236 { STRING_COMMA_LEN ("environ") },
240 #define PE_ARCH_i386 1
242 #define PE_ARCH_mips 3
243 #define PE_ARCH_arm 4
244 #define PE_ARCH_arm_epoc 5
245 #define PE_ARCH_arm_wince 6
247 static const pe_details_type pe_detail_list
[] =
262 autofilter_symbollist_i386
267 16 /* R_SH_IMAGEBASE */,
271 autofilter_symbollist_generic
280 autofilter_symbollist_generic
289 autofilter_symbollist_generic
292 "epoc-pei-arm-little",
293 "epoc-pe-arm-little",
298 autofilter_symbollist_generic
301 "pei-arm-wince-little",
302 "pe-arm-wince-little",
303 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
307 autofilter_symbollist_generic
309 { NULL
, NULL
, 0, 0, 0, FALSE
, NULL
}
312 static const pe_details_type
*pe_details
;
314 /* Do not specify library suffix explicitly, to allow for dllized versions. */
315 static const autofilter_entry_type autofilter_liblist
[] =
317 { STRING_COMMA_LEN ("libcegcc") },
318 { STRING_COMMA_LEN ("libcygwin") },
319 { STRING_COMMA_LEN ("libgcc") },
320 { STRING_COMMA_LEN ("libgcc_s") },
321 { STRING_COMMA_LEN ("libstdc++") },
322 { STRING_COMMA_LEN ("libmingw32") },
323 { STRING_COMMA_LEN ("libmingwex") },
324 { STRING_COMMA_LEN ("libg2c") },
325 { STRING_COMMA_LEN ("libsupc++") },
326 { STRING_COMMA_LEN ("libobjc") },
327 { STRING_COMMA_LEN ("libgcj") },
331 /* Regardless of the suffix issue mentioned above, we must ensure that
332 we do not falsely match on a leading substring, such as when libtool
333 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
334 This routine ensures that the leading part of the name matches and that
335 it is followed by only an optional version suffix and a file extension,
336 returning zero if so or -1 if not. */
337 static int libnamencmp (const char *libname
, const autofilter_entry_type
*afptr
)
339 if (strncmp (libname
, afptr
->name
, afptr
->len
))
342 libname
+= afptr
->len
;
344 /* Be liberal in interpreting what counts as a version suffix; we
345 accept anything that has a dash to separate it from the name and
346 begins with a digit. */
347 if (libname
[0] == '-')
349 if (!ISDIGIT (*++libname
))
351 /* Ensure the filename has an extension. */
352 while (*++libname
!= '.')
356 else if (libname
[0] != '.')
362 static const autofilter_entry_type autofilter_objlist
[] =
364 { STRING_COMMA_LEN ("crt0.o") },
365 { STRING_COMMA_LEN ("crt1.o") },
366 { STRING_COMMA_LEN ("crt2.o") },
367 { STRING_COMMA_LEN ("dllcrt1.o") },
368 { STRING_COMMA_LEN ("dllcrt2.o") },
369 { STRING_COMMA_LEN ("gcrt0.o") },
370 { STRING_COMMA_LEN ("gcrt1.o") },
371 { STRING_COMMA_LEN ("gcrt2.o") },
372 { STRING_COMMA_LEN ("crtbegin.o") },
373 { STRING_COMMA_LEN ("crtend.o") },
377 static const autofilter_entry_type autofilter_symbolprefixlist
[] =
379 /* _imp_ is treated specially, as it is always underscored. */
380 /* { STRING_COMMA_LEN ("_imp_") }, */
381 /* Don't export some c++ symbols. */
382 { STRING_COMMA_LEN ("__rtti_") },
383 { STRING_COMMA_LEN ("__builtin_") },
384 /* Don't re-export auto-imported symbols. */
385 { STRING_COMMA_LEN ("_nm_") },
386 /* Don't export symbols specifying internal DLL layout. */
387 { STRING_COMMA_LEN ("_head_") },
388 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
389 /* Don't export section labels or artificial symbols
391 { STRING_COMMA_LEN (".") },
395 static const autofilter_entry_type autofilter_symbolsuffixlist
[] =
397 { STRING_COMMA_LEN ("_iname") },
398 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
402 #define U(str) (pe_details->underscored ? "_" str : str)
405 pe_dll_id_target (const char *target
)
409 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
410 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
411 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
413 pe_details
= pe_detail_list
+ i
;
416 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
420 /* Helper functions for qsort. Relocs must be sorted so that we can write
421 them out by pages. */
432 reloc_sort (const void *va
, const void *vb
)
434 bfd_vma a
= ((const reloc_data_type
*) va
)->vma
;
435 bfd_vma b
= ((const reloc_data_type
*) vb
)->vma
;
437 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
441 pe_export_sort (const void *va
, const void *vb
)
443 const def_file_export
*a
= va
;
444 const def_file_export
*b
= vb
;
452 return strcmp (an
, bn
);
455 /* Read and process the .DEF file. */
457 /* These correspond to the entries in pe_def_file->exports[]. I use
458 exported_symbol_sections[i] to tag whether or not the symbol was
459 defined, since we can't export symbols we don't have. */
461 static bfd_vma
*exported_symbol_offsets
;
462 static struct bfd_section
**exported_symbol_sections
;
463 static int export_table_size
;
464 static int count_exported
;
465 static int count_exported_byname
;
466 static int count_with_ordinals
;
467 static const char *dll_name
;
468 static int min_ordinal
, max_ordinal
;
469 static int *exported_symbols
;
471 typedef struct exclude_list_struct
474 struct exclude_list_struct
*next
;
479 static struct exclude_list_struct
*excludes
= 0;
482 pe_dll_add_excludes (const char *new_excludes
, const exclude_type type
)
485 char *exclude_string
;
487 local_copy
= xstrdup (new_excludes
);
489 exclude_string
= strtok (local_copy
, ",:");
490 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
492 struct exclude_list_struct
*new_exclude
;
494 new_exclude
= xmalloc (sizeof (struct exclude_list_struct
));
495 new_exclude
->string
= xmalloc (strlen (exclude_string
) + 1);
496 strcpy (new_exclude
->string
, exclude_string
);
497 new_exclude
->type
= type
;
498 new_exclude
->next
= excludes
;
499 excludes
= new_exclude
;
506 is_import (const char* n
)
508 return (CONST_STRNEQ (n
, "__imp_"));
511 /* abfd is a bfd containing n (or NULL)
512 It can be used for contextual checks. */
515 auto_export (bfd
*abfd
, def_file
*d
, const char *n
)
518 struct exclude_list_struct
*ex
;
519 const autofilter_entry_type
*afptr
;
520 const char * libname
= 0;
521 if (abfd
&& abfd
->my_archive
)
522 libname
= lbasename (abfd
->my_archive
->filename
);
524 for (i
= 0; i
< d
->num_exports
; i
++)
525 if (strcmp (d
->exports
[i
].name
, n
) == 0)
528 if (pe_dll_do_default_excludes
)
533 if (pe_dll_extra_pe_debug
)
534 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
535 n
, abfd
, abfd
->my_archive
);
537 /* First of all, make context checks:
538 Don't export anything from standard libs. */
541 afptr
= autofilter_liblist
;
545 if (libnamencmp (libname
, afptr
) == 0 )
551 /* Next, exclude symbols from certain startup objects. */
553 if (abfd
&& (p
= lbasename (abfd
->filename
)))
555 afptr
= autofilter_objlist
;
558 if (strcmp (p
, afptr
->name
) == 0)
564 /* Don't try to blindly exclude all symbols
565 that begin with '__'; this was tried and
566 it is too restrictive. Instead we have
567 a target specific list to use: */
568 afptr
= pe_details
->autofilter_symbollist
;
572 if (strcmp (n
, afptr
->name
) == 0)
578 /* Next, exclude symbols starting with ... */
579 afptr
= autofilter_symbolprefixlist
;
582 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
588 /* Finally, exclude symbols ending with ... */
590 afptr
= autofilter_symbolsuffixlist
;
593 if ((len
>= afptr
->len
)
594 /* Add 1 to insure match with trailing '\0'. */
595 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
596 afptr
->len
+ 1) == 0)
603 for (ex
= excludes
; ex
; ex
= ex
->next
)
605 if (ex
->type
== EXCLUDELIBS
)
608 && ((strcmp (libname
, ex
->string
) == 0)
609 || (strcasecmp ("ALL", ex
->string
) == 0)))
612 else if (ex
->type
== EXCLUDEFORIMPLIB
)
614 if (strcmp (abfd
->filename
, ex
->string
) == 0)
617 else if (strcmp (n
, ex
->string
) == 0)
625 process_def_file_and_drectve (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
628 struct bfd_link_hash_entry
*blhe
;
630 struct bfd_section
*s
;
631 def_file_export
*e
= 0;
634 pe_def_file
= def_file_empty ();
636 /* First, run around to all the objects looking for the .drectve
637 sections, and push those into the def file too. */
638 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
640 s
= bfd_get_section_by_name (b
, ".drectve");
644 char *buf
= xmalloc (size
);
646 bfd_get_section_contents (b
, s
, buf
, 0, size
);
647 def_file_add_directive (pe_def_file
, buf
, size
);
652 /* Process aligned common symbol information from the
653 .drectve sections now; common symbol allocation is
654 done before final link, so it will be too late to
655 process them in process_embedded_commands() called
656 from _bfd_coff_link_input_bfd(). */
657 if (pe_def_file
->aligncomms
)
659 def_file_aligncomm
*ac
= pe_def_file
->aligncomms
;
662 struct coff_link_hash_entry
*sym_hash
;
663 sym_hash
= coff_link_hash_lookup (coff_hash_table (info
),
664 ac
->symbol_name
, FALSE
, FALSE
, FALSE
);
665 if (sym_hash
&& sym_hash
->root
.type
== bfd_link_hash_common
666 && sym_hash
->root
.u
.c
.p
->alignment_power
< (unsigned) ac
->alignment
)
668 sym_hash
->root
.u
.c
.p
->alignment_power
= (unsigned) ac
->alignment
;
674 /* If we are building an executable and there is nothing
675 to export, we do not build an export table at all. */
676 if (info
->executable
&& pe_def_file
->num_exports
== 0
677 && (!pe_dll_export_everything
|| pe_dll_exclude_all_symbols
))
680 /* Now, maybe export everything else the default way. */
681 if ((pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
682 && !pe_dll_exclude_all_symbols
)
684 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
689 if (!bfd_generic_link_read_symbols (b
))
691 einfo (_("%B%F: could not read symbols: %E\n"), b
);
695 symbols
= bfd_get_outsymbols (b
);
696 nsyms
= bfd_get_symcount (b
);
698 for (j
= 0; j
< nsyms
; j
++)
700 /* We should export symbols which are either global or not
701 anything at all. (.bss data is the latter)
702 We should not export undefined symbols. */
703 bfd_boolean would_export
= symbols
[j
]->section
!= &bfd_und_section
704 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
705 || (symbols
[j
]->flags
== 0));
706 if (lang_elf_version_info
&& would_export
)
708 bfd_boolean hide
= 0;
709 char ofs
= pe_details
->underscored
&& symbols
[j
]->name
[0] == '_';
710 (void) bfd_find_version_for_sym (lang_elf_version_info
,
711 symbols
[j
]->name
+ ofs
, &hide
);
712 would_export
= !hide
;
716 const char *sn
= symbols
[j
]->name
;
718 /* We should not re-export imported stuff. */
724 name
= xmalloc (strlen ("__imp_") + strlen (sn
) + 1);
725 sprintf (name
, "%s%s", "__imp_", sn
);
727 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
728 FALSE
, FALSE
, FALSE
);
731 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
735 if (pe_details
->underscored
&& *sn
== '_')
738 if (auto_export (b
, pe_def_file
, sn
))
741 p
=def_file_add_export (pe_def_file
, sn
, 0, -1, NULL
);
742 /* Fill data flag properly, from dlltool.c. */
743 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
751 #define NE pe_def_file->num_exports
753 /* Don't create an empty export table. */
757 /* Canonicalize the export list. */
760 for (i
= 0; i
< NE
; i
++)
762 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
764 /* This will preserve internal_name, which may have been
765 pointing to the same memory as name, or might not
767 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
768 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
769 char *tmp_at
= strchr (tmp
, '@');
774 einfo (_("%XCannot export %s: invalid export name\n"),
775 pe_def_file
->exports
[i
].name
);
776 pe_def_file
->exports
[i
].name
= tmp
;
781 if (pe_dll_stdcall_aliases
)
783 for (i
= 0; i
< NE
; i
++)
785 if (is_import (pe_def_file
->exports
[i
].name
))
788 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
790 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
791 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
793 *(strchr (tmp
, '@')) = 0;
794 if (auto_export (NULL
, pe_def_file
, tmp
))
795 def_file_add_export (pe_def_file
, tmp
,
796 pe_def_file
->exports
[i
].internal_name
,
804 /* Convenience, but watch out for it changing. */
805 e
= pe_def_file
->exports
;
807 exported_symbol_offsets
= xmalloc (NE
* sizeof (bfd_vma
));
808 exported_symbol_sections
= xmalloc (NE
* sizeof (struct bfd_section
*));
810 memset (exported_symbol_sections
, 0, NE
* sizeof (struct bfd_section
*));
814 count_exported_byname
= 0;
815 count_with_ordinals
= 0;
817 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]),
819 for (i
= 0, j
= 0; i
< NE
; i
++)
821 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
823 /* This is a duplicate. */
824 if (e
[j
- 1].ordinal
!= -1
825 && e
[i
].ordinal
!= -1
826 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
828 if (pe_dll_warn_dup_exports
)
829 /* xgettext:c-format */
830 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
831 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
835 if (pe_dll_warn_dup_exports
)
836 /* xgettext:c-format */
837 einfo (_("Warning, duplicate EXPORT: %s\n"),
841 if (e
[i
].ordinal
!= -1)
842 e
[j
- 1].ordinal
= e
[i
].ordinal
;
843 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
844 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
845 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
846 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
855 pe_def_file
->num_exports
= j
; /* == NE */
857 for (i
= 0; i
< NE
; i
++)
861 /* Check for forward exports */
862 if (strchr (pe_def_file
->exports
[i
].internal_name
, '.'))
865 if (!pe_def_file
->exports
[i
].flag_noname
)
866 count_exported_byname
++;
868 pe_def_file
->exports
[i
].flag_forward
= 1;
870 if (pe_def_file
->exports
[i
].ordinal
!= -1)
872 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
873 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
874 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
875 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
876 count_with_ordinals
++;
882 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
883 if (pe_details
->underscored
884 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
887 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
890 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
892 blhe
= bfd_link_hash_lookup (info
->hash
,
897 && (blhe
->type
== bfd_link_hash_defined
898 || (blhe
->type
== bfd_link_hash_common
)))
901 if (!pe_def_file
->exports
[i
].flag_noname
)
902 count_exported_byname
++;
904 /* Only fill in the sections. The actual offsets are computed
905 in fill_exported_offsets() after common symbols are laid
907 if (blhe
->type
== bfd_link_hash_defined
)
908 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
910 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
912 if (pe_def_file
->exports
[i
].ordinal
!= -1)
914 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
915 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
916 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
917 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
918 count_with_ordinals
++;
921 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
923 /* xgettext:c-format */
924 einfo (_("%XCannot export %s: symbol not defined\n"),
925 pe_def_file
->exports
[i
].internal_name
);
929 /* xgettext:c-format */
930 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
931 pe_def_file
->exports
[i
].internal_name
,
932 blhe
->type
, bfd_link_hash_defined
);
936 /* xgettext:c-format */
937 einfo (_("%XCannot export %s: symbol not found\n"),
938 pe_def_file
->exports
[i
].internal_name
);
944 /* Build the bfd that will contain .edata and .reloc sections. */
947 build_filler_bfd (int include_edata
)
949 lang_input_statement_type
*filler_file
;
950 filler_file
= lang_add_input_file ("dll stuff",
951 lang_input_file_is_fake_enum
,
953 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff",
954 link_info
.output_bfd
);
955 if (filler_bfd
== NULL
956 || !bfd_set_arch_mach (filler_bfd
,
957 bfd_get_arch (link_info
.output_bfd
),
958 bfd_get_mach (link_info
.output_bfd
)))
960 einfo ("%X%P: can not create BFD: %E\n");
966 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
968 || !bfd_set_section_flags (filler_bfd
, edata_s
,
975 einfo ("%X%P: can not create .edata section: %E\n");
978 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
981 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
983 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
990 einfo ("%X%P: can not create .reloc section: %E\n");
994 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
996 ldlang_add_file (filler_file
);
999 /* Gather all the exported symbols and build the .edata section. */
1002 generate_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1004 int i
, next_ordinal
;
1005 int name_table_size
= 0;
1008 /* First, we need to know how many exported symbols there are,
1009 and what the range of ordinals is. */
1010 if (pe_def_file
->name
)
1011 dll_name
= pe_def_file
->name
;
1014 dll_name
= abfd
->filename
;
1016 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
1017 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
1018 dll_name
= dlnp
+ 1;
1021 if (count_with_ordinals
&& max_ordinal
> count_exported
)
1023 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
1024 min_ordinal
= max_ordinal
- count_exported
+ 1;
1029 max_ordinal
= count_exported
;
1032 export_table_size
= max_ordinal
- min_ordinal
+ 1;
1033 exported_symbols
= xmalloc (export_table_size
* sizeof (int));
1034 for (i
= 0; i
< export_table_size
; i
++)
1035 exported_symbols
[i
] = -1;
1037 /* Now we need to assign ordinals to those that don't have them. */
1038 for (i
= 0; i
< NE
; i
++)
1040 if (exported_symbol_sections
[i
] ||
1041 pe_def_file
->exports
[i
].flag_forward
)
1043 if (pe_def_file
->exports
[i
].ordinal
!= -1)
1045 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
1046 int pi
= exported_symbols
[ei
];
1050 /* xgettext:c-format */
1051 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1052 pe_def_file
->exports
[i
].ordinal
,
1053 pe_def_file
->exports
[i
].name
,
1054 pe_def_file
->exports
[pi
].name
);
1056 exported_symbols
[ei
] = i
;
1058 if (pe_def_file
->exports
[i
].its_name
)
1059 name_table_size
+= strlen (pe_def_file
->exports
[i
].its_name
) + 1;
1061 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
1064 /* Reserve space for the forward name. */
1065 if (pe_def_file
->exports
[i
].flag_forward
)
1067 name_table_size
+= strlen (pe_def_file
->exports
[i
].internal_name
) + 1;
1071 next_ordinal
= min_ordinal
;
1072 for (i
= 0; i
< NE
; i
++)
1073 if ((exported_symbol_sections
[i
] ||
1074 pe_def_file
->exports
[i
].flag_forward
) &&
1075 pe_def_file
->exports
[i
].ordinal
== -1)
1077 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
1080 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
1081 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
1084 /* OK, now we can allocate some memory. */
1085 edata_sz
= (40 /* directory */
1086 + 4 * export_table_size
/* addresses */
1087 + 4 * count_exported_byname
/* name ptrs */
1088 + 2 * count_exported_byname
/* ordinals */
1089 + name_table_size
+ strlen (dll_name
) + 1);
1092 /* Fill the exported symbol offsets. The preliminary work has already
1093 been done in process_def_file_and_drectve(). */
1096 fill_exported_offsets (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
1099 struct bfd_link_hash_entry
*blhe
;
1101 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1105 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
1106 if (pe_details
->underscored
1107 && *pe_def_file
->exports
[i
].internal_name
!= '@')
1110 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
1113 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
1115 blhe
= bfd_link_hash_lookup (info
->hash
,
1117 FALSE
, FALSE
, TRUE
);
1119 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
1120 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
1127 fill_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1130 unsigned char *edirectory
;
1131 unsigned char *eaddresses
;
1132 unsigned char *enameptrs
;
1133 unsigned char *eordinals
;
1139 edata_d
= xmalloc (edata_sz
);
1141 /* Note use of array pointer math here. */
1142 edirectory
= edata_d
;
1143 eaddresses
= edata_d
+ 40;
1144 enameptrs
= eaddresses
+ 4 * export_table_size
;
1145 eordinals
= enameptrs
+ 4 * count_exported_byname
;
1146 enamestr
= (char *) eordinals
+ 2 * count_exported_byname
;
1148 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1149 + edata_s->output_section->vma - image_base)
1151 memset (edata_d
, 0, edata_sz
);
1152 bfd_put_32 (abfd
, now
, edata_d
+ 4);
1153 if (pe_def_file
->version_major
!= -1)
1155 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
1156 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
1159 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
1160 strcpy (enamestr
, dll_name
);
1161 enamestr
+= strlen (enamestr
) + 1;
1162 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
1163 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
1164 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
1165 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
1166 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
1167 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
1169 fill_exported_offsets (abfd
, info
);
1171 /* Ok, now for the filling in part.
1172 Scan alphabetically - ie the ordering in the exports[] table,
1173 rather than by ordinal - the ordering in the exported_symbol[]
1174 table. See dlltool.c and:
1175 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1176 for more information. */
1178 for (s
= 0; s
< NE
; s
++)
1180 struct bfd_section
*ssec
= exported_symbol_sections
[s
];
1181 if (pe_def_file
->exports
[s
].ordinal
!= -1 &&
1182 (pe_def_file
->exports
[s
].flag_forward
|| ssec
!= NULL
))
1184 int ord
= pe_def_file
->exports
[s
].ordinal
;
1186 if (pe_def_file
->exports
[s
].flag_forward
)
1188 bfd_put_32 (abfd
, ERVA (enamestr
),
1189 eaddresses
+ 4 * (ord
- min_ordinal
));
1191 strcpy (enamestr
, pe_def_file
->exports
[s
].internal_name
);
1192 enamestr
+= strlen (pe_def_file
->exports
[s
].internal_name
) + 1;
1196 bfd_vma srva
= (exported_symbol_offsets
[s
]
1197 + ssec
->output_section
->vma
1198 + ssec
->output_offset
);
1200 bfd_put_32 (abfd
, srva
- image_base
,
1201 eaddresses
+ 4 * (ord
- min_ordinal
));
1204 if (!pe_def_file
->exports
[s
].flag_noname
)
1206 char *ename
= pe_def_file
->exports
[s
].name
;
1207 if (pe_def_file
->exports
[s
].its_name
)
1208 ename
= pe_def_file
->exports
[s
].its_name
;
1210 bfd_put_32 (abfd
, ERVA (enamestr
), enameptrs
);
1212 strcpy (enamestr
, ename
);
1213 enamestr
+= strlen (enamestr
) + 1;
1214 bfd_put_16 (abfd
, ord
- min_ordinal
, eordinals
);
1216 pe_def_file
->exports
[s
].hint
= hint
++;
1223 static struct bfd_section
*current_sec
;
1226 pe_walk_relocs_of_symbol (struct bfd_link_info
*info
,
1228 int (*cb
) (arelent
*, asection
*))
1233 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1238 if (!bfd_generic_link_read_symbols (b
))
1240 einfo (_("%B%F: could not read symbols: %E\n"), b
);
1244 symbols
= bfd_get_outsymbols (b
);
1245 nsyms
= bfd_get_symcount (b
);
1247 for (s
= b
->sections
; s
; s
= s
->next
)
1250 int relsize
, nrelocs
, i
;
1251 int flags
= bfd_get_section_flags (b
, s
);
1253 /* Skip discarded linkonce sections. */
1254 if (flags
& SEC_LINK_ONCE
1255 && s
->output_section
== bfd_abs_section_ptr
)
1260 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1261 relocs
= xmalloc (relsize
);
1262 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1264 for (i
= 0; i
< nrelocs
; i
++)
1266 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1268 if (!strcmp (name
, sym
->name
))
1274 /* Warning: the allocated symbols are remembered in BFD and reused
1275 later, so don't free them! */
1276 /* free (symbols); */
1281 /* Gather all the relocations and build the .reloc section. */
1284 generate_reloc (bfd
*abfd
, struct bfd_link_info
*info
)
1287 /* For .reloc stuff. */
1288 reloc_data_type
*reloc_data
;
1289 int total_relocs
= 0;
1291 bfd_vma sec_page
= (bfd_vma
) -1;
1292 bfd_vma page_ptr
, page_count
;
1295 struct bfd_section
*s
;
1298 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1299 for (s
= b
->sections
; s
; s
= s
->next
)
1300 total_relocs
+= s
->reloc_count
;
1302 reloc_data
= xmalloc (total_relocs
* sizeof (reloc_data_type
));
1306 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1309 int relsize
, nrelocs
;
1311 for (s
= b
->sections
; s
; s
= s
->next
)
1313 bfd_vma sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1317 /* If it's not loaded, we don't need to relocate it this way. */
1318 if (!(s
->output_section
->flags
& SEC_LOAD
))
1321 /* I don't know why there would be a reloc for these, but I've
1322 seen it happen - DJ */
1323 if (s
->output_section
== &bfd_abs_section
)
1326 if (s
->output_section
->vma
== 0)
1328 /* Huh? Shouldn't happen, but punt if it does. */
1329 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1330 s
->output_section
->name
, s
->output_section
->index
,
1331 s
->output_section
->flags
);
1335 if (!bfd_generic_link_read_symbols (b
))
1337 einfo (_("%B%F: could not read symbols: %E\n"), b
);
1341 symbols
= bfd_get_outsymbols (b
);
1342 nsyms
= bfd_get_symcount (b
);
1343 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1344 relocs
= xmalloc (relsize
);
1345 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1347 for (i
= 0; i
< nrelocs
; i
++)
1349 if (pe_dll_extra_pe_debug
)
1351 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1352 printf ("rel: %s\n", sym
->name
);
1354 if (!relocs
[i
]->howto
->pc_relative
1355 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1358 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1360 /* Don't create relocs for undefined weak symbols. */
1361 if (sym
->flags
== BSF_WEAK
)
1363 struct bfd_link_hash_entry
*blhe
1364 = bfd_wrapped_link_hash_lookup (abfd
, info
, sym
->name
,
1365 FALSE
, FALSE
, FALSE
);
1366 if (blhe
&& blhe
->type
== bfd_link_hash_undefweak
)
1368 /* Check aux sym and see if it is defined or not. */
1369 struct coff_link_hash_entry
*h
, *h2
;
1370 h
= (struct coff_link_hash_entry
*)blhe
;
1371 if (h
->symbol_class
!= C_NT_WEAK
|| h
->numaux
!= 1)
1373 h2
= h
->auxbfd
->tdata
.coff_obj_data
->sym_hashes
1374 [h
->aux
->x_sym
.x_tagndx
.l
];
1375 /* We don't want a base reloc if the aux sym is not
1376 found, undefined, or if it is the constant ABS
1377 zero default value. (We broaden that slightly by
1378 not testing the value, just the section; there's
1379 no reason we'd want a reference to any absolute
1380 address to get relocated during rebasing). */
1381 if (!h2
|| h2
->root
.type
== bfd_link_hash_undefined
1382 || h2
->root
.u
.def
.section
== &bfd_abs_section
)
1385 else if (!blhe
|| blhe
->type
!= bfd_link_hash_defined
)
1389 sym_vma
= (relocs
[i
]->addend
1392 + sym
->section
->output_offset
1393 + sym
->section
->output_section
->vma
);
1394 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1396 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1398 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1399 relocs
[i
]->howto
->rightshift
)
1401 #ifdef pe_use_x86_64
1402 case BITS_AND_SHIFT (64, 0):
1403 reloc_data
[total_relocs
].type
= 10;
1407 case BITS_AND_SHIFT (32, 0):
1408 reloc_data
[total_relocs
].type
= 3;
1411 case BITS_AND_SHIFT (16, 0):
1412 reloc_data
[total_relocs
].type
= 2;
1415 case BITS_AND_SHIFT (16, 16):
1416 reloc_data
[total_relocs
].type
= 4;
1417 /* FIXME: we can't know the symbol's right value
1418 yet, but we probably can safely assume that
1419 CE will relocate us in 64k blocks, so leaving
1421 reloc_data
[total_relocs
].extra
= 0;
1424 case BITS_AND_SHIFT (26, 2):
1425 reloc_data
[total_relocs
].type
= 5;
1428 case BITS_AND_SHIFT (24, 2):
1429 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1430 Those ARM_xxx definitions should go in proper
1432 if (relocs
[i
]->howto
->type
== 0
1433 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1434 || relocs
[i
]->howto
->type
== 5)
1435 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1436 that has already been fully processed during a
1437 previous link stage, so ignore it here. */
1441 /* xgettext:c-format */
1442 einfo (_("%XError: %d-bit reloc in dll\n"),
1443 relocs
[i
]->howto
->bitsize
);
1449 /* Warning: the allocated symbols are remembered in BFD and
1450 reused later, so don't free them! */
1454 /* At this point, we have total_relocs relocation addresses in
1455 reloc_addresses, which are all suitable for the .reloc section.
1456 We must now create the new sections. */
1457 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1459 for (i
= 0; i
< total_relocs
; i
++)
1461 bfd_vma this_page
= (reloc_data
[i
].vma
>> 12);
1463 if (this_page
!= sec_page
)
1465 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1467 sec_page
= this_page
;
1472 if (reloc_data
[i
].type
== 4)
1476 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1477 reloc_d
= xmalloc (reloc_sz
);
1478 sec_page
= (bfd_vma
) -1;
1480 page_ptr
= (bfd_vma
) -1;
1483 for (i
= 0; i
< total_relocs
; i
++)
1485 bfd_vma rva
= reloc_data
[i
].vma
- image_base
;
1486 bfd_vma this_page
= (rva
& ~0xfff);
1488 if (this_page
!= sec_page
)
1490 while (reloc_sz
& 3)
1491 reloc_d
[reloc_sz
++] = 0;
1493 if (page_ptr
!= (bfd_vma
) -1)
1494 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1496 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1497 page_ptr
= reloc_sz
;
1499 sec_page
= this_page
;
1503 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1504 reloc_d
+ reloc_sz
);
1507 if (reloc_data
[i
].type
== 4)
1509 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1516 while (reloc_sz
& 3)
1517 reloc_d
[reloc_sz
++] = 0;
1519 if (page_ptr
!= (bfd_vma
) -1)
1520 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1522 while (reloc_sz
< reloc_s
->size
)
1523 reloc_d
[reloc_sz
++] = 0;
1526 /* Given the exiting def_file structure, print out a .DEF file that
1527 corresponds to it. */
1530 quoteput (char *s
, FILE *f
, int needs_quotes
)
1534 for (cp
= s
; *cp
; cp
++)
1549 if (*s
== '"' || *s
== '\\')
1563 pe_dll_generate_def_file (const char *pe_out_def_filename
)
1566 FILE *out
= fopen (pe_out_def_filename
, "w");
1569 /* xgettext:c-format */
1570 einfo (_("%s: Can't open output def file %s\n"),
1571 program_name
, pe_out_def_filename
);
1575 if (pe_def_file
->name
)
1577 if (pe_def_file
->is_dll
)
1578 fprintf (out
, "LIBRARY ");
1580 fprintf (out
, "NAME ");
1582 quoteput (pe_def_file
->name
, out
, 1);
1584 if (pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
)
1586 fprintf (out
, " BASE=0x");
1587 fprintf_vma (out
, ((bfd_vma
) pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
));
1589 fprintf (out
, "\n");
1592 if (pe_def_file
->description
)
1594 fprintf (out
, "DESCRIPTION ");
1595 quoteput (pe_def_file
->description
, out
, 1);
1596 fprintf (out
, "\n");
1599 if (pe_def_file
->version_minor
!= -1)
1600 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1601 pe_def_file
->version_minor
);
1602 else if (pe_def_file
->version_major
!= -1)
1603 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1605 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1606 fprintf (out
, "\n");
1608 if (pe_def_file
->stack_commit
!= -1)
1609 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1610 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1611 else if (pe_def_file
->stack_reserve
!= -1)
1612 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1614 if (pe_def_file
->heap_commit
!= -1)
1615 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1616 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1617 else if (pe_def_file
->heap_reserve
!= -1)
1618 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1620 if (pe_def_file
->num_section_defs
> 0)
1622 fprintf (out
, "\nSECTIONS\n\n");
1624 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1627 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1629 if (pe_def_file
->section_defs
[i
].class)
1631 fprintf (out
, " CLASS ");
1632 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1635 if (pe_def_file
->section_defs
[i
].flag_read
)
1636 fprintf (out
, " READ");
1638 if (pe_def_file
->section_defs
[i
].flag_write
)
1639 fprintf (out
, " WRITE");
1641 if (pe_def_file
->section_defs
[i
].flag_execute
)
1642 fprintf (out
, " EXECUTE");
1644 if (pe_def_file
->section_defs
[i
].flag_shared
)
1645 fprintf (out
, " SHARED");
1647 fprintf (out
, "\n");
1651 if (pe_def_file
->num_exports
> 0)
1653 fprintf (out
, "EXPORTS\n");
1655 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1657 def_file_export
*e
= pe_def_file
->exports
+ i
;
1659 quoteput (e
->name
, out
, 0);
1661 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1663 fprintf (out
, " = ");
1664 quoteput (e
->internal_name
, out
, 0);
1667 if (e
->ordinal
!= -1)
1668 fprintf (out
, " @%d", e
->ordinal
);
1670 if (e
->flag_private
)
1671 fprintf (out
, " PRIVATE");
1673 if (e
->flag_constant
)
1674 fprintf (out
, " CONSTANT");
1677 fprintf (out
, " NONAME");
1680 fprintf (out
, " DATA");
1682 fprintf (out
, "\n");
1686 if (pe_def_file
->num_imports
> 0)
1688 fprintf (out
, "\nIMPORTS\n\n");
1690 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1692 def_file_import
*im
= pe_def_file
->imports
+ i
;
1695 if (im
->internal_name
1696 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1698 quoteput (im
->internal_name
, out
, 0);
1699 fprintf (out
, " = ");
1702 quoteput (im
->module
->name
, out
, 0);
1706 quoteput (im
->name
, out
, 0);
1708 fprintf (out
, "%d", im
->ordinal
);
1712 fprintf (out
, " == ");
1713 quoteput (im
->its_name
, out
, 0);
1716 fprintf (out
, "\n");
1721 fprintf (out
, _("; no contents available\n"));
1723 if (fclose (out
) == EOF
)
1724 /* xgettext:c-format */
1725 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1728 /* Generate the import library. */
1730 static asymbol
**symtab
;
1733 static int tmp_seq2
;
1734 static const char *dll_filename
;
1735 static char *dll_symname
;
1737 #define UNDSEC (asection *) &bfd_und_section
1740 quick_section (bfd
*abfd
, const char *name
, int flags
, int align
)
1745 sec
= bfd_make_section_old_way (abfd
, name
);
1746 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1747 bfd_set_section_alignment (abfd
, sec
, align
);
1748 /* Remember to undo this before trying to link internally! */
1749 sec
->output_section
= sec
;
1751 sym
= bfd_make_empty_symbol (abfd
);
1752 symtab
[symptr
++] = sym
;
1753 sym
->name
= sec
->name
;
1755 sym
->flags
= BSF_LOCAL
;
1762 quick_symbol (bfd
*abfd
,
1771 char *name
= xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1776 sym
= bfd_make_empty_symbol (abfd
);
1781 symtab
[symptr
++] = sym
;
1784 static arelent
*reltab
= 0;
1785 static int relcount
= 0, relsize
= 0;
1788 quick_reloc (bfd
*abfd
, bfd_size_type address
, int which_howto
, int symidx
)
1790 if (relcount
>= relsize
- 1)
1794 reltab
= xrealloc (reltab
, relsize
* sizeof (arelent
));
1796 reltab
= xmalloc (relsize
* sizeof (arelent
));
1798 reltab
[relcount
].address
= address
;
1799 reltab
[relcount
].addend
= 0;
1800 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1801 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1806 save_relocs (asection
*sec
)
1810 sec
->relocation
= reltab
;
1811 sec
->reloc_count
= relcount
;
1812 sec
->orelocation
= xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1813 for (i
= 0; i
< relcount
; i
++)
1814 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1815 sec
->orelocation
[relcount
] = 0;
1816 sec
->flags
|= SEC_RELOC
;
1818 relcount
= relsize
= 0;
1821 /* .section .idata$2
1822 .global __head_my_dll
1839 make_head (bfd
*parent
)
1841 asection
*id2
, *id5
, *id4
;
1842 unsigned char *d2
, *d5
, *d4
;
1846 oname
= xmalloc (20);
1847 sprintf (oname
, "d%06d.o", tmp_seq
);
1850 abfd
= bfd_create (oname
, parent
);
1851 bfd_find_target (pe_details
->object_target
, abfd
);
1852 bfd_make_writable (abfd
);
1854 bfd_set_format (abfd
, bfd_object
);
1855 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1858 symtab
= xmalloc (6 * sizeof (asymbol
*));
1859 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1860 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1861 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1862 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1863 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1865 /* OK, pay attention here. I got confused myself looking back at
1866 it. We create a four-byte section to mark the beginning of the
1867 list, and we include an offset of 4 in the section, so that the
1868 pointer to the list points to the *end* of this section, which is
1869 the start of the list of sections from other objects. */
1871 bfd_set_section_size (abfd
, id2
, 20);
1875 if (pe_use_nul_prefixed_import_tables
)
1876 d2
[0] = d2
[16] = PE_IDATA5_SIZE
; /* Reloc addend. */
1877 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1878 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1879 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1882 if (pe_use_nul_prefixed_import_tables
)
1883 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
1885 bfd_set_section_size (abfd
, id5
, 0);
1886 d5
= xmalloc (PE_IDATA5_SIZE
);
1888 memset (d5
, 0, PE_IDATA5_SIZE
);
1889 if (pe_use_nul_prefixed_import_tables
)
1890 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
1892 bfd_set_section_size (abfd
, id4
, 0);
1893 d4
= xmalloc (PE_IDATA4_SIZE
);
1895 memset (d4
, 0, PE_IDATA4_SIZE
);
1897 bfd_set_symtab (abfd
, symtab
, symptr
);
1899 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1900 if (pe_use_nul_prefixed_import_tables
)
1902 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
1903 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
1907 bfd_set_section_contents (abfd
, id5
, d5
, 0, 0);
1908 bfd_set_section_contents (abfd
, id4
, d4
, 0, 0);
1911 bfd_make_readable (abfd
);
1915 /* .section .idata$4
1922 .global __my_dll_iname
1927 make_tail (bfd
*parent
)
1929 asection
*id4
, *id5
, *id7
;
1930 unsigned char *d4
, *d5
, *d7
;
1935 oname
= xmalloc (20);
1936 sprintf (oname
, "d%06d.o", tmp_seq
);
1939 abfd
= bfd_create (oname
, parent
);
1940 bfd_find_target (pe_details
->object_target
, abfd
);
1941 bfd_make_writable (abfd
);
1943 bfd_set_format (abfd
, bfd_object
);
1944 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1947 symtab
= xmalloc (5 * sizeof (asymbol
*));
1948 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1949 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1950 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1951 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1953 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
1954 d4
= xmalloc (PE_IDATA4_SIZE
);
1956 memset (d4
, 0, PE_IDATA4_SIZE
);
1958 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
1959 d5
= xmalloc (PE_IDATA5_SIZE
);
1961 memset (d5
, 0, PE_IDATA5_SIZE
);
1963 len
= strlen (dll_filename
) + 1;
1966 bfd_set_section_size (abfd
, id7
, len
);
1969 strcpy ((char *) d7
, dll_filename
);
1970 /* If len was odd, the above
1971 strcpy leaves behind an undefined byte. That is harmless,
1972 but we set it to 0 just so the binary dumps are pretty. */
1975 bfd_set_symtab (abfd
, symtab
, symptr
);
1977 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
1978 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
1979 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1981 bfd_make_readable (abfd
);
1987 .global ___imp_function
1988 .global __imp__function
1990 jmp *__imp__function:
2004 .asciz "function" xlate? (add underscore, kill at) */
2006 static const unsigned char jmp_ix86_bytes
[] =
2008 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2016 .dw __imp_function */
2018 static const unsigned char jmp_sh_bytes
[] =
2020 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2024 lui $t0,<high:__imp_function>
2025 lw $t0,<low:__imp_function>
2029 static const unsigned char jmp_mips_bytes
[] =
2031 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2032 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2035 static const unsigned char jmp_arm_bytes
[] =
2037 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2038 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2044 make_one (def_file_export
*exp
, bfd
*parent
, bfd_boolean include_jmp_stub
)
2046 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
2047 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
2051 const unsigned char *jmp_bytes
= NULL
;
2052 int jmp_byte_count
= 0;
2054 /* Include the jump stub section only if it is needed. A jump
2055 stub is needed if the symbol being imported <sym> is a function
2056 symbol and there is at least one undefined reference to that
2057 symbol. In other words, if all the import references to <sym> are
2058 explicitly through _declspec(dllimport) then the jump stub is not
2060 if (include_jmp_stub
)
2062 switch (pe_details
->pe_arch
)
2065 jmp_bytes
= jmp_ix86_bytes
;
2066 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
2069 jmp_bytes
= jmp_sh_bytes
;
2070 jmp_byte_count
= sizeof (jmp_sh_bytes
);
2073 jmp_bytes
= jmp_mips_bytes
;
2074 jmp_byte_count
= sizeof (jmp_mips_bytes
);
2077 case PE_ARCH_arm_epoc
:
2078 case PE_ARCH_arm_wince
:
2079 jmp_bytes
= jmp_arm_bytes
;
2080 jmp_byte_count
= sizeof (jmp_arm_bytes
);
2087 oname
= xmalloc (20);
2088 sprintf (oname
, "d%06d.o", tmp_seq
);
2091 abfd
= bfd_create (oname
, parent
);
2092 bfd_find_target (pe_details
->object_target
, abfd
);
2093 bfd_make_writable (abfd
);
2095 bfd_set_format (abfd
, bfd_object
);
2096 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2099 symtab
= xmalloc (12 * sizeof (asymbol
*));
2101 tx
= quick_section (abfd
, ".text", SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
, 2);
2102 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2103 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2104 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2105 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
2107 if (*exp
->internal_name
== '@')
2109 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2111 if (include_jmp_stub
)
2112 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
2113 quick_symbol (abfd
, "__imp_", exp
->internal_name
, "", id5
,
2115 /* Fastcall applies only to functions,
2116 so no need for auto-import symbol. */
2120 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2122 if (include_jmp_stub
)
2123 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
,
2125 quick_symbol (abfd
, "__imp_", U (""), exp
->internal_name
, id5
,
2127 /* Symbol to reference ord/name of imported
2128 data symbol, used to implement auto-import. */
2130 quick_symbol (abfd
, U ("_nm_"), U (""), exp
->internal_name
, id6
,
2133 if (pe_dll_compat_implib
)
2134 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "", id5
,
2137 if (include_jmp_stub
)
2139 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
2140 td
= xmalloc (jmp_byte_count
);
2142 memcpy (td
, jmp_bytes
, jmp_byte_count
);
2144 switch (pe_details
->pe_arch
)
2147 #ifdef pe_use_x86_64
2148 quick_reloc (abfd
, 2, BFD_RELOC_32_PCREL
, 2);
2150 /* Mark this object as SAFESEH compatible. */
2151 quick_symbol (abfd
, "", "@feat.00", "", bfd_abs_section_ptr
,
2153 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
2157 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2160 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
2161 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
2162 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
2165 case PE_ARCH_arm_epoc
:
2166 case PE_ARCH_arm_wince
:
2167 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2175 bfd_set_section_size (abfd
, tx
, 0);
2177 bfd_set_section_size (abfd
, id7
, 4);
2181 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 5);
2184 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
2185 d5
= xmalloc (PE_IDATA5_SIZE
);
2187 memset (d5
, 0, PE_IDATA5_SIZE
);
2189 if (exp
->flag_noname
)
2191 d5
[0] = exp
->ordinal
;
2192 d5
[1] = exp
->ordinal
>> 8;
2193 d5
[PE_IDATA5_SIZE
- 1] = 0x80;
2197 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2201 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
2202 d4
= xmalloc (PE_IDATA4_SIZE
);
2204 memset (d4
, 0, PE_IDATA4_SIZE
);
2206 if (exp
->flag_noname
)
2208 d4
[0] = exp
->ordinal
;
2209 d4
[1] = exp
->ordinal
>> 8;
2210 d4
[PE_IDATA4_SIZE
- 1] = 0x80;
2214 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2218 if (exp
->flag_noname
)
2221 bfd_set_section_size (abfd
, id6
, 0);
2225 /* { short, asciz } */
2227 len
= 2 + strlen (exp
->its_name
) + 1;
2229 len
= 2 + strlen (exp
->name
) + 1;
2232 bfd_set_section_size (abfd
, id6
, len
);
2235 memset (d6
, 0, len
);
2236 d6
[0] = exp
->hint
& 0xff;
2237 d6
[1] = exp
->hint
>> 8;
2239 strcpy ((char*) d6
+ 2, exp
->its_name
);
2241 strcpy ((char *) d6
+ 2, exp
->name
);
2244 bfd_set_symtab (abfd
, symtab
, symptr
);
2246 if (include_jmp_stub
)
2247 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
2248 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
2249 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2250 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2251 if (!exp
->flag_noname
)
2252 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
2254 bfd_make_readable (abfd
);
2259 make_singleton_name_imp (const char *import
, bfd
*parent
)
2261 /* Name thunks go to idata$4. */
2267 oname
= xmalloc (20);
2268 sprintf (oname
, "nmimp%06d.o", tmp_seq2
);
2271 abfd
= bfd_create (oname
, parent
);
2272 bfd_find_target (pe_details
->object_target
, abfd
);
2273 bfd_make_writable (abfd
);
2275 bfd_set_format (abfd
, bfd_object
);
2276 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2279 symtab
= xmalloc (3 * sizeof (asymbol
*));
2280 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2281 quick_symbol (abfd
, U ("_imp_"), import
, "", id5
, BSF_GLOBAL
, 0);
2283 /* We need space for the real thunk and for the null terminator. */
2284 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
* 2);
2285 d5
= xmalloc (PE_IDATA5_SIZE
* 2);
2287 memset (d5
, 0, PE_IDATA5_SIZE
* 2);
2288 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2291 bfd_set_symtab (abfd
, symtab
, symptr
);
2293 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA4_SIZE
* 2);
2295 bfd_make_readable (abfd
);
2300 make_singleton_name_thunk (const char *import
, bfd
*parent
)
2302 /* Name thunks go to idata$4. */
2308 oname
= xmalloc (20);
2309 sprintf (oname
, "nmth%06d.o", tmp_seq
);
2312 abfd
= bfd_create (oname
, parent
);
2313 bfd_find_target (pe_details
->object_target
, abfd
);
2314 bfd_make_writable (abfd
);
2316 bfd_set_format (abfd
, bfd_object
);
2317 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2320 symtab
= xmalloc (3 * sizeof (asymbol
*));
2321 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2322 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
2323 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
2325 /* We need space for the real thunk and for the null terminator. */
2326 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
* 2);
2327 d4
= xmalloc (PE_IDATA4_SIZE
* 2);
2329 memset (d4
, 0, PE_IDATA4_SIZE
* 2);
2330 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2333 bfd_set_symtab (abfd
, symtab
, symptr
);
2335 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
* 2);
2337 bfd_make_readable (abfd
);
2342 make_import_fixup_mark (arelent
*rel
)
2344 /* We convert reloc to symbol, for later reference. */
2346 static char *fixup_name
= NULL
;
2347 static size_t buffer_len
= 0;
2349 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2351 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2352 struct bfd_link_hash_entry
*bh
;
2356 fixup_name
= xmalloc (384);
2360 if (strlen (sym
->name
) + 25 > buffer_len
)
2361 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2362 bigger than 20 digits long, we've got worse problems than
2363 overflowing this buffer... */
2366 /* New buffer size is length of symbol, plus 25, but
2367 then rounded up to the nearest multiple of 128. */
2368 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2369 fixup_name
= xmalloc (buffer_len
);
2372 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2375 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2376 current_sec
, /* sym->section, */
2377 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2382 /* .section .idata$2
2383 .rva __nm_thnk_SYM (singleton thunk with name of func)
2386 .rva __my_dll_iname (name of dll)
2387 .rva __fuNN_SYM (pointer to reference (address) in text) */
2390 make_import_fixup_entry (const char *name
,
2391 const char *fixup_name
,
2392 const char *symname
,
2400 oname
= xmalloc (20);
2401 sprintf (oname
, "fu%06d.o", tmp_seq
);
2404 abfd
= bfd_create (oname
, parent
);
2405 bfd_find_target (pe_details
->object_target
, abfd
);
2406 bfd_make_writable (abfd
);
2408 bfd_set_format (abfd
, bfd_object
);
2409 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2412 symtab
= xmalloc (6 * sizeof (asymbol
*));
2413 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2415 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2416 quick_symbol (abfd
, U (""), symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2417 /* For relocator v2 we have to use the .idata$5 element and not
2419 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2420 quick_symbol (abfd
, U ("_imp_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2422 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2424 bfd_set_section_size (abfd
, id2
, 20);
2429 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2430 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2431 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2434 bfd_set_symtab (abfd
, symtab
, symptr
);
2436 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2438 bfd_make_readable (abfd
);
2442 /* .section .rdata_runtime_pseudo_reloc
2444 .rva __fuNN_SYM (pointer to reference (address) in text) */
2447 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED
,
2448 const char *fixup_name
,
2449 bfd_vma addend ATTRIBUTE_UNUSED
,
2454 unsigned char *rt_rel_d
;
2457 oname
= xmalloc (20);
2458 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2461 abfd
= bfd_create (oname
, parent
);
2462 bfd_find_target (pe_details
->object_target
, abfd
);
2463 bfd_make_writable (abfd
);
2465 bfd_set_format (abfd
, bfd_object
);
2466 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2469 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2471 symtab
= xmalloc ((runtime_pseudp_reloc_v2_init
? 3 : 6) * sizeof (asymbol
*));
2475 symtab
= xmalloc (2 * sizeof (asymbol
*));
2477 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc",
2478 SEC_HAS_CONTENTS
, 2);
2480 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2482 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2485 if (! runtime_pseudp_reloc_v2_init
)
2488 runtime_pseudp_reloc_v2_init
= 1;
2490 quick_symbol (abfd
, U ("_imp_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2492 bfd_set_section_size (abfd
, rt_rel
, size
);
2493 rt_rel_d
= xmalloc (size
);
2494 rt_rel
->contents
= rt_rel_d
;
2495 memset (rt_rel_d
, 0, size
);
2496 quick_reloc (abfd
, size
- 8, BFD_RELOC_RVA
, 1);
2497 quick_reloc (abfd
, size
- 12, BFD_RELOC_RVA
, 2);
2498 bfd_put_32 (abfd
, bitsize
, rt_rel_d
+ (size
- 4));
2500 bfd_put_32 (abfd
, 1, rt_rel_d
+ 8);
2501 save_relocs (rt_rel
);
2503 bfd_set_symtab (abfd
, symtab
, symptr
);
2505 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, size
);
2509 bfd_set_section_size (abfd
, rt_rel
, 8);
2510 rt_rel_d
= xmalloc (8);
2511 rt_rel
->contents
= rt_rel_d
;
2512 memset (rt_rel_d
, 0, 8);
2514 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2515 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2517 save_relocs (rt_rel
);
2519 bfd_set_symtab (abfd
, symtab
, symptr
);
2521 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2523 bfd_make_readable (abfd
);
2528 .rva __pei386_runtime_relocator */
2531 pe_create_runtime_relocator_reference (bfd
*parent
)
2533 asection
*extern_rt_rel
;
2534 unsigned char *extern_rt_rel_d
;
2538 oname
= xmalloc (20);
2539 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2542 abfd
= bfd_create (oname
, parent
);
2543 bfd_find_target (pe_details
->object_target
, abfd
);
2544 bfd_make_writable (abfd
);
2546 bfd_set_format (abfd
, bfd_object
);
2547 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2550 symtab
= xmalloc (2 * sizeof (asymbol
*));
2551 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2553 quick_symbol (abfd
, "", U ("_pei386_runtime_relocator"), "", UNDSEC
,
2556 bfd_set_section_size (abfd
, extern_rt_rel
, PE_IDATA5_SIZE
);
2557 extern_rt_rel_d
= xmalloc (PE_IDATA5_SIZE
);
2558 extern_rt_rel
->contents
= extern_rt_rel_d
;
2560 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2561 save_relocs (extern_rt_rel
);
2563 bfd_set_symtab (abfd
, symtab
, symptr
);
2565 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, PE_IDATA5_SIZE
);
2567 bfd_make_readable (abfd
);
2572 pe_create_import_fixup (arelent
*rel
, asection
*s
, bfd_vma addend
)
2575 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2576 struct bfd_link_hash_entry
*name_thunk_sym
;
2577 struct bfd_link_hash_entry
*name_imp_sym
;
2578 const char *name
= sym
->name
;
2579 char *fixup_name
= make_import_fixup_mark (rel
);
2581 int need_import_table
= 1;
2583 sprintf (buf
, U ("_imp_%s"), name
);
2584 name_imp_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2586 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2588 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2590 /* For version 2 pseudo relocation we don't need to add an import
2591 if the import symbol is already present. */
2592 if (link_info
.pei386_runtime_pseudo_reloc
== 2
2594 && name_imp_sym
->type
== bfd_link_hash_defined
)
2595 need_import_table
= 0;
2597 if (need_import_table
== 1
2598 && (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
))
2600 b
= make_singleton_name_thunk (name
, link_info
.output_bfd
);
2601 add_bfd_to_link (b
, b
->filename
, &link_info
);
2603 /* If we ever use autoimport, we have to cast text section writable.
2604 But not for version 2. */
2605 if (link_info
.pei386_runtime_pseudo_reloc
!= 2)
2607 config
.text_read_only
= FALSE
;
2608 link_info
.output_bfd
->flags
&= ~WP_TEXT
;
2610 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2612 b
= make_singleton_name_imp (name
, link_info
.output_bfd
);
2613 add_bfd_to_link (b
, b
->filename
, &link_info
);
2617 if ((addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2618 && need_import_table
== 1)
2620 extern char * pe_data_import_dll
;
2621 char * symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2623 b
= make_import_fixup_entry (name
, fixup_name
, symname
,
2624 link_info
.output_bfd
);
2625 add_bfd_to_link (b
, b
->filename
, &link_info
);
2628 if ((link_info
.pei386_runtime_pseudo_reloc
!= 0 && addend
!= 0)
2629 || link_info
.pei386_runtime_pseudo_reloc
== 2)
2631 if (pe_dll_extra_pe_debug
)
2632 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2633 fixup_name
, (int) addend
);
2635 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, rel
->howto
->bitsize
,
2636 link_info
.output_bfd
);
2637 add_bfd_to_link (b
, b
->filename
, &link_info
);
2639 if (runtime_pseudo_relocs_created
== 0)
2641 b
= pe_create_runtime_relocator_reference (link_info
.output_bfd
);
2642 add_bfd_to_link (b
, b
->filename
, &link_info
);
2644 runtime_pseudo_relocs_created
++;
2646 else if (addend
!= 0)
2648 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2649 s
->owner
, s
, rel
->address
, sym
->name
);
2656 pe_dll_generate_implib (def_file
*def
, const char *impfilename
, struct bfd_link_info
*info
)
2665 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2666 dll_symname
= xstrdup (dll_filename
);
2667 for (i
= 0; dll_symname
[i
]; i
++)
2668 if (!ISALNUM (dll_symname
[i
]))
2669 dll_symname
[i
] = '_';
2671 unlink_if_ordinary (impfilename
);
2673 outarch
= bfd_openw (impfilename
, 0);
2677 /* xgettext:c-format */
2678 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2682 /* xgettext:c-format */
2683 info_msg (_("Creating library file: %s\n"), impfilename
);
2685 bfd_set_format (outarch
, bfd_archive
);
2686 outarch
->has_armap
= 1;
2688 /* Work out a reasonable size of things to put onto one line. */
2689 ar_head
= make_head (outarch
);
2691 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2692 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
2694 /* Iterate the exclude list. */
2695 struct exclude_list_struct
*ex
;
2697 for (ex
= excludes
, found
= 0; ex
&& !found
; ex
= ex
->next
)
2699 if (ex
->type
!= EXCLUDEFORIMPLIB
)
2701 found
= (strcmp (ex
->string
, ibfd
->filename
) == 0);
2703 /* If it matched, we must open a fresh BFD for it (the original
2704 input BFD is still needed for the DLL's final link) and add
2705 it into the archive member chain. */
2708 bfd
*newbfd
= bfd_openr (ibfd
->my_archive
2709 ? ibfd
->my_archive
->filename
: ibfd
->filename
, NULL
);
2712 einfo (_("%Xbfd_openr %s: %E\n"), ibfd
->filename
);
2715 if (ibfd
->my_archive
)
2717 /* Must now iterate through archive until we find the
2718 required member. A minor shame that we'll open the
2719 archive once per member that we require from it, and
2720 leak those archive bfds rather than reuse them. */
2721 bfd
*arbfd
= newbfd
;
2722 if (!bfd_check_format_matches (arbfd
, bfd_archive
, NULL
))
2724 einfo (_("%X%s(%s): can't find member in non-archive file"),
2725 ibfd
->my_archive
->filename
, ibfd
->filename
);
2729 while ((newbfd
= bfd_openr_next_archived_file (arbfd
, newbfd
)) != 0)
2731 if (strcmp (newbfd
->filename
, ibfd
->filename
) == 0)
2736 einfo (_("%X%s(%s): can't find member in archive"),
2737 ibfd
->my_archive
->filename
, ibfd
->filename
);
2741 newbfd
->archive_next
= head
;
2746 for (i
= 0; i
< def
->num_exports
; i
++)
2748 /* The import library doesn't know about the internal name. */
2749 char *internal
= def
->exports
[i
].internal_name
;
2752 /* Don't add PRIVATE entries to import lib. */
2753 if (pe_def_file
->exports
[i
].flag_private
)
2755 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2756 n
= make_one (def
->exports
+ i
, outarch
,
2757 ! (def
->exports
+ i
)->flag_data
);
2758 n
->archive_next
= head
;
2760 def
->exports
[i
].internal_name
= internal
;
2763 ar_tail
= make_tail (outarch
);
2765 if (ar_head
== NULL
|| ar_tail
== NULL
)
2768 /* Now stick them all into the archive. */
2769 ar_head
->archive_next
= head
;
2770 ar_tail
->archive_next
= ar_head
;
2773 if (! bfd_set_archive_head (outarch
, head
))
2774 einfo ("%Xbfd_set_archive_head: %E\n");
2776 if (! bfd_close (outarch
))
2777 einfo ("%Xbfd_close %s: %E\n", impfilename
);
2779 while (head
!= NULL
)
2781 bfd
*n
= head
->archive_next
;
2787 static struct bfd_link_hash_entry
*found_sym
;
2790 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry
*h
, void *inf
)
2794 const char *hs
= h
->root
.string
;
2796 sl
= strlen (string
);
2797 if (h
->type
== bfd_link_hash_undefined
2798 && ((*hs
== '@' && *string
== '_'
2799 && strncmp (hs
+ 1, string
+ 1, sl
- 1) == 0)
2800 || strncmp (hs
, string
, sl
) == 0)
2801 && h
->root
.string
[sl
] == '@')
2809 static struct bfd_link_hash_entry
*
2810 pe_find_cdecl_alias_match (char *name
)
2813 bfd_link_hash_traverse (link_info
.hash
, pe_undef_alias_cdecl_match
,
2819 add_bfd_to_link (bfd
*abfd
, const char *name
, struct bfd_link_info
*linfo
)
2821 lang_input_statement_type
*fake_file
;
2823 fake_file
= lang_add_input_file (name
,
2824 lang_input_file_is_fake_enum
,
2826 fake_file
->the_bfd
= abfd
;
2827 ldlang_add_file (fake_file
);
2829 if (!bfd_link_add_symbols (abfd
, linfo
))
2830 einfo ("%Xaddsym %s: %E\n", name
);
2834 pe_process_import_defs (bfd
*output_bfd
, struct bfd_link_info
*linfo
)
2836 def_file_module
*module
;
2838 pe_dll_id_target (bfd_get_target (output_bfd
));
2843 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2847 dll_filename
= module
->name
;
2848 dll_symname
= xstrdup (module
->name
);
2849 for (i
= 0; dll_symname
[i
]; i
++)
2850 if (!ISALNUM (dll_symname
[i
]))
2851 dll_symname
[i
] = '_';
2855 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2856 if (pe_def_file
->imports
[i
].module
== module
)
2858 def_file_export exp
;
2859 struct bfd_link_hash_entry
*blhe
;
2860 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2861 /* See if we need this import. */
2862 size_t len
= strlen (pe_def_file
->imports
[i
].internal_name
);
2863 char *name
= xmalloc (len
+ 2 + 6);
2864 bfd_boolean include_jmp_stub
= FALSE
;
2865 bfd_boolean is_cdecl
= FALSE
;
2866 if (!lead_at
&& strchr (pe_def_file
->imports
[i
].internal_name
, '@') == NULL
)
2870 sprintf (name
, "%s",
2871 pe_def_file
->imports
[i
].internal_name
);
2873 sprintf (name
, "%s%s",U (""),
2874 pe_def_file
->imports
[i
].internal_name
);
2876 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
2877 FALSE
, FALSE
, FALSE
);
2879 /* Include the jump stub for <sym> only if the <sym>
2881 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2884 sprintf (name
, "%s%s", "__imp_",
2885 pe_def_file
->imports
[i
].internal_name
);
2887 sprintf (name
, "%s%s%s", "__imp_", U (""),
2888 pe_def_file
->imports
[i
].internal_name
);
2890 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
2891 FALSE
, FALSE
, FALSE
);
2894 include_jmp_stub
= TRUE
;
2896 if (is_cdecl
&& !blhe
)
2898 sprintf (name
, "%s%s",U (""),
2899 pe_def_file
->imports
[i
].internal_name
);
2900 blhe
= pe_find_cdecl_alias_match (name
);
2901 include_jmp_stub
= TRUE
;
2906 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2912 bfd
*ar_head
= make_head (output_bfd
);
2913 add_bfd_to_link (ar_head
, ar_head
->filename
, linfo
);
2916 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2917 exp
.name
= pe_def_file
->imports
[i
].name
;
2918 exp
.its_name
= pe_def_file
->imports
[i
].its_name
;
2919 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2920 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2921 exp
.flag_private
= 0;
2922 exp
.flag_constant
= 0;
2923 exp
.flag_data
= pe_def_file
->imports
[i
].data
;
2924 exp
.flag_noname
= exp
.name
? 0 : 1;
2925 one
= make_one (&exp
, output_bfd
, (! exp
.flag_data
) && include_jmp_stub
);
2926 add_bfd_to_link (one
, one
->filename
, linfo
);
2931 bfd
*ar_tail
= make_tail (output_bfd
);
2932 add_bfd_to_link (ar_tail
, ar_tail
->filename
, linfo
);
2939 /* We were handed a *.DLL file. Parse it and turn it into a set of
2940 IMPORTS directives in the def file. Return TRUE if the file was
2941 handled, FALSE if not. */
2944 pe_get16 (bfd
*abfd
, int where
)
2948 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2949 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2950 return b
[0] + (b
[1] << 8);
2954 pe_get32 (bfd
*abfd
, int where
)
2958 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2959 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2960 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2966 unsigned char *b
= ptr
;
2968 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2972 pe_implied_import_dll (const char *filename
)
2975 bfd_vma pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2976 bfd_vma export_rva
, export_size
, nsections
, secptr
, expptr
;
2977 bfd_vma exp_funcbase
;
2978 unsigned char *expdata
;
2980 bfd_vma name_rvas
, ordinals
, nexp
, ordbase
;
2981 const char *dllname
;
2982 /* Initialization with start > end guarantees that is_data
2983 will not be set by mistake, and avoids compiler warning. */
2984 bfd_vma data_start
= 1;
2985 bfd_vma data_end
= 0;
2986 bfd_vma rdata_start
= 1;
2987 bfd_vma rdata_end
= 0;
2988 bfd_vma bss_start
= 1;
2989 bfd_vma bss_end
= 0;
2991 /* No, I can't use bfd here. kernel32.dll puts its export table in
2992 the middle of the .rdata section. */
2993 dll
= bfd_openr (filename
, pe_details
->target_name
);
2996 einfo ("%Xopen %s: %E\n", filename
);
3000 /* PEI dlls seem to be bfd_objects. */
3001 if (!bfd_check_format (dll
, bfd_object
))
3003 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
3007 /* Get pe_header, optional header and numbers of directory entries. */
3008 pe_header_offset
= pe_get32 (dll
, 0x3c);
3009 opthdr_ofs
= pe_header_offset
+ 4 + 20;
3010 #ifdef pe_use_x86_64
3011 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3013 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
3016 /* No import or export directory entry. */
3017 if (num_entries
< 1)
3020 #ifdef pe_use_x86_64
3021 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96 + 4 * 4);
3022 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100 + 4 * 4);
3024 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
3025 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
3028 /* No export table - nothing to export. */
3029 if (export_size
== 0)
3032 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
3033 secptr
= (pe_header_offset
+ 4 + 20 +
3034 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
3037 /* Get the rva and size of the export section. */
3038 for (i
= 0; i
< nsections
; i
++)
3041 bfd_vma secptr1
= secptr
+ 40 * i
;
3042 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3043 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 16);
3044 bfd_vma fptr
= pe_get32 (dll
, secptr1
+ 20);
3046 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
3047 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
3049 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
3051 expptr
= fptr
+ (export_rva
- vaddr
);
3052 if (export_rva
+ export_size
> vaddr
+ vsize
)
3053 export_size
= vsize
- (export_rva
- vaddr
);
3058 /* Scan sections and store the base and size of the
3059 data and bss segments in data/base_start/end. */
3060 for (i
= 0; i
< nsections
; i
++)
3062 bfd_vma secptr1
= secptr
+ 40 * i
;
3063 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 8);
3064 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3065 bfd_vma flags
= pe_get32 (dll
, secptr1
+ 36);
3069 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
3070 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
3072 if (strcmp(sec_name
,".data") == 0)
3075 data_end
= vaddr
+ vsize
;
3077 if (pe_dll_extra_pe_debug
)
3078 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3079 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3080 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3082 else if (strcmp(sec_name
,".rdata") == 0)
3084 rdata_start
= vaddr
;
3085 rdata_end
= vaddr
+ vsize
;
3087 if (pe_dll_extra_pe_debug
)
3088 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3089 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3090 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3092 else if (strcmp (sec_name
,".bss") == 0)
3095 bss_end
= vaddr
+ vsize
;
3097 if (pe_dll_extra_pe_debug
)
3098 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3099 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3100 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3104 expdata
= xmalloc (export_size
);
3105 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
3106 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
3107 erva
= (char *) expdata
- export_rva
;
3109 if (pe_def_file
== 0)
3110 pe_def_file
= def_file_empty ();
3112 nexp
= pe_as32 (expdata
+ 24);
3113 name_rvas
= pe_as32 (expdata
+ 32);
3114 ordinals
= pe_as32 (expdata
+ 36);
3115 ordbase
= pe_as32 (expdata
+ 16);
3116 exp_funcbase
= pe_as32 (expdata
+ 28);
3118 /* Use internal dll name instead of filename
3119 to enable symbolic dll linking. */
3120 dllname
= erva
+ pe_as32 (expdata
+ 12);
3122 /* Check to see if the dll has already been added to
3123 the definition list and if so return without error.
3124 This avoids multiple symbol definitions. */
3125 if (def_get_module (pe_def_file
, dllname
))
3127 if (pe_dll_extra_pe_debug
)
3128 printf ("%s is already loaded\n", dllname
);
3132 /* Iterate through the list of symbols. */
3133 for (i
= 0; i
< nexp
; i
++)
3135 /* Pointer to the names vector. */
3136 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3137 def_file_import
*imp
;
3138 /* Pointer to the function address vector. */
3139 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3142 /* Skip unwanted symbols, which are
3143 exported in buggy auto-import releases. */
3144 if (! CONST_STRNEQ (erva
+ name_rva
, "_nm_"))
3146 /* is_data is true if the address is in the data, rdata or bss
3149 (func_rva
>= data_start
&& func_rva
< data_end
)
3150 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3151 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3153 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
3154 dllname
, i
, 0, NULL
);
3155 /* Mark symbol type. */
3156 imp
->data
= is_data
;
3158 if (pe_dll_extra_pe_debug
)
3159 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3160 __FUNCTION__
, dllname
, erva
+ name_rva
,
3161 (unsigned long) func_rva
, is_data
? "(data)" : "");
3169 pe_output_file_set_long_section_names (bfd
*abfd
)
3171 if (pe_use_coff_long_section_names
< 0)
3173 if (!bfd_coff_set_long_section_names (abfd
, pe_use_coff_long_section_names
))
3174 einfo (_("%XError: can't use long section names on this arch\n"));
3177 /* These are the main functions, called from the emulation. The first
3178 is called after the bfds are read, so we can guess at how much space
3179 we need. The second is called after everything is placed, so we
3180 can put the right values in place. */
3183 pe_dll_build_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3185 pe_dll_id_target (bfd_get_target (abfd
));
3186 pe_output_file_set_long_section_names (abfd
);
3187 process_def_file_and_drectve (abfd
, info
);
3189 if (pe_def_file
->num_exports
== 0 && !info
->shared
)
3192 generate_edata (abfd
, info
);
3193 build_filler_bfd (1);
3194 pe_output_file_set_long_section_names (filler_bfd
);
3198 pe_exe_build_sections (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3200 pe_dll_id_target (bfd_get_target (abfd
));
3201 pe_output_file_set_long_section_names (abfd
);
3202 build_filler_bfd (0);
3203 pe_output_file_set_long_section_names (filler_bfd
);
3207 pe_dll_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3209 pe_dll_id_target (bfd_get_target (abfd
));
3210 pe_output_file_set_long_section_names (abfd
);
3211 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3213 generate_reloc (abfd
, info
);
3216 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
3218 /* Resize the sections. */
3219 lang_reset_memory_regions ();
3220 lang_size_sections (NULL
, TRUE
);
3222 /* Redo special stuff. */
3223 ldemul_after_allocation ();
3225 /* Do the assignments again. */
3226 lang_do_assignments ();
3229 fill_edata (abfd
, info
);
3231 if (info
->shared
&& !info
->pie
)
3232 pe_data (abfd
)->dll
= 1;
3234 edata_s
->contents
= edata_d
;
3235 reloc_s
->contents
= reloc_d
;
3239 pe_exe_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3241 pe_dll_id_target (bfd_get_target (abfd
));
3242 pe_output_file_set_long_section_names (abfd
);
3243 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3245 generate_reloc (abfd
, info
);
3248 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
3250 /* Resize the sections. */
3251 lang_reset_memory_regions ();
3252 lang_size_sections (NULL
, TRUE
);
3254 /* Redo special stuff. */
3255 ldemul_after_allocation ();
3257 /* Do the assignments again. */
3258 lang_do_assignments ();
3260 reloc_s
->contents
= reloc_d
;
3264 pe_bfd_is_dll (bfd
*abfd
)
3266 return (bfd_get_format (abfd
) == bfd_object
3268 && pe_data (abfd
)->dll
);