2001-01-03 Philip Blundell <pb@futuretv.com>
[binutils.git] / ld / pe-dll.c
blob25533272f12b05369595e0e994253ac63618326c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998, 1999, 2000 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)
10 any later version.
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
20 02111-1307, USA. */
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
27 #include <time.h>
28 #include <ctype.h>
30 #include "ld.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include "ldwrite.h"
34 #include "ldmisc.h"
35 #include "ldgram.h"
36 #include "ldmain.h"
37 #include "ldfile.h"
38 #include "ldemul.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
41 #include "deffile.h"
42 #include "pe-dll.h"
44 /************************************************************************
46 This file turns a regular Windows PE image into a DLL. Because of
47 the complexity of this operation, it has been broken down into a
48 number of separate modules which are all called by the main function
49 at the end of this file. This function is not re-entrant and is
50 normally only called once, so static variables are used to reduce
51 the number of parameters and return values required.
53 See also: ld/emultempl/pe.em
55 ************************************************************************/
57 /* for emultempl/pe.em */
59 def_file *pe_def_file = 0;
60 int pe_dll_export_everything = 0;
61 int pe_dll_do_default_excludes = 1;
62 int pe_dll_kill_ats = 0;
63 int pe_dll_stdcall_aliases = 0;
64 int pe_dll_warn_dup_exports = 0;
65 int pe_dll_compat_implib = 0;
67 /************************************************************************
69 static variables and types
71 ************************************************************************/
73 static bfd_vma image_base;
75 static bfd *filler_bfd;
76 static struct sec *edata_s, *reloc_s;
77 static unsigned char *edata_d, *reloc_d;
78 static size_t edata_sz, reloc_sz;
80 typedef struct {
81 char *target_name;
82 char *object_target;
83 unsigned int imagebase_reloc;
84 int pe_arch;
85 int bfd_arch;
86 int underscored;
87 } pe_details_type;
89 #define PE_ARCH_i386 1
90 #define PE_ARCH_sh 2
91 #define PE_ARCH_mips 3
92 #define PE_ARCH_arm 4
94 static pe_details_type pe_detail_list[] = {
96 "pei-i386",
97 "pe-i386",
98 7 /* R_IMAGEBASE */,
99 PE_ARCH_i386,
100 bfd_arch_i386,
104 "pei-shl",
105 "pe-shl",
106 16 /* R_SH_IMAGEBASE */,
107 PE_ARCH_sh,
108 bfd_arch_sh,
112 "pei-mips",
113 "pe-mips",
114 34 /* MIPS_R_RVA */,
115 PE_ARCH_mips,
116 bfd_arch_mips,
120 "pei-arm-little",
121 "pe-arm-little",
122 11 /* ARM_RVA32 */,
123 PE_ARCH_arm,
124 bfd_arch_arm,
127 { NULL, NULL, 0, 0, 0, 0 }
130 static pe_details_type *pe_details;
132 #define U(str) (pe_details->underscored ? "_" str : str)
134 void
135 pe_dll_id_target (target)
136 const char *target;
138 int i;
139 for (i = 0; pe_detail_list[i].target_name; i++)
140 if (strcmp (pe_detail_list[i].target_name, target) == 0
141 || strcmp (pe_detail_list[i].object_target, target) == 0)
143 pe_details = pe_detail_list + i;
144 return;
146 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
147 exit (1);
150 /************************************************************************
152 Helper functions for qsort. Relocs must be sorted so that we can write
153 them out by pages.
155 ************************************************************************/
157 typedef struct {
158 bfd_vma vma;
159 char type;
160 short extra;
161 } reloc_data_type;
163 static int
164 reloc_sort (va, vb)
165 const void *va, *vb;
167 bfd_vma a = ((reloc_data_type *) va)->vma;
168 bfd_vma b = ((reloc_data_type *) vb)->vma;
169 return (a > b) ? 1 : ((a < b) ? -1 : 0);
172 static int
173 pe_export_sort (va, vb)
174 const void *va, *vb;
176 def_file_export *a = (def_file_export *) va;
177 def_file_export *b = (def_file_export *) vb;
178 return strcmp (a->name, b->name);
181 /************************************************************************
183 Read and process the .DEF file
185 ************************************************************************/
187 /* These correspond to the entries in pe_def_file->exports[]. I use
188 exported_symbol_sections[i] to tag whether or not the symbol was
189 defined, since we can't export symbols we don't have. */
191 static bfd_vma *exported_symbol_offsets;
192 static struct sec **exported_symbol_sections;
194 static int export_table_size;
195 static int count_exported;
196 static int count_exported_byname;
197 static int count_with_ordinals;
198 static const char *dll_name;
199 static int min_ordinal, max_ordinal;
200 static int *exported_symbols;
202 typedef struct exclude_list_struct {
203 char *string;
204 struct exclude_list_struct *next;
205 } exclude_list_struct;
207 static struct exclude_list_struct *excludes = 0;
209 void
210 pe_dll_add_excludes (new_excludes)
211 const char *new_excludes;
213 char *local_copy;
214 char *exclude_string;
216 local_copy = xstrdup (new_excludes);
218 exclude_string = strtok (local_copy, ",:");
219 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
221 struct exclude_list_struct *new_exclude;
223 new_exclude = ((struct exclude_list_struct *)
224 xmalloc (sizeof (struct exclude_list_struct)));
225 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
226 strcpy (new_exclude->string, exclude_string);
227 new_exclude->next = excludes;
228 excludes = new_exclude;
231 free (local_copy);
234 static int
235 auto_export (d, n)
236 def_file *d;
237 const char *n;
239 int i;
240 struct exclude_list_struct *ex;
241 for (i = 0; i < d->num_exports; i++)
242 if (strcmp (d->exports[i].name, n) == 0)
243 return 0;
244 if (pe_dll_do_default_excludes)
246 if (strcmp (n, "DllMain@12") == 0)
247 return 0;
248 if (strcmp (n, "DllEntryPoint@0") == 0)
249 return 0;
250 if (strcmp (n, "impure_ptr") == 0)
251 return 0;
253 for (ex = excludes; ex; ex = ex->next)
254 if (strcmp (n, ex->string) == 0)
255 return 0;
256 return 1;
259 static void
260 process_def_file (abfd, info)
261 bfd *abfd ATTRIBUTE_UNUSED;
262 struct bfd_link_info *info;
264 int i, j;
265 struct bfd_link_hash_entry *blhe;
266 bfd *b;
267 struct sec *s;
268 def_file_export *e = 0;
270 if (!pe_def_file)
271 pe_def_file = def_file_empty ();
273 /* First, run around to all the objects looking for the .drectve
274 sections, and push those into the def file too. */
276 for (b = info->input_bfds; b; b = b->link_next)
278 s = bfd_get_section_by_name (b, ".drectve");
279 if (s)
281 int size = bfd_get_section_size_before_reloc (s);
282 char *buf = xmalloc (size);
283 bfd_get_section_contents (b, s, buf, 0, size);
284 def_file_add_directive (pe_def_file, buf, size);
285 free (buf);
289 /* Now, maybe export everything else the default way. */
291 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
293 for (b = info->input_bfds; b; b = b->link_next)
295 asymbol **symbols;
296 int nsyms, symsize;
298 symsize = bfd_get_symtab_upper_bound (b);
299 symbols = (asymbol **) xmalloc (symsize);
300 nsyms = bfd_canonicalize_symtab (b, symbols);
302 for (j = 0; j < nsyms; j++)
304 /* We should export symbols which are either global or not
305 anything at all. (.bss data is the latter) */
306 if ((symbols[j]->flags & BSF_GLOBAL)
307 || (symbols[j]->flags == BSF_NO_FLAGS))
309 const char *sn = symbols[j]->name;
310 if (*sn == '_')
311 sn++;
312 if (auto_export (pe_def_file, sn))
314 def_file_export *p;
315 p=def_file_add_export (pe_def_file, sn, 0, -1);
316 /* Fill data flag properly, from dlltool.c */
317 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
324 #undef NE
325 #define NE pe_def_file->num_exports
327 /* Canonicalize the export list. */
329 if (pe_dll_kill_ats)
331 for (i = 0; i < NE; i++)
333 if (strchr (pe_def_file->exports[i].name, '@'))
335 /* This will preserve internal_name, which may have been
336 pointing to the same memory as name, or might not
337 have. */
338 char *tmp = xstrdup (pe_def_file->exports[i].name);
339 *(strchr (tmp, '@')) = 0;
340 pe_def_file->exports[i].name = tmp;
345 if (pe_dll_stdcall_aliases)
347 for (i = 0; i < NE; i++)
349 if (strchr (pe_def_file->exports[i].name, '@'))
351 char *tmp = xstrdup (pe_def_file->exports[i].name);
352 *(strchr (tmp, '@')) = 0;
353 if (auto_export (pe_def_file, tmp))
354 def_file_add_export (pe_def_file, tmp,
355 pe_def_file->exports[i].internal_name, -1);
356 else
357 free (tmp);
362 /* Convenience, but watch out for it changing. */
363 e = pe_def_file->exports;
365 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
366 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
368 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
369 max_ordinal = 0;
370 min_ordinal = 65536;
371 count_exported = 0;
372 count_exported_byname = 0;
373 count_with_ordinals = 0;
375 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
376 for (i = 0, j = 0; i < NE; i++)
378 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
380 /* This is a duplicate. */
381 if (e[j - 1].ordinal != -1
382 && e[i].ordinal != -1
383 && e[j - 1].ordinal != e[i].ordinal)
385 if (pe_dll_warn_dup_exports)
386 /* xgettext:c-format */
387 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
388 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
390 else
392 if (pe_dll_warn_dup_exports)
393 /* xgettext:c-format */
394 einfo (_("Warning, duplicate EXPORT: %s\n"),
395 e[j - 1].name);
397 if (e[i].ordinal != -1)
398 e[j - 1].ordinal = e[i].ordinal;
399 e[j - 1].flag_private |= e[i].flag_private;
400 e[j - 1].flag_constant |= e[i].flag_constant;
401 e[j - 1].flag_noname |= e[i].flag_noname;
402 e[j - 1].flag_data |= e[i].flag_data;
404 else
406 if (i != j)
407 e[j] = e[i];
408 j++;
411 pe_def_file->num_exports = j; /* == NE */
413 for (i = 0; i < NE; i++)
415 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
416 if (pe_details->underscored)
418 *name = '_';
419 strcpy (name + 1, pe_def_file->exports[i].internal_name);
421 else
422 strcpy (name, pe_def_file->exports[i].internal_name);
424 blhe = bfd_link_hash_lookup (info->hash,
425 name,
426 false, false, true);
428 if (blhe
429 && (blhe->type == bfd_link_hash_defined
430 || (blhe->type == bfd_link_hash_common)))
432 count_exported++;
433 if (!pe_def_file->exports[i].flag_noname)
434 count_exported_byname++;
436 /* Only fill in the sections. The actual offsets are computed
437 in fill_exported_offsets() after common symbols are laid
438 out. */
439 if (blhe->type == bfd_link_hash_defined)
440 exported_symbol_sections[i] = blhe->u.def.section;
441 else
442 exported_symbol_sections[i] = blhe->u.c.p->section;
444 if (pe_def_file->exports[i].ordinal != -1)
446 if (max_ordinal < pe_def_file->exports[i].ordinal)
447 max_ordinal = pe_def_file->exports[i].ordinal;
448 if (min_ordinal > pe_def_file->exports[i].ordinal)
449 min_ordinal = pe_def_file->exports[i].ordinal;
450 count_with_ordinals++;
453 else if (blhe && blhe->type == bfd_link_hash_undefined)
455 /* xgettext:c-format */
456 einfo (_("%XCannot export %s: symbol not defined\n"),
457 pe_def_file->exports[i].internal_name);
459 else if (blhe)
461 /* xgettext:c-format */
462 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
463 pe_def_file->exports[i].internal_name,
464 blhe->type, bfd_link_hash_defined);
466 else
468 /* xgettext:c-format */
469 einfo (_("%XCannot export %s: symbol not found\n"),
470 pe_def_file->exports[i].internal_name);
472 free (name);
476 /************************************************************************
478 Build the bfd that will contain .edata and .reloc sections
480 ************************************************************************/
482 static void
483 build_filler_bfd (include_edata)
484 int include_edata;
486 lang_input_statement_type *filler_file;
487 filler_file = lang_add_input_file ("dll stuff",
488 lang_input_file_is_fake_enum,
489 NULL);
490 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
491 if (filler_bfd == NULL
492 || !bfd_set_arch_mach (filler_bfd,
493 bfd_get_arch (output_bfd),
494 bfd_get_mach (output_bfd)))
496 einfo ("%X%P: can not create BFD %E\n");
497 return;
500 if (include_edata)
502 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
503 if (edata_s == NULL
504 || !bfd_set_section_flags (filler_bfd, edata_s,
505 (SEC_HAS_CONTENTS
506 | SEC_ALLOC
507 | SEC_LOAD
508 | SEC_KEEP
509 | SEC_IN_MEMORY)))
511 einfo ("%X%P: can not create .edata section: %E\n");
512 return;
514 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
517 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
518 if (reloc_s == NULL
519 || !bfd_set_section_flags (filler_bfd, reloc_s,
520 (SEC_HAS_CONTENTS
521 | SEC_ALLOC
522 | SEC_LOAD
523 | SEC_KEEP
524 | SEC_IN_MEMORY)))
526 einfo ("%X%P: can not create .reloc section: %E\n");
527 return;
529 bfd_set_section_size (filler_bfd, reloc_s, 0);
531 ldlang_add_file (filler_file);
534 /************************************************************************
536 Gather all the exported symbols and build the .edata section
538 ************************************************************************/
540 static void
541 generate_edata (abfd, info)
542 bfd *abfd;
543 struct bfd_link_info *info ATTRIBUTE_UNUSED;
545 int i, next_ordinal;
546 int name_table_size = 0;
547 const char *dlnp;
549 /* First, we need to know how many exported symbols there are,
550 and what the range of ordinals is. */
552 if (pe_def_file->name)
554 dll_name = pe_def_file->name;
556 else
558 dll_name = abfd->filename;
559 for (dlnp = dll_name; *dlnp; dlnp++)
561 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
562 dll_name = dlnp + 1;
566 if (count_with_ordinals && max_ordinal > count_exported)
568 if (min_ordinal > max_ordinal - count_exported + 1)
569 min_ordinal = max_ordinal - count_exported + 1;
571 else
573 min_ordinal = 1;
574 max_ordinal = count_exported;
576 export_table_size = max_ordinal - min_ordinal + 1;
578 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
579 for (i = 0; i < export_table_size; i++)
580 exported_symbols[i] = -1;
582 /* Now we need to assign ordinals to those that don't have them. */
583 for (i = 0; i < NE; i++)
585 if (exported_symbol_sections[i])
587 if (pe_def_file->exports[i].ordinal != -1)
589 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
590 int pi = exported_symbols[ei];
591 if (pi != -1)
593 /* xgettext:c-format */
594 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
595 pe_def_file->exports[i].ordinal,
596 pe_def_file->exports[i].name,
597 pe_def_file->exports[pi].name);
599 exported_symbols[ei] = i;
601 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
605 next_ordinal = min_ordinal;
606 for (i = 0; i < NE; i++)
607 if (exported_symbol_sections[i])
608 if (pe_def_file->exports[i].ordinal == -1)
610 while (exported_symbols[next_ordinal - min_ordinal] != -1)
611 next_ordinal++;
612 exported_symbols[next_ordinal - min_ordinal] = i;
613 pe_def_file->exports[i].ordinal = next_ordinal;
616 /* OK, now we can allocate some memory. */
618 edata_sz = (40 /* directory */
619 + 4 * export_table_size /* addresses */
620 + 4 * count_exported_byname /* name ptrs */
621 + 2 * count_exported_byname /* ordinals */
622 + name_table_size + strlen (dll_name) + 1);
625 /* Fill the exported symbol offsets. The preliminary work has already
626 been done in process_def_file(). */
628 static void
629 fill_exported_offsets (abfd, info)
630 bfd *abfd ATTRIBUTE_UNUSED;
631 struct bfd_link_info *info;
633 int i;
634 struct bfd_link_hash_entry *blhe;
636 for (i = 0; i < pe_def_file->num_exports; i++)
638 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
639 if (pe_details->underscored)
641 *name = '_';
642 strcpy (name + 1, pe_def_file->exports[i].internal_name);
644 else
645 strcpy (name, pe_def_file->exports[i].internal_name);
647 blhe = bfd_link_hash_lookup (info->hash,
648 name,
649 false, false, true);
651 if (blhe && (blhe->type == bfd_link_hash_defined))
653 exported_symbol_offsets[i] = blhe->u.def.value;
655 free (name);
659 static void
660 fill_edata (abfd, info)
661 bfd *abfd;
662 struct bfd_link_info *info ATTRIBUTE_UNUSED;
664 int i, hint;
665 unsigned char *edirectory;
666 unsigned long *eaddresses;
667 unsigned long *enameptrs;
668 unsigned short *eordinals;
669 unsigned char *enamestr;
670 time_t now;
672 time (&now);
674 edata_d = (unsigned char *) xmalloc (edata_sz);
676 /* Note use of array pointer math here. */
677 edirectory = edata_d;
678 eaddresses = (unsigned long *) (edata_d + 40);
679 enameptrs = eaddresses + export_table_size;
680 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
681 enamestr = (char *) (eordinals + count_exported_byname);
683 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
685 memset (edata_d, 0, edata_sz);
686 bfd_put_32 (abfd, now, edata_d + 4);
687 if (pe_def_file->version_major != -1)
689 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
690 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
692 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
693 strcpy (enamestr, dll_name);
694 enamestr += strlen (enamestr) + 1;
695 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
696 bfd_put_32 (abfd, export_table_size, edata_d + 20);
697 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
698 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
699 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
700 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
702 fill_exported_offsets (abfd, info);
704 /* Ok, now for the filling in part. */
705 hint = 0;
706 for (i = 0; i < export_table_size; i++)
708 int s = exported_symbols[i];
709 if (s != -1)
711 struct sec *ssec = exported_symbol_sections[s];
712 unsigned long srva = (exported_symbol_offsets[s]
713 + ssec->output_section->vma
714 + ssec->output_offset);
715 int ord = pe_def_file->exports[s].ordinal;
717 bfd_put_32 (abfd, srva - image_base,
718 (void *) (eaddresses + ord - min_ordinal));
719 if (!pe_def_file->exports[s].flag_noname)
721 char *ename = pe_def_file->exports[s].name;
722 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
723 enameptrs++;
724 strcpy (enamestr, ename);
725 enamestr += strlen (enamestr) + 1;
726 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
727 eordinals++;
728 pe_def_file->exports[s].hint = hint++;
734 /************************************************************************
736 Gather all the relocations and build the .reloc section
738 ************************************************************************/
740 static void
741 generate_reloc (abfd, info)
742 bfd *abfd;
743 struct bfd_link_info *info;
746 /* For .reloc stuff. */
747 reloc_data_type *reloc_data;
748 int total_relocs = 0;
749 int i;
750 unsigned long sec_page = (unsigned long) (-1);
751 unsigned long page_ptr, page_count;
752 int bi;
753 bfd *b;
754 struct sec *s;
756 total_relocs = 0;
757 for (b = info->input_bfds; b; b = b->link_next)
758 for (s = b->sections; s; s = s->next)
759 total_relocs += s->reloc_count;
761 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
763 total_relocs = 0;
764 bi = 0;
765 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
767 arelent **relocs;
768 int relsize, nrelocs, i;
770 for (s = b->sections; s; s = s->next)
772 unsigned long sec_vma = s->output_section->vma + s->output_offset;
773 asymbol **symbols;
774 int nsyms, symsize;
776 /* If it's not loaded, we don't need to relocate it this way. */
777 if (!(s->output_section->flags & SEC_LOAD))
778 continue;
780 /* I don't know why there would be a reloc for these, but I've
781 seen it happen - DJ */
782 if (s->output_section == &bfd_abs_section)
783 continue;
785 if (s->output_section->vma == 0)
787 /* Huh? Shouldn't happen, but punt if it does. */
788 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
789 s->output_section->name, s->output_section->index,
790 s->output_section->flags);
791 continue;
794 symsize = bfd_get_symtab_upper_bound (b);
795 symbols = (asymbol **) xmalloc (symsize);
796 nsyms = bfd_canonicalize_symtab (b, symbols);
798 relsize = bfd_get_reloc_upper_bound (b, s);
799 relocs = (arelent **) xmalloc ((size_t) relsize);
800 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
802 for (i = 0; i < nrelocs; i++)
804 if (!relocs[i]->howto->pc_relative
805 && relocs[i]->howto->type != pe_details->imagebase_reloc)
807 bfd_vma sym_vma;
808 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
809 sym_vma = (relocs[i]->addend
810 + sym->value
811 + sym->section->vma
812 + sym->section->output_offset
813 + sym->section->output_section->vma);
814 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
816 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
818 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
819 relocs[i]->howto->rightshift)
821 case BITS_AND_SHIFT (32, 0):
822 reloc_data[total_relocs].type = 3;
823 total_relocs++;
824 break;
825 case BITS_AND_SHIFT (16, 0):
826 reloc_data[total_relocs].type = 2;
827 total_relocs++;
828 break;
829 case BITS_AND_SHIFT (16, 16):
830 reloc_data[total_relocs].type = 4;
831 /* FIXME: we can't know the symbol's right value
832 yet, but we probably can safely assume that
833 CE will relocate us in 64k blocks, so leaving
834 it zero is safe. */
835 reloc_data[total_relocs].extra = 0;
836 total_relocs++;
837 break;
838 case BITS_AND_SHIFT (26, 2):
839 reloc_data[total_relocs].type = 5;
840 total_relocs++;
841 break;
842 default:
843 /* xgettext:c-format */
844 einfo (_("%XError: %d-bit reloc in dll\n"),
845 relocs[i]->howto->bitsize);
846 break;
850 free (relocs);
851 /* Warning: the allocated symbols are remembered in BFD and
852 reused later, so don't free them! */
853 #if 0
854 free (symbol);
855 #endif
859 /* At this point, we have total_relocs relocation addresses in
860 reloc_addresses, which are all suitable for the .reloc section.
861 We must now create the new sections. */
863 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
865 for (i = 0; i < total_relocs; i++)
867 unsigned long this_page = (reloc_data[i].vma >> 12);
869 if (this_page != sec_page)
871 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
872 reloc_sz += 8;
873 sec_page = this_page;
876 reloc_sz += 2;
878 if (reloc_data[i].type == 4)
879 reloc_sz += 2;
881 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
883 reloc_d = (unsigned char *) xmalloc (reloc_sz);
885 sec_page = (unsigned long) (-1);
886 reloc_sz = 0;
887 page_ptr = (unsigned long) (-1);
888 page_count = 0;
889 for (i = 0; i < total_relocs; i++)
891 unsigned long rva = reloc_data[i].vma - image_base;
892 unsigned long this_page = (rva & ~0xfff);
893 if (this_page != sec_page)
895 while (reloc_sz & 3)
896 reloc_d[reloc_sz++] = 0;
897 if (page_ptr != (unsigned long) (-1))
898 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
899 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
900 page_ptr = reloc_sz;
901 reloc_sz += 8;
902 sec_page = this_page;
903 page_count = 0;
905 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
906 reloc_d + reloc_sz);
907 reloc_sz += 2;
908 if (reloc_data[i].type == 4)
910 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
911 reloc_sz += 2;
913 page_count++;
915 while (reloc_sz & 3)
916 reloc_d[reloc_sz++] = 0;
917 if (page_ptr != (unsigned long) (-1))
918 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
919 while (reloc_sz < reloc_s->_raw_size)
920 reloc_d[reloc_sz++] = 0;
923 /************************************************************************
925 Given the exiting def_file structure, print out a .DEF file that
926 corresponds to it.
928 ************************************************************************/
930 static void
931 quoteput (s, f, needs_quotes)
932 char *s;
933 FILE *f;
934 int needs_quotes;
936 char *cp;
937 for (cp = s; *cp; cp++)
938 if (*cp == '\''
939 || *cp == '"'
940 || *cp == '\\'
941 || isspace ((unsigned char) *cp)
942 || *cp == ','
943 || *cp == ';')
944 needs_quotes = 1;
945 if (needs_quotes)
947 putc ('"', f);
948 while (*s)
950 if (*s == '"' || *s == '\\')
951 putc ('\\', f);
952 putc (*s, f);
953 s++;
955 putc ('"', f);
957 else
958 fputs (s, f);
961 void
962 pe_dll_generate_def_file (pe_out_def_filename)
963 const char *pe_out_def_filename;
965 int i;
966 FILE *out = fopen (pe_out_def_filename, "w");
967 if (out == NULL)
969 /* xgettext:c-format */
970 einfo (_("%s: Can't open output def file %s\n"),
971 program_name, pe_out_def_filename);
974 if (pe_def_file)
976 if (pe_def_file->name)
978 if (pe_def_file->is_dll)
979 fprintf (out, "LIBRARY ");
980 else
981 fprintf (out, "NAME ");
982 quoteput (pe_def_file->name, out, 1);
983 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
984 fprintf (out, " BASE=0x%lx",
985 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
986 fprintf (out, "\n");
989 if (pe_def_file->description)
991 fprintf (out, "DESCRIPTION ");
992 quoteput (pe_def_file->description, out, 1);
993 fprintf (out, "\n");
996 if (pe_def_file->version_minor != -1)
997 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
998 pe_def_file->version_minor);
999 else if (pe_def_file->version_major != -1)
1000 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1002 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1003 fprintf (out, "\n");
1005 if (pe_def_file->stack_commit != -1)
1006 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1007 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1008 else if (pe_def_file->stack_reserve != -1)
1009 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1010 if (pe_def_file->heap_commit != -1)
1011 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1012 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1013 else if (pe_def_file->heap_reserve != -1)
1014 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1016 if (pe_def_file->num_section_defs > 0)
1018 fprintf (out, "\nSECTIONS\n\n");
1019 for (i = 0; i < pe_def_file->num_section_defs; i++)
1021 fprintf (out, " ");
1022 quoteput (pe_def_file->section_defs[i].name, out, 0);
1023 if (pe_def_file->section_defs[i].class)
1025 fprintf (out, " CLASS ");
1026 quoteput (pe_def_file->section_defs[i].class, out, 0);
1028 if (pe_def_file->section_defs[i].flag_read)
1029 fprintf (out, " READ");
1030 if (pe_def_file->section_defs[i].flag_write)
1031 fprintf (out, " WRITE");
1032 if (pe_def_file->section_defs[i].flag_execute)
1033 fprintf (out, " EXECUTE");
1034 if (pe_def_file->section_defs[i].flag_shared)
1035 fprintf (out, " SHARED");
1036 fprintf (out, "\n");
1040 if (pe_def_file->num_exports > 0)
1042 fprintf (out, "\nEXPORTS\n\n");
1043 for (i = 0; i < pe_def_file->num_exports; i++)
1045 def_file_export *e = pe_def_file->exports + i;
1046 fprintf (out, " ");
1047 quoteput (e->name, out, 0);
1048 if (e->internal_name && strcmp (e->internal_name, e->name))
1050 fprintf (out, " = ");
1051 quoteput (e->internal_name, out, 0);
1053 if (e->ordinal != -1)
1054 fprintf (out, " @%d", e->ordinal);
1055 if (e->flag_private)
1056 fprintf (out, " PRIVATE");
1057 if (e->flag_constant)
1058 fprintf (out, " CONSTANT");
1059 if (e->flag_noname)
1060 fprintf (out, " NONAME");
1061 if (e->flag_data)
1062 fprintf (out, " DATA");
1064 fprintf (out, "\n");
1068 if (pe_def_file->num_imports > 0)
1070 fprintf (out, "\nIMPORTS\n\n");
1071 for (i = 0; i < pe_def_file->num_imports; i++)
1073 def_file_import *im = pe_def_file->imports + i;
1074 fprintf (out, " ");
1075 if (im->internal_name
1076 && (!im->name || strcmp (im->internal_name, im->name)))
1078 quoteput (im->internal_name, out, 0);
1079 fprintf (out, " = ");
1081 quoteput (im->module->name, out, 0);
1082 fprintf (out, ".");
1083 if (im->name)
1084 quoteput (im->name, out, 0);
1085 else
1086 fprintf (out, "%d", im->ordinal);
1087 fprintf (out, "\n");
1091 else
1092 fprintf (out, _("; no contents available\n"));
1094 if (fclose (out) == EOF)
1096 /* xgettext:c-format */
1097 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1101 /************************************************************************
1103 Generate the import library
1105 ************************************************************************/
1107 static asymbol **symtab;
1108 static int symptr;
1109 static int tmp_seq;
1110 static const char *dll_filename;
1111 static char *dll_symname;
1113 #define UNDSEC (asection *) &bfd_und_section
1115 static asection *
1116 quick_section (abfd, name, flags, align)
1117 bfd *abfd;
1118 const char *name;
1119 int flags;
1120 int align;
1122 asection *sec;
1123 asymbol *sym;
1125 sec = bfd_make_section_old_way (abfd, name);
1126 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1127 bfd_set_section_alignment (abfd, sec, align);
1128 /* Remember to undo this before trying to link internally! */
1129 sec->output_section = sec;
1131 sym = bfd_make_empty_symbol (abfd);
1132 symtab[symptr++] = sym;
1133 sym->name = sec->name;
1134 sym->section = sec;
1135 sym->flags = BSF_LOCAL;
1136 sym->value = 0;
1138 return sec;
1141 static void
1142 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1143 bfd *abfd;
1144 char *n1;
1145 char *n2;
1146 char *n3;
1147 asection *sec;
1148 int flags;
1149 int addr;
1151 asymbol *sym;
1152 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1153 strcpy (name, n1);
1154 strcat (name, n2);
1155 strcat (name, n3);
1156 sym = bfd_make_empty_symbol (abfd);
1157 sym->name = name;
1158 sym->section = sec;
1159 sym->flags = flags;
1160 sym->value = addr;
1161 symtab[symptr++] = sym;
1164 static arelent *reltab = 0;
1165 static int relcount = 0, relsize = 0;
1167 static void
1168 quick_reloc (abfd, address, which_howto, symidx)
1169 bfd *abfd;
1170 int address;
1171 int which_howto;
1172 int symidx;
1174 if (relcount >= (relsize - 1))
1176 relsize += 10;
1177 if (reltab)
1178 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1179 else
1180 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1182 reltab[relcount].address = address;
1183 reltab[relcount].addend = 0;
1184 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1185 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1186 relcount++;
1189 static void
1190 save_relocs (asection *sec)
1192 int i;
1193 sec->relocation = reltab;
1194 sec->reloc_count = relcount;
1195 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1196 for (i = 0; i < relcount; i++)
1197 sec->orelocation[i] = sec->relocation + i;
1198 sec->orelocation[relcount] = 0;
1199 sec->flags |= SEC_RELOC;
1200 reltab = 0;
1201 relcount = relsize = 0;
1205 * .section .idata$2
1206 * .global __head_my_dll
1207 * __head_my_dll:
1208 * .rva hname
1209 * .long 0
1210 * .long 0
1211 * .rva __my_dll_iname
1212 * .rva fthunk
1214 * .section .idata$5
1215 * .long 0
1216 * fthunk:
1218 * .section .idata$4
1219 * .long 0
1220 * hname:
1223 static bfd *
1224 make_head (parent)
1225 bfd *parent;
1227 asection *id2, *id5, *id4;
1228 unsigned char *d2, *d5, *d4;
1229 char *oname;
1230 bfd *abfd;
1232 oname = (char *) xmalloc (20);
1233 sprintf (oname, "d%06d.o", tmp_seq);
1234 tmp_seq++;
1236 abfd = bfd_create (oname, parent);
1237 bfd_find_target (pe_details->object_target, abfd);
1238 bfd_make_writable (abfd);
1240 bfd_set_format (abfd, bfd_object);
1241 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1243 symptr = 0;
1244 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1245 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1246 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1247 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1248 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1249 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1251 /* OK, pay attention here. I got confused myself looking back at
1252 it. We create a four-byte section to mark the beginning of the
1253 list, and we include an offset of 4 in the section, so that the
1254 pointer to the list points to the *end* of this section, which is
1255 the start of the list of sections from other objects. */
1257 bfd_set_section_size (abfd, id2, 20);
1258 d2 = (unsigned char *) xmalloc (20);
1259 id2->contents = d2;
1260 memset (d2, 0, 20);
1261 d2[0] = d2[16] = 4; /* reloc addend */
1262 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1263 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1264 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1265 save_relocs (id2);
1267 bfd_set_section_size (abfd, id5, 4);
1268 d5 = (unsigned char *) xmalloc (4);
1269 id5->contents = d5;
1270 memset (d5, 0, 4);
1272 bfd_set_section_size (abfd, id4, 4);
1273 d4 = (unsigned char *) xmalloc (4);
1274 id4->contents = d4;
1275 memset (d4, 0, 4);
1277 bfd_set_symtab (abfd, symtab, symptr);
1279 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1280 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1281 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1283 bfd_make_readable (abfd);
1284 return abfd;
1288 * .section .idata$4
1289 * .long 0
1290 * .section .idata$5
1291 * .long 0
1292 * .section idata$7
1293 * .global __my_dll_iname
1294 *__my_dll_iname:
1295 * .asciz "my.dll"
1298 static bfd *
1299 make_tail (parent)
1300 bfd *parent;
1302 asection *id4, *id5, *id7;
1303 unsigned char *d4, *d5, *d7;
1304 int len;
1305 char *oname;
1306 bfd *abfd;
1308 oname = (char *) xmalloc (20);
1309 sprintf (oname, "d%06d.o", tmp_seq);
1310 tmp_seq++;
1312 abfd = bfd_create (oname, parent);
1313 bfd_find_target (pe_details->object_target, abfd);
1314 bfd_make_writable (abfd);
1316 bfd_set_format (abfd, bfd_object);
1317 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1319 symptr = 0;
1320 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1321 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1322 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1323 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1324 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1326 bfd_set_section_size (abfd, id4, 4);
1327 d4 = (unsigned char *) xmalloc (4);
1328 id4->contents = d4;
1329 memset (d4, 0, 4);
1331 bfd_set_section_size (abfd, id5, 4);
1332 d5 = (unsigned char *) xmalloc (4);
1333 id5->contents = d5;
1334 memset (d5, 0, 4);
1336 len = strlen (dll_filename) + 1;
1337 if (len & 1)
1338 len++;
1339 bfd_set_section_size (abfd, id7, len);
1340 d7 = (unsigned char *) xmalloc (len);
1341 id7->contents = d7;
1342 strcpy (d7, dll_filename);
1344 bfd_set_symtab (abfd, symtab, symptr);
1346 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1347 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1348 bfd_set_section_contents (abfd, id7, d7, 0, len);
1350 bfd_make_readable (abfd);
1351 return abfd;
1355 * .text
1356 * .global _function
1357 * .global ___imp_function
1358 * .global __imp__function
1359 *_function:
1360 * jmp *__imp__function:
1362 * .section idata$7
1363 * .long __head_my_dll
1365 * .section .idata$5
1366 *___imp_function:
1367 *__imp__function:
1368 *iat?
1369 * .section .idata$4
1370 *iat?
1371 * .section .idata$6
1372 *ID<ordinal>:
1373 * .short <hint>
1374 * .asciz "function" xlate? (add underscore, kill at)
1377 static unsigned char jmp_ix86_bytes[] = {
1378 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1382 *_function:
1383 * mov.l ip+8,r0
1384 * mov.l @r0,r0
1385 * jmp @r0
1386 * nop
1387 * .dw __imp_function
1390 static unsigned char jmp_sh_bytes[] = {
1391 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1395 *_function:
1396 * lui $t0,<high:__imp_function>
1397 * lw $t0,<low:__imp_function>
1398 * jr $t0
1399 * nop
1402 static unsigned char jmp_mips_bytes[] = {
1403 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1404 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1407 static bfd *
1408 make_one (exp, parent)
1409 def_file_export *exp;
1410 bfd *parent;
1412 asection *tx, *id7, *id5, *id4, *id6;
1413 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1414 int len;
1415 char *oname;
1416 bfd *abfd;
1417 unsigned char *jmp_bytes = NULL;
1418 int jmp_byte_count = 0;
1420 switch (pe_details->pe_arch)
1422 case PE_ARCH_i386:
1423 jmp_bytes = jmp_ix86_bytes;
1424 jmp_byte_count = sizeof (jmp_ix86_bytes);
1425 break;
1426 case PE_ARCH_sh:
1427 jmp_bytes = jmp_sh_bytes;
1428 jmp_byte_count = sizeof (jmp_sh_bytes);
1429 break;
1430 case PE_ARCH_mips:
1431 jmp_bytes = jmp_mips_bytes;
1432 jmp_byte_count = sizeof (jmp_mips_bytes);
1433 break;
1436 oname = (char *) xmalloc (20);
1437 sprintf (oname, "d%06d.o", tmp_seq);
1438 tmp_seq++;
1440 abfd = bfd_create (oname, parent);
1441 bfd_find_target (pe_details->object_target, abfd);
1442 bfd_make_writable (abfd);
1444 bfd_set_format (abfd, bfd_object);
1445 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1447 symptr = 0;
1448 symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
1449 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1450 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1451 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1452 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1453 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1454 if (! exp->flag_data)
1455 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1456 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1457 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1458 if (pe_dll_compat_implib)
1459 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1460 id5, BSF_GLOBAL, 0);
1462 if (! exp->flag_data)
1464 bfd_set_section_size (abfd, tx, jmp_byte_count);
1465 td = (unsigned char *) xmalloc (jmp_byte_count);
1466 tx->contents = td;
1467 memcpy (td, jmp_bytes, jmp_byte_count);
1468 switch (pe_details->pe_arch)
1470 case PE_ARCH_i386:
1471 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1472 break;
1473 case PE_ARCH_sh:
1474 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1475 break;
1476 case PE_ARCH_mips:
1477 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1478 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1479 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1480 break;
1482 save_relocs (tx);
1485 bfd_set_section_size (abfd, id7, 4);
1486 d7 = (unsigned char *) xmalloc (4);
1487 id7->contents = d7;
1488 memset (d7, 0, 4);
1489 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1490 save_relocs (id7);
1492 bfd_set_section_size (abfd, id5, 4);
1493 d5 = (unsigned char *) xmalloc (4);
1494 id5->contents = d5;
1495 memset (d5, 0, 4);
1496 if (exp->flag_noname)
1498 d5[0] = exp->ordinal;
1499 d5[1] = exp->ordinal >> 8;
1500 d5[3] = 0x80;
1502 else
1504 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1505 save_relocs (id5);
1508 bfd_set_section_size (abfd, id4, 4);
1509 d4 = (unsigned char *) xmalloc (4);
1510 id4->contents = d4;
1511 memset (d4, 0, 4);
1512 if (exp->flag_noname)
1514 d4[0] = exp->ordinal;
1515 d4[1] = exp->ordinal >> 8;
1516 d4[3] = 0x80;
1518 else
1520 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1521 save_relocs (id4);
1524 if (exp->flag_noname)
1526 len = 0;
1527 bfd_set_section_size (abfd, id6, 0);
1529 else
1531 len = strlen (exp->name) + 3;
1532 if (len & 1)
1533 len++;
1534 bfd_set_section_size (abfd, id6, len);
1535 d6 = (unsigned char *) xmalloc (len);
1536 id6->contents = d6;
1537 memset (d6, 0, len);
1538 d6[0] = exp->hint & 0xff;
1539 d6[1] = exp->hint >> 8;
1540 strcpy (d6 + 2, exp->name);
1543 bfd_set_symtab (abfd, symtab, symptr);
1545 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1546 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1547 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1548 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1549 if (!exp->flag_noname)
1550 bfd_set_section_contents (abfd, id6, d6, 0, len);
1552 bfd_make_readable (abfd);
1553 return abfd;
1556 void
1557 pe_dll_generate_implib (def, impfilename)
1558 def_file *def;
1559 const char *impfilename;
1561 int i;
1562 bfd *ar_head;
1563 bfd *ar_tail;
1564 bfd *outarch;
1565 bfd *head = 0;
1567 dll_filename = (def->name) ? def->name : dll_name;
1568 dll_symname = xstrdup (dll_filename);
1569 for (i = 0; dll_symname[i]; i++)
1570 if (!isalnum ((unsigned char) dll_symname[i]))
1571 dll_symname[i] = '_';
1573 unlink (impfilename);
1575 outarch = bfd_openw (impfilename, 0);
1577 if (!outarch)
1579 /* xgettext:c-format */
1580 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1581 return;
1584 /* xgettext:c-format */
1585 einfo (_("Creating library file: %s\n"), impfilename);
1587 bfd_set_format (outarch, bfd_archive);
1588 outarch->has_armap = 1;
1590 /* Work out a reasonable size of things to put onto one line. */
1592 ar_head = make_head (outarch);
1594 for (i = 0; i < def->num_exports; i++)
1596 /* The import library doesn't know about the internal name. */
1597 char *internal = def->exports[i].internal_name;
1598 bfd *n;
1599 def->exports[i].internal_name = def->exports[i].name;
1600 n = make_one (def->exports + i, outarch);
1601 n->next = head;
1602 head = n;
1603 def->exports[i].internal_name = internal;
1606 ar_tail = make_tail (outarch);
1608 if (ar_head == NULL || ar_tail == NULL)
1609 return;
1611 /* Now stick them all into the archive. */
1613 ar_head->next = head;
1614 ar_tail->next = ar_head;
1615 head = ar_tail;
1617 if (! bfd_set_archive_head (outarch, head))
1618 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1620 if (! bfd_close (outarch))
1621 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1623 while (head != NULL)
1625 bfd *n = head->next;
1626 bfd_close (head);
1627 head = n;
1631 static void
1632 add_bfd_to_link (abfd, name, link_info)
1633 bfd *abfd;
1634 char *name;
1635 struct bfd_link_info *link_info;
1637 lang_input_statement_type *fake_file;
1638 fake_file = lang_add_input_file (name,
1639 lang_input_file_is_fake_enum,
1640 NULL);
1641 fake_file->the_bfd = abfd;
1642 ldlang_add_file (fake_file);
1643 if (!bfd_link_add_symbols (abfd, link_info))
1644 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
1647 void
1648 pe_process_import_defs (output_bfd, link_info)
1649 bfd *output_bfd;
1650 struct bfd_link_info *link_info;
1652 def_file_module *module;
1653 pe_dll_id_target (bfd_get_target (output_bfd));
1655 if (!pe_def_file)
1656 return;
1658 for (module = pe_def_file->modules; module; module = module->next)
1660 int i, do_this_dll;
1662 dll_filename = module->name;
1663 dll_symname = xstrdup (module->name);
1664 for (i = 0; dll_symname[i]; i++)
1665 if (!isalnum (dll_symname[i]))
1666 dll_symname[i] = '_';
1668 do_this_dll = 0;
1670 for (i = 0; i < pe_def_file->num_imports; i++)
1671 if (pe_def_file->imports[i].module == module)
1673 def_file_export exp;
1674 struct bfd_link_hash_entry *blhe;
1676 /* See if we need this import. */
1677 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
1678 sprintf (name, "%s%s", U (""), pe_def_file->imports[i].internal_name);
1679 blhe = bfd_link_hash_lookup (link_info->hash, name,
1680 false, false, false);
1681 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
1683 sprintf (name, "%s%s", U ("_imp__"),
1684 pe_def_file->imports[i].internal_name);
1685 blhe = bfd_link_hash_lookup (link_info->hash, name,
1686 false, false, false);
1688 free (name);
1689 if (blhe && blhe->type == bfd_link_hash_undefined)
1691 bfd *one;
1692 /* We do. */
1693 if (!do_this_dll)
1695 bfd *ar_head = make_head (output_bfd);
1696 add_bfd_to_link (ar_head, ar_head->filename, link_info);
1697 do_this_dll = 1;
1699 exp.internal_name = pe_def_file->imports[i].internal_name;
1700 exp.name = pe_def_file->imports[i].name;
1701 exp.ordinal = pe_def_file->imports[i].ordinal;
1702 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
1703 exp.flag_private = 0;
1704 exp.flag_constant = 0;
1705 exp.flag_data = 0;
1706 exp.flag_noname = exp.name ? 0 : 1;
1707 one = make_one (&exp, output_bfd);
1708 add_bfd_to_link (one, one->filename, link_info);
1711 if (do_this_dll)
1713 bfd *ar_tail = make_tail (output_bfd);
1714 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
1717 free (dll_symname);
1721 /************************************************************************
1723 We were handed a *.DLL file. Parse it and turn it into a set of
1724 IMPORTS directives in the def file. Return true if the file was
1725 handled, false if not.
1727 ************************************************************************/
1729 static unsigned int
1730 pe_get16 (abfd, where)
1731 bfd *abfd;
1732 int where;
1734 unsigned char b[2];
1735 bfd_seek (abfd, where, SEEK_SET);
1736 bfd_read (b, 1, 2, abfd);
1737 return b[0] + (b[1] << 8);
1740 static unsigned int
1741 pe_get32 (abfd, where)
1742 bfd *abfd;
1743 int where;
1745 unsigned char b[4];
1746 bfd_seek (abfd, where, SEEK_SET);
1747 bfd_read (b, 1, 4, abfd);
1748 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
1751 #if 0 /* This is not currently used. */
1753 static unsigned int
1754 pe_as16 (ptr)
1755 void *ptr;
1757 unsigned char *b = ptr;
1758 return b[0] + (b[1] << 8);
1761 #endif
1763 static unsigned int
1764 pe_as32 (ptr)
1765 void *ptr;
1767 unsigned char *b = ptr;
1768 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
1771 boolean
1772 pe_implied_import_dll (filename)
1773 const char *filename;
1775 bfd *dll;
1776 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
1777 unsigned long export_rva, export_size, nsections, secptr, expptr;
1778 unsigned char *expdata, *erva;
1779 unsigned long name_rvas, ordinals, nexp, ordbase;
1780 const char *dll_name;
1782 /* No, I can't use bfd here. kernel32.dll puts its export table in
1783 the middle of the .rdata section. */
1785 dll = bfd_openr (filename, pe_details->target_name);
1786 if (!dll)
1788 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
1789 return false;
1791 /* PEI dlls seem to be bfd_objects. */
1792 if (!bfd_check_format (dll, bfd_object))
1794 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
1795 return false;
1798 dll_name = filename;
1799 for (i = 0; filename[i]; i++)
1800 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
1801 dll_name = filename + i + 1;
1803 pe_header_offset = pe_get32 (dll, 0x3c);
1804 opthdr_ofs = pe_header_offset + 4 + 20;
1805 num_entries = pe_get32 (dll, opthdr_ofs + 92);
1806 if (num_entries < 1) /* no exports */
1807 return false;
1808 export_rva = pe_get32 (dll, opthdr_ofs + 96);
1809 export_size = pe_get32 (dll, opthdr_ofs + 100);
1810 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
1811 secptr = (pe_header_offset + 4 + 20 +
1812 pe_get16 (dll, pe_header_offset + 4 + 16));
1813 expptr = 0;
1814 for (i = 0; i < nsections; i++)
1816 char sname[8];
1817 unsigned long secptr1 = secptr + 40 * i;
1818 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
1819 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
1820 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
1821 bfd_seek (dll, secptr1, SEEK_SET);
1822 bfd_read (sname, 1, 8, dll);
1823 if (vaddr <= export_rva && vaddr + vsize > export_rva)
1825 expptr = fptr + (export_rva - vaddr);
1826 if (export_rva + export_size > vaddr + vsize)
1827 export_size = vsize - (export_rva - vaddr);
1828 break;
1832 expdata = (unsigned char *) xmalloc (export_size);
1833 bfd_seek (dll, expptr, SEEK_SET);
1834 bfd_read (expdata, 1, export_size, dll);
1835 erva = expdata - export_rva;
1837 if (pe_def_file == 0)
1838 pe_def_file = def_file_empty ();
1840 nexp = pe_as32 (expdata + 24);
1841 name_rvas = pe_as32 (expdata + 32);
1842 ordinals = pe_as32 (expdata + 36);
1843 ordbase = pe_as32 (expdata + 16);
1844 for (i = 0; i < nexp; i++)
1846 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
1847 def_file_import *imp;
1848 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
1849 i, 0);
1852 return true;
1855 /************************************************************************
1857 These are the main functions, called from the emulation. The first
1858 is called after the bfds are read, so we can guess at how much space
1859 we need. The second is called after everything is placed, so we
1860 can put the right values in place.
1862 ************************************************************************/
1864 void
1865 pe_dll_build_sections (abfd, info)
1866 bfd *abfd;
1867 struct bfd_link_info *info;
1869 pe_dll_id_target (bfd_get_target (abfd));
1870 process_def_file (abfd, info);
1872 generate_edata (abfd, info);
1873 build_filler_bfd (1);
1876 void
1877 pe_exe_build_sections (abfd, info)
1878 bfd *abfd;
1879 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1881 pe_dll_id_target (bfd_get_target (abfd));
1882 build_filler_bfd (0);
1885 void
1886 pe_dll_fill_sections (abfd, info)
1887 bfd *abfd;
1888 struct bfd_link_info *info;
1890 pe_dll_id_target (bfd_get_target (abfd));
1891 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1893 generate_reloc (abfd, info);
1894 if (reloc_sz > 0)
1896 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1898 /* Resize the sections. */
1899 lang_size_sections (stat_ptr->head, abs_output_section,
1900 &stat_ptr->head, 0, (bfd_vma) 0, false);
1902 /* Redo special stuff. */
1903 ldemul_after_allocation ();
1905 /* Do the assignments again. */
1906 lang_do_assignments (stat_ptr->head,
1907 abs_output_section,
1908 (fill_type) 0, (bfd_vma) 0);
1911 fill_edata (abfd, info);
1913 pe_data (abfd)->dll = 1;
1915 edata_s->contents = edata_d;
1916 reloc_s->contents = reloc_d;
1919 void
1920 pe_exe_fill_sections (abfd, info)
1921 bfd *abfd;
1922 struct bfd_link_info *info;
1924 pe_dll_id_target (bfd_get_target (abfd));
1925 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1927 generate_reloc (abfd, info);
1928 if (reloc_sz > 0)
1930 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1932 /* Resize the sections. */
1933 lang_size_sections (stat_ptr->head, abs_output_section,
1934 &stat_ptr->head, 0, (bfd_vma) 0, false);
1936 /* Redo special stuff. */
1937 ldemul_after_allocation ();
1939 /* Do the assignments again. */
1940 lang_do_assignments (stat_ptr->head,
1941 abs_output_section,
1942 (fill_type) 0, (bfd_vma) 0);
1944 reloc_s->contents = reloc_d;