1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of GLD, the Gnu Linker.
7 GLD 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 2, or (at your option)
12 GLD 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 GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25 #include "libiberty.h"
26 #include "safe-ctype.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
44 /* This file turns a regular Windows PE image into a DLL. Because of
45 the complexity of this operation, it has been broken down into a
46 number of separate modules which are all called by the main function
47 at the end of this file. This function is not re-entrant and is
48 normally only called once, so static variables are used to reduce
49 the number of parameters and return values required.
51 See also: ld/emultempl/pe.em. */
53 /* Auto-import feature by Paul Sokolovsky
57 1. With this feature on, DLL clients can import variables from DLL
58 without any concern from their side (for example, without any source
61 2. This is done completely in bounds of the PE specification (to be fair,
62 there's a place where it pokes nose out of, but in practice it works).
63 So, resulting module can be used with any other PE compiler/linker.
65 3. Auto-import is fully compatible with standard import method and they
66 can be mixed together.
68 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
69 reference to it; load time: negligible; virtual/physical memory: should be
70 less than effect of DLL relocation, and I sincerely hope it doesn't affect
71 DLL sharability (too much).
75 The obvious and only way to get rid of dllimport insanity is to make client
76 access variable directly in the DLL, bypassing extra dereference. I.e.,
77 whenever client contains something like
81 address of dll_var in the command should be relocated to point into loaded
82 DLL. The aim is to make OS loader do so, and than make ld help with that.
83 Import section of PE made following way: there's a vector of structures
84 each describing imports from particular DLL. Each such structure points
85 to two other parallel vectors: one holding imported names, and one which
86 will hold address of corresponding imported name. So, the solution is
87 de-vectorize these structures, making import locations be sparse and
88 pointing directly into code. Before continuing, it is worth a note that,
89 while authors strives to make PE act ELF-like, there're some other people
90 make ELF act PE-like: elfvector, ;-) .
94 For each reference of data symbol to be imported from DLL (to set of which
95 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
96 import fixup entry is generated. That entry is of type
97 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
98 fixup entry contains pointer to symbol's address within .text section
99 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
100 (so, DLL name is referenced by multiple entries), and pointer to symbol
101 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
102 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
103 containing imported name. Here comes that "om the edge" problem mentioned
104 above: PE specification rambles that name vector (OriginalFirstThunk)
105 should run in parallel with addresses vector (FirstThunk), i.e. that they
106 should have same number of elements and terminated with zero. We violate
107 this, since FirstThunk points directly into machine code. But in practice,
108 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
109 puts addresses to FirstThunk, not something else. It once again should be
110 noted that dll and symbol name structures are reused across fixup entries
111 and should be there anyway to support standard import stuff, so sustained
112 overhead is 20 bytes per reference. Other question is whether having several
113 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
114 done even by native compiler/linker (libth32's functions are in fact reside
115 in windows9x kernel32.dll, so if you use it, you have two
116 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
117 referencing the same PE structures several times is valid. The answer is why
118 not, prohibiting that (detecting violation) would require more work on
119 behalf of loader than not doing it.
121 See also: ld/emultempl/pe.em. */
124 add_bfd_to_link
PARAMS ((bfd
*, const char *, struct bfd_link_info
*));
126 /* For emultempl/pe.em. */
128 def_file
* pe_def_file
= 0;
129 int pe_dll_export_everything
= 0;
130 int pe_dll_do_default_excludes
= 1;
131 int pe_dll_kill_ats
= 0;
132 int pe_dll_stdcall_aliases
= 0;
133 int pe_dll_warn_dup_exports
= 0;
134 int pe_dll_compat_implib
= 0;
135 int pe_dll_extra_pe_debug
= 0;
137 /* Static variables and types. */
139 static bfd_vma image_base
;
140 static bfd
*filler_bfd
;
141 static struct sec
*edata_s
, *reloc_s
;
142 static unsigned char *edata_d
, *reloc_d
;
143 static size_t edata_sz
, reloc_sz
;
144 static int runtime_pseudo_relocs_created
= 0;
150 unsigned int imagebase_reloc
;
162 autofilter_entry_type
;
164 #define PE_ARCH_i386 1
166 #define PE_ARCH_mips 3
167 #define PE_ARCH_arm 4
168 #define PE_ARCH_arm_epoc 5
170 static pe_details_type pe_detail_list
[] =
183 16 /* R_SH_IMAGEBASE */,
205 "epoc-pei-arm-little",
206 "epoc-pe-arm-little",
212 { NULL
, NULL
, 0, 0, 0, 0 }
215 static pe_details_type
*pe_details
;
217 static autofilter_entry_type autofilter_symbollist
[] =
219 { "DllMain@12", 10 },
220 { "DllEntryPoint@0", 15 },
221 { "DllMainCRTStartup@12", 20 },
222 { "_cygwin_dll_entry@12", 20 },
223 { "_cygwin_crt0_common@8", 21 },
224 { "_cygwin_noncygwin_dll_entry@12", 30 },
225 { "impure_ptr", 10 },
226 { "_pei386_runtime_relocator", 25 },
227 { "do_pseudo_reloc", 15 },
228 { "cygwin_crt0", 11 },
232 /* Do not specify library suffix explicitly, to allow for dllized versions. */
233 static autofilter_entry_type autofilter_liblist
[] =
237 { "libmingw32", 10 },
238 { "libmingwex", 10 },
246 static autofilter_entry_type autofilter_objlist
[] =
256 { "crtbegin.o", 10 },
261 static autofilter_entry_type autofilter_symbolprefixlist
[] =
263 /* { "__imp_", 6 }, */
264 /* Do __imp_ explicitly to save time. */
266 /* Don't re-export auto-imported symbols. */
268 { "__builtin_", 10 },
269 /* Don't export symbols specifying internal DLL layout. */
272 { "_impure_ptr", 11 },
273 { "cygwin_attach_dll", 17 },
274 { "cygwin_premain0", 15 },
275 { "cygwin_premain1", 15 },
276 { "cygwin_premain2", 15 },
277 { "cygwin_premain3", 15 },
282 static autofilter_entry_type autofilter_symbolsuffixlist
[] =
288 #define U(str) (pe_details->underscored ? "_" str : str)
290 static int reloc_sort
PARAMS ((const void *, const void *));
291 static int pe_export_sort
PARAMS ((const void *, const void *));
292 static int auto_export
PARAMS ((bfd
*, def_file
*, const char *));
293 static void process_def_file
PARAMS ((bfd
*, struct bfd_link_info
*));
294 static void build_filler_bfd
PARAMS ((int));
295 static void generate_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
296 static void fill_exported_offsets
PARAMS ((bfd
*, struct bfd_link_info
*));
297 static void fill_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
298 static void generate_reloc
PARAMS ((bfd
*, struct bfd_link_info
*));
299 static void quoteput
PARAMS ((char *, FILE *, int));
300 static asection
*quick_section
PARAMS ((bfd
*, const char *, int, int));
301 static void quick_symbol
302 PARAMS ((bfd
*, const char *, const char *, const char *,
303 asection
*, int, int));
304 static void quick_reloc
PARAMS ((bfd
*, int, int, int));
305 static bfd
*make_head
PARAMS ((bfd
*));
306 static bfd
*make_tail
PARAMS ((bfd
*));
307 static bfd
*make_one
PARAMS ((def_file_export
*, bfd
*));
308 static bfd
*make_singleton_name_thunk
PARAMS ((const char *, bfd
*));
309 static char *make_import_fixup_mark
PARAMS ((arelent
*));
310 static bfd
*make_import_fixup_entry
311 PARAMS ((const char *, const char *, const char *, bfd
*));
312 static bfd
*make_runtime_pseudo_reloc
313 PARAMS ((const char *, const char *, int, bfd
*));
314 static bfd
*pe_create_runtime_relocator_reference
316 static unsigned int pe_get16
PARAMS ((bfd
*, int));
317 static unsigned int pe_get32
PARAMS ((bfd
*, int));
318 static unsigned int pe_as32
PARAMS ((void *));
321 pe_dll_id_target (target
)
326 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
327 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
328 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
330 pe_details
= pe_detail_list
+ i
;
333 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
337 /* Helper functions for qsort. Relocs must be sorted so that we can write
338 them out by pages. */
352 bfd_vma a
= ((reloc_data_type
*) va
)->vma
;
353 bfd_vma b
= ((reloc_data_type
*) vb
)->vma
;
355 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
359 pe_export_sort (va
, vb
)
362 def_file_export
*a
= (def_file_export
*) va
;
363 def_file_export
*b
= (def_file_export
*) vb
;
365 return strcmp (a
->name
, b
->name
);
368 /* Read and process the .DEF file. */
370 /* These correspond to the entries in pe_def_file->exports[]. I use
371 exported_symbol_sections[i] to tag whether or not the symbol was
372 defined, since we can't export symbols we don't have. */
374 static bfd_vma
*exported_symbol_offsets
;
375 static struct sec
**exported_symbol_sections
;
376 static int export_table_size
;
377 static int count_exported
;
378 static int count_exported_byname
;
379 static int count_with_ordinals
;
380 static const char *dll_name
;
381 static int min_ordinal
, max_ordinal
;
382 static int *exported_symbols
;
384 typedef struct exclude_list_struct
387 struct exclude_list_struct
*next
;
392 static struct exclude_list_struct
*excludes
= 0;
395 pe_dll_add_excludes (new_excludes
, type
)
396 const char *new_excludes
;
400 char *exclude_string
;
402 local_copy
= xstrdup (new_excludes
);
404 exclude_string
= strtok (local_copy
, ",:");
405 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
407 struct exclude_list_struct
*new_exclude
;
409 new_exclude
= ((struct exclude_list_struct
*)
410 xmalloc (sizeof (struct exclude_list_struct
)));
411 new_exclude
->string
= (char *) xmalloc (strlen (exclude_string
) + 1);
412 strcpy (new_exclude
->string
, exclude_string
);
413 new_exclude
->type
= type
;
414 new_exclude
->next
= excludes
;
415 excludes
= new_exclude
;
422 /* abfd is a bfd containing n (or NULL)
423 It can be used for contextual checks. */
426 auto_export (abfd
, d
, n
)
432 struct exclude_list_struct
*ex
;
433 autofilter_entry_type
*afptr
;
434 const char * libname
= 0;
435 if (abfd
&& abfd
->my_archive
)
436 libname
= lbasename (abfd
->my_archive
->filename
);
438 /* We should not re-export imported stuff. */
439 if (strncmp (n
, "_imp__", 6) == 0)
442 for (i
= 0; i
< d
->num_exports
; i
++)
443 if (strcmp (d
->exports
[i
].name
, n
) == 0)
446 if (pe_dll_do_default_excludes
)
451 if (pe_dll_extra_pe_debug
)
452 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
453 n
, abfd
, abfd
->my_archive
);
455 /* First of all, make context checks:
456 Don't export anything from standard libs. */
459 afptr
= autofilter_liblist
;
463 if (strncmp (libname
, afptr
->name
, afptr
->len
) == 0 )
469 /* Next, exclude symbols from certain startup objects. */
471 if (abfd
&& (p
= lbasename (abfd
->filename
)))
473 afptr
= autofilter_objlist
;
476 if (strcmp (p
, afptr
->name
) == 0)
482 /* Don't try to blindly exclude all symbols
483 that begin with '__'; this was tried and
484 it is too restrictive. */
486 /* Then, exclude specific symbols. */
487 afptr
= autofilter_symbollist
;
490 if (strcmp (n
, afptr
->name
) == 0)
496 /* Next, exclude symbols starting with ... */
497 afptr
= autofilter_symbolprefixlist
;
500 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
506 /* Finally, exclude symbols ending with ... */
508 afptr
= autofilter_symbolsuffixlist
;
511 if ((len
>= afptr
->len
)
512 /* Add 1 to insure match with trailing '\0'. */
513 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
514 afptr
->len
+ 1) == 0)
521 for (ex
= excludes
; ex
; ex
= ex
->next
)
523 if (ex
->type
== 1) /* exclude-libs */
526 && ((strcmp (libname
, ex
->string
) == 0)
527 || (strcasecmp ("ALL", ex
->string
) == 0)))
530 else if (strcmp (n
, ex
->string
) == 0)
538 process_def_file (abfd
, info
)
539 bfd
*abfd ATTRIBUTE_UNUSED
;
540 struct bfd_link_info
*info
;
543 struct bfd_link_hash_entry
*blhe
;
546 def_file_export
*e
= 0;
549 pe_def_file
= def_file_empty ();
551 /* First, run around to all the objects looking for the .drectve
552 sections, and push those into the def file too. */
553 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
555 s
= bfd_get_section_by_name (b
, ".drectve");
558 int size
= bfd_get_section_size_before_reloc (s
);
559 char *buf
= xmalloc (size
);
561 bfd_get_section_contents (b
, s
, buf
, 0, size
);
562 def_file_add_directive (pe_def_file
, buf
, size
);
567 /* If we are not building a DLL, when there are no exports
568 we do not build an export table at all. */
569 if (!pe_dll_export_everything
&& pe_def_file
->num_exports
== 0
573 /* Now, maybe export everything else the default way. */
574 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
576 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
581 symsize
= bfd_get_symtab_upper_bound (b
);
582 symbols
= (asymbol
**) xmalloc (symsize
);
583 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
585 for (j
= 0; j
< nsyms
; j
++)
587 /* We should export symbols which are either global or not
588 anything at all. (.bss data is the latter)
589 We should not export undefined symbols. */
590 if (symbols
[j
]->section
!= &bfd_und_section
591 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
592 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
594 const char *sn
= symbols
[j
]->name
;
596 /* We should not re-export imported stuff. */
598 char *name
= (char *) xmalloc (strlen (sn
) + 2 + 6);
599 sprintf (name
, "%s%s", U("_imp_"), sn
);
601 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
602 FALSE
, FALSE
, FALSE
);
605 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
612 if (auto_export (b
, pe_def_file
, sn
))
615 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
616 /* Fill data flag properly, from dlltool.c. */
617 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
625 #define NE pe_def_file->num_exports
627 /* Canonicalize the export list. */
630 for (i
= 0; i
< NE
; i
++)
632 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
634 /* This will preserve internal_name, which may have been
635 pointing to the same memory as name, or might not
637 int lead_at
= (*pe_def_file
->exports
[i
].name
=='@');
638 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
640 *(strchr (tmp
, '@')) = 0;
641 pe_def_file
->exports
[i
].name
= tmp
;
646 if (pe_dll_stdcall_aliases
)
648 for (i
= 0; i
< NE
; i
++)
650 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
652 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@' ) ;
653 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
655 *(strchr (tmp
, '@')) = 0;
656 if (auto_export (NULL
, pe_def_file
, tmp
))
657 def_file_add_export (pe_def_file
, tmp
,
658 pe_def_file
->exports
[i
].internal_name
,
666 /* Convenience, but watch out for it changing. */
667 e
= pe_def_file
->exports
;
669 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
670 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
672 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
676 count_exported_byname
= 0;
677 count_with_ordinals
= 0;
679 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
680 for (i
= 0, j
= 0; i
< NE
; i
++)
682 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
684 /* This is a duplicate. */
685 if (e
[j
- 1].ordinal
!= -1
686 && e
[i
].ordinal
!= -1
687 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
689 if (pe_dll_warn_dup_exports
)
690 /* xgettext:c-format */
691 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
692 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
696 if (pe_dll_warn_dup_exports
)
697 /* xgettext:c-format */
698 einfo (_("Warning, duplicate EXPORT: %s\n"),
702 if (e
[i
].ordinal
!= -1)
703 e
[j
- 1].ordinal
= e
[i
].ordinal
;
704 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
705 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
706 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
707 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
716 pe_def_file
->num_exports
= j
; /* == NE */
718 for (i
= 0; i
< NE
; i
++)
720 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
722 if (pe_details
->underscored
723 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
726 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
729 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
731 blhe
= bfd_link_hash_lookup (info
->hash
,
736 && (blhe
->type
== bfd_link_hash_defined
737 || (blhe
->type
== bfd_link_hash_common
)))
740 if (!pe_def_file
->exports
[i
].flag_noname
)
741 count_exported_byname
++;
743 /* Only fill in the sections. The actual offsets are computed
744 in fill_exported_offsets() after common symbols are laid
746 if (blhe
->type
== bfd_link_hash_defined
)
747 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
749 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
751 if (pe_def_file
->exports
[i
].ordinal
!= -1)
753 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
754 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
755 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
756 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
757 count_with_ordinals
++;
760 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
762 /* xgettext:c-format */
763 einfo (_("%XCannot export %s: symbol not defined\n"),
764 pe_def_file
->exports
[i
].internal_name
);
768 /* xgettext:c-format */
769 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
770 pe_def_file
->exports
[i
].internal_name
,
771 blhe
->type
, bfd_link_hash_defined
);
775 /* xgettext:c-format */
776 einfo (_("%XCannot export %s: symbol not found\n"),
777 pe_def_file
->exports
[i
].internal_name
);
783 /* Build the bfd that will contain .edata and .reloc sections. */
786 build_filler_bfd (include_edata
)
789 lang_input_statement_type
*filler_file
;
790 filler_file
= lang_add_input_file ("dll stuff",
791 lang_input_file_is_fake_enum
,
793 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
794 if (filler_bfd
== NULL
795 || !bfd_set_arch_mach (filler_bfd
,
796 bfd_get_arch (output_bfd
),
797 bfd_get_mach (output_bfd
)))
799 einfo ("%X%P: can not create BFD %E\n");
805 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
807 || !bfd_set_section_flags (filler_bfd
, edata_s
,
814 einfo ("%X%P: can not create .edata section: %E\n");
817 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
820 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
822 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
829 einfo ("%X%P: can not create .reloc section: %E\n");
833 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
835 ldlang_add_file (filler_file
);
838 /* Gather all the exported symbols and build the .edata section. */
841 generate_edata (abfd
, info
)
843 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
846 int name_table_size
= 0;
849 /* First, we need to know how many exported symbols there are,
850 and what the range of ordinals is. */
851 if (pe_def_file
->name
)
852 dll_name
= pe_def_file
->name
;
855 dll_name
= abfd
->filename
;
857 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
858 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
862 if (count_with_ordinals
&& max_ordinal
> count_exported
)
864 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
865 min_ordinal
= max_ordinal
- count_exported
+ 1;
870 max_ordinal
= count_exported
;
873 export_table_size
= max_ordinal
- min_ordinal
+ 1;
874 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
875 for (i
= 0; i
< export_table_size
; i
++)
876 exported_symbols
[i
] = -1;
878 /* Now we need to assign ordinals to those that don't have them. */
879 for (i
= 0; i
< NE
; i
++)
881 if (exported_symbol_sections
[i
])
883 if (pe_def_file
->exports
[i
].ordinal
!= -1)
885 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
886 int pi
= exported_symbols
[ei
];
890 /* xgettext:c-format */
891 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
892 pe_def_file
->exports
[i
].ordinal
,
893 pe_def_file
->exports
[i
].name
,
894 pe_def_file
->exports
[pi
].name
);
896 exported_symbols
[ei
] = i
;
898 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
902 next_ordinal
= min_ordinal
;
903 for (i
= 0; i
< NE
; i
++)
904 if (exported_symbol_sections
[i
])
905 if (pe_def_file
->exports
[i
].ordinal
== -1)
907 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
910 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
911 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
914 /* OK, now we can allocate some memory. */
915 edata_sz
= (40 /* directory */
916 + 4 * export_table_size
/* addresses */
917 + 4 * count_exported_byname
/* name ptrs */
918 + 2 * count_exported_byname
/* ordinals */
919 + name_table_size
+ strlen (dll_name
) + 1);
922 /* Fill the exported symbol offsets. The preliminary work has already
923 been done in process_def_file(). */
926 fill_exported_offsets (abfd
, info
)
927 bfd
*abfd ATTRIBUTE_UNUSED
;
928 struct bfd_link_info
*info
;
931 struct bfd_link_hash_entry
*blhe
;
933 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
935 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
937 if (pe_details
->underscored
938 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
941 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
944 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
946 blhe
= bfd_link_hash_lookup (info
->hash
,
950 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
951 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
958 fill_edata (abfd
, info
)
960 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
963 unsigned char *edirectory
;
964 unsigned long *eaddresses
;
965 unsigned long *enameptrs
;
966 unsigned short *eordinals
;
967 unsigned char *enamestr
;
972 edata_d
= (unsigned char *) xmalloc (edata_sz
);
974 /* Note use of array pointer math here. */
975 edirectory
= edata_d
;
976 eaddresses
= (unsigned long *) (edata_d
+ 40);
977 enameptrs
= eaddresses
+ export_table_size
;
978 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
979 enamestr
= (char *) (eordinals
+ count_exported_byname
);
981 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
983 memset (edata_d
, 0, edata_sz
);
984 bfd_put_32 (abfd
, now
, edata_d
+ 4);
985 if (pe_def_file
->version_major
!= -1)
987 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
988 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
991 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
992 strcpy (enamestr
, dll_name
);
993 enamestr
+= strlen (enamestr
) + 1;
994 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
995 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
996 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
997 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
998 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
999 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
1001 fill_exported_offsets (abfd
, info
);
1003 /* Ok, now for the filling in part.
1004 Scan alphabetically - ie the ordering in the exports[] table,
1005 rather than by ordinal - the ordering in the exported_symbol[]
1006 table. See dlltool.c and:
1007 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1008 for more information. */
1010 for (s
= 0; s
< NE
; s
++)
1012 if (pe_def_file
->exports
[s
].ordinal
!= -1)
1014 struct sec
*ssec
= exported_symbol_sections
[s
];
1015 unsigned long srva
= (exported_symbol_offsets
[s
]
1016 + ssec
->output_section
->vma
1017 + ssec
->output_offset
);
1018 int ord
= pe_def_file
->exports
[s
].ordinal
;
1020 bfd_put_32 (abfd
, srva
- image_base
,
1021 (void *) (eaddresses
+ ord
- min_ordinal
));
1023 if (!pe_def_file
->exports
[s
].flag_noname
)
1025 char *ename
= pe_def_file
->exports
[s
].name
;
1027 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
1029 strcpy (enamestr
, ename
);
1030 enamestr
+= strlen (enamestr
) + 1;
1031 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
1033 pe_def_file
->exports
[s
].hint
= hint
++;
1040 static struct sec
*current_sec
;
1043 pe_walk_relocs_of_symbol (info
, name
, cb
)
1044 struct bfd_link_info
*info
;
1046 int (*cb
) (arelent
*, asection
*);
1051 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1056 symsize
= bfd_get_symtab_upper_bound (b
);
1057 symbols
= (asymbol
**) xmalloc (symsize
);
1058 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1060 for (s
= b
->sections
; s
; s
= s
->next
)
1063 int relsize
, nrelocs
, i
;
1064 int flags
= bfd_get_section_flags (b
, s
);
1066 /* Skip discarded linkonce sections. */
1067 if (flags
& SEC_LINK_ONCE
1068 && s
->output_section
== bfd_abs_section_ptr
)
1073 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1074 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1075 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1077 for (i
= 0; i
< nrelocs
; i
++)
1079 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1081 if (!strcmp (name
, sym
->name
))
1087 /* Warning: the allocated symbols are remembered in BFD and reused
1088 later, so don't free them! */
1089 /* free (symbols); */
1094 /* Gather all the relocations and build the .reloc section. */
1097 generate_reloc (abfd
, info
)
1099 struct bfd_link_info
*info
;
1102 /* For .reloc stuff. */
1103 reloc_data_type
*reloc_data
;
1104 int total_relocs
= 0;
1106 unsigned long sec_page
= (unsigned long) (-1);
1107 unsigned long page_ptr
, page_count
;
1113 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1114 for (s
= b
->sections
; s
; s
= s
->next
)
1115 total_relocs
+= s
->reloc_count
;
1118 (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
1122 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1125 int relsize
, nrelocs
, i
;
1127 for (s
= b
->sections
; s
; s
= s
->next
)
1129 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1133 /* If it's not loaded, we don't need to relocate it this way. */
1134 if (!(s
->output_section
->flags
& SEC_LOAD
))
1137 /* I don't know why there would be a reloc for these, but I've
1138 seen it happen - DJ */
1139 if (s
->output_section
== &bfd_abs_section
)
1142 if (s
->output_section
->vma
== 0)
1144 /* Huh? Shouldn't happen, but punt if it does. */
1145 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1146 s
->output_section
->name
, s
->output_section
->index
,
1147 s
->output_section
->flags
);
1151 symsize
= bfd_get_symtab_upper_bound (b
);
1152 symbols
= (asymbol
**) xmalloc (symsize
);
1153 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1155 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1156 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1157 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1159 for (i
= 0; i
< nrelocs
; i
++)
1161 if (pe_dll_extra_pe_debug
)
1163 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1164 printf ("rel: %s\n", sym
->name
);
1166 if (!relocs
[i
]->howto
->pc_relative
1167 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1170 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1172 sym_vma
= (relocs
[i
]->addend
1175 + sym
->section
->output_offset
1176 + sym
->section
->output_section
->vma
);
1177 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1179 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1181 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1182 relocs
[i
]->howto
->rightshift
)
1184 case BITS_AND_SHIFT (32, 0):
1185 reloc_data
[total_relocs
].type
= 3;
1188 case BITS_AND_SHIFT (16, 0):
1189 reloc_data
[total_relocs
].type
= 2;
1192 case BITS_AND_SHIFT (16, 16):
1193 reloc_data
[total_relocs
].type
= 4;
1194 /* FIXME: we can't know the symbol's right value
1195 yet, but we probably can safely assume that
1196 CE will relocate us in 64k blocks, so leaving
1198 reloc_data
[total_relocs
].extra
= 0;
1201 case BITS_AND_SHIFT (26, 2):
1202 reloc_data
[total_relocs
].type
= 5;
1205 case BITS_AND_SHIFT (24, 2):
1206 if (relocs
[i
]->howto
->type
== 5)
1207 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1208 that has already been fully processed during a
1209 previous link stage, so ignore it here. */
1213 /* xgettext:c-format */
1214 einfo (_("%XError: %d-bit reloc in dll\n"),
1215 relocs
[i
]->howto
->bitsize
);
1221 /* Warning: the allocated symbols are remembered in BFD and
1222 reused later, so don't free them! */
1229 /* At this point, we have total_relocs relocation addresses in
1230 reloc_addresses, which are all suitable for the .reloc section.
1231 We must now create the new sections. */
1232 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1234 for (i
= 0; i
< total_relocs
; i
++)
1236 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1238 if (this_page
!= sec_page
)
1240 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1242 sec_page
= this_page
;
1247 if (reloc_data
[i
].type
== 4)
1251 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1252 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
1253 sec_page
= (unsigned long) (-1);
1255 page_ptr
= (unsigned long) (-1);
1258 for (i
= 0; i
< total_relocs
; i
++)
1260 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1261 unsigned long this_page
= (rva
& ~0xfff);
1263 if (this_page
!= sec_page
)
1265 while (reloc_sz
& 3)
1266 reloc_d
[reloc_sz
++] = 0;
1268 if (page_ptr
!= (unsigned long) (-1))
1269 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1271 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1272 page_ptr
= reloc_sz
;
1274 sec_page
= this_page
;
1278 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1279 reloc_d
+ reloc_sz
);
1282 if (reloc_data
[i
].type
== 4)
1284 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1291 while (reloc_sz
& 3)
1292 reloc_d
[reloc_sz
++] = 0;
1294 if (page_ptr
!= (unsigned long) (-1))
1295 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1297 while (reloc_sz
< reloc_s
->_raw_size
)
1298 reloc_d
[reloc_sz
++] = 0;
1301 /* Given the exiting def_file structure, print out a .DEF file that
1302 corresponds to it. */
1305 quoteput (s
, f
, needs_quotes
)
1312 for (cp
= s
; *cp
; cp
++)
1327 if (*s
== '"' || *s
== '\\')
1341 pe_dll_generate_def_file (pe_out_def_filename
)
1342 const char *pe_out_def_filename
;
1345 FILE *out
= fopen (pe_out_def_filename
, "w");
1348 /* xgettext:c-format */
1349 einfo (_("%s: Can't open output def file %s\n"),
1350 program_name
, pe_out_def_filename
);
1354 if (pe_def_file
->name
)
1356 if (pe_def_file
->is_dll
)
1357 fprintf (out
, "LIBRARY ");
1359 fprintf (out
, "NAME ");
1361 quoteput (pe_def_file
->name
, out
, 1);
1363 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1364 fprintf (out
, " BASE=0x%lx",
1365 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1366 fprintf (out
, "\n");
1369 if (pe_def_file
->description
)
1371 fprintf (out
, "DESCRIPTION ");
1372 quoteput (pe_def_file
->description
, out
, 1);
1373 fprintf (out
, "\n");
1376 if (pe_def_file
->version_minor
!= -1)
1377 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1378 pe_def_file
->version_minor
);
1379 else if (pe_def_file
->version_major
!= -1)
1380 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1382 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1383 fprintf (out
, "\n");
1385 if (pe_def_file
->stack_commit
!= -1)
1386 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1387 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1388 else if (pe_def_file
->stack_reserve
!= -1)
1389 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1391 if (pe_def_file
->heap_commit
!= -1)
1392 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1393 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1394 else if (pe_def_file
->heap_reserve
!= -1)
1395 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1397 if (pe_def_file
->num_section_defs
> 0)
1399 fprintf (out
, "\nSECTIONS\n\n");
1401 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1404 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1406 if (pe_def_file
->section_defs
[i
].class)
1408 fprintf (out
, " CLASS ");
1409 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1412 if (pe_def_file
->section_defs
[i
].flag_read
)
1413 fprintf (out
, " READ");
1415 if (pe_def_file
->section_defs
[i
].flag_write
)
1416 fprintf (out
, " WRITE");
1418 if (pe_def_file
->section_defs
[i
].flag_execute
)
1419 fprintf (out
, " EXECUTE");
1421 if (pe_def_file
->section_defs
[i
].flag_shared
)
1422 fprintf (out
, " SHARED");
1424 fprintf (out
, "\n");
1428 if (pe_def_file
->num_exports
> 0)
1430 fprintf (out
, "EXPORTS\n");
1432 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1434 def_file_export
*e
= pe_def_file
->exports
+ i
;
1436 quoteput (e
->name
, out
, 0);
1438 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1440 fprintf (out
, " = ");
1441 quoteput (e
->internal_name
, out
, 0);
1444 if (e
->ordinal
!= -1)
1445 fprintf (out
, " @%d", e
->ordinal
);
1447 if (e
->flag_private
)
1448 fprintf (out
, " PRIVATE");
1450 if (e
->flag_constant
)
1451 fprintf (out
, " CONSTANT");
1454 fprintf (out
, " NONAME");
1457 fprintf (out
, " DATA");
1459 fprintf (out
, "\n");
1463 if (pe_def_file
->num_imports
> 0)
1465 fprintf (out
, "\nIMPORTS\n\n");
1467 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1469 def_file_import
*im
= pe_def_file
->imports
+ i
;
1472 if (im
->internal_name
1473 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1475 quoteput (im
->internal_name
, out
, 0);
1476 fprintf (out
, " = ");
1479 quoteput (im
->module
->name
, out
, 0);
1483 quoteput (im
->name
, out
, 0);
1485 fprintf (out
, "%d", im
->ordinal
);
1487 fprintf (out
, "\n");
1492 fprintf (out
, _("; no contents available\n"));
1494 if (fclose (out
) == EOF
)
1495 /* xgettext:c-format */
1496 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1499 /* Generate the import library. */
1501 static asymbol
**symtab
;
1504 static const char *dll_filename
;
1505 static char *dll_symname
;
1507 #define UNDSEC (asection *) &bfd_und_section
1510 quick_section (abfd
, name
, flags
, align
)
1519 sec
= bfd_make_section_old_way (abfd
, name
);
1520 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1521 bfd_set_section_alignment (abfd
, sec
, align
);
1522 /* Remember to undo this before trying to link internally! */
1523 sec
->output_section
= sec
;
1525 sym
= bfd_make_empty_symbol (abfd
);
1526 symtab
[symptr
++] = sym
;
1527 sym
->name
= sec
->name
;
1529 sym
->flags
= BSF_LOCAL
;
1536 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1546 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1551 sym
= bfd_make_empty_symbol (abfd
);
1556 symtab
[symptr
++] = sym
;
1559 static arelent
*reltab
= 0;
1560 static int relcount
= 0, relsize
= 0;
1563 quick_reloc (abfd
, address
, which_howto
, symidx
)
1569 if (relcount
>= (relsize
- 1))
1573 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1575 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1577 reltab
[relcount
].address
= address
;
1578 reltab
[relcount
].addend
= 0;
1579 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1580 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1585 save_relocs (asection
*sec
)
1589 sec
->relocation
= reltab
;
1590 sec
->reloc_count
= relcount
;
1591 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1592 for (i
= 0; i
< relcount
; i
++)
1593 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1594 sec
->orelocation
[relcount
] = 0;
1595 sec
->flags
|= SEC_RELOC
;
1597 relcount
= relsize
= 0;
1600 /* .section .idata$2
1601 .global __head_my_dll
1621 asection
*id2
, *id5
, *id4
;
1622 unsigned char *d2
, *d5
, *d4
;
1626 oname
= (char *) xmalloc (20);
1627 sprintf (oname
, "d%06d.o", tmp_seq
);
1630 abfd
= bfd_create (oname
, parent
);
1631 bfd_find_target (pe_details
->object_target
, abfd
);
1632 bfd_make_writable (abfd
);
1634 bfd_set_format (abfd
, bfd_object
);
1635 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1638 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1639 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1640 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1641 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1642 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1643 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1645 /* OK, pay attention here. I got confused myself looking back at
1646 it. We create a four-byte section to mark the beginning of the
1647 list, and we include an offset of 4 in the section, so that the
1648 pointer to the list points to the *end* of this section, which is
1649 the start of the list of sections from other objects. */
1651 bfd_set_section_size (abfd
, id2
, 20);
1652 d2
= (unsigned char *) xmalloc (20);
1655 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1656 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1657 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1658 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1661 bfd_set_section_size (abfd
, id5
, 4);
1662 d5
= (unsigned char *) xmalloc (4);
1666 bfd_set_section_size (abfd
, id4
, 4);
1667 d4
= (unsigned char *) xmalloc (4);
1671 bfd_set_symtab (abfd
, symtab
, symptr
);
1673 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1674 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1675 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1677 bfd_make_readable (abfd
);
1681 /* .section .idata$4
1686 .global __my_dll_iname
1694 asection
*id4
, *id5
, *id7
;
1695 unsigned char *d4
, *d5
, *d7
;
1700 oname
= (char *) xmalloc (20);
1701 sprintf (oname
, "d%06d.o", tmp_seq
);
1704 abfd
= bfd_create (oname
, parent
);
1705 bfd_find_target (pe_details
->object_target
, abfd
);
1706 bfd_make_writable (abfd
);
1708 bfd_set_format (abfd
, bfd_object
);
1709 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1712 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1713 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1714 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1715 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1716 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1718 bfd_set_section_size (abfd
, id4
, 4);
1719 d4
= (unsigned char *) xmalloc (4);
1723 bfd_set_section_size (abfd
, id5
, 4);
1724 d5
= (unsigned char *) xmalloc (4);
1728 len
= strlen (dll_filename
) + 1;
1731 bfd_set_section_size (abfd
, id7
, len
);
1732 d7
= (unsigned char *) xmalloc (len
);
1734 strcpy (d7
, dll_filename
);
1736 bfd_set_symtab (abfd
, symtab
, symptr
);
1738 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1739 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1740 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1742 bfd_make_readable (abfd
);
1748 .global ___imp_function
1749 .global __imp__function
1751 jmp *__imp__function:
1765 .asciz "function" xlate? (add underscore, kill at) */
1767 static unsigned char jmp_ix86_bytes
[] =
1769 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1777 .dw __imp_function */
1779 static unsigned char jmp_sh_bytes
[] =
1781 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1785 lui $t0,<high:__imp_function>
1786 lw $t0,<low:__imp_function>
1790 static unsigned char jmp_mips_bytes
[] =
1792 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1793 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1797 make_one (exp
, parent
)
1798 def_file_export
*exp
;
1801 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1802 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1806 unsigned char *jmp_bytes
= NULL
;
1807 int jmp_byte_count
= 0;
1809 switch (pe_details
->pe_arch
)
1812 jmp_bytes
= jmp_ix86_bytes
;
1813 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1816 jmp_bytes
= jmp_sh_bytes
;
1817 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1820 jmp_bytes
= jmp_mips_bytes
;
1821 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1827 oname
= (char *) xmalloc (20);
1828 sprintf (oname
, "d%06d.o", tmp_seq
);
1831 abfd
= bfd_create (oname
, parent
);
1832 bfd_find_target (pe_details
->object_target
, abfd
);
1833 bfd_make_writable (abfd
);
1835 bfd_set_format (abfd
, bfd_object
);
1836 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1839 symtab
= (asymbol
**) xmalloc (11 * sizeof (asymbol
*));
1840 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1841 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1842 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1843 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1844 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1846 if (*exp
->internal_name
== '@')
1848 if (! exp
->flag_data
)
1849 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1850 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1851 quick_symbol (abfd
, U ("_imp_"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1852 /* Fastcall applies only to functions,
1853 so no need for auto-import symbol. */
1857 if (! exp
->flag_data
)
1858 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1859 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1860 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1861 /* Symbol to reference ord/name of imported
1862 data symbol, used to implement auto-import. */
1864 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
, BSF_GLOBAL
,0);
1866 if (pe_dll_compat_implib
)
1867 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "",
1868 id5
, BSF_GLOBAL
, 0);
1870 if (! exp
->flag_data
)
1872 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1873 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1875 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1877 switch (pe_details
->pe_arch
)
1880 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1883 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1886 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1887 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1888 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1896 bfd_set_section_size (abfd
, id7
, 4);
1897 d7
= (unsigned char *) xmalloc (4);
1900 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1903 bfd_set_section_size (abfd
, id5
, 4);
1904 d5
= (unsigned char *) xmalloc (4);
1908 if (exp
->flag_noname
)
1910 d5
[0] = exp
->ordinal
;
1911 d5
[1] = exp
->ordinal
>> 8;
1916 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1920 bfd_set_section_size (abfd
, id4
, 4);
1921 d4
= (unsigned char *) xmalloc (4);
1925 if (exp
->flag_noname
)
1927 d4
[0] = exp
->ordinal
;
1928 d4
[1] = exp
->ordinal
>> 8;
1933 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1937 if (exp
->flag_noname
)
1940 bfd_set_section_size (abfd
, id6
, 0);
1944 len
= strlen (exp
->name
) + 3;
1947 bfd_set_section_size (abfd
, id6
, len
);
1948 d6
= (unsigned char *) xmalloc (len
);
1950 memset (d6
, 0, len
);
1951 d6
[0] = exp
->hint
& 0xff;
1952 d6
[1] = exp
->hint
>> 8;
1953 strcpy (d6
+ 2, exp
->name
);
1956 bfd_set_symtab (abfd
, symtab
, symptr
);
1958 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1959 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1960 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1961 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1962 if (!exp
->flag_noname
)
1963 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1965 bfd_make_readable (abfd
);
1970 make_singleton_name_thunk (import
, parent
)
1974 /* Name thunks go to idata$4. */
1980 oname
= (char *) xmalloc (20);
1981 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1984 abfd
= bfd_create (oname
, parent
);
1985 bfd_find_target (pe_details
->object_target
, abfd
);
1986 bfd_make_writable (abfd
);
1988 bfd_set_format (abfd
, bfd_object
);
1989 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1992 symtab
= (asymbol
**) xmalloc (3 * sizeof (asymbol
*));
1993 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1994 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1995 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1997 bfd_set_section_size (abfd
, id4
, 8);
1998 d4
= (unsigned char *) xmalloc (4);
2001 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2004 bfd_set_symtab (abfd
, symtab
, symptr
);
2006 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
2008 bfd_make_readable (abfd
);
2013 make_import_fixup_mark (rel
)
2016 /* We convert reloc to symbol, for later reference. */
2018 static char *fixup_name
= NULL
;
2019 static size_t buffer_len
= 0;
2021 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2023 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2024 struct bfd_link_hash_entry
*bh
;
2028 fixup_name
= (char *) xmalloc (384);
2032 if (strlen (sym
->name
) + 25 > buffer_len
)
2033 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2034 bigger than 20 digits long, we've got worse problems than
2035 overflowing this buffer... */
2038 /* New buffer size is length of symbol, plus 25, but
2039 then rounded up to the nearest multiple of 128. */
2040 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2041 fixup_name
= (char *) xmalloc (buffer_len
);
2044 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2047 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2048 current_sec
, /* sym->section, */
2049 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2053 struct coff_link_hash_entry
*myh
;
2055 myh
= (struct coff_link_hash_entry
*) bh
;
2056 printf ("type:%d\n", myh
->type
);
2057 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2063 /* .section .idata$3
2064 .rva __nm_thnk_SYM (singleton thunk with name of func)
2067 .rva __my_dll_iname (name of dll)
2068 .rva __fuNN_SYM (pointer to reference (address) in text) */
2071 make_import_fixup_entry (name
, fixup_name
, dll_symname
, parent
)
2073 const char *fixup_name
;
2074 const char *dll_symname
;
2082 oname
= (char *) xmalloc (20);
2083 sprintf (oname
, "fu%06d.o", tmp_seq
);
2086 abfd
= bfd_create (oname
, parent
);
2087 bfd_find_target (pe_details
->object_target
, abfd
);
2088 bfd_make_writable (abfd
);
2090 bfd_set_format (abfd
, bfd_object
);
2091 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2094 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
2095 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2098 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2100 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2101 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2102 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2104 bfd_set_section_size (abfd
, id3
, 20);
2105 d3
= (unsigned char *) xmalloc (20);
2109 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2110 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2111 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2114 bfd_set_symtab (abfd
, symtab
, symptr
);
2116 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2118 bfd_make_readable (abfd
);
2122 /* .section .rdata_runtime_pseudo_reloc
2124 .rva __fuNN_SYM (pointer to reference (address) in text) */
2127 make_runtime_pseudo_reloc (name
, fixup_name
, addend
, parent
)
2128 const char *name ATTRIBUTE_UNUSED
;
2129 const char *fixup_name
;
2134 unsigned char *rt_rel_d
;
2138 oname
= (char *) xmalloc (20);
2139 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2142 abfd
= bfd_create (oname
, parent
);
2143 bfd_find_target (pe_details
->object_target
, abfd
);
2144 bfd_make_writable (abfd
);
2146 bfd_set_format (abfd
, bfd_object
);
2147 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2150 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2151 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS
, 2);
2153 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2155 bfd_set_section_size (abfd
, rt_rel
, 8);
2156 rt_rel_d
= (unsigned char *) xmalloc (8);
2157 rt_rel
->contents
= rt_rel_d
;
2158 memset (rt_rel_d
, 0, 8);
2159 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2161 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2162 save_relocs (rt_rel
);
2164 bfd_set_symtab (abfd
, symtab
, symptr
);
2166 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2168 bfd_make_readable (abfd
);
2173 .rva __pei386_runtime_relocator */
2176 pe_create_runtime_relocator_reference (parent
)
2179 asection
*extern_rt_rel
;
2180 unsigned char *extern_rt_rel_d
;
2184 oname
= (char *) xmalloc (20);
2185 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2188 abfd
= bfd_create (oname
, parent
);
2189 bfd_find_target (pe_details
->object_target
, abfd
);
2190 bfd_make_writable (abfd
);
2192 bfd_set_format (abfd
, bfd_object
);
2193 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2196 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2197 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2199 quick_symbol (abfd
, "", "__pei386_runtime_relocator", "", UNDSEC
, BSF_NO_FLAGS
, 0);
2201 bfd_set_section_size (abfd
, extern_rt_rel
, 4);
2202 extern_rt_rel_d
= (unsigned char *) xmalloc (4);
2203 extern_rt_rel
->contents
= extern_rt_rel_d
;
2205 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2206 save_relocs (extern_rt_rel
);
2208 bfd_set_symtab (abfd
, symtab
, symptr
);
2210 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, 4);
2212 bfd_make_readable (abfd
);
2217 pe_create_import_fixup (rel
, s
, addend
)
2223 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2224 struct bfd_link_hash_entry
*name_thunk_sym
;
2225 const char *name
= sym
->name
;
2226 char *fixup_name
= make_import_fixup_mark (rel
);
2229 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2231 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2233 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2235 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2236 add_bfd_to_link (b
, b
->filename
, &link_info
);
2238 /* If we ever use autoimport, we have to cast text section writable. */
2239 config
.text_read_only
= FALSE
;
2242 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2244 extern char * pe_data_import_dll
;
2245 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2247 b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
, output_bfd
);
2248 add_bfd_to_link (b
, b
->filename
, &link_info
);
2253 if (link_info
.pei386_runtime_pseudo_reloc
)
2255 if (pe_dll_extra_pe_debug
)
2256 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2257 fixup_name
, addend
);
2258 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, output_bfd
);
2259 add_bfd_to_link (b
, b
->filename
, &link_info
);
2261 if (runtime_pseudo_relocs_created
== 0)
2263 b
= pe_create_runtime_relocator_reference (output_bfd
);
2264 add_bfd_to_link (b
, b
->filename
, &link_info
);
2266 runtime_pseudo_relocs_created
++;
2270 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2271 s
->owner
, s
, rel
->address
, sym
->name
);
2279 pe_dll_generate_implib (def
, impfilename
)
2281 const char *impfilename
;
2289 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2290 dll_symname
= xstrdup (dll_filename
);
2291 for (i
= 0; dll_symname
[i
]; i
++)
2292 if (!ISALNUM (dll_symname
[i
]))
2293 dll_symname
[i
] = '_';
2295 unlink (impfilename
);
2297 outarch
= bfd_openw (impfilename
, 0);
2301 /* xgettext:c-format */
2302 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2306 /* xgettext:c-format */
2307 einfo (_("Creating library file: %s\n"), impfilename
);
2309 bfd_set_format (outarch
, bfd_archive
);
2310 outarch
->has_armap
= 1;
2312 /* Work out a reasonable size of things to put onto one line. */
2313 ar_head
= make_head (outarch
);
2315 for (i
= 0; i
< def
->num_exports
; i
++)
2317 /* The import library doesn't know about the internal name. */
2318 char *internal
= def
->exports
[i
].internal_name
;
2321 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2322 n
= make_one (def
->exports
+ i
, outarch
);
2325 def
->exports
[i
].internal_name
= internal
;
2328 ar_tail
= make_tail (outarch
);
2330 if (ar_head
== NULL
|| ar_tail
== NULL
)
2333 /* Now stick them all into the archive. */
2334 ar_head
->next
= head
;
2335 ar_tail
->next
= ar_head
;
2338 if (! bfd_set_archive_head (outarch
, head
))
2339 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2341 if (! bfd_close (outarch
))
2342 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2344 while (head
!= NULL
)
2346 bfd
*n
= head
->next
;
2353 add_bfd_to_link (abfd
, name
, link_info
)
2356 struct bfd_link_info
*link_info
;
2358 lang_input_statement_type
*fake_file
;
2360 fake_file
= lang_add_input_file (name
,
2361 lang_input_file_is_fake_enum
,
2363 fake_file
->the_bfd
= abfd
;
2364 ldlang_add_file (fake_file
);
2366 if (!bfd_link_add_symbols (abfd
, link_info
))
2367 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2371 pe_process_import_defs (output_bfd
, link_info
)
2373 struct bfd_link_info
*link_info
;
2375 def_file_module
*module
;
2377 pe_dll_id_target (bfd_get_target (output_bfd
));
2382 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2386 dll_filename
= module
->name
;
2387 dll_symname
= xstrdup (module
->name
);
2388 for (i
= 0; dll_symname
[i
]; i
++)
2389 if (!ISALNUM (dll_symname
[i
]))
2390 dll_symname
[i
] = '_';
2394 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2395 if (pe_def_file
->imports
[i
].module
== module
)
2397 def_file_export exp
;
2398 struct bfd_link_hash_entry
*blhe
;
2399 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2400 /* See if we need this import. */
2401 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2 + 6);
2404 sprintf (name
, "%s%s", "", pe_def_file
->imports
[i
].internal_name
);
2406 sprintf (name
, "%s%s",U (""), pe_def_file
->imports
[i
].internal_name
);
2408 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2409 FALSE
, FALSE
, FALSE
);
2411 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2414 sprintf (name
, "%s%s", U ("_imp_"),
2415 pe_def_file
->imports
[i
].internal_name
);
2417 sprintf (name
, "%s%s", U ("_imp__"),
2418 pe_def_file
->imports
[i
].internal_name
);
2420 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2421 FALSE
, FALSE
, FALSE
);
2425 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2431 bfd
*ar_head
= make_head (output_bfd
);
2432 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2435 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2436 exp
.name
= pe_def_file
->imports
[i
].name
;
2437 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2438 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2439 exp
.flag_private
= 0;
2440 exp
.flag_constant
= 0;
2441 exp
.flag_data
= pe_def_file
->imports
[i
].data
;
2442 exp
.flag_noname
= exp
.name
? 0 : 1;
2443 one
= make_one (&exp
, output_bfd
);
2444 add_bfd_to_link (one
, one
->filename
, link_info
);
2449 bfd
*ar_tail
= make_tail (output_bfd
);
2450 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2457 /* We were handed a *.DLL file. Parse it and turn it into a set of
2458 IMPORTS directives in the def file. Return TRUE if the file was
2459 handled, FALSE if not. */
2462 pe_get16 (abfd
, where
)
2468 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2469 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2470 return b
[0] + (b
[1] << 8);
2474 pe_get32 (abfd
, where
)
2480 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2481 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2482 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2485 #if 0 /* This is not currently used. */
2491 unsigned char *b
= ptr
;
2493 return b
[0] + (b
[1] << 8);
2502 unsigned char *b
= ptr
;
2504 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2508 pe_implied_import_dll (filename
)
2509 const char *filename
;
2512 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2513 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2514 unsigned long exp_funcbase
;
2515 unsigned char *expdata
, *erva
;
2516 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2517 const char *dll_name
;
2518 /* Initialization with start > end guarantees that is_data
2519 will not be set by mistake, and avoids compiler warning. */
2520 unsigned long data_start
= 1;
2521 unsigned long data_end
= 0;
2522 unsigned long bss_start
= 1;
2523 unsigned long bss_end
= 0;
2525 /* No, I can't use bfd here. kernel32.dll puts its export table in
2526 the middle of the .rdata section. */
2527 dll
= bfd_openr (filename
, pe_details
->target_name
);
2530 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2534 /* PEI dlls seem to be bfd_objects. */
2535 if (!bfd_check_format (dll
, bfd_object
))
2537 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2541 /* Get pe_header, optional header and numbers of export entries. */
2542 pe_header_offset
= pe_get32 (dll
, 0x3c);
2543 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2544 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2546 if (num_entries
< 1) /* No exports. */
2549 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2550 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2551 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2552 secptr
= (pe_header_offset
+ 4 + 20 +
2553 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2556 /* Get the rva and size of the export section. */
2557 for (i
= 0; i
< nsections
; i
++)
2560 unsigned long secptr1
= secptr
+ 40 * i
;
2561 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2562 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2563 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2565 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2566 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2568 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2570 expptr
= fptr
+ (export_rva
- vaddr
);
2571 if (export_rva
+ export_size
> vaddr
+ vsize
)
2572 export_size
= vsize
- (export_rva
- vaddr
);
2577 /* Scan sections and store the base and size of the
2578 data and bss segments in data/base_start/end. */
2579 for (i
= 0; i
< nsections
; i
++)
2581 unsigned long secptr1
= secptr
+ 40 * i
;
2582 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 8);
2583 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2584 unsigned long flags
= pe_get32 (dll
, secptr1
+ 36);
2588 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
2589 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
2591 if (strcmp(sec_name
,".data") == 0)
2594 data_end
= vaddr
+ vsize
;
2596 if (pe_dll_extra_pe_debug
)
2597 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2598 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2600 else if (strcmp (sec_name
,".bss") == 0)
2603 bss_end
= vaddr
+ vsize
;
2605 if (pe_dll_extra_pe_debug
)
2606 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2607 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2611 expdata
= (unsigned char *) xmalloc (export_size
);
2612 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2613 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2614 erva
= expdata
- export_rva
;
2616 if (pe_def_file
== 0)
2617 pe_def_file
= def_file_empty ();
2619 nexp
= pe_as32 (expdata
+ 24);
2620 name_rvas
= pe_as32 (expdata
+ 32);
2621 ordinals
= pe_as32 (expdata
+ 36);
2622 ordbase
= pe_as32 (expdata
+ 16);
2623 exp_funcbase
= pe_as32 (expdata
+ 28);
2625 /* Use internal dll name instead of filename
2626 to enable symbolic dll linking. */
2627 dll_name
= pe_as32 (expdata
+ 12) + erva
;
2629 /* Check to see if the dll has already been added to
2630 the definition list and if so return without error.
2631 This avoids multiple symbol definitions. */
2632 if (def_get_module (pe_def_file
, dll_name
))
2634 if (pe_dll_extra_pe_debug
)
2635 printf ("%s is already loaded\n", dll_name
);
2639 /* Iterate through the list of symbols. */
2640 for (i
= 0; i
< nexp
; i
++)
2642 /* Pointer to the names vector. */
2643 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2644 def_file_import
*imp
;
2645 /* Pointer to the function address vector. */
2646 unsigned long func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
2649 /* Skip unwanted symbols, which are
2650 exported in buggy auto-import releases. */
2651 if (strncmp (erva
+ name_rva
, "_nm_", 4) != 0)
2653 /* is_data is true if the address is in the data or bss segment. */
2655 (func_rva
>= data_start
&& func_rva
< data_end
)
2656 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
2658 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
2660 /* Mark symbol type. */
2661 imp
->data
= is_data
;
2663 if (pe_dll_extra_pe_debug
)
2664 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2665 __FUNCTION__
, dll_name
, erva
+ name_rva
,
2666 func_rva
, is_data
? "(data)" : "");
2673 /* These are the main functions, called from the emulation. The first
2674 is called after the bfds are read, so we can guess at how much space
2675 we need. The second is called after everything is placed, so we
2676 can put the right values in place. */
2679 pe_dll_build_sections (abfd
, info
)
2681 struct bfd_link_info
*info
;
2683 pe_dll_id_target (bfd_get_target (abfd
));
2684 process_def_file (abfd
, info
);
2686 if (pe_def_file
->num_exports
== 0 && !(info
->shared
))
2689 generate_edata (abfd
, info
);
2690 build_filler_bfd (1);
2694 pe_exe_build_sections (abfd
, info
)
2696 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2698 pe_dll_id_target (bfd_get_target (abfd
));
2699 build_filler_bfd (0);
2703 pe_dll_fill_sections (abfd
, info
)
2705 struct bfd_link_info
*info
;
2707 pe_dll_id_target (bfd_get_target (abfd
));
2708 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2710 generate_reloc (abfd
, info
);
2713 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2715 /* Resize the sections. */
2716 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2717 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
, TRUE
);
2719 /* Redo special stuff. */
2720 ldemul_after_allocation ();
2722 /* Do the assignments again. */
2723 lang_do_assignments (stat_ptr
->head
,
2725 (fill_type
*) 0, (bfd_vma
) 0);
2728 fill_edata (abfd
, info
);
2731 pe_data (abfd
)->dll
= 1;
2733 edata_s
->contents
= edata_d
;
2734 reloc_s
->contents
= reloc_d
;
2738 pe_exe_fill_sections (abfd
, info
)
2740 struct bfd_link_info
*info
;
2742 pe_dll_id_target (bfd_get_target (abfd
));
2743 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2745 generate_reloc (abfd
, info
);
2748 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2750 /* Resize the sections. */
2751 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2752 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
, TRUE
);
2754 /* Redo special stuff. */
2755 ldemul_after_allocation ();
2757 /* Do the assignments again. */
2758 lang_do_assignments (stat_ptr
->head
,
2760 (fill_type
*) 0, (bfd_vma
) 0);
2762 reloc_s
->contents
= reloc_d
;