5afdfbbf7bedeee3ed7de759c2e24a2754c6f2dc
[binutils-gdb.git] / ld / pe-dll.c
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>
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 <time.h>
28 #include <ctype.h>
29
30 #include "ld.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include "ldwrite.h"
34 #include "ldmisc.h"
35 #include "ldgram.h"
36 #include "ldmain.h"
37 #include "ldemul.h"
38 #include "coff/internal.h"
39 #include "../bfd/libcoff.h"
40 #include "deffile.h"
41 #include "pe-dll.h"
42
43 /************************************************************************
44
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.
51
52 See also: ld/emultempl/pe.em
53
54 ************************************************************************/
55
56 /* for emultempl/pe.em */
57
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;
63
64 /************************************************************************
65
66 static variables and types
67
68 ************************************************************************/
69
70 static bfd_vma image_base;
71
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;
76
77 typedef struct {
78 char *target_name;
79 char *object_target;
80 unsigned int imagebase_reloc;
81 int pe_arch;
82 int bfd_arch;
83 int underscored;
84 } pe_details_type;
85
86 #define PE_ARCH_i386 1
87
88 static pe_details_type pe_detail_list[] = {
89 {
90 "pei-i386",
91 "pe-i386",
92 7 /* R_IMAGEBASE */,
93 PE_ARCH_i386,
94 bfd_arch_i386,
95 1
96 },
97 { NULL, NULL, 0, 0, 0, 0 }
98 };
99
100 static pe_details_type *pe_details;
101
102 #define U(str) (pe_details->underscored ? "_" str : str)
103
104 void
105 pe_dll_id_target (target)
106 const char *target;
107 {
108 int i;
109 for (i=0; pe_detail_list[i].target_name; i++)
110 if (strcmp (pe_detail_list[i].target_name, target) == 0)
111 {
112 pe_details = pe_detail_list+i;
113 return;
114 }
115 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
116 exit (1);
117 }
118
119 /************************************************************************
120
121 Helper functions for qsort. Relocs must be sorted so that we can write
122 them out by pages.
123
124 ************************************************************************/
125
126 typedef struct {
127 bfd_vma vma;
128 char type;
129 short extra;
130 } reloc_data_type;
131
132 static int
133 reloc_sort (va, vb)
134 const void *va, *vb;
135 {
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);
139 }
140
141 static int
142 pe_export_sort (va, vb)
143 const void *va, *vb;
144 {
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);
148 }
149
150 /************************************************************************
151
152 Read and process the .DEF file
153
154 ************************************************************************/
155
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. */
159
160 static bfd_vma *exported_symbol_offsets;
161 static struct sec **exported_symbol_sections;
162
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;
170
171 typedef struct exclude_list_struct
172 {
173 char *string;
174 struct exclude_list_struct *next;
175 }
176 exclude_list_struct;
177 static struct exclude_list_struct *excludes = 0;
178
179 void
180 pe_dll_add_excludes (new_excludes)
181 const char *new_excludes;
182 {
183 char *local_copy;
184 char *exclude_string;
185
186 local_copy = xstrdup (new_excludes);
187
188 exclude_string = strtok (local_copy, ",:");
189 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
190 {
191 struct exclude_list_struct *new_exclude;
192
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;
199 }
200
201 free (local_copy);
202 }
203
204 static int
205 auto_export (d, n)
206 def_file *d;
207 const char *n;
208 {
209 int i;
210 struct exclude_list_struct *ex;
211 for (i = 0; i < d->num_exports; i++)
212 if (strcmp (d->exports[i].name, n) == 0)
213 return 0;
214 if (pe_dll_do_default_excludes)
215 {
216 if (strcmp (n, "DllMain@12") == 0)
217 return 0;
218 if (strcmp (n, "DllEntryPoint@0") == 0)
219 return 0;
220 if (strcmp (n, "impure_ptr") == 0)
221 return 0;
222 }
223 for (ex = excludes; ex; ex = ex->next)
224 if (strcmp (n, ex->string) == 0)
225 return 0;
226 return 1;
227 }
228
229 static void
230 process_def_file (abfd, info)
231 bfd *abfd ATTRIBUTE_UNUSED;
232 struct bfd_link_info *info;
233 {
234 int i, j;
235 struct bfd_link_hash_entry *blhe;
236 bfd *b;
237 struct sec *s;
238 def_file_export *e=0;
239
240 if (!pe_def_file)
241 pe_def_file = def_file_empty ();
242
243 /* First, run around to all the objects looking for the .drectve
244 sections, and push those into the def file too */
245
246 for (b = info->input_bfds; b; b = b->link_next)
247 {
248 s = bfd_get_section_by_name (b, ".drectve");
249 if (s)
250 {
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);
255 free (buf);
256 }
257 }
258
259 /* Now, maybe export everything else the default way */
260
261 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
262 {
263 for (b = info->input_bfds; b; b = b->link_next)
264 {
265 asymbol **symbols;
266 int nsyms, symsize;
267
268 symsize = bfd_get_symtab_upper_bound (b);
269 symbols = (asymbol **) xmalloc (symsize);
270 nsyms = bfd_canonicalize_symtab (b, symbols);
271
272 for (j = 0; j < nsyms; j++)
273 {
274 if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
275 == (BSF_FUNCTION | BSF_GLOBAL))
276 {
277 const char *sn = symbols[j]->name;
278 if (*sn == '_')
279 sn++;
280 if (auto_export (pe_def_file, sn))
281 def_file_add_export (pe_def_file, sn, 0, -1);
282 }
283 }
284 }
285 }
286
287 #undef NE
288 #define NE pe_def_file->num_exports
289
290 /* Canonicalize the export list */
291
292 if (pe_dll_kill_ats)
293 {
294 for (i = 0; i < NE; i++)
295 {
296 if (strchr (pe_def_file->exports[i].name, '@'))
297 {
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;
303 }
304 }
305 }
306
307 if (pe_dll_stdcall_aliases)
308 {
309 for (i = 0; i < NE; i++)
310 {
311 if (strchr (pe_def_file->exports[i].name, '@'))
312 {
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);
318 else
319 free (tmp);
320 }
321 }
322 }
323
324 e = pe_def_file->exports; /* convenience, but watch out for it changing */
325
326 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
327 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
328
329 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
330 max_ordinal = 0;
331 min_ordinal = 65536;
332 count_exported = 0;
333 count_exported_byname = 0;
334 count_with_ordinals = 0;
335
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++)
338 {
339 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
340 {
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)
345 {
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);
349 }
350 else
351 {
352 /* xgettext:c-format */
353 einfo (_("Warning, duplicate EXPORT: %s\n"),
354 e[j - 1].name);
355 }
356 if (e[i].ordinal)
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;
362 }
363 else
364 {
365 if (i != j)
366 e[j] = e[i];
367 j++;
368 }
369 }
370 pe_def_file->num_exports = j; /* == NE */
371
372 for (i = 0; i < NE; i++)
373 {
374 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
375 if (pe_details->underscored)
376 {
377 *name = '_';
378 strcpy (name + 1, pe_def_file->exports[i].internal_name);
379 }
380 else
381 strcpy (name, pe_def_file->exports[i].internal_name);
382
383 blhe = bfd_link_hash_lookup (info->hash,
384 name,
385 false, false, true);
386
387 if (blhe && (blhe->type == bfd_link_hash_defined))
388 {
389 count_exported++;
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)
395 {
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++;
401 }
402 }
403 else if (blhe && blhe->type == bfd_link_hash_undefined)
404 {
405 /* xgettext:c-format */
406 einfo (_("%XCannot export %s: symbol not defined\n"),
407 pe_def_file->exports[i].internal_name);
408 }
409 else if (blhe)
410 {
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);
415 }
416 else
417 {
418 /* xgettext:c-format */
419 einfo (_("%XCannot export %s: symbol not found\n"),
420 pe_def_file->exports[i].internal_name);
421 }
422 free (name);
423 }
424 }
425
426 /************************************************************************
427
428 Build the bfd that will contain .edata and .reloc sections
429
430 ************************************************************************/
431
432 static void
433 build_filler_bfd (include_edata)
434 int include_edata;
435 {
436 lang_input_statement_type *filler_file;
437 filler_file = lang_add_input_file ("dll stuff",
438 lang_input_file_is_fake_enum,
439 NULL);
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)))
445 {
446 einfo ("%X%P: can not create BFD %E\n");
447 return;
448 }
449
450 if (include_edata)
451 {
452 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
453 if (edata_s == NULL
454 || !bfd_set_section_flags (filler_bfd, edata_s,
455 (SEC_HAS_CONTENTS
456 | SEC_ALLOC
457 | SEC_LOAD
458 | SEC_KEEP
459 | SEC_IN_MEMORY)))
460 {
461 einfo ("%X%P: can not create .edata section: %E\n");
462 return;
463 }
464 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
465 }
466
467 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
468 if (reloc_s == NULL
469 || !bfd_set_section_flags (filler_bfd, reloc_s,
470 (SEC_HAS_CONTENTS
471 | SEC_ALLOC
472 | SEC_LOAD
473 | SEC_KEEP
474 | SEC_IN_MEMORY)))
475 {
476 einfo ("%X%P: can not create .reloc section: %E\n");
477 return;
478 }
479 bfd_set_section_size (filler_bfd, reloc_s, 0);
480
481 ldlang_add_file (filler_file);
482 }
483
484 /************************************************************************
485
486 Gather all the exported symbols and build the .edata section
487
488 ************************************************************************/
489
490 static void
491 generate_edata (abfd, info)
492 bfd *abfd;
493 struct bfd_link_info *info ATTRIBUTE_UNUSED;
494 {
495 int i, next_ordinal;
496 int name_table_size = 0;
497 const char *dlnp;
498
499 /* First, we need to know how many exported symbols there are,
500 and what the range of ordinals is. */
501
502 if (pe_def_file->name)
503 {
504 dll_name = pe_def_file->name;
505 }
506 else
507 {
508 dll_name = abfd->filename;
509 for (dlnp = dll_name; *dlnp; dlnp++)
510 {
511 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
512 dll_name = dlnp + 1;
513 }
514 }
515
516 if (count_with_ordinals && max_ordinal > count_exported)
517 {
518 if (min_ordinal > max_ordinal - count_exported + 1)
519 min_ordinal = max_ordinal - count_exported + 1;
520 }
521 else
522 {
523 min_ordinal = 1;
524 max_ordinal = count_exported;
525 }
526 export_table_size = max_ordinal - min_ordinal + 1;
527
528 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
529 for (i = 0; i < export_table_size; i++)
530 exported_symbols[i] = -1;
531
532 /* Now we need to assign ordinals to those that don't have them */
533 for (i = 0; i < NE; i++)
534 {
535 if (exported_symbol_sections[i])
536 {
537 if (pe_def_file->exports[i].ordinal != -1)
538 {
539 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
540 int pi = exported_symbols[ei];
541 if (pi != -1)
542 {
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);
548 }
549 exported_symbols[ei] = i;
550 }
551 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
552 }
553 }
554
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)
559 {
560 while (exported_symbols[next_ordinal - min_ordinal] != -1)
561 next_ordinal++;
562 exported_symbols[next_ordinal - min_ordinal] = i;
563 pe_def_file->exports[i].ordinal = next_ordinal;
564 }
565
566 /* OK, now we can allocate some memory */
567
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);
573 }
574
575 static void
576 fill_edata (abfd, info)
577 bfd *abfd;
578 struct bfd_link_info *info ATTRIBUTE_UNUSED;
579 {
580 int i, hint;
581 unsigned char *edirectory;
582 unsigned long *eaddresses;
583 unsigned long *enameptrs;
584 unsigned short *eordinals;
585 unsigned char *enamestr;
586 time_t now;
587
588 time (&now);
589
590 edata_d = (unsigned char *) xmalloc (edata_sz);
591
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);
598
599 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
600
601 memset (edata_d, 0, 40);
602 bfd_put_32 (abfd, now, edata_d + 4);
603 if (pe_def_file->version_major != -1)
604 {
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);
607 }
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);
617
618 /* Ok, now for the filling in part */
619 hint = 0;
620 for (i = 0; i < export_table_size; i++)
621 {
622 int s = exported_symbols[i];
623 if (s != -1)
624 {
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);
629
630 bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
631 if (!pe_def_file->exports[s].flag_noname)
632 {
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);
638 enameptrs++;
639 pe_def_file->exports[s].hint = hint++;
640 }
641 eordinals++;
642 }
643 }
644 }
645
646 /************************************************************************
647
648 Gather all the relocations and build the .reloc section
649
650 ************************************************************************/
651
652 static void
653 generate_reloc (abfd, info)
654 bfd *abfd;
655 struct bfd_link_info *info;
656 {
657
658 /* for .reloc stuff */
659 reloc_data_type *reloc_data;
660 int total_relocs = 0;
661 int i;
662 unsigned long sec_page = (unsigned long) (-1);
663 unsigned long page_ptr, page_count;
664 int bi;
665 bfd *b;
666 struct sec *s;
667
668 total_relocs = 0;
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;
672
673 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
674
675 total_relocs = 0;
676 bi = 0;
677 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
678 {
679 arelent **relocs;
680 int relsize, nrelocs, i;
681
682 for (s = b->sections; s; s = s->next)
683 {
684 unsigned long sec_vma = s->output_section->vma + s->output_offset;
685 asymbol **symbols;
686 int nsyms, symsize;
687
688 /* if it's not loaded, we don't need to relocate it this way */
689 if (!(s->output_section->flags & SEC_LOAD))
690 continue;
691
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)
695 continue;
696
697 if (s->output_section->vma == 0)
698 {
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);
703 continue;
704 }
705
706 symsize = bfd_get_symtab_upper_bound (b);
707 symbols = (asymbol **) xmalloc (symsize);
708 nsyms = bfd_canonicalize_symtab (b, symbols);
709
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);
713
714 for (i = 0; i < nrelocs; i++)
715 {
716 if (!relocs[i]->howto->pc_relative
717 && relocs[i]->howto->type != pe_details->imagebase_reloc)
718 {
719 bfd_vma sym_vma;
720 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
721 sym_vma = (relocs[i]->addend
722 + sym->value
723 + sym->section->vma
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)
729 {
730 case 32000:
731 reloc_data[total_relocs].type = 3;
732 total_relocs++;
733 break;
734 default:
735 /* xgettext:c-format */
736 einfo (_("%XError: %d-bit reloc in dll\n"),
737 relocs[i]->howto->bitsize);
738 break;
739 }
740 }
741 }
742 free (relocs);
743 /* Warning: the allocated symbols are remembered in BFD and reused
744 later, so don't free them! */
745 /* free (symbols); */
746 }
747 }
748
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. */
752
753 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
754
755 for (i = 0; i < total_relocs; i++)
756 {
757 unsigned long this_page = (reloc_data[i].vma >> 12);
758 if (this_page != sec_page)
759 {
760 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
761 reloc_sz += 8;
762 sec_page = this_page;
763 }
764 reloc_sz += 2;
765 }
766 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
767
768 reloc_d = (unsigned char *) xmalloc (reloc_sz);
769
770 sec_page = (unsigned long) (-1);
771 reloc_sz = 0;
772 page_ptr = (unsigned long) (-1);
773 page_count = 0;
774 for (i = 0; i < total_relocs; i++)
775 {
776 unsigned long rva = reloc_data[i].vma - image_base;
777 unsigned long this_page = (rva & ~0xfff);
778 if (this_page != sec_page)
779 {
780 while (reloc_sz & 3)
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);
785 page_ptr = reloc_sz;
786 reloc_sz += 8;
787 sec_page = this_page;
788 page_count = 0;
789 }
790 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type<<12),
791 reloc_d + reloc_sz);
792 reloc_sz += 2;
793 if (reloc_data[i].type == 4)
794 {
795 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
796 reloc_sz += 2;
797 }
798 page_count++;
799 }
800 while (reloc_sz & 3)
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;
806 }
807
808 /************************************************************************
809
810 Given the exiting def_file structure, print out a .DEF file that
811 corresponds to it.
812
813 ************************************************************************/
814
815 static void
816 quoteput (s, f, needs_quotes)
817 char *s;
818 FILE * f;
819 int needs_quotes;
820 {
821 char *cp;
822 for (cp = s; *cp; cp++)
823 if (*cp == '\''
824 || *cp == '"'
825 || *cp == '\\'
826 || isspace ((unsigned char) *cp)
827 || *cp == ','
828 || *cp == ';')
829 needs_quotes = 1;
830 if (needs_quotes)
831 {
832 putc ('"', f);
833 while (*s)
834 {
835 if (*s == '"' || *s == '\\')
836 putc ('\\', f);
837 putc (*s, f);
838 s++;
839 }
840 putc ('"', f);
841 }
842 else
843 fputs (s, f);
844 }
845
846 void
847 pe_dll_generate_def_file (pe_out_def_filename)
848 const char *pe_out_def_filename;
849 {
850 int i;
851 FILE *out = fopen (pe_out_def_filename, "w");
852 if (out == NULL)
853 {
854 /* xgettext:c-format */
855 einfo (_("%s: Can't open output def file %s\n"),
856 program_name, pe_out_def_filename);
857 }
858
859 if (pe_def_file)
860 {
861 if (pe_def_file->name)
862 {
863 if (pe_def_file->is_dll)
864 fprintf (out, "LIBRARY ");
865 else
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);
871 fprintf (out, "\n");
872 }
873
874 if (pe_def_file->description)
875 {
876 fprintf (out, "DESCRIPTION ");
877 quoteput (pe_def_file->description, out, 1);
878 fprintf (out, "\n");
879 }
880
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);
886
887 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
888 fprintf (out, "\n");
889
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);
900
901 if (pe_def_file->num_section_defs > 0)
902 {
903 fprintf (out, "\nSECTIONS\n\n");
904 for (i = 0; i < pe_def_file->num_section_defs; i++)
905 {
906 fprintf (out, " ");
907 quoteput (pe_def_file->section_defs[i].name, out, 0);
908 if (pe_def_file->section_defs[i].class)
909 {
910 fprintf (out, " CLASS ");
911 quoteput (pe_def_file->section_defs[i].class, out, 0);
912 }
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");
921 fprintf (out, "\n");
922 }
923 }
924
925 if (pe_def_file->num_exports > 0)
926 {
927 fprintf (out, "\nEXPORTS\n\n");
928 for (i = 0; i < pe_def_file->num_exports; i++)
929 {
930 def_file_export *e = pe_def_file->exports + i;
931 fprintf (out, " ");
932 quoteput (e->name, out, 0);
933 if (e->internal_name && strcmp (e->internal_name, e->name))
934 {
935 fprintf (out, " = ");
936 quoteput (e->internal_name, out, 0);
937 }
938 if (e->ordinal != -1)
939 fprintf (out, " @%d", e->ordinal);
940 if (e->flag_private)
941 fprintf (out, " PRIVATE");
942 if (e->flag_constant)
943 fprintf (out, " CONSTANT");
944 if (e->flag_noname)
945 fprintf (out, " NONAME");
946 if (e->flag_data)
947 fprintf (out, " DATA");
948
949 fprintf (out, "\n");
950 }
951 }
952
953 if (pe_def_file->num_imports > 0)
954 {
955 fprintf (out, "\nIMPORTS\n\n");
956 for (i = 0; i < pe_def_file->num_imports; i++)
957 {
958 def_file_import *im = pe_def_file->imports + i;
959 fprintf (out, " ");
960 if (im->internal_name
961 && (!im->name || strcmp (im->internal_name, im->name)))
962 {
963 quoteput (im->internal_name, out, 0);
964 fprintf (out, " = ");
965 }
966 quoteput (im->module->name, out, 0);
967 fprintf (out, ".");
968 if (im->name)
969 quoteput (im->name, out, 0);
970 else
971 fprintf (out, "%d", im->ordinal);
972 fprintf (out, "\n");
973 }
974 }
975 }
976 else
977 fprintf (out, _("; no contents available\n"));
978
979 if (fclose (out) == EOF)
980 {
981 /* xgettext:c-format */
982 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
983 }
984 }
985
986 /************************************************************************
987
988 Generate the import library
989
990 ************************************************************************/
991
992 static asymbol **symtab;
993 static int symptr;
994 static int tmp_seq;
995 static const char *dll_filename;
996 static char *dll_symname;
997
998 #define UNDSEC (asection *) &bfd_und_section
999
1000 static asection *
1001 quick_section(abfd, name, flags, align)
1002 bfd *abfd;
1003 const char *name;
1004 int flags;
1005 int align;
1006 {
1007 asection *sec;
1008 asymbol *sym;
1009
1010 sec = bfd_make_section_old_way (abfd, name);
1011 bfd_set_section_flags (abfd, sec, flags
1012 | SEC_ALLOC
1013 | SEC_LOAD
1014 | SEC_KEEP
1015 );
1016 bfd_set_section_alignment (abfd, sec, align);
1017 /* remember to undo this before trying to link internally! */
1018 sec->output_section = sec;
1019
1020 sym = bfd_make_empty_symbol (abfd);
1021 symtab[symptr++] = sym;
1022 sym->name = sec->name;
1023 sym->section = sec;
1024 sym->flags = BSF_LOCAL;
1025 sym->value = 0;
1026
1027 return sec;
1028 }
1029
1030 static void
1031 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1032 bfd *abfd;
1033 char *n1;
1034 char *n2;
1035 char *n3;
1036 asection *sec;
1037 int flags;
1038 int addr;
1039 {
1040 asymbol *sym;
1041 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1042 strcpy (name, n1);
1043 strcat (name, n2);
1044 strcat (name, n3);
1045 sym = bfd_make_empty_symbol (abfd);
1046 sym->name = name;
1047 sym->section = sec;
1048 sym->flags = flags;
1049 sym->value = addr;
1050 symtab[symptr++] = sym;
1051 }
1052
1053 static arelent *reltab = 0;
1054 static int relcount = 0, relsize = 0;
1055
1056 static void
1057 quick_reloc (abfd, address, which_howto, symidx)
1058 bfd *abfd;
1059 int address;
1060 int which_howto;
1061 int symidx;
1062 {
1063 if (relcount >= (relsize-1))
1064 {
1065 relsize += 10;
1066 if (reltab)
1067 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1068 else
1069 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1070 }
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;
1075 relcount++;
1076 }
1077
1078 static void
1079 save_relocs (asection *sec)
1080 {
1081 int i;
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;
1089 reltab = 0;
1090 relcount = relsize = 0;
1091 }
1092
1093 /*
1094 * .section .idata$2
1095 * .global __head_my_dll
1096 * __head_my_dll:
1097 * .rva hname
1098 * .long 0
1099 * .long 0
1100 * .rva __my_dll_iname
1101 * .rva fthunk
1102 *
1103 * .section .idata$5
1104 * .long 0
1105 * fthunk:
1106 *
1107 * .section .idata$4
1108 * .long 0
1109 * hname:
1110 */
1111
1112 static bfd *
1113 make_head (parent)
1114 bfd *parent;
1115 {
1116 asection *id2, *id5, *id4;
1117 unsigned char *d2, *d5, *d4;
1118 char *oname;
1119 bfd *abfd;
1120
1121 oname = (char *) xmalloc (20);
1122 sprintf (oname, "d%06d.o", tmp_seq);
1123 tmp_seq++;
1124
1125 abfd = bfd_create (oname, parent);
1126 bfd_find_target (pe_details->object_target, abfd);
1127 bfd_make_writable (abfd);
1128
1129 bfd_set_format (abfd, bfd_object);
1130 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1131
1132 symptr = 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);
1139
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. */
1145
1146 bfd_set_section_size (abfd, id2, 20);
1147 d2 = (unsigned char *) xmalloc (20);
1148 id2->contents = d2;
1149 memset (d2, 0, 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);
1154 save_relocs (id2);
1155
1156 bfd_set_section_size (abfd, id5, 4);
1157 d5 = (unsigned char *) xmalloc (4);
1158 id5->contents = d5;
1159 memset (d5, 0, 4);
1160
1161 bfd_set_section_size (abfd, id4, 4);
1162 d4 = (unsigned char *) xmalloc (4);
1163 id4->contents = d4;
1164 memset (d4, 0, 4);
1165
1166 bfd_set_symtab (abfd, symtab, symptr);
1167
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);
1171
1172 bfd_make_readable (abfd);
1173 return abfd;
1174 }
1175
1176 /*
1177 * .section .idata$4
1178 * .long 0
1179 * .section .idata$5
1180 * .long 0
1181 * .section idata$7
1182 * .global __my_dll_iname
1183 *__my_dll_iname:
1184 * .asciz "my.dll"
1185 */
1186
1187 static bfd *
1188 make_tail (parent)
1189 bfd *parent;
1190 {
1191 asection *id4, *id5, *id7;
1192 unsigned char *d4, *d5, *d7;
1193 int len;
1194 char *oname;
1195 bfd *abfd;
1196
1197 oname = (char *) xmalloc (20);
1198 sprintf (oname, "d%06d.o", tmp_seq);
1199 tmp_seq++;
1200
1201 abfd = bfd_create (oname, parent);
1202 bfd_find_target (pe_details->object_target, abfd);
1203 bfd_make_writable (abfd);
1204
1205 bfd_set_format (abfd, bfd_object);
1206 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1207
1208 symptr = 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);
1214
1215 bfd_set_section_size (abfd, id4, 4);
1216 d4 = (unsigned char *) xmalloc (4);
1217 id4->contents = d4;
1218 memset (d4, 0, 4);
1219
1220 bfd_set_section_size (abfd, id5, 4);
1221 d5 = (unsigned char *) xmalloc (4);
1222 id5->contents = d5;
1223 memset (d5, 0, 4);
1224
1225 len = strlen (dll_filename)+1;
1226 if (len & 1)
1227 len ++;
1228 bfd_set_section_size (abfd, id7, len);
1229 d7 = (unsigned char *) xmalloc (len);
1230 id7->contents = d7;
1231 strcpy (d7, dll_filename);
1232
1233 bfd_set_symtab (abfd, symtab, symptr);
1234
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);
1238
1239 bfd_make_readable (abfd);
1240 return abfd;
1241 }
1242
1243 /*
1244 * .text
1245 * .global _function
1246 * .global ___imp_function
1247 * .global __imp__function
1248 *_function:
1249 * jmp *__imp__function:
1250 *
1251 * .section idata$7
1252 * .long __head_my_dll
1253 *
1254 * .section .idata$5
1255 *___imp_function:
1256 *__imp__function:
1257 *iat?
1258 * .section .idata$4
1259 *iat?
1260 * .section .idata$6
1261 *ID<ordinal>:
1262 * .short <hint>
1263 * .asciz "function" xlate? (add underscore, kill at)
1264 */
1265
1266 static unsigned char jmp_ix86_bytes[] = {
1267 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1268 };
1269
1270
1271 static bfd *
1272 make_one (exp, parent)
1273 def_file_export *exp;
1274 bfd *parent;
1275 {
1276 asection *tx, *id7, *id5, *id4, *id6;
1277 unsigned char *td, *d7, *d5, *d4, *d6;
1278 int len;
1279 char *oname;
1280 bfd *abfd;
1281 unsigned char *jmp_bytes;
1282 int jmp_byte_count;
1283
1284 switch (pe_details->pe_arch)
1285 {
1286 case PE_ARCH_i386:
1287 jmp_bytes = jmp_ix86_bytes;
1288 jmp_byte_count = sizeof (jmp_ix86_bytes);
1289 break;
1290 }
1291
1292 oname = (char *) xmalloc (20);
1293 sprintf (oname, "d%06d.o", tmp_seq);
1294 tmp_seq++;
1295
1296 abfd = bfd_create (oname, parent);
1297 bfd_find_target (pe_details->object_target, abfd);
1298 bfd_make_writable (abfd);
1299
1300 bfd_set_format (abfd, bfd_object);
1301 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1302
1303 symptr = 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 quick_symbol (abfd, U(""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1311 quick_symbol (abfd, U("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1312 quick_symbol (abfd, U("__imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1313 quick_symbol (abfd, U("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1314
1315 bfd_set_section_size (abfd, tx, jmp_byte_count);
1316 td = (unsigned char *) xmalloc (jmp_byte_count);
1317 tx->contents = td;
1318 memcpy (td, jmp_bytes, jmp_byte_count);
1319 switch (pe_details->pe_arch)
1320 {
1321 case PE_ARCH_i386:
1322 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1323 break;
1324 }
1325 save_relocs (tx);
1326
1327 bfd_set_section_size (abfd, id7, 4);
1328 d7 = (unsigned char *) xmalloc (4);
1329 id7->contents = d7;
1330 memset (d7, 0, 4);
1331 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1332 save_relocs (id7);
1333
1334 bfd_set_section_size (abfd, id5, 4);
1335 d5 = (unsigned char *) xmalloc (4);
1336 id5->contents = d5;
1337 memset (d5, 0, 4);
1338 if (exp->flag_noname)
1339 {
1340 d5[0] = exp->ordinal;
1341 d5[1] = exp->ordinal >> 8;
1342 d5[3] = 0x80;
1343 }
1344 else
1345 {
1346 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1347 save_relocs (id5);
1348 }
1349
1350 bfd_set_section_size (abfd, id4, 4);
1351 d4 = (unsigned char *) xmalloc (4);
1352 id4->contents = d4;
1353 memset (d4, 0, 4);
1354 if (exp->flag_noname)
1355 {
1356 d5[0] = exp->ordinal;
1357 d5[1] = exp->ordinal >> 8;
1358 d5[3] = 0x80;
1359 }
1360 else
1361 {
1362 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1363 save_relocs (id4);
1364 }
1365
1366 if (exp->flag_noname)
1367 {
1368 len = 0;
1369 bfd_set_section_size (abfd, id6, 0);
1370 }
1371 else
1372 {
1373 len = strlen (exp->name) + 3;
1374 if (len & 1)
1375 len++;
1376 bfd_set_section_size (abfd, id6, len);
1377 d6 = (unsigned char *) xmalloc (len);
1378 id6->contents = d6;
1379 memset (d6, 0, len);
1380 d6[0] = exp->hint & 0xff;
1381 d6[1] = exp->hint >> 8;
1382 strcpy (d6+2, exp->name);
1383 }
1384
1385 bfd_set_symtab (abfd, symtab, symptr);
1386
1387 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1388 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1389 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1390 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1391 if (!exp->flag_noname)
1392 bfd_set_section_contents (abfd, id6, d6, 0, len);
1393
1394 bfd_make_readable (abfd);
1395 return abfd;
1396 }
1397
1398 void
1399 pe_dll_generate_implib (def, impfilename)
1400 def_file *def;
1401 const char *impfilename;
1402 {
1403 int i;
1404 bfd *ar_head;
1405 bfd *ar_tail;
1406 bfd *outarch;
1407 bfd *head = 0;
1408
1409 dll_filename = def->name;
1410 if (dll_filename == 0)
1411 {
1412 dll_filename = dll_name;
1413 for (i=0; impfilename[i]; i++)
1414 if (impfilename[i] == '/' || impfilename[i] == '\\')
1415 dll_filename = impfilename+1;
1416 }
1417 dll_symname = xstrdup (dll_filename);
1418 for (i=0; dll_symname[i]; i++)
1419 if (!isalnum ((unsigned char) dll_symname[i]))
1420 dll_symname[i] = '_';
1421
1422 unlink (impfilename);
1423
1424 outarch = bfd_openw (impfilename, 0);
1425
1426 if (!outarch)
1427 {
1428 /* xgettext:c-format */
1429 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1430 return;
1431 }
1432
1433 /* xgettext:c-format */
1434 einfo (_("Creating library file: %s\n"), impfilename);
1435
1436 bfd_set_format (outarch, bfd_archive);
1437 outarch->has_armap = 1;
1438
1439 /* Work out a reasonable size of things to put onto one line. */
1440
1441 ar_head = make_head (outarch);
1442
1443 for (i = 0; i<def->num_exports; i++)
1444 {
1445 /* The import library doesn't know about the internal name */
1446 char *internal = def->exports[i].internal_name;
1447 bfd *n;
1448 def->exports[i].internal_name = def->exports[i].name;
1449 n = make_one (def->exports+i, outarch);
1450 n->next = head;
1451 head = n;
1452 def->exports[i].internal_name = internal;
1453 }
1454
1455 ar_tail = make_tail (outarch);
1456
1457 if (ar_head == NULL || ar_tail == NULL)
1458 return;
1459
1460 /* Now stick them all into the archive */
1461
1462 ar_head->next = head;
1463 ar_tail->next = ar_head;
1464 head = ar_tail;
1465
1466 if (! bfd_set_archive_head (outarch, head))
1467 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1468
1469 if (! bfd_close (outarch))
1470 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1471
1472 while (head != NULL)
1473 {
1474 bfd *n = head->next;
1475 bfd_close (head);
1476 head = n;
1477 }
1478 }
1479
1480 static void
1481 add_bfd_to_link (abfd, name, link_info)
1482 bfd *abfd;
1483 char *name;
1484 struct bfd_link_info *link_info;
1485 {
1486 lang_input_statement_type *fake_file;
1487 fake_file = lang_add_input_file (name,
1488 lang_input_file_is_fake_enum,
1489 NULL);
1490 fake_file->the_bfd = abfd;
1491 ldlang_add_file (fake_file);
1492 if (!bfd_link_add_symbols (abfd, link_info))
1493 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
1494 }
1495
1496 void
1497 pe_process_import_defs (output_bfd, link_info)
1498 bfd *output_bfd;
1499 struct bfd_link_info *link_info;
1500 {
1501 def_file_module *module;
1502 pe_dll_id_target(bfd_get_target (output_bfd));
1503
1504 if (!pe_def_file)
1505 return;
1506
1507 for (module = pe_def_file->modules; module; module = module->next)
1508 {
1509 int i, do_this_dll;
1510
1511 dll_filename = module->name;
1512 dll_symname = xstrdup (module->name);
1513 for (i=0; dll_symname[i]; i++)
1514 if (!isalnum (dll_symname[i]))
1515 dll_symname[i] = '_';
1516
1517 do_this_dll = 0;
1518
1519 for (i=0; i<pe_def_file->num_imports; i++)
1520 if (pe_def_file->imports[i].module == module)
1521 {
1522 def_file_export exp;
1523 struct bfd_link_hash_entry *blhe;
1524
1525 /* see if we need this import */
1526 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2);
1527 sprintf (name, "%s%s", U(""), pe_def_file->imports[i].internal_name);
1528 blhe = bfd_link_hash_lookup (link_info->hash, name,
1529 false, false, false);
1530 free (name);
1531 if (blhe && blhe->type == bfd_link_hash_undefined)
1532 {
1533 bfd *one;
1534 /* we do */
1535 if (!do_this_dll)
1536 {
1537 bfd *ar_head = make_head (output_bfd);
1538 add_bfd_to_link (ar_head, ar_head->filename, link_info);
1539 do_this_dll = 1;
1540 }
1541 exp.internal_name = pe_def_file->imports[i].internal_name;
1542 exp.name = pe_def_file->imports[i].name;
1543 exp.ordinal = pe_def_file->imports[i].ordinal;
1544 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
1545 exp.flag_private = 0;
1546 exp.flag_constant = 0;
1547 exp.flag_data = 0;
1548 exp.flag_noname = exp.name ? 0 : 1;
1549 one = make_one (&exp, output_bfd);
1550 add_bfd_to_link (one, one->filename, link_info);
1551 }
1552 }
1553 if (do_this_dll)
1554 {
1555 bfd *ar_tail = make_tail (output_bfd);
1556 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
1557 }
1558
1559 free (dll_symname);
1560 }
1561 }
1562
1563 /************************************************************************
1564
1565 We were handed a *.DLL file. Parse it and turn it into a set of
1566 IMPORTS directives in the def file. Return true if the file was
1567 handled, false if not.
1568
1569 ************************************************************************/
1570
1571 static unsigned int
1572 pe_get16 (abfd, where)
1573 bfd *abfd;
1574 int where;
1575 {
1576 unsigned char b[2];
1577 bfd_seek (abfd, where, SEEK_SET);
1578 bfd_read (b, 1, 2, abfd);
1579 return b[0] + (b[1]<<8);
1580 }
1581
1582 static unsigned int
1583 pe_get32 (abfd, where)
1584 bfd *abfd;
1585 int where;
1586 {
1587 unsigned char b[4];
1588 bfd_seek (abfd, where, SEEK_SET);
1589 bfd_read (b, 1, 4, abfd);
1590 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1591 }
1592
1593 #if 0 /* This is not currently used. */
1594
1595 static unsigned int
1596 pe_as16 (ptr)
1597 void *ptr;
1598 {
1599 unsigned char *b = ptr;
1600 return b[0] + (b[1]<<8);
1601 }
1602
1603 #endif
1604
1605 static unsigned int
1606 pe_as32 (ptr)
1607 void *ptr;
1608 {
1609 unsigned char *b = ptr;
1610 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1611 }
1612
1613 boolean
1614 pe_implied_import_dll (filename)
1615 const char *filename;
1616 {
1617 bfd *dll;
1618 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
1619 unsigned long export_rva, export_size, nsections, secptr, expptr;
1620 unsigned char *expdata, *erva;
1621 unsigned long name_rvas, ordinals, nexp, ordbase;
1622 const char *dll_name;
1623
1624 /* No, I can't use bfd here. kernel32.dll puts its export table in
1625 the middle of the .rdata section. */
1626
1627 dll = bfd_openr (filename, pe_details->target_name);
1628 if (!dll)
1629 {
1630 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
1631 return false;
1632 }
1633 /* PEI dlls seem to be bfd_objects */
1634 if (!bfd_check_format (dll, bfd_object))
1635 {
1636 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
1637 return false;
1638 }
1639
1640 dll_name = filename;
1641 for (i=0; filename[i]; i++)
1642 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
1643 dll_name = filename + i + 1;
1644
1645 pe_header_offset = pe_get32 (dll, 0x3c);
1646 opthdr_ofs = pe_header_offset + 4 + 20;
1647 num_entries = pe_get32 (dll, opthdr_ofs + 92);
1648 if (num_entries < 1) /* no exports */
1649 return false;
1650 export_rva = pe_get32 (dll, opthdr_ofs + 96);
1651 export_size = pe_get32 (dll, opthdr_ofs + 100);
1652 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
1653 secptr = (pe_header_offset + 4 + 20 +
1654 pe_get16 (dll, pe_header_offset + 4 + 16));
1655 expptr = 0;
1656 for (i=0; i<nsections; i++)
1657 {
1658 char sname[8];
1659 unsigned long secptr1 = secptr + 40 * i;
1660 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
1661 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
1662 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
1663 bfd_seek(dll, secptr1, SEEK_SET);
1664 bfd_read(sname, 1, 8, dll);
1665 if (vaddr <= export_rva && vaddr+vsize > export_rva)
1666 {
1667 expptr = fptr + (export_rva - vaddr);
1668 if (export_rva + export_size > vaddr + vsize)
1669 export_size = vsize - (export_rva - vaddr);
1670 break;
1671 }
1672 }
1673
1674 expdata = (unsigned char *) xmalloc (export_size);
1675 bfd_seek (dll, expptr, SEEK_SET);
1676 bfd_read (expdata, 1, export_size, dll);
1677 erva = expdata - export_rva;
1678
1679 if (pe_def_file == 0)
1680 pe_def_file = def_file_empty();
1681
1682 nexp = pe_as32 (expdata+24);
1683 name_rvas = pe_as32 (expdata+32);
1684 ordinals = pe_as32 (expdata+36);
1685 ordbase = pe_as32 (expdata+16);
1686 for (i=0; i<nexp; i++)
1687 {
1688 unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
1689 def_file_import *imp;
1690 imp = def_file_add_import (pe_def_file, erva+name_rva, dll_name,
1691 i, 0);
1692 }
1693
1694 return true;
1695 }
1696
1697 /************************************************************************
1698
1699 These are the main functions, called from the emulation. The first
1700 is called after the bfds are read, so we can guess at how much space
1701 we need. The second is called after everything is placed, so we
1702 can put the right values in place.
1703
1704 ************************************************************************/
1705
1706 void
1707 pe_dll_build_sections (abfd, info)
1708 bfd *abfd;
1709 struct bfd_link_info *info;
1710 {
1711 pe_dll_id_target (bfd_get_target (abfd));
1712 process_def_file (abfd, info);
1713
1714 generate_edata (abfd, info);
1715 build_filler_bfd (1);
1716 }
1717
1718 void
1719 pe_exe_build_sections (abfd, info)
1720 bfd *abfd;
1721 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1722 {
1723 pe_dll_id_target (bfd_get_target (abfd));
1724 build_filler_bfd (0);
1725 }
1726
1727 void
1728 pe_dll_fill_sections (abfd, info)
1729 bfd *abfd;
1730 struct bfd_link_info *info;
1731 {
1732 pe_dll_id_target (bfd_get_target (abfd));
1733 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1734
1735 generate_reloc (abfd, info);
1736 if (reloc_sz > 0)
1737 {
1738 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1739
1740 /* Resize the sections. */
1741 lang_size_sections (stat_ptr->head, abs_output_section,
1742 &stat_ptr->head, 0, (bfd_vma) 0, false);
1743
1744 /* Redo special stuff. */
1745 ldemul_after_allocation ();
1746
1747 /* Do the assignments again. */
1748 lang_do_assignments (stat_ptr->head,
1749 abs_output_section,
1750 (fill_type) 0, (bfd_vma) 0);
1751 }
1752
1753 fill_edata (abfd, info);
1754
1755 pe_data (abfd)->dll = 1;
1756
1757 edata_s->contents = edata_d;
1758 reloc_s->contents = reloc_d;
1759 }
1760
1761 void
1762 pe_exe_fill_sections (abfd, info)
1763 bfd *abfd;
1764 struct bfd_link_info *info;
1765 {
1766 pe_dll_id_target (bfd_get_target (abfd));
1767 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1768
1769 generate_reloc (abfd, info);
1770 if (reloc_sz > 0)
1771 {
1772 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1773
1774 /* Resize the sections. */
1775 lang_size_sections (stat_ptr->head, abs_output_section,
1776 &stat_ptr->head, 0, (bfd_vma) 0, false);
1777
1778 /* Redo special stuff. */
1779 ldemul_after_allocation ();
1780
1781 /* Do the assignments again. */
1782 lang_do_assignments (stat_ptr->head,
1783 abs_output_section,
1784 (fill_type) 0, (bfd_vma) 0);
1785 }
1786 reloc_s->contents = reloc_d;
1787 }