1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998, 1999 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"
38 #include "coff/internal.h"
39 #include "../bfd/libcoff.h"
43 /************************************************************************
45 This file turns a regular Windows PE image into a DLL. Because of
46 the complexity of this operation, it has been broken down into a
47 number of separate modules which are all called by the main function
48 at the end of this file. This function is not re-entrant and is
49 normally only called once, so static variables are used to reduce
50 the number of parameters and return values required.
52 See also: ld/emultempl/pe.em
54 ************************************************************************/
56 /* for emultempl/pe.em */
58 def_file *pe_def_file = 0;
59 int pe_dll_export_everything = 0;
60 int pe_dll_do_default_excludes = 1;
61 int pe_dll_kill_ats = 0;
62 int pe_dll_stdcall_aliases = 0;
64 /************************************************************************
66 static variables and types
68 ************************************************************************/
70 static bfd_vma image_base;
72 static bfd *filler_bfd;
73 static struct sec *edata_s, *reloc_s;
74 static unsigned char *edata_d, *reloc_d;
75 static size_t edata_sz, reloc_sz;
80 unsigned int imagebase_reloc;
86 #define PE_ARCH_i386 1
88 static pe_details_type pe_detail_list[] = {
97 { NULL, NULL, 0, 0, 0, 0 }
100 static pe_details_type *pe_details;
102 #define U(str) (pe_details->underscored ? "_" str : str)
105 pe_dll_id_target (target)
109 for (i=0; pe_detail_list[i].target_name; i++)
110 if (strcmp (pe_detail_list[i].target_name, target) == 0)
112 pe_details = pe_detail_list+i;
115 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
119 /************************************************************************
121 Helper functions for qsort. Relocs must be sorted so that we can write
124 ************************************************************************/
136 bfd_vma a = ((reloc_data_type *) va)->vma;
137 bfd_vma b = ((reloc_data_type *) vb)->vma;
138 return (a > b) ? 1 : ((a < b) ? -1 : 0);
142 pe_export_sort (va, vb)
145 def_file_export *a = (def_file_export *) va;
146 def_file_export *b = (def_file_export *) vb;
147 return strcmp (a->name, b->name);
150 /************************************************************************
152 Read and process the .DEF file
154 ************************************************************************/
156 /* These correspond to the entries in pe_def_file->exports[]. I use
157 exported_symbol_sections[i] to tag whether or not the symbol was
158 defined, since we can't export symbols we don't have. */
160 static bfd_vma *exported_symbol_offsets;
161 static struct sec **exported_symbol_sections;
163 static int export_table_size;
164 static int count_exported;
165 static int count_exported_byname;
166 static int count_with_ordinals;
167 static const char *dll_name;
168 static int min_ordinal, max_ordinal;
169 static int *exported_symbols;
171 typedef struct exclude_list_struct
174 struct exclude_list_struct *next;
177 static struct exclude_list_struct *excludes = 0;
180 pe_dll_add_excludes (new_excludes)
181 const char *new_excludes;
184 char *exclude_string;
186 local_copy = xstrdup (new_excludes);
188 exclude_string = strtok (local_copy, ",:");
189 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
191 struct exclude_list_struct *new_exclude;
193 new_exclude = ((struct exclude_list_struct *)
194 xmalloc (sizeof (struct exclude_list_struct)));
195 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
196 strcpy (new_exclude->string, exclude_string);
197 new_exclude->next = excludes;
198 excludes = new_exclude;
210 struct exclude_list_struct *ex;
211 for (i = 0; i < d->num_exports; i++)
212 if (strcmp (d->exports[i].name, n) == 0)
214 if (pe_dll_do_default_excludes)
216 if (strcmp (n, "DllMain@12") == 0)
218 if (strcmp (n, "DllEntryPoint@0") == 0)
220 if (strcmp (n, "impure_ptr") == 0)
223 for (ex = excludes; ex; ex = ex->next)
224 if (strcmp (n, ex->string) == 0)
230 process_def_file (abfd, info)
231 bfd *abfd ATTRIBUTE_UNUSED;
232 struct bfd_link_info *info;
235 struct bfd_link_hash_entry *blhe;
238 def_file_export *e=0;
241 pe_def_file = def_file_empty ();
243 /* First, run around to all the objects looking for the .drectve
244 sections, and push those into the def file too */
246 for (b = info->input_bfds; b; b = b->link_next)
248 s = bfd_get_section_by_name (b, ".drectve");
251 int size = bfd_get_section_size_before_reloc (s);
252 char *buf = xmalloc (size);
253 bfd_get_section_contents (b, s, buf, 0, size);
254 def_file_add_directive (pe_def_file, buf, size);
259 /* Now, maybe export everything else the default way */
261 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
263 for (b = info->input_bfds; b; b = b->link_next)
268 symsize = bfd_get_symtab_upper_bound (b);
269 symbols = (asymbol **) xmalloc (symsize);
270 nsyms = bfd_canonicalize_symtab (b, symbols);
272 for (j = 0; j < nsyms; j++)
274 if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
275 == (BSF_FUNCTION | BSF_GLOBAL))
277 const char *sn = symbols[j]->name;
280 if (auto_export (pe_def_file, sn))
281 def_file_add_export (pe_def_file, sn, 0, -1);
288 #define NE pe_def_file->num_exports
290 /* Canonicalize the export list */
294 for (i = 0; i < NE; i++)
296 if (strchr (pe_def_file->exports[i].name, '@'))
298 /* This will preserve internal_name, which may have been pointing
299 to the same memory as name, or might not have */
300 char *tmp = xstrdup (pe_def_file->exports[i].name);
301 *(strchr (tmp, '@')) = 0;
302 pe_def_file->exports[i].name = tmp;
307 if (pe_dll_stdcall_aliases)
309 for (i = 0; i < NE; i++)
311 if (strchr (pe_def_file->exports[i].name, '@'))
313 char *tmp = xstrdup (pe_def_file->exports[i].name);
314 *(strchr (tmp, '@')) = 0;
315 if (auto_export (pe_def_file, tmp))
316 def_file_add_export (pe_def_file, tmp,
317 pe_def_file->exports[i].internal_name, -1);
324 e = pe_def_file->exports; /* convenience, but watch out for it changing */
326 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
327 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
329 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
333 count_exported_byname = 0;
334 count_with_ordinals = 0;
336 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
337 for (i = 0, j = 0; i < NE; i++)
339 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
341 /* This is a duplicate */
342 if (e[j - 1].ordinal != -1
343 && e[i].ordinal != -1
344 && e[j - 1].ordinal != e[i].ordinal)
346 /* xgettext:c-format */
347 einfo (_("%XError, duplicate EXPORT with oridinals: %s (%d vs %d)\n"),
348 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
352 /* xgettext:c-format */
353 einfo (_("Warning, duplicate EXPORT: %s\n"),
357 e[j - 1].ordinal = e[i].ordinal;
358 e[j - 1].flag_private |= e[i].flag_private;
359 e[j - 1].flag_constant |= e[i].flag_constant;
360 e[j - 1].flag_noname |= e[i].flag_noname;
361 e[j - 1].flag_data |= e[i].flag_data;
370 pe_def_file->num_exports = j; /* == NE */
372 for (i = 0; i < NE; i++)
374 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
375 if (pe_details->underscored)
378 strcpy (name + 1, pe_def_file->exports[i].internal_name);
381 strcpy (name, pe_def_file->exports[i].internal_name);
383 blhe = bfd_link_hash_lookup (info->hash,
387 if (blhe && (blhe->type == bfd_link_hash_defined))
390 if (!pe_def_file->exports[i].flag_noname)
391 count_exported_byname++;
392 exported_symbol_offsets[i] = blhe->u.def.value;
393 exported_symbol_sections[i] = blhe->u.def.section;
394 if (pe_def_file->exports[i].ordinal != -1)
396 if (max_ordinal < pe_def_file->exports[i].ordinal)
397 max_ordinal = pe_def_file->exports[i].ordinal;
398 if (min_ordinal > pe_def_file->exports[i].ordinal)
399 min_ordinal = pe_def_file->exports[i].ordinal;
400 count_with_ordinals++;
403 else if (blhe && blhe->type == bfd_link_hash_undefined)
405 /* xgettext:c-format */
406 einfo (_("%XCannot export %s: symbol not defined\n"),
407 pe_def_file->exports[i].internal_name);
411 /* xgettext:c-format */
412 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
413 pe_def_file->exports[i].internal_name,
414 blhe->type, bfd_link_hash_defined);
418 /* xgettext:c-format */
419 einfo (_("%XCannot export %s: symbol not found\n"),
420 pe_def_file->exports[i].internal_name);
426 /************************************************************************
428 Build the bfd that will contain .edata and .reloc sections
430 ************************************************************************/
433 build_filler_bfd (include_edata)
436 lang_input_statement_type *filler_file;
437 filler_file = lang_add_input_file ("dll stuff",
438 lang_input_file_is_fake_enum,
440 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
441 if (filler_bfd == NULL
442 || !bfd_set_arch_mach (filler_bfd,
443 bfd_get_arch (output_bfd),
444 bfd_get_mach (output_bfd)))
446 einfo ("%X%P: can not create BFD %E\n");
452 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
454 || !bfd_set_section_flags (filler_bfd, edata_s,
461 einfo ("%X%P: can not create .edata section: %E\n");
464 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
467 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
469 || !bfd_set_section_flags (filler_bfd, reloc_s,
476 einfo ("%X%P: can not create .reloc section: %E\n");
479 bfd_set_section_size (filler_bfd, reloc_s, 0);
481 ldlang_add_file (filler_file);
484 /************************************************************************
486 Gather all the exported symbols and build the .edata section
488 ************************************************************************/
491 generate_edata (abfd, info)
493 struct bfd_link_info *info ATTRIBUTE_UNUSED;
496 int name_table_size = 0;
499 /* First, we need to know how many exported symbols there are,
500 and what the range of ordinals is. */
502 if (pe_def_file->name)
504 dll_name = pe_def_file->name;
508 dll_name = abfd->filename;
509 for (dlnp = dll_name; *dlnp; dlnp++)
511 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
516 if (count_with_ordinals && max_ordinal > count_exported)
518 if (min_ordinal > max_ordinal - count_exported + 1)
519 min_ordinal = max_ordinal - count_exported + 1;
524 max_ordinal = count_exported;
526 export_table_size = max_ordinal - min_ordinal + 1;
528 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
529 for (i = 0; i < export_table_size; i++)
530 exported_symbols[i] = -1;
532 /* Now we need to assign ordinals to those that don't have them */
533 for (i = 0; i < NE; i++)
535 if (exported_symbol_sections[i])
537 if (pe_def_file->exports[i].ordinal != -1)
539 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
540 int pi = exported_symbols[ei];
543 /* xgettext:c-format */
544 einfo (_("%XError, oridinal used twice: %d (%s vs %s)\n"),
545 pe_def_file->exports[i].ordinal,
546 pe_def_file->exports[i].name,
547 pe_def_file->exports[pi].name);
549 exported_symbols[ei] = i;
551 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
555 next_ordinal = min_ordinal;
556 for (i = 0; i < NE; i++)
557 if (exported_symbol_sections[i])
558 if (pe_def_file->exports[i].ordinal == -1)
560 while (exported_symbols[next_ordinal - min_ordinal] != -1)
562 exported_symbols[next_ordinal - min_ordinal] = i;
563 pe_def_file->exports[i].ordinal = next_ordinal;
566 /* OK, now we can allocate some memory */
568 edata_sz = (40 /* directory */
569 + 4 * export_table_size /* addresses */
570 + 4 * count_exported_byname /* name ptrs */
571 + 2 * count_exported_byname /* ordinals */
572 + name_table_size + strlen (dll_name) + 1);
576 fill_edata (abfd, info)
578 struct bfd_link_info *info ATTRIBUTE_UNUSED;
581 unsigned char *edirectory;
582 unsigned long *eaddresses;
583 unsigned long *enameptrs;
584 unsigned short *eordinals;
585 unsigned char *enamestr;
590 edata_d = (unsigned char *) xmalloc (edata_sz);
592 /* Note use of array pointer math here */
593 edirectory = edata_d;
594 eaddresses = (unsigned long *) (edata_d + 40);
595 enameptrs = eaddresses + export_table_size;
596 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
597 enamestr = (char *) (eordinals + count_exported_byname);
599 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
601 memset (edata_d, 0, 40);
602 bfd_put_32 (abfd, now, edata_d + 4);
603 if (pe_def_file->version_major != -1)
605 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
606 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
608 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
609 strcpy (enamestr, dll_name);
610 enamestr += strlen (enamestr) + 1;
611 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
612 bfd_put_32 (abfd, export_table_size, edata_d + 20);
613 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
614 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
615 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
616 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
618 /* Ok, now for the filling in part */
620 for (i = 0; i < export_table_size; i++)
622 int s = exported_symbols[i];
625 struct sec *ssec = exported_symbol_sections[s];
626 unsigned long srva = (exported_symbol_offsets[s]
627 + ssec->output_section->vma
628 + ssec->output_offset);
630 bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
631 if (!pe_def_file->exports[s].flag_noname)
633 char *ename = pe_def_file->exports[s].name;
634 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
635 strcpy (enamestr, ename);
636 enamestr += strlen (enamestr) + 1;
637 bfd_put_16 (abfd, i, (void *) eordinals);
639 pe_def_file->exports[s].hint = hint++;
646 /************************************************************************
648 Gather all the relocations and build the .reloc section
650 ************************************************************************/
653 generate_reloc (abfd, info)
655 struct bfd_link_info *info;
658 /* for .reloc stuff */
659 reloc_data_type *reloc_data;
660 int total_relocs = 0;
662 unsigned long sec_page = (unsigned long) (-1);
663 unsigned long page_ptr, page_count;
669 for (b = info->input_bfds; b; b = b->link_next)
670 for (s = b->sections; s; s = s->next)
671 total_relocs += s->reloc_count;
673 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
677 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
680 int relsize, nrelocs, i;
682 for (s = b->sections; s; s = s->next)
684 unsigned long sec_vma = s->output_section->vma + s->output_offset;
688 /* if it's not loaded, we don't need to relocate it this way */
689 if (!(s->output_section->flags & SEC_LOAD))
692 /* I don't know why there would be a reloc for these, but I've
693 seen it happen - DJ */
694 if (s->output_section == &bfd_abs_section)
697 if (s->output_section->vma == 0)
699 /* Huh? Shouldn't happen, but punt if it does */
700 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
701 s->output_section->name, s->output_section->index,
702 s->output_section->flags);
706 symsize = bfd_get_symtab_upper_bound (b);
707 symbols = (asymbol **) xmalloc (symsize);
708 nsyms = bfd_canonicalize_symtab (b, symbols);
710 relsize = bfd_get_reloc_upper_bound (b, s);
711 relocs = (arelent **) xmalloc ((size_t) relsize);
712 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
714 for (i = 0; i < nrelocs; i++)
716 if (!relocs[i]->howto->pc_relative
717 && relocs[i]->howto->type != pe_details->imagebase_reloc)
720 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
721 sym_vma = (relocs[i]->addend
724 + sym->section->output_offset
725 + sym->section->output_section->vma);
726 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
727 switch (relocs[i]->howto->bitsize*1000
728 + relocs[i]->howto->rightshift)
731 reloc_data[total_relocs].type = 3;
735 /* xgettext:c-format */
736 einfo (_("%XError: %d-bit reloc in dll\n"),
737 relocs[i]->howto->bitsize);
743 /* Warning: the allocated symbols are remembered in BFD and reused
744 later, so don't free them! */
745 /* free (symbols); */
749 /* At this point, we have total_relocs relocation addresses in
750 reloc_addresses, which are all suitable for the .reloc section.
751 We must now create the new sections. */
753 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
755 for (i = 0; i < total_relocs; i++)
757 unsigned long this_page = (reloc_data[i].vma >> 12);
758 if (this_page != sec_page)
760 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
762 sec_page = this_page;
766 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
768 reloc_d = (unsigned char *) xmalloc (reloc_sz);
770 sec_page = (unsigned long) (-1);
772 page_ptr = (unsigned long) (-1);
774 for (i = 0; i < total_relocs; i++)
776 unsigned long rva = reloc_data[i].vma - image_base;
777 unsigned long this_page = (rva & ~0xfff);
778 if (this_page != sec_page)
781 reloc_d[reloc_sz++] = 0;
782 if (page_ptr != (unsigned long) (-1))
783 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
784 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
787 sec_page = this_page;
790 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type<<12),
793 if (reloc_data[i].type == 4)
795 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
801 reloc_d[reloc_sz++] = 0;
802 if (page_ptr != (unsigned long) (-1))
803 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
804 while (reloc_sz < reloc_s->_raw_size)
805 reloc_d[reloc_sz++] = 0;
808 /************************************************************************
810 Given the exiting def_file structure, print out a .DEF file that
813 ************************************************************************/
816 quoteput (s, f, needs_quotes)
822 for (cp = s; *cp; cp++)
826 || isspace ((unsigned char) *cp)
835 if (*s == '"' || *s == '\\')
847 pe_dll_generate_def_file (pe_out_def_filename)
848 const char *pe_out_def_filename;
851 FILE *out = fopen (pe_out_def_filename, "w");
854 /* xgettext:c-format */
855 einfo (_("%s: Can't open output def file %s\n"),
856 program_name, pe_out_def_filename);
861 if (pe_def_file->name)
863 if (pe_def_file->is_dll)
864 fprintf (out, "LIBRARY ");
866 fprintf (out, "NAME ");
867 quoteput (pe_def_file->name, out, 1);
868 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
869 fprintf (out, " BASE=0x%lx",
870 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
874 if (pe_def_file->description)
876 fprintf (out, "DESCRIPTION ");
877 quoteput (pe_def_file->description, out, 1);
881 if (pe_def_file->version_minor != -1)
882 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
883 pe_def_file->version_minor);
884 else if (pe_def_file->version_major != -1)
885 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
887 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
890 if (pe_def_file->stack_commit != -1)
891 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
892 pe_def_file->stack_reserve, pe_def_file->stack_commit);
893 else if (pe_def_file->stack_reserve != -1)
894 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
895 if (pe_def_file->heap_commit != -1)
896 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
897 pe_def_file->heap_reserve, pe_def_file->heap_commit);
898 else if (pe_def_file->heap_reserve != -1)
899 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
901 if (pe_def_file->num_section_defs > 0)
903 fprintf (out, "\nSECTIONS\n\n");
904 for (i = 0; i < pe_def_file->num_section_defs; i++)
907 quoteput (pe_def_file->section_defs[i].name, out, 0);
908 if (pe_def_file->section_defs[i].class)
910 fprintf (out, " CLASS ");
911 quoteput (pe_def_file->section_defs[i].class, out, 0);
913 if (pe_def_file->section_defs[i].flag_read)
914 fprintf (out, " READ");
915 if (pe_def_file->section_defs[i].flag_write)
916 fprintf (out, " WRITE");
917 if (pe_def_file->section_defs[i].flag_execute)
918 fprintf (out, " EXECUTE");
919 if (pe_def_file->section_defs[i].flag_shared)
920 fprintf (out, " SHARED");
925 if (pe_def_file->num_exports > 0)
927 fprintf (out, "\nEXPORTS\n\n");
928 for (i = 0; i < pe_def_file->num_exports; i++)
930 def_file_export *e = pe_def_file->exports + i;
932 quoteput (e->name, out, 0);
933 if (e->internal_name && strcmp (e->internal_name, e->name))
935 fprintf (out, " = ");
936 quoteput (e->internal_name, out, 0);
938 if (e->ordinal != -1)
939 fprintf (out, " @%d", e->ordinal);
941 fprintf (out, " PRIVATE");
942 if (e->flag_constant)
943 fprintf (out, " CONSTANT");
945 fprintf (out, " NONAME");
947 fprintf (out, " DATA");
953 if (pe_def_file->num_imports > 0)
955 fprintf (out, "\nIMPORTS\n\n");
956 for (i = 0; i < pe_def_file->num_imports; i++)
958 def_file_import *im = pe_def_file->imports + i;
960 if (im->internal_name
961 && (!im->name || strcmp (im->internal_name, im->name)))
963 quoteput (im->internal_name, out, 0);
964 fprintf (out, " = ");
966 quoteput (im->module->name, out, 0);
969 quoteput (im->name, out, 0);
971 fprintf (out, "%d", im->ordinal);
977 fprintf (out, _("; no contents available\n"));
979 if (fclose (out) == EOF)
981 /* xgettext:c-format */
982 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
986 /************************************************************************
988 Generate the import library
990 ************************************************************************/
992 static asymbol **symtab;
995 static const char *dll_filename;
996 static char *dll_symname;
998 #define UNDSEC (asection *) &bfd_und_section
1001 quick_section(abfd, name, flags, align)
1010 sec = bfd_make_section_old_way (abfd, name);
1011 bfd_set_section_flags (abfd, sec, flags
1016 bfd_set_section_alignment (abfd, sec, align);
1017 /* remember to undo this before trying to link internally! */
1018 sec->output_section = sec;
1020 sym = bfd_make_empty_symbol (abfd);
1021 symtab[symptr++] = sym;
1022 sym->name = sec->name;
1024 sym->flags = BSF_LOCAL;
1031 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1041 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1045 sym = bfd_make_empty_symbol (abfd);
1050 symtab[symptr++] = sym;
1053 static arelent *reltab = 0;
1054 static int relcount = 0, relsize = 0;
1057 quick_reloc (abfd, address, which_howto, symidx)
1063 if (relcount >= (relsize-1))
1067 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1069 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1071 reltab[relcount].address = address;
1072 reltab[relcount].addend = 0;
1073 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1074 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1079 save_relocs (asection *sec)
1082 sec->relocation = reltab;
1083 sec->reloc_count = relcount;
1084 sec->orelocation = (arelent **) xmalloc ((relcount+1) * sizeof (arelent *));
1085 for (i=0; i<relcount; i++)
1086 sec->orelocation[i] = sec->relocation + i;
1087 sec->orelocation[relcount] = 0;
1088 sec->flags |= SEC_RELOC;
1090 relcount = relsize = 0;
1095 * .global __head_my_dll
1100 * .rva __my_dll_iname
1116 asection *id2, *id5, *id4;
1117 unsigned char *d2, *d5, *d4;
1121 oname = (char *) xmalloc (20);
1122 sprintf (oname, "d%06d.o", tmp_seq);
1125 abfd = bfd_create (oname, parent);
1126 bfd_find_target (pe_details->object_target, abfd);
1127 bfd_make_writable (abfd);
1129 bfd_set_format (abfd, bfd_object);
1130 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1133 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1134 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1135 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1136 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1137 quick_symbol (abfd, U("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1138 quick_symbol (abfd, U(""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1140 /* OK, pay attention here. I got confused myself looking back at
1141 it. We create a four-byte section to mark the beginning of the
1142 list, and we include an offset of 4 in the section, so that the
1143 pointer to the list points to the *end* of this section, which is
1144 the start of the list of sections from other objects. */
1146 bfd_set_section_size (abfd, id2, 20);
1147 d2 = (unsigned char *) xmalloc (20);
1150 d2[0] = d2[16] = 4; /* reloc addend */
1151 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1152 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1153 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1156 bfd_set_section_size (abfd, id5, 4);
1157 d5 = (unsigned char *) xmalloc (4);
1161 bfd_set_section_size (abfd, id4, 4);
1162 d4 = (unsigned char *) xmalloc (4);
1166 bfd_set_symtab (abfd, symtab, symptr);
1168 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1169 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1170 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1172 bfd_make_readable (abfd);
1182 * .global __my_dll_iname
1191 asection *id4, *id5, *id7;
1192 unsigned char *d4, *d5, *d7;
1197 oname = (char *) xmalloc (20);
1198 sprintf (oname, "d%06d.o", tmp_seq);
1201 abfd = bfd_create (oname, parent);
1202 bfd_find_target (pe_details->object_target, abfd);
1203 bfd_make_writable (abfd);
1205 bfd_set_format (abfd, bfd_object);
1206 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1209 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1210 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1211 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1212 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1213 quick_symbol (abfd, U(""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1215 bfd_set_section_size (abfd, id4, 4);
1216 d4 = (unsigned char *) xmalloc (4);
1220 bfd_set_section_size (abfd, id5, 4);
1221 d5 = (unsigned char *) xmalloc (4);
1225 len = strlen (dll_filename)+1;
1228 bfd_set_section_size (abfd, id7, len);
1229 d7 = (unsigned char *) xmalloc (len);
1231 strcpy (d7, dll_filename);
1233 bfd_set_symtab (abfd, symtab, symptr);
1235 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1236 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1237 bfd_set_section_contents (abfd, id7, d7, 0, len);
1239 bfd_make_readable (abfd);
1246 * .global ___imp_function
1247 * .global __imp__function
1249 * jmp *__imp__function:
1252 * .long __head_my_dll
1263 * .asciz "function" xlate? (add underscore, kill at)
1266 static unsigned char jmp_ix86_bytes[] = {
1267 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1272 make_one (exp, parent)
1273 def_file_export *exp;
1276 asection *tx, *id7, *id5, *id4, *id6;
1277 unsigned char *td, *d7, *d5, *d4, *d6;
1281 unsigned char *jmp_bytes;
1284 switch (pe_details->pe_arch)
1287 jmp_bytes = jmp_ix86_bytes;
1288 jmp_byte_count = sizeof (jmp_ix86_bytes);
1292 oname = (char *) xmalloc (20);
1293 sprintf (oname, "d%06d.o", tmp_seq);
1296 abfd = bfd_create (oname, parent);
1297 bfd_find_target (pe_details->object_target, abfd);
1298 bfd_make_writable (abfd);
1300 bfd_set_format (abfd, bfd_object);
1301 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1304 symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
1305 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1306 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1307 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1308 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1309 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1310 if (! exp->flag_data)
1311 quick_symbol (abfd, U(""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1312 quick_symbol (abfd, U("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1313 quick_symbol (abfd, U("__imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1314 quick_symbol (abfd, U("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1316 bfd_set_section_size (abfd, tx, jmp_byte_count);
1317 td = (unsigned char *) xmalloc (jmp_byte_count);
1319 memcpy (td, jmp_bytes, jmp_byte_count);
1320 switch (pe_details->pe_arch)
1323 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1328 bfd_set_section_size (abfd, id7, 4);
1329 d7 = (unsigned char *) xmalloc (4);
1332 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1335 bfd_set_section_size (abfd, id5, 4);
1336 d5 = (unsigned char *) xmalloc (4);
1339 if (exp->flag_noname)
1341 d5[0] = exp->ordinal;
1342 d5[1] = exp->ordinal >> 8;
1347 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1351 bfd_set_section_size (abfd, id4, 4);
1352 d4 = (unsigned char *) xmalloc (4);
1355 if (exp->flag_noname)
1357 d5[0] = exp->ordinal;
1358 d5[1] = exp->ordinal >> 8;
1363 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1367 if (exp->flag_noname)
1370 bfd_set_section_size (abfd, id6, 0);
1374 len = strlen (exp->name) + 3;
1377 bfd_set_section_size (abfd, id6, len);
1378 d6 = (unsigned char *) xmalloc (len);
1380 memset (d6, 0, len);
1381 d6[0] = exp->hint & 0xff;
1382 d6[1] = exp->hint >> 8;
1383 strcpy (d6+2, exp->name);
1386 bfd_set_symtab (abfd, symtab, symptr);
1388 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1389 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1390 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1391 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1392 if (!exp->flag_noname)
1393 bfd_set_section_contents (abfd, id6, d6, 0, len);
1395 bfd_make_readable (abfd);
1400 pe_dll_generate_implib (def, impfilename)
1402 const char *impfilename;
1410 dll_filename = def->name;
1411 if (dll_filename == 0)
1413 dll_filename = dll_name;
1414 for (i=0; impfilename[i]; i++)
1415 if (impfilename[i] == '/' || impfilename[i] == '\\')
1416 dll_filename = impfilename+1;
1418 dll_symname = xstrdup (dll_filename);
1419 for (i=0; dll_symname[i]; i++)
1420 if (!isalnum ((unsigned char) dll_symname[i]))
1421 dll_symname[i] = '_';
1423 unlink (impfilename);
1425 outarch = bfd_openw (impfilename, 0);
1429 /* xgettext:c-format */
1430 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1434 /* xgettext:c-format */
1435 einfo (_("Creating library file: %s\n"), impfilename);
1437 bfd_set_format (outarch, bfd_archive);
1438 outarch->has_armap = 1;
1440 /* Work out a reasonable size of things to put onto one line. */
1442 ar_head = make_head (outarch);
1444 for (i = 0; i<def->num_exports; i++)
1446 /* The import library doesn't know about the internal name */
1447 char *internal = def->exports[i].internal_name;
1449 def->exports[i].internal_name = def->exports[i].name;
1450 n = make_one (def->exports+i, outarch);
1453 def->exports[i].internal_name = internal;
1456 ar_tail = make_tail (outarch);
1458 if (ar_head == NULL || ar_tail == NULL)
1461 /* Now stick them all into the archive */
1463 ar_head->next = head;
1464 ar_tail->next = ar_head;
1467 if (! bfd_set_archive_head (outarch, head))
1468 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1470 if (! bfd_close (outarch))
1471 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1473 while (head != NULL)
1475 bfd *n = head->next;
1482 add_bfd_to_link (abfd, name, link_info)
1485 struct bfd_link_info *link_info;
1487 lang_input_statement_type *fake_file;
1488 fake_file = lang_add_input_file (name,
1489 lang_input_file_is_fake_enum,
1491 fake_file->the_bfd = abfd;
1492 ldlang_add_file (fake_file);
1493 if (!bfd_link_add_symbols (abfd, link_info))
1494 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
1498 pe_process_import_defs (output_bfd, link_info)
1500 struct bfd_link_info *link_info;
1502 def_file_module *module;
1503 pe_dll_id_target(bfd_get_target (output_bfd));
1508 for (module = pe_def_file->modules; module; module = module->next)
1512 dll_filename = module->name;
1513 dll_symname = xstrdup (module->name);
1514 for (i=0; dll_symname[i]; i++)
1515 if (!isalnum (dll_symname[i]))
1516 dll_symname[i] = '_';
1520 for (i=0; i<pe_def_file->num_imports; i++)
1521 if (pe_def_file->imports[i].module == module)
1523 def_file_export exp;
1524 struct bfd_link_hash_entry *blhe;
1526 /* see if we need this import */
1527 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2);
1528 sprintf (name, "%s%s", U(""), pe_def_file->imports[i].internal_name);
1529 blhe = bfd_link_hash_lookup (link_info->hash, name,
1530 false, false, false);
1532 if (blhe && blhe->type == bfd_link_hash_undefined)
1538 bfd *ar_head = make_head (output_bfd);
1539 add_bfd_to_link (ar_head, ar_head->filename, link_info);
1542 exp.internal_name = pe_def_file->imports[i].internal_name;
1543 exp.name = pe_def_file->imports[i].name;
1544 exp.ordinal = pe_def_file->imports[i].ordinal;
1545 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
1546 exp.flag_private = 0;
1547 exp.flag_constant = 0;
1549 exp.flag_noname = exp.name ? 0 : 1;
1550 one = make_one (&exp, output_bfd);
1551 add_bfd_to_link (one, one->filename, link_info);
1556 bfd *ar_tail = make_tail (output_bfd);
1557 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
1564 /************************************************************************
1566 We were handed a *.DLL file. Parse it and turn it into a set of
1567 IMPORTS directives in the def file. Return true if the file was
1568 handled, false if not.
1570 ************************************************************************/
1573 pe_get16 (abfd, where)
1578 bfd_seek (abfd, where, SEEK_SET);
1579 bfd_read (b, 1, 2, abfd);
1580 return b[0] + (b[1]<<8);
1584 pe_get32 (abfd, where)
1589 bfd_seek (abfd, where, SEEK_SET);
1590 bfd_read (b, 1, 4, abfd);
1591 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1594 #if 0 /* This is not currently used. */
1600 unsigned char *b = ptr;
1601 return b[0] + (b[1]<<8);
1610 unsigned char *b = ptr;
1611 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1615 pe_implied_import_dll (filename)
1616 const char *filename;
1619 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
1620 unsigned long export_rva, export_size, nsections, secptr, expptr;
1621 unsigned char *expdata, *erva;
1622 unsigned long name_rvas, ordinals, nexp, ordbase;
1623 const char *dll_name;
1625 /* No, I can't use bfd here. kernel32.dll puts its export table in
1626 the middle of the .rdata section. */
1628 dll = bfd_openr (filename, pe_details->target_name);
1631 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
1634 /* PEI dlls seem to be bfd_objects */
1635 if (!bfd_check_format (dll, bfd_object))
1637 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
1641 dll_name = filename;
1642 for (i=0; filename[i]; i++)
1643 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
1644 dll_name = filename + i + 1;
1646 pe_header_offset = pe_get32 (dll, 0x3c);
1647 opthdr_ofs = pe_header_offset + 4 + 20;
1648 num_entries = pe_get32 (dll, opthdr_ofs + 92);
1649 if (num_entries < 1) /* no exports */
1651 export_rva = pe_get32 (dll, opthdr_ofs + 96);
1652 export_size = pe_get32 (dll, opthdr_ofs + 100);
1653 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
1654 secptr = (pe_header_offset + 4 + 20 +
1655 pe_get16 (dll, pe_header_offset + 4 + 16));
1657 for (i=0; i<nsections; i++)
1660 unsigned long secptr1 = secptr + 40 * i;
1661 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
1662 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
1663 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
1664 bfd_seek(dll, secptr1, SEEK_SET);
1665 bfd_read(sname, 1, 8, dll);
1666 if (vaddr <= export_rva && vaddr+vsize > export_rva)
1668 expptr = fptr + (export_rva - vaddr);
1669 if (export_rva + export_size > vaddr + vsize)
1670 export_size = vsize - (export_rva - vaddr);
1675 expdata = (unsigned char *) xmalloc (export_size);
1676 bfd_seek (dll, expptr, SEEK_SET);
1677 bfd_read (expdata, 1, export_size, dll);
1678 erva = expdata - export_rva;
1680 if (pe_def_file == 0)
1681 pe_def_file = def_file_empty();
1683 nexp = pe_as32 (expdata+24);
1684 name_rvas = pe_as32 (expdata+32);
1685 ordinals = pe_as32 (expdata+36);
1686 ordbase = pe_as32 (expdata+16);
1687 for (i=0; i<nexp; i++)
1689 unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
1690 def_file_import *imp;
1691 imp = def_file_add_import (pe_def_file, erva+name_rva, dll_name,
1698 /************************************************************************
1700 These are the main functions, called from the emulation. The first
1701 is called after the bfds are read, so we can guess at how much space
1702 we need. The second is called after everything is placed, so we
1703 can put the right values in place.
1705 ************************************************************************/
1708 pe_dll_build_sections (abfd, info)
1710 struct bfd_link_info *info;
1712 pe_dll_id_target (bfd_get_target (abfd));
1713 process_def_file (abfd, info);
1715 generate_edata (abfd, info);
1716 build_filler_bfd (1);
1720 pe_exe_build_sections (abfd, info)
1722 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1724 pe_dll_id_target (bfd_get_target (abfd));
1725 build_filler_bfd (0);
1729 pe_dll_fill_sections (abfd, info)
1731 struct bfd_link_info *info;
1733 pe_dll_id_target (bfd_get_target (abfd));
1734 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1736 generate_reloc (abfd, info);
1739 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1741 /* Resize the sections. */
1742 lang_size_sections (stat_ptr->head, abs_output_section,
1743 &stat_ptr->head, 0, (bfd_vma) 0, false);
1745 /* Redo special stuff. */
1746 ldemul_after_allocation ();
1748 /* Do the assignments again. */
1749 lang_do_assignments (stat_ptr->head,
1751 (fill_type) 0, (bfd_vma) 0);
1754 fill_edata (abfd, info);
1756 pe_data (abfd)->dll = 1;
1758 edata_s->contents = edata_d;
1759 reloc_s->contents = reloc_d;
1763 pe_exe_fill_sections (abfd, info)
1765 struct bfd_link_info *info;
1767 pe_dll_id_target (bfd_get_target (abfd));
1768 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1770 generate_reloc (abfd, info);
1773 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1775 /* Resize the sections. */
1776 lang_size_sections (stat_ptr->head, abs_output_section,
1777 &stat_ptr->head, 0, (bfd_vma) 0, false);
1779 /* Redo special stuff. */
1780 ldemul_after_allocation ();
1782 /* Do the assignments again. */
1783 lang_do_assignments (stat_ptr->head,
1785 (fill_type) 0, (bfd_vma) 0);
1787 reloc_s->contents = reloc_d;