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
;
149 unsigned int imagebase_reloc
;
161 autofilter_entry_type
;
163 #define PE_ARCH_i386 1
165 #define PE_ARCH_mips 3
166 #define PE_ARCH_arm 4
167 #define PE_ARCH_arm_epoc 5
169 static pe_details_type pe_detail_list
[] =
182 16 /* R_SH_IMAGEBASE */,
204 "epoc-pei-arm-little",
205 "epoc-pe-arm-little",
211 { NULL
, NULL
, 0, 0, 0, 0 }
214 static pe_details_type
*pe_details
;
216 static autofilter_entry_type autofilter_symbollist
[] =
218 { "DllMain@12", 10 },
219 { "DllEntryPoint@0", 15 },
220 { "DllMainCRTStartup@12", 20 },
221 { "_cygwin_dll_entry@12", 20 },
222 { "_cygwin_crt0_common@8", 21 },
223 { "_cygwin_noncygwin_dll_entry@12", 30 },
224 { "impure_ptr", 10 },
228 /* Do not specify library suffix explicitly, to allow for dllized versions. */
229 static autofilter_entry_type autofilter_liblist
[] =
232 { "libstdc++.", 10 },
233 { "libmingw32.", 11 },
235 { "libsupc++.", 10 },
240 static autofilter_entry_type autofilter_objlist
[] =
250 { "crtbegin.o", 10 },
255 static autofilter_entry_type autofilter_symbolprefixlist
[] =
257 /* { "__imp_", 6 }, */
258 /* Do __imp_ explicitly to save time. */
260 { "__builtin_", 10 },
261 /* Don't export symbols specifying internal DLL layout. */
264 { "_impure_ptr", 11 },
265 { "cygwin_attach_dll", 17 },
266 { "cygwin_premain0", 15 },
267 { "cygwin_premain1", 15 },
268 { "cygwin_premain2", 15 },
269 { "cygwin_premain3", 15 },
274 static autofilter_entry_type autofilter_symbolsuffixlist
[] =
280 #define U(str) (pe_details->underscored ? "_" str : str)
282 static int reloc_sort
PARAMS ((const void *, const void *));
283 static int pe_export_sort
PARAMS ((const void *, const void *));
284 static int auto_export
PARAMS ((bfd
*, def_file
*, const char *));
285 static void process_def_file
PARAMS ((bfd
*, struct bfd_link_info
*));
286 static void build_filler_bfd
PARAMS ((int));
287 static void generate_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
288 static void fill_exported_offsets
PARAMS ((bfd
*, struct bfd_link_info
*));
289 static void fill_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
290 static void generate_reloc
PARAMS ((bfd
*, struct bfd_link_info
*));
291 static void quoteput
PARAMS ((char *, FILE *, int));
292 static asection
*quick_section
PARAMS ((bfd
*, const char *, int, int));
293 static void quick_symbol
294 PARAMS ((bfd
*, const char *, const char *, const char *,
295 asection
*, int, int));
296 static void quick_reloc
PARAMS ((bfd
*, int, int, int));
297 static bfd
*make_head
PARAMS ((bfd
*));
298 static bfd
*make_tail
PARAMS ((bfd
*));
299 static bfd
*make_one
PARAMS ((def_file_export
*, bfd
*));
300 static bfd
*make_singleton_name_thunk
PARAMS ((const char *, bfd
*));
301 static char *make_import_fixup_mark
PARAMS ((arelent
*));
302 static bfd
*make_import_fixup_entry
303 PARAMS ((const char *, const char *, const char *, bfd
*));
304 static unsigned int pe_get16
PARAMS ((bfd
*, int));
305 static unsigned int pe_get32
PARAMS ((bfd
*, int));
306 static unsigned int pe_as32
PARAMS ((void *));
309 pe_dll_id_target (target
)
314 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
315 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
316 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
318 pe_details
= pe_detail_list
+ i
;
321 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
325 /* Helper functions for qsort. Relocs must be sorted so that we can write
326 them out by pages. */
340 bfd_vma a
= ((reloc_data_type
*) va
)->vma
;
341 bfd_vma b
= ((reloc_data_type
*) vb
)->vma
;
343 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
347 pe_export_sort (va
, vb
)
350 def_file_export
*a
= (def_file_export
*) va
;
351 def_file_export
*b
= (def_file_export
*) vb
;
353 return strcmp (a
->name
, b
->name
);
356 /* Read and process the .DEF file. */
358 /* These correspond to the entries in pe_def_file->exports[]. I use
359 exported_symbol_sections[i] to tag whether or not the symbol was
360 defined, since we can't export symbols we don't have. */
362 static bfd_vma
*exported_symbol_offsets
;
363 static struct sec
**exported_symbol_sections
;
364 static int export_table_size
;
365 static int count_exported
;
366 static int count_exported_byname
;
367 static int count_with_ordinals
;
368 static const char *dll_name
;
369 static int min_ordinal
, max_ordinal
;
370 static int *exported_symbols
;
372 typedef struct exclude_list_struct
375 struct exclude_list_struct
*next
;
380 static struct exclude_list_struct
*excludes
= 0;
383 pe_dll_add_excludes (new_excludes
, type
)
384 const char *new_excludes
;
388 char *exclude_string
;
390 local_copy
= xstrdup (new_excludes
);
392 exclude_string
= strtok (local_copy
, ",:");
393 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
395 struct exclude_list_struct
*new_exclude
;
397 new_exclude
= ((struct exclude_list_struct
*)
398 xmalloc (sizeof (struct exclude_list_struct
)));
399 new_exclude
->string
= (char *) xmalloc (strlen (exclude_string
) + 1);
400 strcpy (new_exclude
->string
, exclude_string
);
401 new_exclude
->type
= type
;
402 new_exclude
->next
= excludes
;
403 excludes
= new_exclude
;
410 /* abfd is a bfd containing n (or NULL)
411 It can be used for contextual checks. */
414 auto_export (abfd
, d
, n
)
420 struct exclude_list_struct
*ex
;
421 autofilter_entry_type
*afptr
;
422 const char * libname
= 0;
423 if (abfd
&& abfd
->my_archive
)
424 libname
= lbasename (abfd
->my_archive
->filename
);
426 /* We should not re-export imported stuff. */
427 if (strncmp (n
, "_imp__", 6) == 0)
430 for (i
= 0; i
< d
->num_exports
; i
++)
431 if (strcmp (d
->exports
[i
].name
, n
) == 0)
434 if (pe_dll_do_default_excludes
)
439 if (pe_dll_extra_pe_debug
)
440 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
441 n
, abfd
, abfd
->my_archive
);
443 /* First of all, make context checks:
444 Don't export anything from standard libs. */
447 afptr
= autofilter_liblist
;
451 if (strncmp (libname
, afptr
->name
, afptr
->len
) == 0 )
457 /* Next, exclude symbols from certain startup objects. */
459 if (abfd
&& (p
= lbasename (abfd
->filename
)))
461 afptr
= autofilter_objlist
;
464 if (strcmp (p
, afptr
->name
) == 0)
470 /* Don't try to blindly exclude all symbols
471 that begin with '__'; this was tried and
472 it is too restrictive. */
474 /* Then, exclude specific symbols. */
475 afptr
= autofilter_symbollist
;
478 if (strcmp (n
, afptr
->name
) == 0)
484 /* Next, exclude symbols starting with ... */
485 afptr
= autofilter_symbolprefixlist
;
488 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
494 /* Finally, exclude symbols ending with ... */
496 afptr
= autofilter_symbolsuffixlist
;
499 if ((len
>= afptr
->len
)
500 /* Add 1 to insure match with trailing '\0'. */
501 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
502 afptr
->len
+ 1) == 0)
509 for (ex
= excludes
; ex
; ex
= ex
->next
)
511 if (ex
->type
== 1) /* exclude-libs */
514 && ((strcmp (libname
, ex
->string
) == 0)
515 || (strcasecmp ("ALL", ex
->string
) == 0)))
518 else if (strcmp (n
, ex
->string
) == 0)
526 process_def_file (abfd
, info
)
527 bfd
*abfd ATTRIBUTE_UNUSED
;
528 struct bfd_link_info
*info
;
531 struct bfd_link_hash_entry
*blhe
;
534 def_file_export
*e
= 0;
537 pe_def_file
= def_file_empty ();
539 /* First, run around to all the objects looking for the .drectve
540 sections, and push those into the def file too. */
541 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
543 s
= bfd_get_section_by_name (b
, ".drectve");
546 int size
= bfd_get_section_size_before_reloc (s
);
547 char *buf
= xmalloc (size
);
549 bfd_get_section_contents (b
, s
, buf
, 0, size
);
550 def_file_add_directive (pe_def_file
, buf
, size
);
555 /* Now, maybe export everything else the default way. */
556 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
558 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
563 symsize
= bfd_get_symtab_upper_bound (b
);
564 symbols
= (asymbol
**) xmalloc (symsize
);
565 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
567 for (j
= 0; j
< nsyms
; j
++)
569 /* We should export symbols which are either global or not
570 anything at all. (.bss data is the latter)
571 We should not export undefined symbols. */
572 if (symbols
[j
]->section
!= &bfd_und_section
573 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
574 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
576 const char *sn
= symbols
[j
]->name
;
578 /* We should not re-export imported stuff. */
580 char *name
= (char *) xmalloc (strlen (sn
) + 2 + 6);
581 sprintf (name
, "%s%s", U("_imp_"), sn
);
583 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
584 false, false, false);
587 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
594 if (auto_export (b
, pe_def_file
, sn
))
597 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
598 /* Fill data flag properly, from dlltool.c. */
599 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
607 #define NE pe_def_file->num_exports
609 /* Canonicalize the export list. */
612 for (i
= 0; i
< NE
; i
++)
614 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
616 /* This will preserve internal_name, which may have been
617 pointing to the same memory as name, or might not
619 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
);
621 *(strchr (tmp
, '@')) = 0;
622 pe_def_file
->exports
[i
].name
= tmp
;
627 if (pe_dll_stdcall_aliases
)
629 for (i
= 0; i
< NE
; i
++)
631 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
633 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
);
635 *(strchr (tmp
, '@')) = 0;
636 if (auto_export (NULL
, pe_def_file
, tmp
))
637 def_file_add_export (pe_def_file
, tmp
,
638 pe_def_file
->exports
[i
].internal_name
,
646 /* Convenience, but watch out for it changing. */
647 e
= pe_def_file
->exports
;
649 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
650 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
652 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
656 count_exported_byname
= 0;
657 count_with_ordinals
= 0;
659 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
660 for (i
= 0, j
= 0; i
< NE
; i
++)
662 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
664 /* This is a duplicate. */
665 if (e
[j
- 1].ordinal
!= -1
666 && e
[i
].ordinal
!= -1
667 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
669 if (pe_dll_warn_dup_exports
)
670 /* xgettext:c-format */
671 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
672 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
676 if (pe_dll_warn_dup_exports
)
677 /* xgettext:c-format */
678 einfo (_("Warning, duplicate EXPORT: %s\n"),
682 if (e
[i
].ordinal
!= -1)
683 e
[j
- 1].ordinal
= e
[i
].ordinal
;
684 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
685 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
686 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
687 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
696 pe_def_file
->num_exports
= j
; /* == NE */
698 for (i
= 0; i
< NE
; i
++)
700 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
702 if (pe_details
->underscored
)
705 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
708 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
710 blhe
= bfd_link_hash_lookup (info
->hash
,
715 && (blhe
->type
== bfd_link_hash_defined
716 || (blhe
->type
== bfd_link_hash_common
)))
719 if (!pe_def_file
->exports
[i
].flag_noname
)
720 count_exported_byname
++;
722 /* Only fill in the sections. The actual offsets are computed
723 in fill_exported_offsets() after common symbols are laid
725 if (blhe
->type
== bfd_link_hash_defined
)
726 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
728 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
730 if (pe_def_file
->exports
[i
].ordinal
!= -1)
732 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
733 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
734 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
735 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
736 count_with_ordinals
++;
739 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
741 /* xgettext:c-format */
742 einfo (_("%XCannot export %s: symbol not defined\n"),
743 pe_def_file
->exports
[i
].internal_name
);
747 /* xgettext:c-format */
748 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
749 pe_def_file
->exports
[i
].internal_name
,
750 blhe
->type
, bfd_link_hash_defined
);
754 /* xgettext:c-format */
755 einfo (_("%XCannot export %s: symbol not found\n"),
756 pe_def_file
->exports
[i
].internal_name
);
762 /* Build the bfd that will contain .edata and .reloc sections. */
765 build_filler_bfd (include_edata
)
768 lang_input_statement_type
*filler_file
;
769 filler_file
= lang_add_input_file ("dll stuff",
770 lang_input_file_is_fake_enum
,
772 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
773 if (filler_bfd
== NULL
774 || !bfd_set_arch_mach (filler_bfd
,
775 bfd_get_arch (output_bfd
),
776 bfd_get_mach (output_bfd
)))
778 einfo ("%X%P: can not create BFD %E\n");
784 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
786 || !bfd_set_section_flags (filler_bfd
, edata_s
,
793 einfo ("%X%P: can not create .edata section: %E\n");
796 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
799 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
801 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
808 einfo ("%X%P: can not create .reloc section: %E\n");
812 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
814 ldlang_add_file (filler_file
);
817 /* Gather all the exported symbols and build the .edata section. */
820 generate_edata (abfd
, info
)
822 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
825 int name_table_size
= 0;
828 /* First, we need to know how many exported symbols there are,
829 and what the range of ordinals is. */
830 if (pe_def_file
->name
)
831 dll_name
= pe_def_file
->name
;
834 dll_name
= abfd
->filename
;
836 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
837 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
841 if (count_with_ordinals
&& max_ordinal
> count_exported
)
843 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
844 min_ordinal
= max_ordinal
- count_exported
+ 1;
849 max_ordinal
= count_exported
;
852 export_table_size
= max_ordinal
- min_ordinal
+ 1;
853 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
854 for (i
= 0; i
< export_table_size
; i
++)
855 exported_symbols
[i
] = -1;
857 /* Now we need to assign ordinals to those that don't have them. */
858 for (i
= 0; i
< NE
; i
++)
860 if (exported_symbol_sections
[i
])
862 if (pe_def_file
->exports
[i
].ordinal
!= -1)
864 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
865 int pi
= exported_symbols
[ei
];
869 /* xgettext:c-format */
870 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
871 pe_def_file
->exports
[i
].ordinal
,
872 pe_def_file
->exports
[i
].name
,
873 pe_def_file
->exports
[pi
].name
);
875 exported_symbols
[ei
] = i
;
877 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
881 next_ordinal
= min_ordinal
;
882 for (i
= 0; i
< NE
; i
++)
883 if (exported_symbol_sections
[i
])
884 if (pe_def_file
->exports
[i
].ordinal
== -1)
886 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
889 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
890 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
893 /* OK, now we can allocate some memory. */
894 edata_sz
= (40 /* directory */
895 + 4 * export_table_size
/* addresses */
896 + 4 * count_exported_byname
/* name ptrs */
897 + 2 * count_exported_byname
/* ordinals */
898 + name_table_size
+ strlen (dll_name
) + 1);
901 /* Fill the exported symbol offsets. The preliminary work has already
902 been done in process_def_file(). */
905 fill_exported_offsets (abfd
, info
)
906 bfd
*abfd ATTRIBUTE_UNUSED
;
907 struct bfd_link_info
*info
;
910 struct bfd_link_hash_entry
*blhe
;
912 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
914 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
916 if (pe_details
->underscored
)
919 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
922 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
924 blhe
= bfd_link_hash_lookup (info
->hash
,
928 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
929 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
936 fill_edata (abfd
, info
)
938 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
941 unsigned char *edirectory
;
942 unsigned long *eaddresses
;
943 unsigned long *enameptrs
;
944 unsigned short *eordinals
;
945 unsigned char *enamestr
;
950 edata_d
= (unsigned char *) xmalloc (edata_sz
);
952 /* Note use of array pointer math here. */
953 edirectory
= edata_d
;
954 eaddresses
= (unsigned long *) (edata_d
+ 40);
955 enameptrs
= eaddresses
+ export_table_size
;
956 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
957 enamestr
= (char *) (eordinals
+ count_exported_byname
);
959 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
961 memset (edata_d
, 0, edata_sz
);
962 bfd_put_32 (abfd
, now
, edata_d
+ 4);
963 if (pe_def_file
->version_major
!= -1)
965 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
966 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
969 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
970 strcpy (enamestr
, dll_name
);
971 enamestr
+= strlen (enamestr
) + 1;
972 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
973 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
974 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
975 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
976 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
977 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
979 fill_exported_offsets (abfd
, info
);
981 /* Ok, now for the filling in part. */
983 for (i
= 0; i
< export_table_size
; i
++)
985 int s
= exported_symbols
[i
];
989 struct sec
*ssec
= exported_symbol_sections
[s
];
990 unsigned long srva
= (exported_symbol_offsets
[s
]
991 + ssec
->output_section
->vma
992 + ssec
->output_offset
);
993 int ord
= pe_def_file
->exports
[s
].ordinal
;
995 bfd_put_32 (abfd
, srva
- image_base
,
996 (void *) (eaddresses
+ ord
- min_ordinal
));
998 if (!pe_def_file
->exports
[s
].flag_noname
)
1000 char *ename
= pe_def_file
->exports
[s
].name
;
1001 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
1003 strcpy (enamestr
, ename
);
1004 enamestr
+= strlen (enamestr
) + 1;
1005 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
1007 pe_def_file
->exports
[s
].hint
= hint
++;
1014 static struct sec
*current_sec
;
1017 pe_walk_relocs_of_symbol (info
, name
, cb
)
1018 struct bfd_link_info
*info
;
1020 int (*cb
) (arelent
*, asection
*);
1025 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1030 symsize
= bfd_get_symtab_upper_bound (b
);
1031 symbols
= (asymbol
**) xmalloc (symsize
);
1032 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1034 for (s
= b
->sections
; s
; s
= s
->next
)
1037 int relsize
, nrelocs
, i
;
1038 int flags
= bfd_get_section_flags (b
, s
);
1040 /* Skip discarded linkonce sections. */
1041 if (flags
& SEC_LINK_ONCE
1042 && s
->output_section
== bfd_abs_section_ptr
)
1047 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1048 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1049 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1051 for (i
= 0; i
< nrelocs
; i
++)
1053 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1055 if (!strcmp (name
, sym
->name
))
1061 /* Warning: the allocated symbols are remembered in BFD and reused
1062 later, so don't free them! */
1063 /* free (symbols); */
1068 /* Gather all the relocations and build the .reloc section. */
1071 generate_reloc (abfd
, info
)
1073 struct bfd_link_info
*info
;
1076 /* For .reloc stuff. */
1077 reloc_data_type
*reloc_data
;
1078 int total_relocs
= 0;
1080 unsigned long sec_page
= (unsigned long) (-1);
1081 unsigned long page_ptr
, page_count
;
1087 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1088 for (s
= b
->sections
; s
; s
= s
->next
)
1089 total_relocs
+= s
->reloc_count
;
1092 (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
1096 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1099 int relsize
, nrelocs
, i
;
1101 for (s
= b
->sections
; s
; s
= s
->next
)
1103 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1107 /* If it's not loaded, we don't need to relocate it this way. */
1108 if (!(s
->output_section
->flags
& SEC_LOAD
))
1111 /* I don't know why there would be a reloc for these, but I've
1112 seen it happen - DJ */
1113 if (s
->output_section
== &bfd_abs_section
)
1116 if (s
->output_section
->vma
== 0)
1118 /* Huh? Shouldn't happen, but punt if it does. */
1119 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1120 s
->output_section
->name
, s
->output_section
->index
,
1121 s
->output_section
->flags
);
1125 symsize
= bfd_get_symtab_upper_bound (b
);
1126 symbols
= (asymbol
**) xmalloc (symsize
);
1127 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1129 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1130 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1131 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1133 for (i
= 0; i
< nrelocs
; i
++)
1135 if (pe_dll_extra_pe_debug
)
1137 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1138 printf ("rel: %s\n", sym
->name
);
1140 if (!relocs
[i
]->howto
->pc_relative
1141 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1144 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1146 sym_vma
= (relocs
[i
]->addend
1149 + sym
->section
->output_offset
1150 + sym
->section
->output_section
->vma
);
1151 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1153 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1155 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1156 relocs
[i
]->howto
->rightshift
)
1158 case BITS_AND_SHIFT (32, 0):
1159 reloc_data
[total_relocs
].type
= 3;
1162 case BITS_AND_SHIFT (16, 0):
1163 reloc_data
[total_relocs
].type
= 2;
1166 case BITS_AND_SHIFT (16, 16):
1167 reloc_data
[total_relocs
].type
= 4;
1168 /* FIXME: we can't know the symbol's right value
1169 yet, but we probably can safely assume that
1170 CE will relocate us in 64k blocks, so leaving
1172 reloc_data
[total_relocs
].extra
= 0;
1175 case BITS_AND_SHIFT (26, 2):
1176 reloc_data
[total_relocs
].type
= 5;
1180 /* xgettext:c-format */
1181 einfo (_("%XError: %d-bit reloc in dll\n"),
1182 relocs
[i
]->howto
->bitsize
);
1188 /* Warning: the allocated symbols are remembered in BFD and
1189 reused later, so don't free them! */
1196 /* At this point, we have total_relocs relocation addresses in
1197 reloc_addresses, which are all suitable for the .reloc section.
1198 We must now create the new sections. */
1199 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1201 for (i
= 0; i
< total_relocs
; i
++)
1203 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1205 if (this_page
!= sec_page
)
1207 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1209 sec_page
= this_page
;
1214 if (reloc_data
[i
].type
== 4)
1218 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1219 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
1220 sec_page
= (unsigned long) (-1);
1222 page_ptr
= (unsigned long) (-1);
1225 for (i
= 0; i
< total_relocs
; i
++)
1227 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1228 unsigned long this_page
= (rva
& ~0xfff);
1230 if (this_page
!= sec_page
)
1232 while (reloc_sz
& 3)
1233 reloc_d
[reloc_sz
++] = 0;
1235 if (page_ptr
!= (unsigned long) (-1))
1236 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1238 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1239 page_ptr
= reloc_sz
;
1241 sec_page
= this_page
;
1245 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1246 reloc_d
+ reloc_sz
);
1249 if (reloc_data
[i
].type
== 4)
1251 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1258 while (reloc_sz
& 3)
1259 reloc_d
[reloc_sz
++] = 0;
1261 if (page_ptr
!= (unsigned long) (-1))
1262 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1264 while (reloc_sz
< reloc_s
->_raw_size
)
1265 reloc_d
[reloc_sz
++] = 0;
1268 /* Given the exiting def_file structure, print out a .DEF file that
1269 corresponds to it. */
1272 quoteput (s
, f
, needs_quotes
)
1279 for (cp
= s
; *cp
; cp
++)
1294 if (*s
== '"' || *s
== '\\')
1308 pe_dll_generate_def_file (pe_out_def_filename
)
1309 const char *pe_out_def_filename
;
1312 FILE *out
= fopen (pe_out_def_filename
, "w");
1315 /* xgettext:c-format */
1316 einfo (_("%s: Can't open output def file %s\n"),
1317 program_name
, pe_out_def_filename
);
1321 if (pe_def_file
->name
)
1323 if (pe_def_file
->is_dll
)
1324 fprintf (out
, "LIBRARY ");
1326 fprintf (out
, "NAME ");
1328 quoteput (pe_def_file
->name
, out
, 1);
1330 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1331 fprintf (out
, " BASE=0x%lx",
1332 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1333 fprintf (out
, "\n");
1336 if (pe_def_file
->description
)
1338 fprintf (out
, "DESCRIPTION ");
1339 quoteput (pe_def_file
->description
, out
, 1);
1340 fprintf (out
, "\n");
1343 if (pe_def_file
->version_minor
!= -1)
1344 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1345 pe_def_file
->version_minor
);
1346 else if (pe_def_file
->version_major
!= -1)
1347 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1349 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1350 fprintf (out
, "\n");
1352 if (pe_def_file
->stack_commit
!= -1)
1353 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1354 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1355 else if (pe_def_file
->stack_reserve
!= -1)
1356 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1358 if (pe_def_file
->heap_commit
!= -1)
1359 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1360 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1361 else if (pe_def_file
->heap_reserve
!= -1)
1362 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1364 if (pe_def_file
->num_section_defs
> 0)
1366 fprintf (out
, "\nSECTIONS\n\n");
1368 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1371 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1373 if (pe_def_file
->section_defs
[i
].class)
1375 fprintf (out
, " CLASS ");
1376 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1379 if (pe_def_file
->section_defs
[i
].flag_read
)
1380 fprintf (out
, " READ");
1382 if (pe_def_file
->section_defs
[i
].flag_write
)
1383 fprintf (out
, " WRITE");
1385 if (pe_def_file
->section_defs
[i
].flag_execute
)
1386 fprintf (out
, " EXECUTE");
1388 if (pe_def_file
->section_defs
[i
].flag_shared
)
1389 fprintf (out
, " SHARED");
1391 fprintf (out
, "\n");
1395 if (pe_def_file
->num_exports
> 0)
1397 fprintf (out
, "EXPORTS\n");
1399 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1401 def_file_export
*e
= pe_def_file
->exports
+ i
;
1403 quoteput (e
->name
, out
, 0);
1405 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1407 fprintf (out
, " = ");
1408 quoteput (e
->internal_name
, out
, 0);
1411 if (e
->ordinal
!= -1)
1412 fprintf (out
, " @%d", e
->ordinal
);
1414 if (e
->flag_private
)
1415 fprintf (out
, " PRIVATE");
1417 if (e
->flag_constant
)
1418 fprintf (out
, " CONSTANT");
1421 fprintf (out
, " NONAME");
1424 fprintf (out
, " DATA");
1426 fprintf (out
, "\n");
1430 if (pe_def_file
->num_imports
> 0)
1432 fprintf (out
, "\nIMPORTS\n\n");
1434 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1436 def_file_import
*im
= pe_def_file
->imports
+ i
;
1439 if (im
->internal_name
1440 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1442 quoteput (im
->internal_name
, out
, 0);
1443 fprintf (out
, " = ");
1446 quoteput (im
->module
->name
, out
, 0);
1450 quoteput (im
->name
, out
, 0);
1452 fprintf (out
, "%d", im
->ordinal
);
1454 fprintf (out
, "\n");
1459 fprintf (out
, _("; no contents available\n"));
1461 if (fclose (out
) == EOF
)
1462 /* xgettext:c-format */
1463 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1466 /* Generate the import library. */
1468 static asymbol
**symtab
;
1471 static const char *dll_filename
;
1472 static char *dll_symname
;
1474 #define UNDSEC (asection *) &bfd_und_section
1477 quick_section (abfd
, name
, flags
, align
)
1486 sec
= bfd_make_section_old_way (abfd
, name
);
1487 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1488 bfd_set_section_alignment (abfd
, sec
, align
);
1489 /* Remember to undo this before trying to link internally! */
1490 sec
->output_section
= sec
;
1492 sym
= bfd_make_empty_symbol (abfd
);
1493 symtab
[symptr
++] = sym
;
1494 sym
->name
= sec
->name
;
1496 sym
->flags
= BSF_LOCAL
;
1503 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1513 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1518 sym
= bfd_make_empty_symbol (abfd
);
1523 symtab
[symptr
++] = sym
;
1526 static arelent
*reltab
= 0;
1527 static int relcount
= 0, relsize
= 0;
1530 quick_reloc (abfd
, address
, which_howto
, symidx
)
1536 if (relcount
>= (relsize
- 1))
1540 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1542 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1544 reltab
[relcount
].address
= address
;
1545 reltab
[relcount
].addend
= 0;
1546 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1547 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1552 save_relocs (asection
*sec
)
1556 sec
->relocation
= reltab
;
1557 sec
->reloc_count
= relcount
;
1558 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1559 for (i
= 0; i
< relcount
; i
++)
1560 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1561 sec
->orelocation
[relcount
] = 0;
1562 sec
->flags
|= SEC_RELOC
;
1564 relcount
= relsize
= 0;
1567 /* .section .idata$2
1568 .global __head_my_dll
1588 asection
*id2
, *id5
, *id4
;
1589 unsigned char *d2
, *d5
, *d4
;
1593 oname
= (char *) xmalloc (20);
1594 sprintf (oname
, "d%06d.o", tmp_seq
);
1597 abfd
= bfd_create (oname
, parent
);
1598 bfd_find_target (pe_details
->object_target
, abfd
);
1599 bfd_make_writable (abfd
);
1601 bfd_set_format (abfd
, bfd_object
);
1602 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1605 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1606 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1607 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1608 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1609 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1610 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1612 /* OK, pay attention here. I got confused myself looking back at
1613 it. We create a four-byte section to mark the beginning of the
1614 list, and we include an offset of 4 in the section, so that the
1615 pointer to the list points to the *end* of this section, which is
1616 the start of the list of sections from other objects. */
1618 bfd_set_section_size (abfd
, id2
, 20);
1619 d2
= (unsigned char *) xmalloc (20);
1622 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1623 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1624 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1625 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1628 bfd_set_section_size (abfd
, id5
, 4);
1629 d5
= (unsigned char *) xmalloc (4);
1633 bfd_set_section_size (abfd
, id4
, 4);
1634 d4
= (unsigned char *) xmalloc (4);
1638 bfd_set_symtab (abfd
, symtab
, symptr
);
1640 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1641 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1642 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1644 bfd_make_readable (abfd
);
1648 /* .section .idata$4
1653 .global __my_dll_iname
1661 asection
*id4
, *id5
, *id7
;
1662 unsigned char *d4
, *d5
, *d7
;
1667 oname
= (char *) xmalloc (20);
1668 sprintf (oname
, "d%06d.o", tmp_seq
);
1671 abfd
= bfd_create (oname
, parent
);
1672 bfd_find_target (pe_details
->object_target
, abfd
);
1673 bfd_make_writable (abfd
);
1675 bfd_set_format (abfd
, bfd_object
);
1676 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1679 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1680 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1681 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1682 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1683 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1685 bfd_set_section_size (abfd
, id4
, 4);
1686 d4
= (unsigned char *) xmalloc (4);
1690 bfd_set_section_size (abfd
, id5
, 4);
1691 d5
= (unsigned char *) xmalloc (4);
1695 len
= strlen (dll_filename
) + 1;
1698 bfd_set_section_size (abfd
, id7
, len
);
1699 d7
= (unsigned char *) xmalloc (len
);
1701 strcpy (d7
, dll_filename
);
1703 bfd_set_symtab (abfd
, symtab
, symptr
);
1705 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1706 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1707 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1709 bfd_make_readable (abfd
);
1715 .global ___imp_function
1716 .global __imp__function
1718 jmp *__imp__function:
1732 .asciz "function" xlate? (add underscore, kill at) */
1734 static unsigned char jmp_ix86_bytes
[] =
1736 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1744 .dw __imp_function */
1746 static unsigned char jmp_sh_bytes
[] =
1748 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1752 lui $t0,<high:__imp_function>
1753 lw $t0,<low:__imp_function>
1757 static unsigned char jmp_mips_bytes
[] =
1759 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1760 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1764 make_one (exp
, parent
)
1765 def_file_export
*exp
;
1768 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1769 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1773 unsigned char *jmp_bytes
= NULL
;
1774 int jmp_byte_count
= 0;
1776 switch (pe_details
->pe_arch
)
1779 jmp_bytes
= jmp_ix86_bytes
;
1780 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1783 jmp_bytes
= jmp_sh_bytes
;
1784 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1787 jmp_bytes
= jmp_mips_bytes
;
1788 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1794 oname
= (char *) xmalloc (20);
1795 sprintf (oname
, "d%06d.o", tmp_seq
);
1798 abfd
= bfd_create (oname
, parent
);
1799 bfd_find_target (pe_details
->object_target
, abfd
);
1800 bfd_make_writable (abfd
);
1802 bfd_set_format (abfd
, bfd_object
);
1803 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1806 symtab
= (asymbol
**) xmalloc (11 * sizeof (asymbol
*));
1807 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1808 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1809 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1810 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1811 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1812 if (! exp
->flag_data
)
1813 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1814 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1815 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1816 /* Symbol to reference ord/name of imported
1817 symbol, used to implement auto-import. */
1818 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
, BSF_GLOBAL
, 0);
1819 if (pe_dll_compat_implib
)
1820 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "",
1821 id5
, BSF_GLOBAL
, 0);
1823 if (! exp
->flag_data
)
1825 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1826 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1828 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1830 switch (pe_details
->pe_arch
)
1833 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1836 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1839 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1840 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1841 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1849 bfd_set_section_size (abfd
, id7
, 4);
1850 d7
= (unsigned char *) xmalloc (4);
1853 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1856 bfd_set_section_size (abfd
, id5
, 4);
1857 d5
= (unsigned char *) xmalloc (4);
1861 if (exp
->flag_noname
)
1863 d5
[0] = exp
->ordinal
;
1864 d5
[1] = exp
->ordinal
>> 8;
1869 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1873 bfd_set_section_size (abfd
, id4
, 4);
1874 d4
= (unsigned char *) xmalloc (4);
1878 if (exp
->flag_noname
)
1880 d4
[0] = exp
->ordinal
;
1881 d4
[1] = exp
->ordinal
>> 8;
1886 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1890 if (exp
->flag_noname
)
1893 bfd_set_section_size (abfd
, id6
, 0);
1897 len
= strlen (exp
->name
) + 3;
1900 bfd_set_section_size (abfd
, id6
, len
);
1901 d6
= (unsigned char *) xmalloc (len
);
1903 memset (d6
, 0, len
);
1904 d6
[0] = exp
->hint
& 0xff;
1905 d6
[1] = exp
->hint
>> 8;
1906 strcpy (d6
+ 2, exp
->name
);
1909 bfd_set_symtab (abfd
, symtab
, symptr
);
1911 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1912 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1913 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1914 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1915 if (!exp
->flag_noname
)
1916 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1918 bfd_make_readable (abfd
);
1923 make_singleton_name_thunk (import
, parent
)
1927 /* Name thunks go to idata$4. */
1933 oname
= (char *) xmalloc (20);
1934 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1937 abfd
= bfd_create (oname
, parent
);
1938 bfd_find_target (pe_details
->object_target
, abfd
);
1939 bfd_make_writable (abfd
);
1941 bfd_set_format (abfd
, bfd_object
);
1942 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1945 symtab
= (asymbol
**) xmalloc (3 * sizeof (asymbol
*));
1946 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1947 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1948 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1950 bfd_set_section_size (abfd
, id4
, 8);
1951 d4
= (unsigned char *) xmalloc (4);
1954 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1957 bfd_set_symtab (abfd
, symtab
, symptr
);
1959 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
1961 bfd_make_readable (abfd
);
1966 make_import_fixup_mark (rel
)
1969 /* We convert reloc to symbol, for later reference. */
1971 static char *fixup_name
= NULL
;
1972 static size_t buffer_len
= 0;
1974 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
1976 bfd
*abfd
= bfd_asymbol_bfd (sym
);
1977 struct coff_link_hash_entry
*myh
= NULL
;
1981 fixup_name
= (char *) xmalloc (384);
1985 if (strlen (sym
->name
) + 25 > buffer_len
)
1986 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1987 bigger than 20 digits long, we've got worse problems than
1988 overflowing this buffer... */
1991 /* New buffer size is length of symbol, plus 25, but then
1992 rounded up to the nearest multiple of 128. */
1993 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
1994 fixup_name
= (char *) xmalloc (buffer_len
);
1997 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
1999 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2000 current_sec
, /* sym->section, */
2001 rel
->address
, NULL
, true, false,
2002 (struct bfd_link_hash_entry
**) &myh
);
2005 printf ("type:%d\n", myh
->type
);
2006 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2011 /* .section .idata$3
2012 .rva __nm_thnk_SYM (singleton thunk with name of func)
2015 .rva __my_dll_iname (name of dll)
2016 .rva __fuNN_SYM (pointer to reference (address) in text) */
2019 make_import_fixup_entry (name
, fixup_name
, dll_symname
, parent
)
2021 const char *fixup_name
;
2022 const char *dll_symname
;
2030 oname
= (char *) xmalloc (20);
2031 sprintf (oname
, "fu%06d.o", tmp_seq
);
2034 abfd
= bfd_create (oname
, parent
);
2035 bfd_find_target (pe_details
->object_target
, abfd
);
2036 bfd_make_writable (abfd
);
2038 bfd_set_format (abfd
, bfd_object
);
2039 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2042 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
2043 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2046 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2048 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2049 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2050 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2052 bfd_set_section_size (abfd
, id3
, 20);
2053 d3
= (unsigned char *) xmalloc (20);
2057 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2058 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2059 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2062 bfd_set_symtab (abfd
, symtab
, symptr
);
2064 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2066 bfd_make_readable (abfd
);
2071 pe_create_import_fixup (rel
)
2075 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2076 struct bfd_link_hash_entry
*name_thunk_sym
;
2077 const char *name
= sym
->name
;
2078 char *fixup_name
= make_import_fixup_mark (rel
);
2080 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2082 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2084 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2086 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2087 add_bfd_to_link (b
, b
->filename
, &link_info
);
2089 /* If we ever use autoimport, we have to cast text section writable. */
2090 config
.text_read_only
= false;
2094 extern char * pe_data_import_dll
;
2095 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2097 bfd
*b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
,
2099 add_bfd_to_link (b
, b
->filename
, &link_info
);
2105 pe_dll_generate_implib (def
, impfilename
)
2107 const char *impfilename
;
2115 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2116 dll_symname
= xstrdup (dll_filename
);
2117 for (i
= 0; dll_symname
[i
]; i
++)
2118 if (!ISALNUM (dll_symname
[i
]))
2119 dll_symname
[i
] = '_';
2121 unlink (impfilename
);
2123 outarch
= bfd_openw (impfilename
, 0);
2127 /* xgettext:c-format */
2128 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2132 /* xgettext:c-format */
2133 einfo (_("Creating library file: %s\n"), impfilename
);
2135 bfd_set_format (outarch
, bfd_archive
);
2136 outarch
->has_armap
= 1;
2138 /* Work out a reasonable size of things to put onto one line. */
2139 ar_head
= make_head (outarch
);
2141 for (i
= 0; i
< def
->num_exports
; i
++)
2143 /* The import library doesn't know about the internal name. */
2144 char *internal
= def
->exports
[i
].internal_name
;
2147 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2148 n
= make_one (def
->exports
+ i
, outarch
);
2151 def
->exports
[i
].internal_name
= internal
;
2154 ar_tail
= make_tail (outarch
);
2156 if (ar_head
== NULL
|| ar_tail
== NULL
)
2159 /* Now stick them all into the archive. */
2160 ar_head
->next
= head
;
2161 ar_tail
->next
= ar_head
;
2164 if (! bfd_set_archive_head (outarch
, head
))
2165 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2167 if (! bfd_close (outarch
))
2168 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2170 while (head
!= NULL
)
2172 bfd
*n
= head
->next
;
2179 add_bfd_to_link (abfd
, name
, link_info
)
2182 struct bfd_link_info
*link_info
;
2184 lang_input_statement_type
*fake_file
;
2186 fake_file
= lang_add_input_file (name
,
2187 lang_input_file_is_fake_enum
,
2189 fake_file
->the_bfd
= abfd
;
2190 ldlang_add_file (fake_file
);
2192 if (!bfd_link_add_symbols (abfd
, link_info
))
2193 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2197 pe_process_import_defs (output_bfd
, link_info
)
2199 struct bfd_link_info
*link_info
;
2201 def_file_module
*module
;
2203 pe_dll_id_target (bfd_get_target (output_bfd
));
2208 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2212 dll_filename
= module
->name
;
2213 dll_symname
= xstrdup (module
->name
);
2214 for (i
= 0; dll_symname
[i
]; i
++)
2215 if (!ISALNUM (dll_symname
[i
]))
2216 dll_symname
[i
] = '_';
2220 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2221 if (pe_def_file
->imports
[i
].module
== module
)
2223 def_file_export exp
;
2224 struct bfd_link_hash_entry
*blhe
;
2226 /* See if we need this import. */
2227 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2 + 6);
2228 sprintf (name
, "%s%s", U (""), pe_def_file
->imports
[i
].internal_name
);
2229 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2230 false, false, false);
2231 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2233 sprintf (name
, "%s%s", U ("_imp__"),
2234 pe_def_file
->imports
[i
].internal_name
);
2235 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2236 false, false, false);
2239 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2245 bfd
*ar_head
= make_head (output_bfd
);
2246 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2249 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2250 exp
.name
= pe_def_file
->imports
[i
].name
;
2251 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2252 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2253 exp
.flag_private
= 0;
2254 exp
.flag_constant
= 0;
2256 exp
.flag_noname
= exp
.name
? 0 : 1;
2257 one
= make_one (&exp
, output_bfd
);
2258 add_bfd_to_link (one
, one
->filename
, link_info
);
2263 bfd
*ar_tail
= make_tail (output_bfd
);
2264 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2271 /* We were handed a *.DLL file. Parse it and turn it into a set of
2272 IMPORTS directives in the def file. Return true if the file was
2273 handled, false if not. */
2276 pe_get16 (abfd
, where
)
2282 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2283 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2284 return b
[0] + (b
[1] << 8);
2288 pe_get32 (abfd
, where
)
2294 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2295 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2296 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2299 #if 0 /* This is not currently used. */
2305 unsigned char *b
= ptr
;
2307 return b
[0] + (b
[1] << 8);
2316 unsigned char *b
= ptr
;
2318 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2322 pe_implied_import_dll (filename
)
2323 const char *filename
;
2326 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2327 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2328 unsigned char *expdata
, *erva
;
2329 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2330 const char *dll_name
;
2332 /* No, I can't use bfd here. kernel32.dll puts its export table in
2333 the middle of the .rdata section. */
2334 dll
= bfd_openr (filename
, pe_details
->target_name
);
2337 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2341 /* PEI dlls seem to be bfd_objects. */
2342 if (!bfd_check_format (dll
, bfd_object
))
2344 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2348 dll_name
= filename
;
2349 for (i
= 0; filename
[i
]; i
++)
2350 if (filename
[i
] == '/' || filename
[i
] == '\\' || filename
[i
] == ':')
2351 dll_name
= filename
+ i
+ 1;
2353 pe_header_offset
= pe_get32 (dll
, 0x3c);
2354 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2355 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2357 if (num_entries
< 1) /* No exports. */
2360 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2361 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2362 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2363 secptr
= (pe_header_offset
+ 4 + 20 +
2364 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2367 for (i
= 0; i
< nsections
; i
++)
2370 unsigned long secptr1
= secptr
+ 40 * i
;
2371 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2372 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2373 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2375 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2376 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2378 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2380 expptr
= fptr
+ (export_rva
- vaddr
);
2381 if (export_rva
+ export_size
> vaddr
+ vsize
)
2382 export_size
= vsize
- (export_rva
- vaddr
);
2387 expdata
= (unsigned char *) xmalloc (export_size
);
2388 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2389 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2390 erva
= expdata
- export_rva
;
2392 if (pe_def_file
== 0)
2393 pe_def_file
= def_file_empty ();
2395 nexp
= pe_as32 (expdata
+ 24);
2396 name_rvas
= pe_as32 (expdata
+ 32);
2397 ordinals
= pe_as32 (expdata
+ 36);
2398 ordbase
= pe_as32 (expdata
+ 16);
2400 for (i
= 0; i
< nexp
; i
++)
2402 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2403 def_file_import
*imp
;
2405 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
, dll_name
,
2412 /* These are the main functions, called from the emulation. The first
2413 is called after the bfds are read, so we can guess at how much space
2414 we need. The second is called after everything is placed, so we
2415 can put the right values in place. */
2418 pe_dll_build_sections (abfd
, info
)
2420 struct bfd_link_info
*info
;
2422 pe_dll_id_target (bfd_get_target (abfd
));
2423 process_def_file (abfd
, info
);
2425 generate_edata (abfd
, info
);
2426 build_filler_bfd (1);
2430 pe_exe_build_sections (abfd
, info
)
2432 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2434 pe_dll_id_target (bfd_get_target (abfd
));
2435 build_filler_bfd (0);
2439 pe_dll_fill_sections (abfd
, info
)
2441 struct bfd_link_info
*info
;
2443 pe_dll_id_target (bfd_get_target (abfd
));
2444 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2446 generate_reloc (abfd
, info
);
2449 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2451 /* Resize the sections. */
2452 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2453 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2455 /* Redo special stuff. */
2456 ldemul_after_allocation ();
2458 /* Do the assignments again. */
2459 lang_do_assignments (stat_ptr
->head
,
2461 (fill_type
*) 0, (bfd_vma
) 0);
2464 fill_edata (abfd
, info
);
2466 pe_data (abfd
)->dll
= 1;
2468 edata_s
->contents
= edata_d
;
2469 reloc_s
->contents
= reloc_d
;
2473 pe_exe_fill_sections (abfd
, info
)
2475 struct bfd_link_info
*info
;
2477 pe_dll_id_target (bfd_get_target (abfd
));
2478 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2480 generate_reloc (abfd
, info
);
2483 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2485 /* Resize the sections. */
2486 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2487 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2489 /* Redo special stuff. */
2490 ldemul_after_allocation ();
2492 /* Do the assignments again. */
2493 lang_do_assignments (stat_ptr
->head
,
2495 (fill_type
*) 0, (bfd_vma
) 0);
2497 reloc_s
->contents
= reloc_d
;