1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002 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 practise 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 someting 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 parellel 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 practise,
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, prohibitting 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 },
229 /* Do not specify library suffix explicitly, to allow for dllized versions. */
230 static autofilter_entry_type autofilter_liblist
[] =
234 { "libmingw32", 10 },
235 { "libmingwex", 10 },
243 static autofilter_entry_type autofilter_objlist
[] =
253 { "crtbegin.o", 10 },
258 static autofilter_entry_type autofilter_symbolprefixlist
[] =
260 /* { "__imp_", 6 }, */
261 /* Do __imp_ explicitly to save time. */
263 /* Don't re-export auto-imported symbols. */
265 { "__builtin_", 10 },
266 /* Don't export symbols specifying internal DLL layout. */
269 { "_impure_ptr", 11 },
270 { "cygwin_attach_dll", 17 },
271 { "cygwin_premain0", 15 },
272 { "cygwin_premain1", 15 },
273 { "cygwin_premain2", 15 },
274 { "cygwin_premain3", 15 },
279 static autofilter_entry_type autofilter_symbolsuffixlist
[] =
285 #define U(str) (pe_details->underscored ? "_" str : str)
287 static int reloc_sort
PARAMS ((const void *, const void *));
288 static int pe_export_sort
PARAMS ((const void *, const void *));
289 static int auto_export
PARAMS ((bfd
*, def_file
*, const char *));
290 static void process_def_file
PARAMS ((bfd
*, struct bfd_link_info
*));
291 static void build_filler_bfd
PARAMS ((int));
292 static void generate_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
293 static void fill_exported_offsets
PARAMS ((bfd
*, struct bfd_link_info
*));
294 static void fill_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
295 static void generate_reloc
PARAMS ((bfd
*, struct bfd_link_info
*));
296 static void quoteput
PARAMS ((char *, FILE *, int));
297 static asection
*quick_section
PARAMS ((bfd
*, const char *, int, int));
298 static void quick_symbol
299 PARAMS ((bfd
*, const char *, const char *, const char *,
300 asection
*, int, int));
301 static void quick_reloc
PARAMS ((bfd
*, int, int, int));
302 static bfd
*make_head
PARAMS ((bfd
*));
303 static bfd
*make_tail
PARAMS ((bfd
*));
304 static bfd
*make_one
PARAMS ((def_file_export
*, bfd
*));
305 static bfd
*make_singleton_name_thunk
PARAMS ((const char *, bfd
*));
306 static char *make_import_fixup_mark
PARAMS ((arelent
*));
307 static bfd
*make_import_fixup_entry
308 PARAMS ((const char *, const char *, const char *, bfd
*));
309 static bfd
*make_runtime_pseudo_reloc
310 PARAMS ((const char *, const char *, int, bfd
*));
311 static bfd
*pe_create_runtime_relocator_reference
313 static unsigned int pe_get16
PARAMS ((bfd
*, int));
314 static unsigned int pe_get32
PARAMS ((bfd
*, int));
315 static unsigned int pe_as32
PARAMS ((void *));
318 pe_dll_id_target (target
)
323 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
324 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
325 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
327 pe_details
= pe_detail_list
+ i
;
330 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
334 /* Helper functions for qsort. Relocs must be sorted so that we can write
335 them out by pages. */
349 bfd_vma a
= ((reloc_data_type
*) va
)->vma
;
350 bfd_vma b
= ((reloc_data_type
*) vb
)->vma
;
352 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
356 pe_export_sort (va
, vb
)
359 def_file_export
*a
= (def_file_export
*) va
;
360 def_file_export
*b
= (def_file_export
*) vb
;
362 return strcmp (a
->name
, b
->name
);
365 /* Read and process the .DEF file. */
367 /* These correspond to the entries in pe_def_file->exports[]. I use
368 exported_symbol_sections[i] to tag whether or not the symbol was
369 defined, since we can't export symbols we don't have. */
371 static bfd_vma
*exported_symbol_offsets
;
372 static struct sec
**exported_symbol_sections
;
373 static int export_table_size
;
374 static int count_exported
;
375 static int count_exported_byname
;
376 static int count_with_ordinals
;
377 static const char *dll_name
;
378 static int min_ordinal
, max_ordinal
;
379 static int *exported_symbols
;
381 typedef struct exclude_list_struct
384 struct exclude_list_struct
*next
;
389 static struct exclude_list_struct
*excludes
= 0;
392 pe_dll_add_excludes (new_excludes
, type
)
393 const char *new_excludes
;
397 char *exclude_string
;
399 local_copy
= xstrdup (new_excludes
);
401 exclude_string
= strtok (local_copy
, ",:");
402 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
404 struct exclude_list_struct
*new_exclude
;
406 new_exclude
= ((struct exclude_list_struct
*)
407 xmalloc (sizeof (struct exclude_list_struct
)));
408 new_exclude
->string
= (char *) xmalloc (strlen (exclude_string
) + 1);
409 strcpy (new_exclude
->string
, exclude_string
);
410 new_exclude
->type
= type
;
411 new_exclude
->next
= excludes
;
412 excludes
= new_exclude
;
419 /* abfd is a bfd containing n (or NULL)
420 It can be used for contextual checks. */
423 auto_export (abfd
, d
, n
)
429 struct exclude_list_struct
*ex
;
430 autofilter_entry_type
*afptr
;
431 const char * libname
= 0;
432 if (abfd
&& abfd
->my_archive
)
433 libname
= lbasename (abfd
->my_archive
->filename
);
435 /* We should not re-export imported stuff. */
436 if (strncmp (n
, "_imp__", 6) == 0)
439 for (i
= 0; i
< d
->num_exports
; i
++)
440 if (strcmp (d
->exports
[i
].name
, n
) == 0)
443 if (pe_dll_do_default_excludes
)
448 if (pe_dll_extra_pe_debug
)
449 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
450 n
, abfd
, abfd
->my_archive
);
452 /* First of all, make context checks:
453 Don't export anything from standard libs. */
456 afptr
= autofilter_liblist
;
460 if (strncmp (libname
, afptr
->name
, afptr
->len
) == 0 )
466 /* Next, exclude symbols from certain startup objects. */
468 if (abfd
&& (p
= lbasename (abfd
->filename
)))
470 afptr
= autofilter_objlist
;
473 if (strcmp (p
, afptr
->name
) == 0)
479 /* Don't try to blindly exclude all symbols
480 that begin with '__'; this was tried and
481 it is too restrictive. */
483 /* Then, exclude specific symbols. */
484 afptr
= autofilter_symbollist
;
487 if (strcmp (n
, afptr
->name
) == 0)
493 /* Next, exclude symbols starting with ... */
494 afptr
= autofilter_symbolprefixlist
;
497 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
503 /* Finally, exclude symbols ending with ... */
505 afptr
= autofilter_symbolsuffixlist
;
508 if ((len
>= afptr
->len
)
509 /* Add 1 to insure match with trailing '\0'. */
510 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
511 afptr
->len
+ 1) == 0)
518 for (ex
= excludes
; ex
; ex
= ex
->next
)
520 if (ex
->type
== 1) /* exclude-libs */
523 && ((strcmp (libname
, ex
->string
) == 0)
524 || (strcasecmp ("ALL", ex
->string
) == 0)))
527 else if (strcmp (n
, ex
->string
) == 0)
535 process_def_file (abfd
, info
)
536 bfd
*abfd ATTRIBUTE_UNUSED
;
537 struct bfd_link_info
*info
;
540 struct bfd_link_hash_entry
*blhe
;
543 def_file_export
*e
= 0;
546 pe_def_file
= def_file_empty ();
548 /* First, run around to all the objects looking for the .drectve
549 sections, and push those into the def file too. */
550 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
552 s
= bfd_get_section_by_name (b
, ".drectve");
555 int size
= bfd_get_section_size_before_reloc (s
);
556 char *buf
= xmalloc (size
);
558 bfd_get_section_contents (b
, s
, buf
, 0, size
);
559 def_file_add_directive (pe_def_file
, buf
, size
);
564 /* Now, maybe export everything else the default way. */
565 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
567 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
572 symsize
= bfd_get_symtab_upper_bound (b
);
573 symbols
= (asymbol
**) xmalloc (symsize
);
574 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
576 for (j
= 0; j
< nsyms
; j
++)
578 /* We should export symbols which are either global or not
579 anything at all. (.bss data is the latter)
580 We should not export undefined symbols. */
581 if (symbols
[j
]->section
!= &bfd_und_section
582 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
583 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
585 const char *sn
= symbols
[j
]->name
;
587 /* We should not re-export imported stuff. */
589 char *name
= (char *) xmalloc (strlen (sn
) + 2 + 6);
590 sprintf (name
, "%s%s", U("_imp_"), sn
);
592 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
593 FALSE
, FALSE
, FALSE
);
596 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
603 if (auto_export (b
, pe_def_file
, sn
))
606 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
607 /* Fill data flag properly, from dlltool.c. */
608 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
616 #define NE pe_def_file->num_exports
618 /* Canonicalize the export list. */
621 for (i
= 0; i
< NE
; i
++)
623 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
625 /* This will preserve internal_name, which may have been
626 pointing to the same memory as name, or might not
628 int lead_at
= (*pe_def_file
->exports
[i
].name
=='@');
629 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
631 *(strchr (tmp
, '@')) = 0;
632 pe_def_file
->exports
[i
].name
= tmp
;
637 if (pe_dll_stdcall_aliases
)
639 for (i
= 0; i
< NE
; i
++)
641 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
643 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@' ) ;
644 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
646 *(strchr (tmp
, '@')) = 0;
647 if (auto_export (NULL
, pe_def_file
, tmp
))
648 def_file_add_export (pe_def_file
, tmp
,
649 pe_def_file
->exports
[i
].internal_name
,
657 /* Convenience, but watch out for it changing. */
658 e
= pe_def_file
->exports
;
660 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
661 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
663 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
667 count_exported_byname
= 0;
668 count_with_ordinals
= 0;
670 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
671 for (i
= 0, j
= 0; i
< NE
; i
++)
673 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
675 /* This is a duplicate. */
676 if (e
[j
- 1].ordinal
!= -1
677 && e
[i
].ordinal
!= -1
678 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
680 if (pe_dll_warn_dup_exports
)
681 /* xgettext:c-format */
682 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
683 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
687 if (pe_dll_warn_dup_exports
)
688 /* xgettext:c-format */
689 einfo (_("Warning, duplicate EXPORT: %s\n"),
693 if (e
[i
].ordinal
!= -1)
694 e
[j
- 1].ordinal
= e
[i
].ordinal
;
695 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
696 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
697 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
698 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
707 pe_def_file
->num_exports
= j
; /* == NE */
709 for (i
= 0; i
< NE
; i
++)
711 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
713 if (pe_details
->underscored
714 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
717 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
720 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
722 blhe
= bfd_link_hash_lookup (info
->hash
,
727 && (blhe
->type
== bfd_link_hash_defined
728 || (blhe
->type
== bfd_link_hash_common
)))
731 if (!pe_def_file
->exports
[i
].flag_noname
)
732 count_exported_byname
++;
734 /* Only fill in the sections. The actual offsets are computed
735 in fill_exported_offsets() after common symbols are laid
737 if (blhe
->type
== bfd_link_hash_defined
)
738 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
740 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
742 if (pe_def_file
->exports
[i
].ordinal
!= -1)
744 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
745 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
746 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
747 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
748 count_with_ordinals
++;
751 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
753 /* xgettext:c-format */
754 einfo (_("%XCannot export %s: symbol not defined\n"),
755 pe_def_file
->exports
[i
].internal_name
);
759 /* xgettext:c-format */
760 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
761 pe_def_file
->exports
[i
].internal_name
,
762 blhe
->type
, bfd_link_hash_defined
);
766 /* xgettext:c-format */
767 einfo (_("%XCannot export %s: symbol not found\n"),
768 pe_def_file
->exports
[i
].internal_name
);
774 /* Build the bfd that will contain .edata and .reloc sections. */
777 build_filler_bfd (include_edata
)
780 lang_input_statement_type
*filler_file
;
781 filler_file
= lang_add_input_file ("dll stuff",
782 lang_input_file_is_fake_enum
,
784 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
785 if (filler_bfd
== NULL
786 || !bfd_set_arch_mach (filler_bfd
,
787 bfd_get_arch (output_bfd
),
788 bfd_get_mach (output_bfd
)))
790 einfo ("%X%P: can not create BFD %E\n");
796 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
798 || !bfd_set_section_flags (filler_bfd
, edata_s
,
805 einfo ("%X%P: can not create .edata section: %E\n");
808 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
811 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
813 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
820 einfo ("%X%P: can not create .reloc section: %E\n");
824 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
826 ldlang_add_file (filler_file
);
829 /* Gather all the exported symbols and build the .edata section. */
832 generate_edata (abfd
, info
)
834 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
837 int name_table_size
= 0;
840 /* First, we need to know how many exported symbols there are,
841 and what the range of ordinals is. */
842 if (pe_def_file
->name
)
843 dll_name
= pe_def_file
->name
;
846 dll_name
= abfd
->filename
;
848 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
849 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
853 if (count_with_ordinals
&& max_ordinal
> count_exported
)
855 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
856 min_ordinal
= max_ordinal
- count_exported
+ 1;
861 max_ordinal
= count_exported
;
864 export_table_size
= max_ordinal
- min_ordinal
+ 1;
865 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
866 for (i
= 0; i
< export_table_size
; i
++)
867 exported_symbols
[i
] = -1;
869 /* Now we need to assign ordinals to those that don't have them. */
870 for (i
= 0; i
< NE
; i
++)
872 if (exported_symbol_sections
[i
])
874 if (pe_def_file
->exports
[i
].ordinal
!= -1)
876 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
877 int pi
= exported_symbols
[ei
];
881 /* xgettext:c-format */
882 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
883 pe_def_file
->exports
[i
].ordinal
,
884 pe_def_file
->exports
[i
].name
,
885 pe_def_file
->exports
[pi
].name
);
887 exported_symbols
[ei
] = i
;
889 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
893 next_ordinal
= min_ordinal
;
894 for (i
= 0; i
< NE
; i
++)
895 if (exported_symbol_sections
[i
])
896 if (pe_def_file
->exports
[i
].ordinal
== -1)
898 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
901 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
902 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
905 /* OK, now we can allocate some memory. */
906 edata_sz
= (40 /* directory */
907 + 4 * export_table_size
/* addresses */
908 + 4 * count_exported_byname
/* name ptrs */
909 + 2 * count_exported_byname
/* ordinals */
910 + name_table_size
+ strlen (dll_name
) + 1);
913 /* Fill the exported symbol offsets. The preliminary work has already
914 been done in process_def_file(). */
917 fill_exported_offsets (abfd
, info
)
918 bfd
*abfd ATTRIBUTE_UNUSED
;
919 struct bfd_link_info
*info
;
922 struct bfd_link_hash_entry
*blhe
;
924 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
926 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
928 if (pe_details
->underscored
929 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
932 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
935 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
937 blhe
= bfd_link_hash_lookup (info
->hash
,
941 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
942 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
949 fill_edata (abfd
, info
)
951 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
954 unsigned char *edirectory
;
955 unsigned long *eaddresses
;
956 unsigned long *enameptrs
;
957 unsigned short *eordinals
;
958 unsigned char *enamestr
;
963 edata_d
= (unsigned char *) xmalloc (edata_sz
);
965 /* Note use of array pointer math here. */
966 edirectory
= edata_d
;
967 eaddresses
= (unsigned long *) (edata_d
+ 40);
968 enameptrs
= eaddresses
+ export_table_size
;
969 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
970 enamestr
= (char *) (eordinals
+ count_exported_byname
);
972 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
974 memset (edata_d
, 0, edata_sz
);
975 bfd_put_32 (abfd
, now
, edata_d
+ 4);
976 if (pe_def_file
->version_major
!= -1)
978 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
979 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
982 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
983 strcpy (enamestr
, dll_name
);
984 enamestr
+= strlen (enamestr
) + 1;
985 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
986 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
987 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
988 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
989 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
990 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
992 fill_exported_offsets (abfd
, info
);
994 /* Ok, now for the filling in part. */
996 for (i
= 0; i
< export_table_size
; i
++)
998 int s
= exported_symbols
[i
];
1002 struct sec
*ssec
= exported_symbol_sections
[s
];
1003 unsigned long srva
= (exported_symbol_offsets
[s
]
1004 + ssec
->output_section
->vma
1005 + ssec
->output_offset
);
1006 int ord
= pe_def_file
->exports
[s
].ordinal
;
1008 bfd_put_32 (abfd
, srva
- image_base
,
1009 (void *) (eaddresses
+ ord
- min_ordinal
));
1011 if (!pe_def_file
->exports
[s
].flag_noname
)
1013 char *ename
= pe_def_file
->exports
[s
].name
;
1014 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
1016 strcpy (enamestr
, ename
);
1017 enamestr
+= strlen (enamestr
) + 1;
1018 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
1020 pe_def_file
->exports
[s
].hint
= hint
++;
1027 static struct sec
*current_sec
;
1030 pe_walk_relocs_of_symbol (info
, name
, cb
)
1031 struct bfd_link_info
*info
;
1033 int (*cb
) (arelent
*, asection
*);
1038 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1043 symsize
= bfd_get_symtab_upper_bound (b
);
1044 symbols
= (asymbol
**) xmalloc (symsize
);
1045 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1047 for (s
= b
->sections
; s
; s
= s
->next
)
1050 int relsize
, nrelocs
, i
;
1051 int flags
= bfd_get_section_flags (b
, s
);
1053 /* Skip discarded linkonce sections. */
1054 if (flags
& SEC_LINK_ONCE
1055 && s
->output_section
== bfd_abs_section_ptr
)
1060 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1061 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1062 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1064 for (i
= 0; i
< nrelocs
; i
++)
1066 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1068 if (!strcmp (name
, sym
->name
))
1074 /* Warning: the allocated symbols are remembered in BFD and reused
1075 later, so don't free them! */
1076 /* free (symbols); */
1081 /* Gather all the relocations and build the .reloc section. */
1084 generate_reloc (abfd
, info
)
1086 struct bfd_link_info
*info
;
1089 /* For .reloc stuff. */
1090 reloc_data_type
*reloc_data
;
1091 int total_relocs
= 0;
1093 unsigned long sec_page
= (unsigned long) (-1);
1094 unsigned long page_ptr
, page_count
;
1100 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1101 for (s
= b
->sections
; s
; s
= s
->next
)
1102 total_relocs
+= s
->reloc_count
;
1105 (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
1109 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1112 int relsize
, nrelocs
, i
;
1114 for (s
= b
->sections
; s
; s
= s
->next
)
1116 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1120 /* If it's not loaded, we don't need to relocate it this way. */
1121 if (!(s
->output_section
->flags
& SEC_LOAD
))
1124 /* I don't know why there would be a reloc for these, but I've
1125 seen it happen - DJ */
1126 if (s
->output_section
== &bfd_abs_section
)
1129 if (s
->output_section
->vma
== 0)
1131 /* Huh? Shouldn't happen, but punt if it does. */
1132 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1133 s
->output_section
->name
, s
->output_section
->index
,
1134 s
->output_section
->flags
);
1138 symsize
= bfd_get_symtab_upper_bound (b
);
1139 symbols
= (asymbol
**) xmalloc (symsize
);
1140 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1142 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1143 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1144 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1146 for (i
= 0; i
< nrelocs
; i
++)
1148 if (pe_dll_extra_pe_debug
)
1150 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1151 printf ("rel: %s\n", sym
->name
);
1153 if (!relocs
[i
]->howto
->pc_relative
1154 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1157 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1159 sym_vma
= (relocs
[i
]->addend
1162 + sym
->section
->output_offset
1163 + sym
->section
->output_section
->vma
);
1164 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1166 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1168 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1169 relocs
[i
]->howto
->rightshift
)
1171 case BITS_AND_SHIFT (32, 0):
1172 reloc_data
[total_relocs
].type
= 3;
1175 case BITS_AND_SHIFT (16, 0):
1176 reloc_data
[total_relocs
].type
= 2;
1179 case BITS_AND_SHIFT (16, 16):
1180 reloc_data
[total_relocs
].type
= 4;
1181 /* FIXME: we can't know the symbol's right value
1182 yet, but we probably can safely assume that
1183 CE will relocate us in 64k blocks, so leaving
1185 reloc_data
[total_relocs
].extra
= 0;
1188 case BITS_AND_SHIFT (26, 2):
1189 reloc_data
[total_relocs
].type
= 5;
1193 /* xgettext:c-format */
1194 einfo (_("%XError: %d-bit reloc in dll\n"),
1195 relocs
[i
]->howto
->bitsize
);
1201 /* Warning: the allocated symbols are remembered in BFD and
1202 reused later, so don't free them! */
1209 /* At this point, we have total_relocs relocation addresses in
1210 reloc_addresses, which are all suitable for the .reloc section.
1211 We must now create the new sections. */
1212 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1214 for (i
= 0; i
< total_relocs
; i
++)
1216 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1218 if (this_page
!= sec_page
)
1220 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1222 sec_page
= this_page
;
1227 if (reloc_data
[i
].type
== 4)
1231 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1232 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
1233 sec_page
= (unsigned long) (-1);
1235 page_ptr
= (unsigned long) (-1);
1238 for (i
= 0; i
< total_relocs
; i
++)
1240 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1241 unsigned long this_page
= (rva
& ~0xfff);
1243 if (this_page
!= sec_page
)
1245 while (reloc_sz
& 3)
1246 reloc_d
[reloc_sz
++] = 0;
1248 if (page_ptr
!= (unsigned long) (-1))
1249 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1251 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1252 page_ptr
= reloc_sz
;
1254 sec_page
= this_page
;
1258 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1259 reloc_d
+ reloc_sz
);
1262 if (reloc_data
[i
].type
== 4)
1264 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1271 while (reloc_sz
& 3)
1272 reloc_d
[reloc_sz
++] = 0;
1274 if (page_ptr
!= (unsigned long) (-1))
1275 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1277 while (reloc_sz
< reloc_s
->_raw_size
)
1278 reloc_d
[reloc_sz
++] = 0;
1281 /* Given the exiting def_file structure, print out a .DEF file that
1282 corresponds to it. */
1285 quoteput (s
, f
, needs_quotes
)
1292 for (cp
= s
; *cp
; cp
++)
1307 if (*s
== '"' || *s
== '\\')
1321 pe_dll_generate_def_file (pe_out_def_filename
)
1322 const char *pe_out_def_filename
;
1325 FILE *out
= fopen (pe_out_def_filename
, "w");
1328 /* xgettext:c-format */
1329 einfo (_("%s: Can't open output def file %s\n"),
1330 program_name
, pe_out_def_filename
);
1334 if (pe_def_file
->name
)
1336 if (pe_def_file
->is_dll
)
1337 fprintf (out
, "LIBRARY ");
1339 fprintf (out
, "NAME ");
1341 quoteput (pe_def_file
->name
, out
, 1);
1343 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1344 fprintf (out
, " BASE=0x%lx",
1345 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1346 fprintf (out
, "\n");
1349 if (pe_def_file
->description
)
1351 fprintf (out
, "DESCRIPTION ");
1352 quoteput (pe_def_file
->description
, out
, 1);
1353 fprintf (out
, "\n");
1356 if (pe_def_file
->version_minor
!= -1)
1357 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1358 pe_def_file
->version_minor
);
1359 else if (pe_def_file
->version_major
!= -1)
1360 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1362 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1363 fprintf (out
, "\n");
1365 if (pe_def_file
->stack_commit
!= -1)
1366 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1367 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1368 else if (pe_def_file
->stack_reserve
!= -1)
1369 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1371 if (pe_def_file
->heap_commit
!= -1)
1372 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1373 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1374 else if (pe_def_file
->heap_reserve
!= -1)
1375 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1377 if (pe_def_file
->num_section_defs
> 0)
1379 fprintf (out
, "\nSECTIONS\n\n");
1381 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1384 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1386 if (pe_def_file
->section_defs
[i
].class)
1388 fprintf (out
, " CLASS ");
1389 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1392 if (pe_def_file
->section_defs
[i
].flag_read
)
1393 fprintf (out
, " READ");
1395 if (pe_def_file
->section_defs
[i
].flag_write
)
1396 fprintf (out
, " WRITE");
1398 if (pe_def_file
->section_defs
[i
].flag_execute
)
1399 fprintf (out
, " EXECUTE");
1401 if (pe_def_file
->section_defs
[i
].flag_shared
)
1402 fprintf (out
, " SHARED");
1404 fprintf (out
, "\n");
1408 if (pe_def_file
->num_exports
> 0)
1410 fprintf (out
, "EXPORTS\n");
1412 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1414 def_file_export
*e
= pe_def_file
->exports
+ i
;
1416 quoteput (e
->name
, out
, 0);
1418 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1420 fprintf (out
, " = ");
1421 quoteput (e
->internal_name
, out
, 0);
1424 if (e
->ordinal
!= -1)
1425 fprintf (out
, " @%d", e
->ordinal
);
1427 if (e
->flag_private
)
1428 fprintf (out
, " PRIVATE");
1430 if (e
->flag_constant
)
1431 fprintf (out
, " CONSTANT");
1434 fprintf (out
, " NONAME");
1437 fprintf (out
, " DATA");
1439 fprintf (out
, "\n");
1443 if (pe_def_file
->num_imports
> 0)
1445 fprintf (out
, "\nIMPORTS\n\n");
1447 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1449 def_file_import
*im
= pe_def_file
->imports
+ i
;
1452 if (im
->internal_name
1453 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1455 quoteput (im
->internal_name
, out
, 0);
1456 fprintf (out
, " = ");
1459 quoteput (im
->module
->name
, out
, 0);
1463 quoteput (im
->name
, out
, 0);
1465 fprintf (out
, "%d", im
->ordinal
);
1467 fprintf (out
, "\n");
1472 fprintf (out
, _("; no contents available\n"));
1474 if (fclose (out
) == EOF
)
1475 /* xgettext:c-format */
1476 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1479 /* Generate the import library. */
1481 static asymbol
**symtab
;
1484 static const char *dll_filename
;
1485 static char *dll_symname
;
1487 #define UNDSEC (asection *) &bfd_und_section
1490 quick_section (abfd
, name
, flags
, align
)
1499 sec
= bfd_make_section_old_way (abfd
, name
);
1500 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1501 bfd_set_section_alignment (abfd
, sec
, align
);
1502 /* Remember to undo this before trying to link internally! */
1503 sec
->output_section
= sec
;
1505 sym
= bfd_make_empty_symbol (abfd
);
1506 symtab
[symptr
++] = sym
;
1507 sym
->name
= sec
->name
;
1509 sym
->flags
= BSF_LOCAL
;
1516 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1526 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1531 sym
= bfd_make_empty_symbol (abfd
);
1536 symtab
[symptr
++] = sym
;
1539 static arelent
*reltab
= 0;
1540 static int relcount
= 0, relsize
= 0;
1543 quick_reloc (abfd
, address
, which_howto
, symidx
)
1549 if (relcount
>= (relsize
- 1))
1553 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1555 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1557 reltab
[relcount
].address
= address
;
1558 reltab
[relcount
].addend
= 0;
1559 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1560 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1565 save_relocs (asection
*sec
)
1569 sec
->relocation
= reltab
;
1570 sec
->reloc_count
= relcount
;
1571 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1572 for (i
= 0; i
< relcount
; i
++)
1573 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1574 sec
->orelocation
[relcount
] = 0;
1575 sec
->flags
|= SEC_RELOC
;
1577 relcount
= relsize
= 0;
1580 /* .section .idata$2
1581 .global __head_my_dll
1601 asection
*id2
, *id5
, *id4
;
1602 unsigned char *d2
, *d5
, *d4
;
1606 oname
= (char *) xmalloc (20);
1607 sprintf (oname
, "d%06d.o", tmp_seq
);
1610 abfd
= bfd_create (oname
, parent
);
1611 bfd_find_target (pe_details
->object_target
, abfd
);
1612 bfd_make_writable (abfd
);
1614 bfd_set_format (abfd
, bfd_object
);
1615 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1618 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1619 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1620 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1621 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1622 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1623 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1625 /* OK, pay attention here. I got confused myself looking back at
1626 it. We create a four-byte section to mark the beginning of the
1627 list, and we include an offset of 4 in the section, so that the
1628 pointer to the list points to the *end* of this section, which is
1629 the start of the list of sections from other objects. */
1631 bfd_set_section_size (abfd
, id2
, 20);
1632 d2
= (unsigned char *) xmalloc (20);
1635 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1636 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1637 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1638 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1641 bfd_set_section_size (abfd
, id5
, 4);
1642 d5
= (unsigned char *) xmalloc (4);
1646 bfd_set_section_size (abfd
, id4
, 4);
1647 d4
= (unsigned char *) xmalloc (4);
1651 bfd_set_symtab (abfd
, symtab
, symptr
);
1653 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1654 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1655 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1657 bfd_make_readable (abfd
);
1661 /* .section .idata$4
1666 .global __my_dll_iname
1674 asection
*id4
, *id5
, *id7
;
1675 unsigned char *d4
, *d5
, *d7
;
1680 oname
= (char *) xmalloc (20);
1681 sprintf (oname
, "d%06d.o", tmp_seq
);
1684 abfd
= bfd_create (oname
, parent
);
1685 bfd_find_target (pe_details
->object_target
, abfd
);
1686 bfd_make_writable (abfd
);
1688 bfd_set_format (abfd
, bfd_object
);
1689 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1692 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1693 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1694 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1695 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1696 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1698 bfd_set_section_size (abfd
, id4
, 4);
1699 d4
= (unsigned char *) xmalloc (4);
1703 bfd_set_section_size (abfd
, id5
, 4);
1704 d5
= (unsigned char *) xmalloc (4);
1708 len
= strlen (dll_filename
) + 1;
1711 bfd_set_section_size (abfd
, id7
, len
);
1712 d7
= (unsigned char *) xmalloc (len
);
1714 strcpy (d7
, dll_filename
);
1716 bfd_set_symtab (abfd
, symtab
, symptr
);
1718 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1719 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1720 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1722 bfd_make_readable (abfd
);
1728 .global ___imp_function
1729 .global __imp__function
1731 jmp *__imp__function:
1745 .asciz "function" xlate? (add underscore, kill at) */
1747 static unsigned char jmp_ix86_bytes
[] =
1749 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1757 .dw __imp_function */
1759 static unsigned char jmp_sh_bytes
[] =
1761 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1765 lui $t0,<high:__imp_function>
1766 lw $t0,<low:__imp_function>
1770 static unsigned char jmp_mips_bytes
[] =
1772 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1773 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1777 make_one (exp
, parent
)
1778 def_file_export
*exp
;
1781 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1782 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1786 unsigned char *jmp_bytes
= NULL
;
1787 int jmp_byte_count
= 0;
1789 switch (pe_details
->pe_arch
)
1792 jmp_bytes
= jmp_ix86_bytes
;
1793 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1796 jmp_bytes
= jmp_sh_bytes
;
1797 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1800 jmp_bytes
= jmp_mips_bytes
;
1801 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1807 oname
= (char *) xmalloc (20);
1808 sprintf (oname
, "d%06d.o", tmp_seq
);
1811 abfd
= bfd_create (oname
, parent
);
1812 bfd_find_target (pe_details
->object_target
, abfd
);
1813 bfd_make_writable (abfd
);
1815 bfd_set_format (abfd
, bfd_object
);
1816 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1819 symtab
= (asymbol
**) xmalloc (11 * sizeof (asymbol
*));
1820 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1821 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1822 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1823 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1824 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1826 if (*exp
->internal_name
== '@')
1828 if (! exp
->flag_data
)
1829 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1830 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1831 quick_symbol (abfd
, U ("_imp_"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1832 /* Fastcall applies only to functions,
1833 so no need for auto-import symbol. */
1837 if (! exp
->flag_data
)
1838 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1839 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1840 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1841 /* Symbol to reference ord/name of imported
1842 data symbol, used to implement auto-import. */
1844 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
, BSF_GLOBAL
,0);
1846 if (pe_dll_compat_implib
)
1847 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "",
1848 id5
, BSF_GLOBAL
, 0);
1850 if (! exp
->flag_data
)
1852 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1853 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1855 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1857 switch (pe_details
->pe_arch
)
1860 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1863 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1866 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1867 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1868 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1876 bfd_set_section_size (abfd
, id7
, 4);
1877 d7
= (unsigned char *) xmalloc (4);
1880 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1883 bfd_set_section_size (abfd
, id5
, 4);
1884 d5
= (unsigned char *) xmalloc (4);
1888 if (exp
->flag_noname
)
1890 d5
[0] = exp
->ordinal
;
1891 d5
[1] = exp
->ordinal
>> 8;
1896 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1900 bfd_set_section_size (abfd
, id4
, 4);
1901 d4
= (unsigned char *) xmalloc (4);
1905 if (exp
->flag_noname
)
1907 d4
[0] = exp
->ordinal
;
1908 d4
[1] = exp
->ordinal
>> 8;
1913 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1917 if (exp
->flag_noname
)
1920 bfd_set_section_size (abfd
, id6
, 0);
1924 len
= strlen (exp
->name
) + 3;
1927 bfd_set_section_size (abfd
, id6
, len
);
1928 d6
= (unsigned char *) xmalloc (len
);
1930 memset (d6
, 0, len
);
1931 d6
[0] = exp
->hint
& 0xff;
1932 d6
[1] = exp
->hint
>> 8;
1933 strcpy (d6
+ 2, exp
->name
);
1936 bfd_set_symtab (abfd
, symtab
, symptr
);
1938 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1939 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1940 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1941 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1942 if (!exp
->flag_noname
)
1943 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1945 bfd_make_readable (abfd
);
1950 make_singleton_name_thunk (import
, parent
)
1954 /* Name thunks go to idata$4. */
1960 oname
= (char *) xmalloc (20);
1961 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1964 abfd
= bfd_create (oname
, parent
);
1965 bfd_find_target (pe_details
->object_target
, abfd
);
1966 bfd_make_writable (abfd
);
1968 bfd_set_format (abfd
, bfd_object
);
1969 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1972 symtab
= (asymbol
**) xmalloc (3 * sizeof (asymbol
*));
1973 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1974 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1975 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1977 bfd_set_section_size (abfd
, id4
, 8);
1978 d4
= (unsigned char *) xmalloc (4);
1981 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1984 bfd_set_symtab (abfd
, symtab
, symptr
);
1986 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
1988 bfd_make_readable (abfd
);
1993 make_import_fixup_mark (rel
)
1996 /* We convert reloc to symbol, for later reference. */
1998 static char *fixup_name
= NULL
;
1999 static size_t buffer_len
= 0;
2001 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2003 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2004 struct bfd_link_hash_entry
*bh
;
2008 fixup_name
= (char *) xmalloc (384);
2012 if (strlen (sym
->name
) + 25 > buffer_len
)
2013 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2014 bigger than 20 digits long, we've got worse problems than
2015 overflowing this buffer... */
2018 /* New buffer size is length of symbol, plus 25, but then
2019 rounded up to the nearest multiple of 128. */
2020 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2021 fixup_name
= (char *) xmalloc (buffer_len
);
2024 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2027 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2028 current_sec
, /* sym->section, */
2029 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2033 struct coff_link_hash_entry
*myh
;
2035 myh
= (struct coff_link_hash_entry
*) bh
;
2036 printf ("type:%d\n", myh
->type
);
2037 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2043 /* .section .idata$3
2044 .rva __nm_thnk_SYM (singleton thunk with name of func)
2047 .rva __my_dll_iname (name of dll)
2048 .rva __fuNN_SYM (pointer to reference (address) in text) */
2051 make_import_fixup_entry (name
, fixup_name
, dll_symname
, parent
)
2053 const char *fixup_name
;
2054 const char *dll_symname
;
2062 oname
= (char *) xmalloc (20);
2063 sprintf (oname
, "fu%06d.o", tmp_seq
);
2066 abfd
= bfd_create (oname
, parent
);
2067 bfd_find_target (pe_details
->object_target
, abfd
);
2068 bfd_make_writable (abfd
);
2070 bfd_set_format (abfd
, bfd_object
);
2071 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2074 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
2075 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2078 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2080 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2081 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2082 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2084 bfd_set_section_size (abfd
, id3
, 20);
2085 d3
= (unsigned char *) xmalloc (20);
2089 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2090 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2091 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2094 bfd_set_symtab (abfd
, symtab
, symptr
);
2096 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2098 bfd_make_readable (abfd
);
2102 /* .section .rdata_runtime_pseudo_reloc
2104 .rva __fuNN_SYM (pointer to reference (address) in text) */
2107 make_runtime_pseudo_reloc (name
, fixup_name
, addend
, parent
)
2108 const char *name ATTRIBUTE_UNUSED
;
2109 const char *fixup_name
;
2114 unsigned char *rt_rel_d
;
2118 oname
= (char *) xmalloc (20);
2119 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2122 abfd
= bfd_create (oname
, parent
);
2123 bfd_find_target (pe_details
->object_target
, abfd
);
2124 bfd_make_writable (abfd
);
2126 bfd_set_format (abfd
, bfd_object
);
2127 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2130 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2131 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS
, 2);
2133 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2135 bfd_set_section_size (abfd
, rt_rel
, 8);
2136 rt_rel_d
= (unsigned char *) xmalloc (8);
2137 rt_rel
->contents
= rt_rel_d
;
2138 memset (rt_rel_d
, 0, 8);
2139 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2141 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2142 save_relocs (rt_rel
);
2144 bfd_set_symtab (abfd
, symtab
, symptr
);
2146 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2148 bfd_make_readable (abfd
);
2153 .rva __pei386_runtime_relocator */
2156 pe_create_runtime_relocator_reference (parent
)
2159 asection
*extern_rt_rel
;
2160 unsigned char *extern_rt_rel_d
;
2164 oname
= (char *) xmalloc (20);
2165 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2168 abfd
= bfd_create (oname
, parent
);
2169 bfd_find_target (pe_details
->object_target
, abfd
);
2170 bfd_make_writable (abfd
);
2172 bfd_set_format (abfd
, bfd_object
);
2173 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2176 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2177 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2179 quick_symbol (abfd
, "", "__pei386_runtime_relocator", "", UNDSEC
, BSF_NO_FLAGS
, 0);
2181 bfd_set_section_size (abfd
, extern_rt_rel
, 4);
2182 extern_rt_rel_d
= (unsigned char *) xmalloc (4);
2183 extern_rt_rel
->contents
= extern_rt_rel_d
;
2185 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2186 save_relocs (extern_rt_rel
);
2188 bfd_set_symtab (abfd
, symtab
, symptr
);
2190 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, 4);
2192 bfd_make_readable (abfd
);
2197 pe_create_import_fixup (rel
, s
, addend
)
2203 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2204 struct bfd_link_hash_entry
*name_thunk_sym
;
2205 const char *name
= sym
->name
;
2206 char *fixup_name
= make_import_fixup_mark (rel
);
2209 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2211 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2213 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2215 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2216 add_bfd_to_link (b
, b
->filename
, &link_info
);
2218 /* If we ever use autoimport, we have to cast text section writable. */
2219 config
.text_read_only
= FALSE
;
2222 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2224 extern char * pe_data_import_dll
;
2225 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2227 b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
, output_bfd
);
2228 add_bfd_to_link (b
, b
->filename
, &link_info
);
2233 if (link_info
.pei386_runtime_pseudo_reloc
)
2235 if (pe_dll_extra_pe_debug
)
2236 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2237 fixup_name
, addend
);
2238 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, output_bfd
);
2239 add_bfd_to_link (b
, b
->filename
, &link_info
);
2241 if (runtime_pseudo_relocs_created
== 0)
2243 b
= pe_create_runtime_relocator_reference (output_bfd
);
2244 add_bfd_to_link (b
, b
->filename
, &link_info
);
2246 runtime_pseudo_relocs_created
++;
2250 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2251 s
->owner
, s
, rel
->address
, sym
->name
);
2259 pe_dll_generate_implib (def
, impfilename
)
2261 const char *impfilename
;
2269 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2270 dll_symname
= xstrdup (dll_filename
);
2271 for (i
= 0; dll_symname
[i
]; i
++)
2272 if (!ISALNUM (dll_symname
[i
]))
2273 dll_symname
[i
] = '_';
2275 unlink (impfilename
);
2277 outarch
= bfd_openw (impfilename
, 0);
2281 /* xgettext:c-format */
2282 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2286 /* xgettext:c-format */
2287 einfo (_("Creating library file: %s\n"), impfilename
);
2289 bfd_set_format (outarch
, bfd_archive
);
2290 outarch
->has_armap
= 1;
2292 /* Work out a reasonable size of things to put onto one line. */
2293 ar_head
= make_head (outarch
);
2295 for (i
= 0; i
< def
->num_exports
; i
++)
2297 /* The import library doesn't know about the internal name. */
2298 char *internal
= def
->exports
[i
].internal_name
;
2301 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2302 n
= make_one (def
->exports
+ i
, outarch
);
2305 def
->exports
[i
].internal_name
= internal
;
2308 ar_tail
= make_tail (outarch
);
2310 if (ar_head
== NULL
|| ar_tail
== NULL
)
2313 /* Now stick them all into the archive. */
2314 ar_head
->next
= head
;
2315 ar_tail
->next
= ar_head
;
2318 if (! bfd_set_archive_head (outarch
, head
))
2319 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2321 if (! bfd_close (outarch
))
2322 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2324 while (head
!= NULL
)
2326 bfd
*n
= head
->next
;
2333 add_bfd_to_link (abfd
, name
, link_info
)
2336 struct bfd_link_info
*link_info
;
2338 lang_input_statement_type
*fake_file
;
2340 fake_file
= lang_add_input_file (name
,
2341 lang_input_file_is_fake_enum
,
2343 fake_file
->the_bfd
= abfd
;
2344 ldlang_add_file (fake_file
);
2346 if (!bfd_link_add_symbols (abfd
, link_info
))
2347 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2351 pe_process_import_defs (output_bfd
, link_info
)
2353 struct bfd_link_info
*link_info
;
2355 def_file_module
*module
;
2357 pe_dll_id_target (bfd_get_target (output_bfd
));
2362 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2366 dll_filename
= module
->name
;
2367 dll_symname
= xstrdup (module
->name
);
2368 for (i
= 0; dll_symname
[i
]; i
++)
2369 if (!ISALNUM (dll_symname
[i
]))
2370 dll_symname
[i
] = '_';
2374 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2375 if (pe_def_file
->imports
[i
].module
== module
)
2377 def_file_export exp
;
2378 struct bfd_link_hash_entry
*blhe
;
2379 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2380 /* See if we need this import. */
2381 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2 + 6);
2384 sprintf (name
, "%s%s", "", pe_def_file
->imports
[i
].internal_name
);
2386 sprintf (name
, "%s%s",U (""), pe_def_file
->imports
[i
].internal_name
);
2388 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2389 FALSE
, FALSE
, FALSE
);
2391 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2394 sprintf (name
, "%s%s", U ("_imp_"),
2395 pe_def_file
->imports
[i
].internal_name
);
2397 sprintf (name
, "%s%s", U ("_imp__"),
2398 pe_def_file
->imports
[i
].internal_name
);
2400 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2401 FALSE
, FALSE
, FALSE
);
2405 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2411 bfd
*ar_head
= make_head (output_bfd
);
2412 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2415 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2416 exp
.name
= pe_def_file
->imports
[i
].name
;
2417 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2418 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2419 exp
.flag_private
= 0;
2420 exp
.flag_constant
= 0;
2422 exp
.flag_noname
= exp
.name
? 0 : 1;
2423 one
= make_one (&exp
, output_bfd
);
2424 add_bfd_to_link (one
, one
->filename
, link_info
);
2429 bfd
*ar_tail
= make_tail (output_bfd
);
2430 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2437 /* We were handed a *.DLL file. Parse it and turn it into a set of
2438 IMPORTS directives in the def file. Return TRUE if the file was
2439 handled, FALSE if not. */
2442 pe_get16 (abfd
, where
)
2448 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2449 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2450 return b
[0] + (b
[1] << 8);
2454 pe_get32 (abfd
, where
)
2460 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2461 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2462 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2465 #if 0 /* This is not currently used. */
2471 unsigned char *b
= ptr
;
2473 return b
[0] + (b
[1] << 8);
2482 unsigned char *b
= ptr
;
2484 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2488 pe_implied_import_dll (filename
)
2489 const char *filename
;
2492 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2493 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2494 unsigned char *expdata
, *erva
;
2495 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2496 const char *dll_name
;
2498 /* No, I can't use bfd here. kernel32.dll puts its export table in
2499 the middle of the .rdata section. */
2500 dll
= bfd_openr (filename
, pe_details
->target_name
);
2503 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2507 /* PEI dlls seem to be bfd_objects. */
2508 if (!bfd_check_format (dll
, bfd_object
))
2510 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2514 dll_name
= filename
;
2515 for (i
= 0; filename
[i
]; i
++)
2516 if (filename
[i
] == '/' || filename
[i
] == '\\' || filename
[i
] == ':')
2517 dll_name
= filename
+ i
+ 1;
2519 pe_header_offset
= pe_get32 (dll
, 0x3c);
2520 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2521 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2523 if (num_entries
< 1) /* No exports. */
2526 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2527 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2528 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2529 secptr
= (pe_header_offset
+ 4 + 20 +
2530 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2533 for (i
= 0; i
< nsections
; i
++)
2536 unsigned long secptr1
= secptr
+ 40 * i
;
2537 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2538 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2539 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2541 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2542 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2544 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2546 expptr
= fptr
+ (export_rva
- vaddr
);
2547 if (export_rva
+ export_size
> vaddr
+ vsize
)
2548 export_size
= vsize
- (export_rva
- vaddr
);
2553 expdata
= (unsigned char *) xmalloc (export_size
);
2554 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2555 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2556 erva
= expdata
- export_rva
;
2558 if (pe_def_file
== 0)
2559 pe_def_file
= def_file_empty ();
2561 nexp
= pe_as32 (expdata
+ 24);
2562 name_rvas
= pe_as32 (expdata
+ 32);
2563 ordinals
= pe_as32 (expdata
+ 36);
2564 ordbase
= pe_as32 (expdata
+ 16);
2566 for (i
= 0; i
< nexp
; i
++)
2568 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2569 def_file_import
*imp
;
2571 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
, dll_name
,
2578 /* These are the main functions, called from the emulation. The first
2579 is called after the bfds are read, so we can guess at how much space
2580 we need. The second is called after everything is placed, so we
2581 can put the right values in place. */
2584 pe_dll_build_sections (abfd
, info
)
2586 struct bfd_link_info
*info
;
2588 pe_dll_id_target (bfd_get_target (abfd
));
2589 process_def_file (abfd
, info
);
2591 generate_edata (abfd
, info
);
2592 build_filler_bfd (1);
2596 pe_exe_build_sections (abfd
, info
)
2598 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2600 pe_dll_id_target (bfd_get_target (abfd
));
2601 build_filler_bfd (0);
2605 pe_dll_fill_sections (abfd
, info
)
2607 struct bfd_link_info
*info
;
2609 pe_dll_id_target (bfd_get_target (abfd
));
2610 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2612 generate_reloc (abfd
, info
);
2615 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2617 /* Resize the sections. */
2618 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2619 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2621 /* Redo special stuff. */
2622 ldemul_after_allocation ();
2624 /* Do the assignments again. */
2625 lang_do_assignments (stat_ptr
->head
,
2627 (fill_type
*) 0, (bfd_vma
) 0);
2630 fill_edata (abfd
, info
);
2632 pe_data (abfd
)->dll
= 1;
2634 edata_s
->contents
= edata_d
;
2635 reloc_s
->contents
= reloc_d
;
2639 pe_exe_fill_sections (abfd
, info
)
2641 struct bfd_link_info
*info
;
2643 pe_dll_id_target (bfd_get_target (abfd
));
2644 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2646 generate_reloc (abfd
, info
);
2649 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2651 /* Resize the sections. */
2652 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2653 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2655 /* Redo special stuff. */
2656 ldemul_after_allocation ();
2658 /* Do the assignments again. */
2659 lang_do_assignments (stat_ptr
->head
,
2661 (fill_type
*) 0, (bfd_vma
) 0);
2663 reloc_s
->contents
= reloc_d
;