* emultempl/pe.em (gld_i386_finish): generate import library
[deliverable/binutils-gdb.git] / ld / pe-dll.c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
4
5 This file is part of GLD, the Gnu Linker.
6
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.
11
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.
16
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. */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26
27 #include "ld.h"
28 #include "ldexp.h"
29 #include "ldlang.h"
30 #include "ldwrite.h"
31 #include "ldmisc.h"
32 #include "ldgram.h"
33 #include "ldmain.h"
34 #include "coff/internal.h"
35 #include "../bfd/libcoff.h"
36 #include "deffile.h"
37
38 /************************************************************************
39
40 This file turns a regular Windows PE image into a DLL. Because of
41 the complexity of this operation, it has been broken down into a
42 number of separate modules which are all called by the main function
43 at the end of this file. This function is not re-entrant and is
44 normally only called once, so static variables are used to reduce
45 the number of parameters and return values required.
46
47 See also: ld/emultempl/pe.em
48
49 ************************************************************************/
50
51 /* from emultempl/pe.em */
52
53 extern def_file *pe_def_file;
54 extern int pe_dll_export_everything;
55 extern int pe_dll_do_default_excludes;
56 extern int pe_dll_kill_ats;
57 extern int pe_dll_stdcall_aliases;
58
59 /************************************************************************
60
61 static variables and types
62
63 ************************************************************************/
64
65 static bfd_vma image_base;
66
67 static bfd *filler_bfd;
68 static struct sec *edata_s, *reloc_s;
69 static unsigned char *edata_d, *reloc_d;
70 static int edata_sz, reloc_sz;
71
72 /************************************************************************
73
74 Helper functions for qsort. Relocs must be sorted so that we can write
75 them out by pages.
76
77 ************************************************************************/
78
79 static int
80 reloc_sort (va, vb)
81 const void *va, *vb;
82 {
83 unsigned long a = *(unsigned long *) va;
84 unsigned long b = *(unsigned long *) vb;
85 return a - b;
86 }
87
88 static int
89 pe_export_sort (va, vb)
90 const void *va, *vb;
91 {
92 def_file_export *a = (def_file_export *) va;
93 def_file_export *b = (def_file_export *) vb;
94 return strcmp (a->name, b->name);
95 }
96
97 /************************************************************************
98
99 Read and process the .DEF file
100
101 ************************************************************************/
102
103 /* These correspond to the entries in pe_def_file->exports[]. I use
104 exported_symbol_sections[i] to tag whether or not the symbol was
105 defined, since we can't export symbols we don't have. */
106
107 static bfd_vma *exported_symbol_offsets;
108 static struct sec **exported_symbol_sections;
109
110 static int export_table_size;
111 static int count_exported;
112 static int count_exported_byname;
113 static int count_with_ordinals;
114 static const char *dll_name;
115 static int min_ordinal, max_ordinal;
116 static int *exported_symbols;
117
118 typedef struct exclude_list_struct
119 {
120 char *string;
121 struct exclude_list_struct *next;
122 }
123 exclude_list_struct;
124 static struct exclude_list_struct *excludes = 0;
125
126 void
127 pe_dll_add_excludes (new_excludes)
128 const char *new_excludes;
129 {
130 char *local_copy;
131 char *exclude_string;
132
133 local_copy = xstrdup (new_excludes);
134
135 exclude_string = strtok (local_copy, ",:");
136 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
137 {
138 struct exclude_list_struct *new_exclude;
139
140 new_exclude = ((struct exclude_list_struct *)
141 xmalloc (sizeof (struct exclude_list_struct)));
142 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
143 strcpy (new_exclude->string, exclude_string);
144 new_exclude->next = excludes;
145 excludes = new_exclude;
146 }
147
148 free (local_copy);
149 }
150
151 static int
152 auto_export (d, n)
153 def_file *d;
154 const char *n;
155 {
156 int i;
157 struct exclude_list_struct *ex;
158 for (i = 0; i < d->num_exports; i++)
159 if (strcmp (d->exports[i].name, n) == 0)
160 return 0;
161 if (pe_dll_do_default_excludes)
162 {
163 if (strcmp (n, "DllMain@12") == 0)
164 return 0;
165 if (strcmp (n, "DllEntryPoint@0") == 0)
166 return 0;
167 if (strcmp (n, "impure_ptr") == 0)
168 return 0;
169 }
170 for (ex = excludes; ex; ex = ex->next)
171 if (strcmp (n, ex->string) == 0)
172 return 0;
173 return 1;
174 }
175
176 static void
177 process_def_file (abfd, info)
178 bfd *abfd;
179 struct bfd_link_info *info;
180 {
181 int i, j;
182 struct bfd_link_hash_entry *blhe;
183 bfd *b;
184 struct sec *s;
185 def_file_export *e=0;
186
187 if (!pe_def_file)
188 pe_def_file = def_file_empty ();
189
190 /* First, run around to all the objects looking for the .drectve
191 sections, and push those into the def file too */
192
193 for (b = info->input_bfds; b; b = b->link_next)
194 {
195 s = bfd_get_section_by_name (b, ".drectve");
196 if (s)
197 {
198 int size = bfd_get_section_size_before_reloc (s);
199 char *buf = xmalloc (size);
200 bfd_get_section_contents (b, s, buf, 0, size);
201 def_file_add_directive (pe_def_file, buf, size);
202 free (buf);
203 }
204 }
205
206 /* Now, maybe export everything else the default way */
207
208 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
209 {
210 for (b = info->input_bfds; b; b = b->link_next)
211 {
212 asymbol **symbols;
213 int nsyms, symsize;
214
215 symsize = bfd_get_symtab_upper_bound (b);
216 symbols = (asymbol **) xmalloc (symsize);
217 nsyms = bfd_canonicalize_symtab (b, symbols);
218
219 for (j = 0; j < nsyms; j++)
220 {
221 if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
222 == (BSF_FUNCTION | BSF_GLOBAL))
223 {
224 const char *sn = symbols[j]->name;
225 if (*sn == '_')
226 sn++;
227 if (auto_export (pe_def_file, sn))
228 def_file_add_export (pe_def_file, sn, 0, -1);
229 }
230 }
231 }
232 }
233
234 #undef NE
235 #define NE pe_def_file->num_exports
236
237 /* Canonicalize the export list */
238
239 if (pe_dll_kill_ats)
240 {
241 for (i = 0; i < NE; i++)
242 {
243 if (strchr (pe_def_file->exports[i].name, '@'))
244 {
245 /* This will preserve internal_name, which may have been pointing
246 to the same memory as name, or might not have */
247 char *tmp = xstrdup (pe_def_file->exports[i].name);
248 *(strchr (tmp, '@')) = 0;
249 pe_def_file->exports[i].name = tmp;
250 }
251 }
252 }
253
254 if (pe_dll_stdcall_aliases)
255 {
256 for (i = 0; i < NE; i++)
257 {
258 if (strchr (pe_def_file->exports[i].name, '@'))
259 {
260 char *tmp = xstrdup (pe_def_file->exports[i].name);
261 *(strchr (tmp, '@')) = 0;
262 if (auto_export (pe_def_file, tmp))
263 def_file_add_export (pe_def_file, tmp,
264 pe_def_file->exports[i].internal_name, -1);
265 else
266 free (tmp);
267 }
268 }
269 }
270
271 e = pe_def_file->exports; /* convenience, but watch out for it changing */
272
273 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
274 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
275
276 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
277 max_ordinal = 0;
278 min_ordinal = 65536;
279 count_exported = 0;
280 count_exported_byname = 0;
281 count_with_ordinals = 0;
282
283 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
284 for (i = 0, j = 0; i < NE; i++)
285 {
286 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
287 {
288 /* This is a duplicate */
289 if (e[j - 1].ordinal != -1
290 && e[i].ordinal != -1
291 && e[j - 1].ordinal != e[i].ordinal)
292 {
293 /* xgettext:c-format */
294 einfo (_("%XError, duplicate EXPORT with oridinals: %s (%d vs %d)\n"),
295 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
296 }
297 else
298 {
299 /* xgettext:c-format */
300 einfo (_("Warning, duplicate EXPORT: %s\n"),
301 e[j - 1].name);
302 }
303 if (e[i].ordinal)
304 e[j - 1].ordinal = e[i].ordinal;
305 e[j - 1].flag_private |= e[i].flag_private;
306 e[j - 1].flag_constant |= e[i].flag_constant;
307 e[j - 1].flag_noname |= e[i].flag_noname;
308 e[j - 1].flag_data |= e[i].flag_data;
309 }
310 else
311 {
312 if (i != j)
313 e[j] = e[i];
314 j++;
315 }
316 }
317 pe_def_file->num_exports = j; /* == NE */
318
319 for (i = 0; i < NE; i++)
320 {
321 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
322 *name = '_';
323 strcpy (name + 1, pe_def_file->exports[i].internal_name);
324
325 blhe = bfd_link_hash_lookup (info->hash,
326 name,
327 false, false, true);
328
329 if (blhe && (blhe->type == bfd_link_hash_defined))
330 {
331 count_exported++;
332 if (!pe_def_file->exports[i].flag_noname)
333 count_exported_byname++;
334 exported_symbol_offsets[i] = blhe->u.def.value;
335 exported_symbol_sections[i] = blhe->u.def.section;
336 if (pe_def_file->exports[i].ordinal != -1)
337 {
338 if (max_ordinal < pe_def_file->exports[i].ordinal)
339 max_ordinal = pe_def_file->exports[i].ordinal;
340 if (min_ordinal > pe_def_file->exports[i].ordinal)
341 min_ordinal = pe_def_file->exports[i].ordinal;
342 count_with_ordinals++;
343 }
344 }
345 else if (blhe && blhe->type == bfd_link_hash_undefined)
346 {
347 /* xgettext:c-format */
348 einfo (_("%XCannot export %s: symbol not defined\n"),
349 pe_def_file->exports[i].internal_name);
350 }
351 else if (blhe)
352 {
353 /* xgettext:c-format */
354 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
355 pe_def_file->exports[i].internal_name,
356 blhe->type, bfd_link_hash_defined);
357 }
358 else
359 {
360 /* xgettext:c-format */
361 einfo (_("%XCannot export %s: symbol not found\n"),
362 pe_def_file->exports[i].internal_name);
363 }
364 free(name);
365 }
366 }
367
368 /************************************************************************
369
370 Build the bfd that will contain .edata and .reloc sections
371
372 ************************************************************************/
373
374 static void
375 build_filler_bfd ()
376 {
377 static lang_input_statement_type *filler_file;
378 filler_file = lang_add_input_file ("dll stuff",
379 lang_input_file_is_fake_enum,
380 NULL);
381 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
382 if (filler_bfd == NULL
383 || !bfd_set_arch_mach (filler_bfd,
384 bfd_get_arch (output_bfd),
385 bfd_get_mach (output_bfd)))
386 {
387 einfo ("%X%P: can not create BFD %E\n");
388 return;
389 }
390
391 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
392 if (edata_s == NULL
393 || !bfd_set_section_flags (filler_bfd, edata_s,
394 (SEC_HAS_CONTENTS
395 | SEC_ALLOC
396 | SEC_LOAD
397 | SEC_KEEP
398 | SEC_IN_MEMORY)))
399 {
400 einfo ("%X%P: can not create .edata section: %E\n");
401 return;
402 }
403 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
404
405 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
406 if (reloc_s == NULL
407 || !bfd_set_section_flags (filler_bfd, reloc_s,
408 (SEC_HAS_CONTENTS
409 | SEC_ALLOC
410 | SEC_LOAD
411 | SEC_KEEP
412 | SEC_IN_MEMORY)))
413 {
414 einfo ("%X%P: can not create .reloc section: %E\n");
415 return;
416 }
417 bfd_set_section_size (filler_bfd, reloc_s, 0);
418
419 ldlang_add_file (filler_file);
420 }
421
422 /************************************************************************
423
424 Gather all the exported symbols and build the .edata section
425
426 ************************************************************************/
427
428 static void
429 generate_edata (abfd, info)
430 bfd *abfd;
431 struct bfd_link_info *info;
432 {
433 int i, j, next_ordinal;
434 int name_table_size = 0;
435 const char *dlnp;
436
437 /* First, we need to know how many exported symbols there are,
438 and what the range of ordinals is. */
439
440 if (pe_def_file->name)
441 {
442 dll_name = pe_def_file->name;
443 }
444 else
445 {
446 dll_name = abfd->filename;
447 for (dlnp = dll_name; *dlnp; dlnp++)
448 {
449 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
450 dll_name = dlnp + 1;
451 }
452 }
453
454 if (count_with_ordinals && max_ordinal > count_exported)
455 {
456 if (min_ordinal > max_ordinal - count_exported + 1)
457 min_ordinal = max_ordinal - count_exported + 1;
458 }
459 else
460 {
461 min_ordinal = 1;
462 max_ordinal = count_exported;
463 }
464 export_table_size = max_ordinal - min_ordinal + 1;
465
466 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
467 for (i = 0; i < export_table_size; i++)
468 exported_symbols[i] = -1;
469
470 /* Now we need to assign ordinals to those that don't have them */
471 for (i = 0; i < NE; i++)
472 {
473 if (exported_symbol_sections[i])
474 {
475 if (pe_def_file->exports[i].ordinal != -1)
476 {
477 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
478 int pi = exported_symbols[ei];
479 if (pi != -1)
480 {
481 /* xgettext:c-format */
482 einfo (_("%XError, oridinal used twice: %d (%s vs %s)\n"),
483 pe_def_file->exports[i].ordinal,
484 pe_def_file->exports[i].name,
485 pe_def_file->exports[pi].name);
486 }
487 exported_symbols[ei] = i;
488 }
489 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
490 }
491 }
492
493 next_ordinal = min_ordinal;
494 for (i = 0; i < NE; i++)
495 if (exported_symbol_sections[i])
496 if (pe_def_file->exports[i].ordinal == -1)
497 {
498 while (exported_symbols[next_ordinal - min_ordinal] != -1)
499 next_ordinal++;
500 exported_symbols[next_ordinal - min_ordinal] = i;
501 pe_def_file->exports[i].ordinal = next_ordinal;
502 }
503
504 /* OK, now we can allocate some memory */
505
506 edata_sz = (40 /* directory */
507 + 4 * export_table_size /* addresses */
508 + 4 * count_exported_byname /* name ptrs */
509 + 2 * count_exported_byname /* ordinals */
510 + name_table_size + strlen (dll_name) + 1);
511 }
512
513 static void
514 fill_edata (abfd, info)
515 bfd *abfd;
516 struct bfd_link_info *info;
517 {
518 int i, hint;
519 unsigned char *edirectory;
520 unsigned long *eaddresses;
521 unsigned long *enameptrs;
522 unsigned short *eordinals;
523 unsigned char *enamestr;
524
525 edata_d = (unsigned char *) xmalloc (edata_sz);
526
527 /* Note use of array pointer math here */
528 edirectory = edata_d;
529 eaddresses = (unsigned long *) (edata_d + 40);
530 enameptrs = eaddresses + export_table_size;
531 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
532 enamestr = (char *) (eordinals + count_exported_byname);
533
534 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
535
536 memset (edata_d, 0, 40);
537 if (pe_def_file->version_major != -1)
538 {
539 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
540 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
541 }
542 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
543 strcpy (enamestr, dll_name);
544 enamestr += strlen (enamestr) + 1;
545 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
546 bfd_put_32 (abfd, export_table_size, edata_d + 20);
547 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
548 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
549 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
550 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
551
552 /* Ok, now for the filling in part */
553 hint = 0;
554 for (i = 0; i < export_table_size; i++)
555 {
556 int s = exported_symbols[i];
557 if (s != -1)
558 {
559 struct sec *ssec = exported_symbol_sections[s];
560 unsigned long srva = (exported_symbol_offsets[s]
561 + ssec->output_section->vma
562 + ssec->output_offset);
563
564 bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
565 if (!pe_def_file->exports[s].flag_noname)
566 {
567 char *ename = pe_def_file->exports[s].name;
568 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
569 strcpy (enamestr, ename);
570 enamestr += strlen (enamestr) + 1;
571 bfd_put_16 (abfd, i, (void *) eordinals);
572 enameptrs++;
573 pe_def_file->exports[s].hint = hint++;
574 }
575 eordinals++;
576 }
577 }
578 }
579
580 /************************************************************************
581
582 Gather all the relocations and build the .reloc section
583
584 ************************************************************************/
585
586 static void
587 generate_reloc (abfd, info)
588 bfd *abfd;
589 struct bfd_link_info *info;
590 {
591
592 /* for .reloc stuff */
593 bfd_vma *reloc_addresses;
594 int total_relocs = 0;
595 int i, j;
596 unsigned long sec_page = (unsigned long) (-1);
597 unsigned long page_ptr, page_count;
598 int bi;
599 bfd *b;
600 struct sec *s;
601
602 total_relocs = 0;
603 for (b = info->input_bfds; b; b = b->link_next)
604 for (s = b->sections; s; s = s->next)
605 total_relocs += s->reloc_count;
606
607 reloc_addresses = (unsigned long *) xmalloc (total_relocs * sizeof (unsigned long));
608
609 total_relocs = 0;
610 bi = 0;
611 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
612 {
613 arelent **relocs;
614 int relsize, nrelocs, i;
615
616 for (s = b->sections; s; s = s->next)
617 {
618 unsigned long sec_vma = s->output_section->vma + s->output_offset;
619 asymbol **symbols;
620 int nsyms, symsize;
621
622 /* if it's not loaded, we don't need to relocate it this way */
623 if (!(s->output_section->flags & SEC_LOAD))
624 continue;
625
626 /* I don't know why there would be a reloc for these, but I've
627 seen it happen - DJ */
628 if (s->output_section == &bfd_abs_section)
629 continue;
630
631 if (s->output_section->vma == 0)
632 {
633 /* Huh? Shouldn't happen, but punt if it does */
634 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
635 s->output_section->name, s->output_section->index,
636 s->output_section->flags);
637 continue;
638 }
639
640 symsize = bfd_get_symtab_upper_bound (b);
641 symbols = (asymbol **) xmalloc (symsize);
642 nsyms = bfd_canonicalize_symtab (b, symbols);
643
644 relsize = bfd_get_reloc_upper_bound (b, s);
645 relocs = (arelent **) xmalloc ((size_t) relsize);
646 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
647
648 for (i = 0; i < nrelocs; i++)
649 {
650 if (!relocs[i]->howto->pc_relative
651 && relocs[i]->howto->type != R_IMAGEBASE)
652 {
653 switch (relocs[i]->howto->bitsize)
654 {
655 case 32:
656 reloc_addresses[total_relocs++] = sec_vma + relocs[i]->address;
657 break;
658 default:
659 /* xgettext:c-format */
660 einfo (_("%XError: %d-bit reloc in dll\n"),
661 relocs[i]->howto->bitsize);
662 break;
663 }
664 }
665 }
666 free (relocs);
667 /* Warning: the allocated symbols are remembered in BFD and reused
668 later, so don't free them! */
669 /* free(symbols); */
670 }
671 }
672
673 /* At this point, we have total_relocs relocation addresses in
674 reloc_addresses, which are all suitable for the .reloc section.
675 We must now create the new sections. */
676
677 qsort (reloc_addresses, total_relocs, sizeof (unsigned long), reloc_sort);
678
679 for (i = 0; i < total_relocs; i++)
680 {
681 unsigned long this_page = (reloc_addresses[i] >> 12);
682 if (this_page != sec_page)
683 {
684 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
685 reloc_sz += 8;
686 sec_page = this_page;
687 }
688 reloc_sz += 2;
689 }
690 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
691
692 reloc_d = (unsigned char *) xmalloc (reloc_sz);
693
694 sec_page = (unsigned long) (-1);
695 reloc_sz = 0;
696 page_ptr = (unsigned long) (-1);
697 page_count = 0;
698 for (i = 0; i < total_relocs; i++)
699 {
700 unsigned long rva = reloc_addresses[i] - image_base;
701 unsigned long this_page = (rva & ~0xfff);
702 if (this_page != sec_page)
703 {
704 while (reloc_sz & 3)
705 reloc_d[reloc_sz++] = 0;
706 if (page_ptr != (unsigned long) (-1))
707 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
708 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
709 page_ptr = reloc_sz;
710 reloc_sz += 8;
711 sec_page = this_page;
712 page_count = 0;
713 }
714 bfd_put_16 (abfd, (rva & 0xfff) + 0x3000, reloc_d + reloc_sz);
715 reloc_sz += 2;
716 page_count++;
717 }
718 while (reloc_sz & 3)
719 reloc_d[reloc_sz++] = 0;
720 if (page_ptr != (unsigned long) (-1))
721 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
722 while (reloc_sz < reloc_s->_raw_size)
723 reloc_d[reloc_sz++] = 0;
724 }
725
726 /************************************************************************
727
728 Given the exiting def_file structure, print out a .DEF file that
729 corresponds to it.
730
731 ************************************************************************/
732
733 static void
734 quoteput (s, f, needs_quotes)
735 char *s;
736 FILE * f;
737 int needs_quotes;
738 {
739 char *cp;
740 for (cp = s; *cp; cp++)
741 if (*cp == '\'' || *cp == '"' || *cp == '\\' || isspace (*cp) || *cp == ','
742 || *cp == ';')
743 needs_quotes = 1;
744 if (needs_quotes)
745 {
746 putc ('"', f);
747 while (*s)
748 {
749 if (*s == '"' || *s == '\\')
750 putc ('\\', f);
751 putc (*s, f);
752 s++;
753 }
754 putc ('"', f);
755 }
756 else
757 fputs (s, f);
758 }
759
760 void
761 pe_dll_generate_def_file (pe_out_def_filename)
762 char *pe_out_def_filename;
763 {
764 int i;
765 FILE *out = fopen (pe_out_def_filename, "w");
766 if (out == NULL)
767 {
768 /* xgettext:c-format */
769 einfo (_("%s: Can't open output def file %s\n"),
770 program_name, pe_out_def_filename);
771 }
772
773 if (pe_def_file)
774 {
775 if (pe_def_file->name)
776 {
777 if (pe_def_file->is_dll)
778 fprintf (out, "LIBRARY ");
779 else
780 fprintf (out, "NAME ");
781 quoteput (pe_def_file->name, out, 1);
782 if (pe_def_file->base_address != (bfd_vma) (-1))
783 fprintf (out, " BASE=0x%x", pe_def_file->base_address);
784 fprintf (out, "\n");
785 }
786
787 if (pe_def_file->description)
788 {
789 fprintf (out, "DESCRIPTION ");
790 quoteput (pe_def_file->description, out, 1);
791 fprintf (out, "\n");
792 }
793
794 if (pe_def_file->version_minor)
795 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
796 pe_def_file->version_minor);
797 else
798 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
799
800 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
801 fprintf (out, "\n");
802
803 if (pe_def_file->stack_commit != -1)
804 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
805 pe_def_file->stack_reserve, pe_def_file->stack_commit);
806 else if (pe_def_file->stack_reserve != -1)
807 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
808 if (pe_def_file->heap_commit != -1)
809 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
810 pe_def_file->heap_reserve, pe_def_file->heap_commit);
811 else if (pe_def_file->heap_reserve != -1)
812 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
813
814 if (pe_def_file->num_section_defs > 0)
815 {
816 fprintf (out, "\nSECTIONS\n\n");
817 for (i = 0; i < pe_def_file->num_section_defs; i++)
818 {
819 fprintf (out, " ");
820 quoteput (pe_def_file->section_defs[i].name, out, 0);
821 if (pe_def_file->section_defs[i].class)
822 {
823 fprintf (out, " CLASS ");
824 quoteput (pe_def_file->section_defs[i].class, out, 0);
825 }
826 if (pe_def_file->section_defs[i].flag_read)
827 fprintf (out, " READ");
828 if (pe_def_file->section_defs[i].flag_write)
829 fprintf (out, " WRITE");
830 if (pe_def_file->section_defs[i].flag_execute)
831 fprintf (out, " EXECUTE");
832 if (pe_def_file->section_defs[i].flag_shared)
833 fprintf (out, " SHARED");
834 fprintf (out, "\n");
835 }
836 }
837
838 if (pe_def_file->num_exports > 0)
839 {
840 fprintf (out, "\nEXPORTS\n\n");
841 for (i = 0; i < pe_def_file->num_exports; i++)
842 {
843 def_file_export *e = pe_def_file->exports + i;
844 fprintf (out, " ");
845 quoteput (e->name, out, 0);
846 if (e->internal_name && strcmp (e->internal_name, e->name))
847 {
848 fprintf (out, " = ");
849 quoteput (e->internal_name, out, 0);
850 }
851 if (e->ordinal != -1)
852 fprintf (out, " @%d", e->ordinal);
853 if (e->flag_private)
854 fprintf (out, " PRIVATE");
855 if (e->flag_constant)
856 fprintf (out, " CONSTANT");
857 if (e->flag_noname)
858 fprintf (out, " NONAME");
859 if (e->flag_data)
860 fprintf (out, " DATA");
861
862 fprintf (out, "\n");
863 }
864 }
865
866 if (pe_def_file->num_imports > 0)
867 {
868 fprintf (out, "\nIMPORTS\n\n");
869 for (i = 0; i < pe_def_file->num_imports; i++)
870 {
871 def_file_import *im = pe_def_file->imports + i;
872 fprintf (out, " ");
873 if (im->internal_name
874 && (!im->name || strcmp (im->internal_name, im->name)))
875 {
876 quoteput (im->internal_name, out, 0);
877 fprintf (out, " = ");
878 }
879 quoteput (im->module->name, out, 0);
880 fprintf (out, ".");
881 if (im->name)
882 quoteput (im->name, out, 0);
883 else
884 fprintf (out, "%d", im->ordinal);
885 fprintf (out, "\n");
886 }
887 }
888 }
889 else
890 fprintf (out, _("; no contents available\n"));
891
892 if (fclose (out) == EOF)
893 {
894 /* xgettext:c-format */
895 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
896 }
897 }
898
899 /************************************************************************
900
901 Generate the import library
902
903 ************************************************************************/
904
905 static asymbol **symtab;
906 static int symptr;
907 static int tmp_seq;
908 static const char *dll_filename;
909 static char *dll_symname;
910
911 static asection *
912 quick_section(abfd, name, flags, align)
913 bfd *abfd;
914 const char *name;
915 int flags;
916 int align;
917 {
918 asection *sec;
919 asymbol *sym;
920
921 sec = bfd_make_section_old_way(abfd, name);
922 sec->output_section = sec;
923 bfd_set_section_flags (abfd, sec, flags);
924 bfd_set_section_alignment (abfd, sec, align);
925
926 sym = bfd_make_empty_symbol(abfd);
927 symtab[symptr++] = sym;
928 sym->name = sec->name;
929 sym->section = sec;
930 sym->flags = BSF_LOCAL;
931 sym->value = 0;
932
933 return sec;
934 }
935
936 static void
937 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
938 bfd *abfd;
939 char *n1;
940 char *n2;
941 char *n3;
942 asection *sec;
943 int flags;
944 int addr;
945 {
946 asymbol *sym = bfd_make_empty_symbol(abfd);
947 char *name = (char *) xmalloc (strlen(n1) + strlen(n2) + strlen(n3) + 1);
948 strcpy (name, n1);
949 strcat (name, n2);
950 strcat (name, n3);
951 sym->name = name;
952 sym->section = sec;
953 sym->flags = flags;
954 sym->value = addr;
955 symtab[symptr++] = sym;
956 }
957
958 static arelent **reltab = 0;
959 static int relcount = 0, relsize = 0;
960
961 static void
962 quick_reloc (abfd, address, which_howto, symidx)
963 bfd *abfd;
964 int address;
965 int which_howto;
966 int symidx;
967 {
968 if (relcount >= (relsize-1))
969 {
970 relsize += 10;
971 if (reltab)
972 reltab = (arelent **) xrealloc (reltab, relsize * sizeof (arelent *));
973 else
974 reltab = (arelent **) xmalloc (relsize * sizeof (arelent *));
975 }
976 reltab[relcount] = (arelent *) xmalloc (sizeof (arelent));
977 reltab[relcount]->address = address;
978 reltab[relcount]->addend = 0;
979 reltab[relcount]->howto = bfd_reloc_type_lookup (abfd, which_howto);
980 reltab[relcount]->sym_ptr_ptr = symtab + symidx;
981 relcount++;
982 }
983
984 static void
985 save_relocs (asection *sec)
986 {
987 reltab[relcount] = 0;
988 sec->orelocation = reltab;
989 sec->reloc_count = relcount;
990 reltab = 0;
991 relcount = relsize = 0;
992 }
993
994 #define UNDSEC (asection *) &bfd_und_section
995
996 /*
997 * .section .idata$2
998 * .global __head_my_dll
999 * __head_my_dll:
1000 * .rva hname
1001 * .long 0
1002 * .long 0
1003 * .rva __my_dll_iname
1004 * .rva fthunk
1005 *
1006 * .section .idata$5
1007 * .long 0
1008 * fthunk:
1009 *
1010 * .section .idata$4
1011 * .long 0
1012 * hname:
1013 */
1014
1015 #define BFD_OPEN_OLDWAY 0
1016
1017 bfd *
1018 make_head (parent)
1019 bfd *parent;
1020 {
1021 asection *id2, *id5, *id4;
1022 unsigned char *d2, *d5, *d4;
1023
1024 #if BFD_OPEN_OLDWAY
1025 bfd *abfd = bfd_openw ("dh.o", 0);
1026 #else
1027 bfd *abfd = bfd_create ("dh.o", parent);
1028 bfd_make_writable (abfd);
1029 #endif
1030 bfd_set_format (abfd, bfd_object);
1031 bfd_set_arch_mach (abfd, bfd_arch_i386, 0);
1032
1033 symptr = 0;
1034 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1035 id2 = quick_section(abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1036 id5 = quick_section(abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1037 id4 = quick_section(abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1038 quick_symbol (abfd, "__head_", dll_symname, "", id2, BSF_GLOBAL, 0);
1039 quick_symbol (abfd, "_", dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1040
1041 bfd_set_section_size(abfd, id2, 20);
1042 d2 = (unsigned char *) xmalloc (20);
1043 memset (d2, 0, 20);
1044 d2[0] = d2[16] = 4; /* reloc addend */
1045 quick_reloc(abfd, 0, BFD_RELOC_RVA, 2);
1046 quick_reloc(abfd, 12, BFD_RELOC_RVA, 4);
1047 quick_reloc(abfd, 16, BFD_RELOC_RVA, 1);
1048 save_relocs(id2);
1049
1050 bfd_set_section_size (abfd, id5, 4);
1051 d5 = (unsigned char *) xmalloc (4);
1052 memset (d5, 0, 4);
1053
1054 bfd_set_section_size (abfd, id4, 4);
1055 d4 = (unsigned char *) xmalloc (4);
1056 memset (d4, 0, 4);
1057
1058 bfd_set_symtab(abfd, symtab, symptr);
1059
1060 bfd_set_section_contents(abfd, id2, d2, 0, 20);
1061 bfd_set_section_contents(abfd, id5, d5, 0, 4);
1062 bfd_set_section_contents(abfd, id4, d4, 0, 4);
1063
1064 #if BFD_OPEN_OLDWAY
1065 bfd_close (abfd);
1066 return bfd_openr("dh.o", 0);
1067 #else
1068 bfd_make_readable (abfd);
1069 return abfd;
1070 #endif
1071 }
1072
1073 /*
1074 * .section .idata$4
1075 * .long 0
1076 * .section .idata$5
1077 * .long 0
1078 * .section idata$7
1079 * .global __my_dll_iname
1080 *__my_dll_iname:
1081 * .asciz "my.dll"
1082 */
1083
1084 bfd *
1085 make_tail (parent)
1086 bfd *parent;
1087 {
1088 asection *id4, *id5, *id7;
1089 unsigned char *d4, *d5, *d7;
1090 int len;
1091
1092 #if BFD_OPEN_OLDWAY
1093 bfd *abfd = bfd_openw ("dt.o", 0);
1094 #else
1095 bfd *abfd = bfd_create ("dt.o", parent);
1096 bfd_make_writable (abfd);
1097 #endif
1098 bfd_set_format (abfd, bfd_object);
1099 bfd_set_arch_mach (abfd, bfd_arch_i386, 0);
1100
1101 symptr = 0;
1102 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1103 id4 = quick_section(abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1104 id5 = quick_section(abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1105 id7 = quick_section(abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1106 quick_symbol (abfd, "_", dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1107
1108 bfd_set_section_size(abfd, id4, 4);
1109 d4 = (unsigned char *) xmalloc (4);
1110 memset (d4, 0, 4);
1111
1112 bfd_set_section_size (abfd, id5, 4);
1113 d5 = (unsigned char *) xmalloc (4);
1114 memset (d5, 0, 4);
1115
1116 len = strlen(dll_filename)+1;
1117 if (len & 1)
1118 len ++;
1119 bfd_set_section_size (abfd, id7, len);
1120 d7 = (unsigned char *) xmalloc (len);
1121 strcpy (d7, dll_filename);
1122
1123 bfd_set_symtab(abfd, symtab, symptr);
1124
1125 bfd_set_section_contents(abfd, id4, d4, 0, 4);
1126 bfd_set_section_contents(abfd, id5, d5, 0, 4);
1127 bfd_set_section_contents(abfd, id7, d7, 0, len);
1128
1129 #if BFD_OPEN_OLDWAY
1130 bfd_close (abfd);
1131 return bfd_openr ("dt.o", 0);
1132 #else
1133 bfd_make_readable (abfd);
1134 return abfd;
1135 #endif
1136 }
1137
1138 /*
1139 * .text
1140 * .global _function
1141 * .global ___imp_function
1142 * .global __imp__function
1143 *_function:
1144 * jmp *__imp__function:
1145 *
1146 * .section idata$7
1147 * .long __head_my_dll
1148 *
1149 * .section .idata$5
1150 *___imp_function:
1151 *__imp__function:
1152 *iat?
1153 * .section .idata$4
1154 *iat?
1155 * .section .idata$6
1156 *ID<ordinal>:
1157 * .short <hint>
1158 * .asciz "function" xlate? (add underscore, kill at)
1159 */
1160
1161 unsigned char jmp_ix86_bytes[] = {
1162 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1163 };
1164
1165
1166 bfd *
1167 make_one (exp, parent)
1168 def_file_export *exp;
1169 bfd *parent;
1170 {
1171 asection *tx, *id7, *id5, *id4, *id6;
1172 unsigned char *td, *d7, *d5, *d4, *d6;
1173 int len;
1174 char *oname;
1175 bfd *abfd;
1176
1177 oname = (char *) xmalloc (20);
1178 sprintf(oname, "ds%d.o", tmp_seq);
1179 tmp_seq++;
1180 #if BFD_OPEN_OLDWAY
1181 abfd = bfd_openw (oname, 0);
1182 #else
1183 abfd = bfd_create (oname, parent);
1184 bfd_make_writable (abfd);
1185 #endif
1186 bfd_set_format (abfd, bfd_object);
1187 bfd_set_arch_mach (abfd, bfd_arch_i386, 0);
1188
1189 symptr = 0;
1190 symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
1191 tx = quick_section(abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1192 id7 = quick_section(abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1193 id5 = quick_section(abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1194 id4 = quick_section(abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1195 id6 = quick_section(abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1196 quick_symbol (abfd, "_", exp->name, "", tx, BSF_GLOBAL, 0);
1197 quick_symbol (abfd, "__head_", dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1198 quick_symbol (abfd, "___imp_", exp->name, "", id5, BSF_GLOBAL, 0);
1199 quick_symbol (abfd, "__imp__", exp->name, "", id5, BSF_GLOBAL, 0);
1200
1201 bfd_set_section_size (abfd, tx, 8);
1202 td = (unsigned char *) xmalloc (8);
1203 memcpy (td, jmp_ix86_bytes, 8);
1204 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1205 save_relocs (tx);
1206
1207 bfd_set_section_size(abfd, id7, 4);
1208 d7 = (unsigned char *) xmalloc (4);
1209 memset (d7, 0, 4);
1210 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1211 save_relocs (id7);
1212
1213 bfd_set_section_size (abfd, id5, 4);
1214 d5 = (unsigned char *) xmalloc (4);
1215 memset (d5, 0, 4);
1216 if (exp->flag_noname)
1217 {
1218 d5[0] = exp->ordinal;
1219 d5[1] = exp->ordinal >> 8;
1220 d5[3] = 0x80;
1221 }
1222 else
1223 {
1224 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1225 save_relocs (id5);
1226 }
1227
1228 bfd_set_section_size (abfd, id4, 4);
1229 d4 = (unsigned char *) xmalloc (4);
1230 memset (d4, 0, 4);
1231 if (exp->flag_noname)
1232 {
1233 d5[0] = exp->ordinal;
1234 d5[1] = exp->ordinal >> 8;
1235 d5[3] = 0x80;
1236 }
1237 else
1238 {
1239 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1240 save_relocs (id4);
1241 }
1242
1243 if (exp->flag_noname)
1244 {
1245 len = 0;
1246 bfd_set_section_size(abfd, id6, 0);
1247 }
1248 else
1249 {
1250 len = strlen(exp->name) + 3;
1251 if (len & 1)
1252 len++;
1253 bfd_set_section_size(abfd, id6, len);
1254 d6 = (unsigned char *) xmalloc (len);
1255 memset (d6, 0, len);
1256 d6[0] = exp->hint & 0xff;
1257 d6[1] = exp->hint >> 8;
1258 strcpy(d6+2, exp->name);
1259 }
1260
1261 bfd_set_symtab(abfd, symtab, symptr);
1262
1263 bfd_set_section_contents(abfd, tx, td, 0, 8);
1264 bfd_set_section_contents(abfd, id7, d7, 0, 4);
1265 bfd_set_section_contents(abfd, id5, d5, 0, 4);
1266 bfd_set_section_contents(abfd, id4, d4, 0, 4);
1267 bfd_set_section_contents(abfd, id6, d6, 0, len);
1268
1269 #if BFD_OPEN_OLDWAY
1270 bfd_close(abfd);
1271 return bfd_openr(oname, 0);
1272 #else
1273 bfd_make_readable (abfd);
1274 return abfd;
1275 #endif
1276 }
1277
1278 void
1279 pe_dll_generate_implib (def, impfilename)
1280 def_file *def;
1281 char *impfilename;
1282 {
1283 int i;
1284 /*export_type *exp;*/
1285 bfd *ar_head;
1286 bfd *ar_tail;
1287 bfd *outarch;
1288 bfd * head = 0;
1289
1290 dll_filename = def->name;
1291 if (dll_filename == 0)
1292 {
1293 dll_filename = dll_name;
1294 for (i=0; impfilename[i]; i++)
1295 if (impfilename[i] == '/' || impfilename[i] == '\\')
1296 dll_filename = impfilename+1;
1297 }
1298 dll_symname = xstrdup (dll_filename);
1299 for (i=0; dll_symname[i]; i++)
1300 if (!isalnum (dll_symname[i]))
1301 dll_symname[i] = '_';
1302
1303 unlink (impfilename);
1304
1305 outarch = bfd_openw (impfilename, 0);
1306
1307 if (!outarch)
1308 {
1309 /* xgettext:c-format */
1310 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1311 return;
1312 }
1313
1314 /* xgettext:c-format */
1315 einfo (_("Creating library file: %s\n"), impfilename);
1316
1317 bfd_set_format (outarch, bfd_archive);
1318 outarch->has_armap = 1;
1319
1320 /* Work out a reasonable size of things to put onto one line. */
1321
1322 ar_head = make_head (outarch);
1323 ar_tail = make_tail (outarch);
1324
1325 if (ar_head == NULL || ar_tail == NULL)
1326 return;
1327
1328 for (i = 0; i<def->num_exports; i++)
1329 {
1330 bfd *n = make_one (def->exports+i, outarch);
1331 n->next = head;
1332 head = n;
1333 }
1334
1335 /* Now stick them all into the archive */
1336
1337 ar_head->next = head;
1338 ar_tail->next = ar_head;
1339 head = ar_tail;
1340
1341 if (! bfd_set_archive_head (outarch, head))
1342 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1343
1344 if (! bfd_close (outarch))
1345 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1346
1347 while (head != NULL)
1348 {
1349 bfd *n = head->next;
1350 bfd_close (head);
1351 head = n;
1352 }
1353
1354 unlink ("dh.o");
1355 unlink ("dt.o");
1356 for (i=0; i<tmp_seq; i++)
1357 {
1358 char buf[20];
1359 sprintf (buf, "ds%d.o", i);
1360 unlink (buf);
1361 }
1362 }
1363
1364 /************************************************************************
1365
1366 These are the main functions, called from the emulation. The first
1367 is called after the bfds are read, so we can guess at how much space
1368 we need. The second is called after everything is placed, so we
1369 can put the right values in place.
1370
1371 ************************************************************************/
1372
1373 void
1374 pe_dll_build_sections (abfd, info)
1375 bfd *abfd;
1376 struct bfd_link_info *info;
1377 {
1378 process_def_file (abfd, info);
1379
1380 generate_edata (abfd, info);
1381 build_filler_bfd ();
1382 }
1383
1384 void
1385 pe_dll_fill_sections (abfd, info)
1386 bfd *abfd;
1387 struct bfd_link_info *info;
1388 {
1389 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1390
1391 generate_reloc (abfd, info);
1392 if (reloc_sz > 0)
1393 {
1394 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1395
1396 /* Resize the sections. */
1397 lang_size_sections (stat_ptr->head, abs_output_section,
1398 &stat_ptr->head, 0, (bfd_vma) 0, false);
1399
1400 /* Redo special stuff. */
1401 ldemul_after_allocation ();
1402
1403 /* Do the assignments again. */
1404 lang_do_assignments (stat_ptr->head,
1405 abs_output_section,
1406 (fill_type) 0, (bfd_vma) 0);
1407 }
1408
1409 fill_edata (abfd, info);
1410
1411 pe_data (abfd)->dll = 1;
1412
1413 edata_s->contents = edata_d;
1414 reloc_s->contents = reloc_d;
1415 }
This page took 0.059331 seconds and 5 git commands to generate.