1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 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)
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"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.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;
83 unsigned int imagebase_reloc;
89 #define PE_ARCH_i386 1
91 #define PE_ARCH_mips 3
94 static pe_details_type pe_detail_list[] = {
106 16 /* R_SH_IMAGEBASE */,
127 { NULL, NULL, 0, 0, 0, 0 }
130 static pe_details_type *pe_details;
132 #define U(str) (pe_details->underscored ? "_" str : str)
135 pe_dll_id_target (target)
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;
146 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
150 /************************************************************************
152 Helper functions for qsort. Relocs must be sorted so that we can write
155 ************************************************************************/
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);
173 pe_export_sort (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 {
204 struct exclude_list_struct *next;
205 } exclude_list_struct;
207 static struct exclude_list_struct *excludes = 0;
210 pe_dll_add_excludes (new_excludes)
211 const char *new_excludes;
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;
240 struct exclude_list_struct *ex;
241 for (i = 0; i < d->num_exports; i++)
242 if (strcmp (d->exports[i].name, n) == 0)
244 if (pe_dll_do_default_excludes)
246 if (strcmp (n, "DllMain@12") == 0)
248 if (strcmp (n, "DllEntryPoint@0") == 0)
250 if (strcmp (n, "impure_ptr") == 0)
253 for (ex = excludes; ex; ex = ex->next)
254 if (strcmp (n, ex->string) == 0)
260 process_def_file (abfd, info)
261 bfd *abfd ATTRIBUTE_UNUSED;
262 struct bfd_link_info *info;
265 struct bfd_link_hash_entry *blhe;
268 def_file_export *e = 0;
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");
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);
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)
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;
312 if (auto_export (pe_def_file, sn))
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);
325 #define NE pe_def_file->num_exports
327 /* Canonicalize the export list. */
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
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);
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 *));
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);
392 if (pe_dll_warn_dup_exports)
393 /* xgettext:c-format */
394 einfo (_("Warning, duplicate EXPORT: %s\n"),
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;
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)
419 strcpy (name + 1, pe_def_file->exports[i].internal_name);
422 strcpy (name, pe_def_file->exports[i].internal_name);
424 blhe = bfd_link_hash_lookup (info->hash,
429 && (blhe->type == bfd_link_hash_defined
430 || (blhe->type == bfd_link_hash_common)))
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
439 if (blhe->type == bfd_link_hash_defined)
440 exported_symbol_sections[i] = blhe->u.def.section;
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);
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);
468 /* xgettext:c-format */
469 einfo (_("%XCannot export %s: symbol not found\n"),
470 pe_def_file->exports[i].internal_name);
476 /************************************************************************
478 Build the bfd that will contain .edata and .reloc sections
480 ************************************************************************/
483 build_filler_bfd (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,
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");
502 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
504 || !bfd_set_section_flags (filler_bfd, edata_s,
511 einfo ("%X%P: can not create .edata section: %E\n");
514 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
517 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
519 || !bfd_set_section_flags (filler_bfd, reloc_s,
526 einfo ("%X%P: can not create .reloc section: %E\n");
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 ************************************************************************/
541 generate_edata (abfd, info)
543 struct bfd_link_info *info ATTRIBUTE_UNUSED;
546 int name_table_size = 0;
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;
558 dll_name = abfd->filename;
559 for (dlnp = dll_name; *dlnp; dlnp++)
561 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
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;
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];
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)
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(). */
629 fill_exported_offsets (abfd, info)
630 bfd *abfd ATTRIBUTE_UNUSED;
631 struct bfd_link_info *info;
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)
642 strcpy (name + 1, pe_def_file->exports[i].internal_name);
645 strcpy (name, pe_def_file->exports[i].internal_name);
647 blhe = bfd_link_hash_lookup (info->hash,
651 if (blhe && (blhe->type == bfd_link_hash_defined))
653 exported_symbol_offsets[i] = blhe->u.def.value;
660 fill_edata (abfd, info)
662 struct bfd_link_info *info ATTRIBUTE_UNUSED;
665 unsigned char *edirectory;
666 unsigned long *eaddresses;
667 unsigned long *enameptrs;
668 unsigned short *eordinals;
669 unsigned char *enamestr;
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. */
706 for (i = 0; i < export_table_size; i++)
708 int s = exported_symbols[i];
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);
724 strcpy (enamestr, ename);
725 enamestr += strlen (enamestr) + 1;
726 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
728 pe_def_file->exports[s].hint = hint++;
734 /************************************************************************
736 Gather all the relocations and build the .reloc section
738 ************************************************************************/
741 generate_reloc (abfd, info)
743 struct bfd_link_info *info;
746 /* For .reloc stuff. */
747 reloc_data_type *reloc_data;
748 int total_relocs = 0;
750 unsigned long sec_page = (unsigned long) (-1);
751 unsigned long page_ptr, page_count;
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));
765 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
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;
776 /* If it's not loaded, we don't need to relocate it this way. */
777 if (!(s->output_section->flags & SEC_LOAD))
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)
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);
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)
808 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
809 sym_vma = (relocs[i]->addend
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;
825 case BITS_AND_SHIFT (16, 0):
826 reloc_data[total_relocs].type = 2;
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
835 reloc_data[total_relocs].extra = 0;
838 case BITS_AND_SHIFT (26, 2):
839 reloc_data[total_relocs].type = 5;
843 /* xgettext:c-format */
844 einfo (_("%XError: %d-bit reloc in dll\n"),
845 relocs[i]->howto->bitsize);
851 /* Warning: the allocated symbols are remembered in BFD and
852 reused later, so don't free them! */
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 */
873 sec_page = this_page;
878 if (reloc_data[i].type == 4)
881 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
883 reloc_d = (unsigned char *) xmalloc (reloc_sz);
885 sec_page = (unsigned long) (-1);
887 page_ptr = (unsigned long) (-1);
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)
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);
902 sec_page = this_page;
905 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
908 if (reloc_data[i].type == 4)
910 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
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
928 ************************************************************************/
931 quoteput (s, f, needs_quotes)
937 for (cp = s; *cp; cp++)
941 || isspace ((unsigned char) *cp)
950 if (*s == '"' || *s == '\\')
962 pe_dll_generate_def_file (pe_out_def_filename)
963 const char *pe_out_def_filename;
966 FILE *out = fopen (pe_out_def_filename, "w");
969 /* xgettext:c-format */
970 einfo (_("%s: Can't open output def file %s\n"),
971 program_name, pe_out_def_filename);
976 if (pe_def_file->name)
978 if (pe_def_file->is_dll)
979 fprintf (out, "LIBRARY ");
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);
989 if (pe_def_file->description)
991 fprintf (out, "DESCRIPTION ");
992 quoteput (pe_def_file->description, out, 1);
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++)
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;
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");
1060 fprintf (out, " NONAME");
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;
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);
1084 quoteput (im->name, out, 0);
1086 fprintf (out, "%d", im->ordinal);
1087 fprintf (out, "\n");
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;
1110 static const char *dll_filename;
1111 static char *dll_symname;
1113 #define UNDSEC (asection *) &bfd_und_section
1116 quick_section (abfd, name, flags, align)
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;
1135 sym->flags = BSF_LOCAL;
1142 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1152 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1156 sym = bfd_make_empty_symbol (abfd);
1161 symtab[symptr++] = sym;
1164 static arelent *reltab = 0;
1165 static int relcount = 0, relsize = 0;
1168 quick_reloc (abfd, address, which_howto, symidx)
1174 if (relcount >= (relsize - 1))
1178 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
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;
1190 save_relocs (asection *sec)
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;
1201 relcount = relsize = 0;
1206 * .global __head_my_dll
1211 * .rva __my_dll_iname
1227 asection *id2, *id5, *id4;
1228 unsigned char *d2, *d5, *d4;
1232 oname = (char *) xmalloc (20);
1233 sprintf (oname, "d%06d.o", 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);
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);
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);
1267 bfd_set_section_size (abfd, id5, 4);
1268 d5 = (unsigned char *) xmalloc (4);
1272 bfd_set_section_size (abfd, id4, 4);
1273 d4 = (unsigned char *) xmalloc (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);
1293 * .global __my_dll_iname
1302 asection *id4, *id5, *id7;
1303 unsigned char *d4, *d5, *d7;
1308 oname = (char *) xmalloc (20);
1309 sprintf (oname, "d%06d.o", 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);
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);
1331 bfd_set_section_size (abfd, id5, 4);
1332 d5 = (unsigned char *) xmalloc (4);
1336 len = strlen (dll_filename) + 1;
1339 bfd_set_section_size (abfd, id7, len);
1340 d7 = (unsigned char *) xmalloc (len);
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);
1357 * .global ___imp_function
1358 * .global __imp__function
1360 * jmp *__imp__function:
1363 * .long __head_my_dll
1374 * .asciz "function" xlate? (add underscore, kill at)
1377 static unsigned char jmp_ix86_bytes[] = {
1378 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1387 * .dw __imp_function
1390 static unsigned char jmp_sh_bytes[] = {
1391 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1396 * lui $t0,<high:__imp_function>
1397 * lw $t0,<low:__imp_function>
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
1408 make_one (exp, parent)
1409 def_file_export *exp;
1412 asection *tx, *id7, *id5, *id4, *id6;
1413 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1417 unsigned char *jmp_bytes = NULL;
1418 int jmp_byte_count = 0;
1420 switch (pe_details->pe_arch)
1423 jmp_bytes = jmp_ix86_bytes;
1424 jmp_byte_count = sizeof (jmp_ix86_bytes);
1427 jmp_bytes = jmp_sh_bytes;
1428 jmp_byte_count = sizeof (jmp_sh_bytes);
1431 jmp_bytes = jmp_mips_bytes;
1432 jmp_byte_count = sizeof (jmp_mips_bytes);
1436 oname = (char *) xmalloc (20);
1437 sprintf (oname, "d%06d.o", 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);
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);
1467 memcpy (td, jmp_bytes, jmp_byte_count);
1468 switch (pe_details->pe_arch)
1471 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1474 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
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);
1485 bfd_set_section_size (abfd, id7, 4);
1486 d7 = (unsigned char *) xmalloc (4);
1489 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1492 bfd_set_section_size (abfd, id5, 4);
1493 d5 = (unsigned char *) xmalloc (4);
1496 if (exp->flag_noname)
1498 d5[0] = exp->ordinal;
1499 d5[1] = exp->ordinal >> 8;
1504 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1508 bfd_set_section_size (abfd, id4, 4);
1509 d4 = (unsigned char *) xmalloc (4);
1512 if (exp->flag_noname)
1514 d4[0] = exp->ordinal;
1515 d4[1] = exp->ordinal >> 8;
1520 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1524 if (exp->flag_noname)
1527 bfd_set_section_size (abfd, id6, 0);
1531 len = strlen (exp->name) + 3;
1534 bfd_set_section_size (abfd, id6, len);
1535 d6 = (unsigned char *) xmalloc (len);
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);
1557 pe_dll_generate_implib (def, impfilename)
1559 const char *impfilename;
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);
1579 /* xgettext:c-format */
1580 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
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;
1599 def->exports[i].internal_name = def->exports[i].name;
1600 n = make_one (def->exports + i, outarch);
1603 def->exports[i].internal_name = internal;
1606 ar_tail = make_tail (outarch);
1608 if (ar_head == NULL || ar_tail == NULL)
1611 /* Now stick them all into the archive. */
1613 ar_head->next = head;
1614 ar_tail->next = ar_head;
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;
1632 add_bfd_to_link (abfd, name, link_info)
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,
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 ()));
1648 pe_process_import_defs (output_bfd, link_info)
1650 struct bfd_link_info *link_info;
1652 def_file_module *module;
1653 pe_dll_id_target (bfd_get_target (output_bfd));
1658 for (module = pe_def_file->modules; module; module = module->next)
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] = '_';
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);
1689 if (blhe && blhe->type == bfd_link_hash_undefined)
1695 bfd *ar_head = make_head (output_bfd);
1696 add_bfd_to_link (ar_head, ar_head->filename, link_info);
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;
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);
1713 bfd *ar_tail = make_tail (output_bfd);
1714 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
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 ************************************************************************/
1730 pe_get16 (abfd, where)
1735 bfd_seek (abfd, where, SEEK_SET);
1736 bfd_read (b, 1, 2, abfd);
1737 return b[0] + (b[1] << 8);
1741 pe_get32 (abfd, where)
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. */
1757 unsigned char *b = ptr;
1758 return b[0] + (b[1] << 8);
1767 unsigned char *b = ptr;
1768 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
1772 pe_implied_import_dll (filename)
1773 const char *filename;
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);
1788 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
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);
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 */
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));
1814 for (i = 0; i < nsections; i++)
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);
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,
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 ************************************************************************/
1865 pe_dll_build_sections (abfd, info)
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);
1877 pe_exe_build_sections (abfd, info)
1879 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1881 pe_dll_id_target (bfd_get_target (abfd));
1882 build_filler_bfd (0);
1886 pe_dll_fill_sections (abfd, info)
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);
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,
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;
1920 pe_exe_fill_sections (abfd, info)
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);
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,
1942 (fill_type) 0, (bfd_vma) 0);
1944 reloc_s->contents = reloc_d;