2000-10-09 Kazu Hirata <kazu@hxi.com>
[deliverable/binutils-gdb.git] / ld / pe-dll.c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
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 "ldfile.h"
38 #include "ldemul.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
41 #include "deffile.h"
42 #include "pe-dll.h"
43
44 /************************************************************************
45
46 This file turns a regular Windows PE image into a DLL. Because of
47 the complexity of this operation, it has been broken down into a
48 number of separate modules which are all called by the main function
49 at the end of this file. This function is not re-entrant and is
50 normally only called once, so static variables are used to reduce
51 the number of parameters and return values required.
52
53 See also: ld/emultempl/pe.em
54
55 ************************************************************************/
56
57 /* for emultempl/pe.em */
58
59 def_file *pe_def_file = 0;
60 int pe_dll_export_everything = 0;
61 int pe_dll_do_default_excludes = 1;
62 int pe_dll_kill_ats = 0;
63 int pe_dll_stdcall_aliases = 0;
64 int pe_dll_warn_dup_exports = 0;
65 int pe_dll_compat_implib = 0;
66
67 /************************************************************************
68
69 static variables and types
70
71 ************************************************************************/
72
73 static bfd_vma image_base;
74
75 static bfd *filler_bfd;
76 static struct sec *edata_s, *reloc_s;
77 static unsigned char *edata_d, *reloc_d;
78 static size_t edata_sz, reloc_sz;
79
80 typedef struct {
81 char *target_name;
82 char *object_target;
83 unsigned int imagebase_reloc;
84 int pe_arch;
85 int bfd_arch;
86 int underscored;
87 } pe_details_type;
88
89 #define PE_ARCH_i386 1
90 #define PE_ARCH_sh 2
91 #define PE_ARCH_mips 3
92 #define PE_ARCH_arm 4
93
94 static pe_details_type pe_detail_list[] = {
95 {
96 "pei-i386",
97 "pe-i386",
98 7 /* R_IMAGEBASE */,
99 PE_ARCH_i386,
100 bfd_arch_i386,
101 1
102 },
103 {
104 "pei-shl",
105 "pe-shl",
106 16 /* R_SH_IMAGEBASE */,
107 PE_ARCH_sh,
108 bfd_arch_sh,
109 1
110 },
111 {
112 "pei-mips",
113 "pe-mips",
114 34 /* MIPS_R_RVA */,
115 PE_ARCH_mips,
116 bfd_arch_mips,
117 0
118 },
119 {
120 "pei-arm-little",
121 "pe-arm-little",
122 11 /* ARM_RVA32 */,
123 PE_ARCH_arm,
124 bfd_arch_arm,
125 0
126 },
127 { NULL, NULL, 0, 0, 0, 0 }
128 };
129
130 static pe_details_type *pe_details;
131
132 #define U(str) (pe_details->underscored ? "_" str : str)
133
134 void
135 pe_dll_id_target (target)
136 const char *target;
137 {
138 int i;
139 for (i = 0; pe_detail_list[i].target_name; i++)
140 if (strcmp (pe_detail_list[i].target_name, target) == 0
141 || strcmp (pe_detail_list[i].object_target, target) == 0)
142 {
143 pe_details = pe_detail_list + i;
144 return;
145 }
146 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
147 exit (1);
148 }
149
150 /************************************************************************
151
152 Helper functions for qsort. Relocs must be sorted so that we can write
153 them out by pages.
154
155 ************************************************************************/
156
157 typedef struct {
158 bfd_vma vma;
159 char type;
160 short extra;
161 } reloc_data_type;
162
163 static int
164 reloc_sort (va, vb)
165 const void *va, *vb;
166 {
167 bfd_vma a = ((reloc_data_type *) va)->vma;
168 bfd_vma b = ((reloc_data_type *) vb)->vma;
169 return (a > b) ? 1 : ((a < b) ? -1 : 0);
170 }
171
172 static int
173 pe_export_sort (va, vb)
174 const void *va, *vb;
175 {
176 def_file_export *a = (def_file_export *) va;
177 def_file_export *b = (def_file_export *) vb;
178 return strcmp (a->name, b->name);
179 }
180
181 /************************************************************************
182
183 Read and process the .DEF file
184
185 ************************************************************************/
186
187 /* These correspond to the entries in pe_def_file->exports[]. I use
188 exported_symbol_sections[i] to tag whether or not the symbol was
189 defined, since we can't export symbols we don't have. */
190
191 static bfd_vma *exported_symbol_offsets;
192 static struct sec **exported_symbol_sections;
193
194 static int export_table_size;
195 static int count_exported;
196 static int count_exported_byname;
197 static int count_with_ordinals;
198 static const char *dll_name;
199 static int min_ordinal, max_ordinal;
200 static int *exported_symbols;
201
202 typedef struct exclude_list_struct {
203 char *string;
204 struct exclude_list_struct *next;
205 } exclude_list_struct;
206
207 static struct exclude_list_struct *excludes = 0;
208
209 void
210 pe_dll_add_excludes (new_excludes)
211 const char *new_excludes;
212 {
213 char *local_copy;
214 char *exclude_string;
215
216 local_copy = xstrdup (new_excludes);
217
218 exclude_string = strtok (local_copy, ",:");
219 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
220 {
221 struct exclude_list_struct *new_exclude;
222
223 new_exclude = ((struct exclude_list_struct *)
224 xmalloc (sizeof (struct exclude_list_struct)));
225 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
226 strcpy (new_exclude->string, exclude_string);
227 new_exclude->next = excludes;
228 excludes = new_exclude;
229 }
230
231 free (local_copy);
232 }
233
234 static int
235 auto_export (d, n)
236 def_file *d;
237 const char *n;
238 {
239 int i;
240 struct exclude_list_struct *ex;
241 for (i = 0; i < d->num_exports; i++)
242 if (strcmp (d->exports[i].name, n) == 0)
243 return 0;
244 if (pe_dll_do_default_excludes)
245 {
246 if (strcmp (n, "DllMain@12") == 0)
247 return 0;
248 if (strcmp (n, "DllEntryPoint@0") == 0)
249 return 0;
250 if (strcmp (n, "impure_ptr") == 0)
251 return 0;
252 }
253 for (ex = excludes; ex; ex = ex->next)
254 if (strcmp (n, ex->string) == 0)
255 return 0;
256 return 1;
257 }
258
259 static void
260 process_def_file (abfd, info)
261 bfd *abfd ATTRIBUTE_UNUSED;
262 struct bfd_link_info *info;
263 {
264 int i, j;
265 struct bfd_link_hash_entry *blhe;
266 bfd *b;
267 struct sec *s;
268 def_file_export *e = 0;
269
270 if (!pe_def_file)
271 pe_def_file = def_file_empty ();
272
273 /* First, run around to all the objects looking for the .drectve
274 sections, and push those into the def file too. */
275
276 for (b = info->input_bfds; b; b = b->link_next)
277 {
278 s = bfd_get_section_by_name (b, ".drectve");
279 if (s)
280 {
281 int size = bfd_get_section_size_before_reloc (s);
282 char *buf = xmalloc (size);
283 bfd_get_section_contents (b, s, buf, 0, size);
284 def_file_add_directive (pe_def_file, buf, size);
285 free (buf);
286 }
287 }
288
289 /* Now, maybe export everything else the default way. */
290
291 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
292 {
293 for (b = info->input_bfds; b; b = b->link_next)
294 {
295 asymbol **symbols;
296 int nsyms, symsize;
297
298 symsize = bfd_get_symtab_upper_bound (b);
299 symbols = (asymbol **) xmalloc (symsize);
300 nsyms = bfd_canonicalize_symtab (b, symbols);
301
302 for (j = 0; j < nsyms; j++)
303 {
304 /* We should export symbols which are either global or not
305 anything at all. (.bss data is the latter) */
306 if ((symbols[j]->flags & BSF_GLOBAL)
307 || (symbols[j]->flags == BSF_NO_FLAGS))
308 {
309 const char *sn = symbols[j]->name;
310 if (*sn == '_')
311 sn++;
312 if (auto_export (pe_def_file, sn))
313 def_file_add_export (pe_def_file, sn, 0, -1);
314 }
315 }
316 }
317 }
318
319 #undef NE
320 #define NE pe_def_file->num_exports
321
322 /* Canonicalize the export list. */
323
324 if (pe_dll_kill_ats)
325 {
326 for (i = 0; i < NE; i++)
327 {
328 if (strchr (pe_def_file->exports[i].name, '@'))
329 {
330 /* This will preserve internal_name, which may have been
331 pointing to the same memory as name, or might not
332 have. */
333 char *tmp = xstrdup (pe_def_file->exports[i].name);
334 *(strchr (tmp, '@')) = 0;
335 pe_def_file->exports[i].name = tmp;
336 }
337 }
338 }
339
340 if (pe_dll_stdcall_aliases)
341 {
342 for (i = 0; i < NE; i++)
343 {
344 if (strchr (pe_def_file->exports[i].name, '@'))
345 {
346 char *tmp = xstrdup (pe_def_file->exports[i].name);
347 *(strchr (tmp, '@')) = 0;
348 if (auto_export (pe_def_file, tmp))
349 def_file_add_export (pe_def_file, tmp,
350 pe_def_file->exports[i].internal_name, -1);
351 else
352 free (tmp);
353 }
354 }
355 }
356
357 /* Convenience, but watch out for it changing. */
358 e = pe_def_file->exports;
359
360 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
361 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
362
363 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
364 max_ordinal = 0;
365 min_ordinal = 65536;
366 count_exported = 0;
367 count_exported_byname = 0;
368 count_with_ordinals = 0;
369
370 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
371 for (i = 0, j = 0; i < NE; i++)
372 {
373 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
374 {
375 /* This is a duplicate. */
376 if (e[j - 1].ordinal != -1
377 && e[i].ordinal != -1
378 && e[j - 1].ordinal != e[i].ordinal)
379 {
380 if (pe_dll_warn_dup_exports)
381 /* xgettext:c-format */
382 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
383 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
384 }
385 else
386 {
387 if (pe_dll_warn_dup_exports)
388 /* xgettext:c-format */
389 einfo (_("Warning, duplicate EXPORT: %s\n"),
390 e[j - 1].name);
391 }
392 if (e[i].ordinal != -1)
393 e[j - 1].ordinal = e[i].ordinal;
394 e[j - 1].flag_private |= e[i].flag_private;
395 e[j - 1].flag_constant |= e[i].flag_constant;
396 e[j - 1].flag_noname |= e[i].flag_noname;
397 e[j - 1].flag_data |= e[i].flag_data;
398 }
399 else
400 {
401 if (i != j)
402 e[j] = e[i];
403 j++;
404 }
405 }
406 pe_def_file->num_exports = j; /* == NE */
407
408 for (i = 0; i < NE; i++)
409 {
410 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
411 if (pe_details->underscored)
412 {
413 *name = '_';
414 strcpy (name + 1, pe_def_file->exports[i].internal_name);
415 }
416 else
417 strcpy (name, pe_def_file->exports[i].internal_name);
418
419 blhe = bfd_link_hash_lookup (info->hash,
420 name,
421 false, false, true);
422
423 if (blhe
424 && (blhe->type == bfd_link_hash_defined
425 || (blhe->type == bfd_link_hash_common)))
426 {
427 count_exported++;
428 if (!pe_def_file->exports[i].flag_noname)
429 count_exported_byname++;
430
431 /* Only fill in the sections. The actual offsets are computed
432 in fill_exported_offsets() after common symbols are laid
433 out. */
434 if (blhe->type == bfd_link_hash_defined)
435 exported_symbol_sections[i] = blhe->u.def.section;
436 else
437 exported_symbol_sections[i] = blhe->u.c.p->section;
438
439 if (pe_def_file->exports[i].ordinal != -1)
440 {
441 if (max_ordinal < pe_def_file->exports[i].ordinal)
442 max_ordinal = pe_def_file->exports[i].ordinal;
443 if (min_ordinal > pe_def_file->exports[i].ordinal)
444 min_ordinal = pe_def_file->exports[i].ordinal;
445 count_with_ordinals++;
446 }
447 }
448 else if (blhe && blhe->type == bfd_link_hash_undefined)
449 {
450 /* xgettext:c-format */
451 einfo (_("%XCannot export %s: symbol not defined\n"),
452 pe_def_file->exports[i].internal_name);
453 }
454 else if (blhe)
455 {
456 /* xgettext:c-format */
457 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
458 pe_def_file->exports[i].internal_name,
459 blhe->type, bfd_link_hash_defined);
460 }
461 else
462 {
463 /* xgettext:c-format */
464 einfo (_("%XCannot export %s: symbol not found\n"),
465 pe_def_file->exports[i].internal_name);
466 }
467 free (name);
468 }
469 }
470
471 /************************************************************************
472
473 Build the bfd that will contain .edata and .reloc sections
474
475 ************************************************************************/
476
477 static void
478 build_filler_bfd (include_edata)
479 int include_edata;
480 {
481 lang_input_statement_type *filler_file;
482 filler_file = lang_add_input_file ("dll stuff",
483 lang_input_file_is_fake_enum,
484 NULL);
485 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
486 if (filler_bfd == NULL
487 || !bfd_set_arch_mach (filler_bfd,
488 bfd_get_arch (output_bfd),
489 bfd_get_mach (output_bfd)))
490 {
491 einfo ("%X%P: can not create BFD %E\n");
492 return;
493 }
494
495 if (include_edata)
496 {
497 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
498 if (edata_s == NULL
499 || !bfd_set_section_flags (filler_bfd, edata_s,
500 (SEC_HAS_CONTENTS
501 | SEC_ALLOC
502 | SEC_LOAD
503 | SEC_KEEP
504 | SEC_IN_MEMORY)))
505 {
506 einfo ("%X%P: can not create .edata section: %E\n");
507 return;
508 }
509 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
510 }
511
512 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
513 if (reloc_s == NULL
514 || !bfd_set_section_flags (filler_bfd, reloc_s,
515 (SEC_HAS_CONTENTS
516 | SEC_ALLOC
517 | SEC_LOAD
518 | SEC_KEEP
519 | SEC_IN_MEMORY)))
520 {
521 einfo ("%X%P: can not create .reloc section: %E\n");
522 return;
523 }
524 bfd_set_section_size (filler_bfd, reloc_s, 0);
525
526 ldlang_add_file (filler_file);
527 }
528
529 /************************************************************************
530
531 Gather all the exported symbols and build the .edata section
532
533 ************************************************************************/
534
535 static void
536 generate_edata (abfd, info)
537 bfd *abfd;
538 struct bfd_link_info *info ATTRIBUTE_UNUSED;
539 {
540 int i, next_ordinal;
541 int name_table_size = 0;
542 const char *dlnp;
543
544 /* First, we need to know how many exported symbols there are,
545 and what the range of ordinals is. */
546
547 if (pe_def_file->name)
548 {
549 dll_name = pe_def_file->name;
550 }
551 else
552 {
553 dll_name = abfd->filename;
554 for (dlnp = dll_name; *dlnp; dlnp++)
555 {
556 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
557 dll_name = dlnp + 1;
558 }
559 }
560
561 if (count_with_ordinals && max_ordinal > count_exported)
562 {
563 if (min_ordinal > max_ordinal - count_exported + 1)
564 min_ordinal = max_ordinal - count_exported + 1;
565 }
566 else
567 {
568 min_ordinal = 1;
569 max_ordinal = count_exported;
570 }
571 export_table_size = max_ordinal - min_ordinal + 1;
572
573 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
574 for (i = 0; i < export_table_size; i++)
575 exported_symbols[i] = -1;
576
577 /* Now we need to assign ordinals to those that don't have them. */
578 for (i = 0; i < NE; i++)
579 {
580 if (exported_symbol_sections[i])
581 {
582 if (pe_def_file->exports[i].ordinal != -1)
583 {
584 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
585 int pi = exported_symbols[ei];
586 if (pi != -1)
587 {
588 /* xgettext:c-format */
589 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
590 pe_def_file->exports[i].ordinal,
591 pe_def_file->exports[i].name,
592 pe_def_file->exports[pi].name);
593 }
594 exported_symbols[ei] = i;
595 }
596 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
597 }
598 }
599
600 next_ordinal = min_ordinal;
601 for (i = 0; i < NE; i++)
602 if (exported_symbol_sections[i])
603 if (pe_def_file->exports[i].ordinal == -1)
604 {
605 while (exported_symbols[next_ordinal - min_ordinal] != -1)
606 next_ordinal++;
607 exported_symbols[next_ordinal - min_ordinal] = i;
608 pe_def_file->exports[i].ordinal = next_ordinal;
609 }
610
611 /* OK, now we can allocate some memory. */
612
613 edata_sz = (40 /* directory */
614 + 4 * export_table_size /* addresses */
615 + 4 * count_exported_byname /* name ptrs */
616 + 2 * count_exported_byname /* ordinals */
617 + name_table_size + strlen (dll_name) + 1);
618 }
619
620 /* Fill the exported symbol offsets. The preliminary work has already
621 been done in process_def_file(). */
622
623 static void
624 fill_exported_offsets (abfd, info)
625 bfd *abfd ATTRIBUTE_UNUSED;
626 struct bfd_link_info *info;
627 {
628 int i;
629 struct bfd_link_hash_entry *blhe;
630
631 for (i = 0; i < pe_def_file->num_exports; i++)
632 {
633 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
634 if (pe_details->underscored)
635 {
636 *name = '_';
637 strcpy (name + 1, pe_def_file->exports[i].internal_name);
638 }
639 else
640 strcpy (name, pe_def_file->exports[i].internal_name);
641
642 blhe = bfd_link_hash_lookup (info->hash,
643 name,
644 false, false, true);
645
646 if (blhe && (blhe->type == bfd_link_hash_defined))
647 {
648 exported_symbol_offsets[i] = blhe->u.def.value;
649 }
650 free (name);
651 }
652 }
653
654 static void
655 fill_edata (abfd, info)
656 bfd *abfd;
657 struct bfd_link_info *info ATTRIBUTE_UNUSED;
658 {
659 int i, hint;
660 unsigned char *edirectory;
661 unsigned long *eaddresses;
662 unsigned long *enameptrs;
663 unsigned short *eordinals;
664 unsigned char *enamestr;
665 time_t now;
666
667 time (&now);
668
669 edata_d = (unsigned char *) xmalloc (edata_sz);
670
671 /* Note use of array pointer math here. */
672 edirectory = edata_d;
673 eaddresses = (unsigned long *) (edata_d + 40);
674 enameptrs = eaddresses + export_table_size;
675 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
676 enamestr = (char *) (eordinals + count_exported_byname);
677
678 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
679
680 memset (edata_d, 0, edata_sz);
681 bfd_put_32 (abfd, now, edata_d + 4);
682 if (pe_def_file->version_major != -1)
683 {
684 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
685 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
686 }
687 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
688 strcpy (enamestr, dll_name);
689 enamestr += strlen (enamestr) + 1;
690 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
691 bfd_put_32 (abfd, export_table_size, edata_d + 20);
692 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
693 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
694 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
695 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
696
697 fill_exported_offsets (abfd, info);
698
699 /* Ok, now for the filling in part. */
700 hint = 0;
701 for (i = 0; i < export_table_size; i++)
702 {
703 int s = exported_symbols[i];
704 if (s != -1)
705 {
706 struct sec *ssec = exported_symbol_sections[s];
707 unsigned long srva = (exported_symbol_offsets[s]
708 + ssec->output_section->vma
709 + ssec->output_offset);
710 int ord = pe_def_file->exports[s].ordinal;
711
712 bfd_put_32 (abfd, srva - image_base,
713 (void *) (eaddresses + ord - min_ordinal));
714 if (!pe_def_file->exports[s].flag_noname)
715 {
716 char *ename = pe_def_file->exports[s].name;
717 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
718 enameptrs++;
719 strcpy (enamestr, ename);
720 enamestr += strlen (enamestr) + 1;
721 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
722 eordinals++;
723 pe_def_file->exports[s].hint = hint++;
724 }
725 }
726 }
727 }
728
729 /************************************************************************
730
731 Gather all the relocations and build the .reloc section
732
733 ************************************************************************/
734
735 static void
736 generate_reloc (abfd, info)
737 bfd *abfd;
738 struct bfd_link_info *info;
739 {
740
741 /* For .reloc stuff. */
742 reloc_data_type *reloc_data;
743 int total_relocs = 0;
744 int i;
745 unsigned long sec_page = (unsigned long) (-1);
746 unsigned long page_ptr, page_count;
747 int bi;
748 bfd *b;
749 struct sec *s;
750
751 total_relocs = 0;
752 for (b = info->input_bfds; b; b = b->link_next)
753 for (s = b->sections; s; s = s->next)
754 total_relocs += s->reloc_count;
755
756 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
757
758 total_relocs = 0;
759 bi = 0;
760 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
761 {
762 arelent **relocs;
763 int relsize, nrelocs, i;
764
765 for (s = b->sections; s; s = s->next)
766 {
767 unsigned long sec_vma = s->output_section->vma + s->output_offset;
768 asymbol **symbols;
769 int nsyms, symsize;
770
771 /* If it's not loaded, we don't need to relocate it this way. */
772 if (!(s->output_section->flags & SEC_LOAD))
773 continue;
774
775 /* I don't know why there would be a reloc for these, but I've
776 seen it happen - DJ */
777 if (s->output_section == &bfd_abs_section)
778 continue;
779
780 if (s->output_section->vma == 0)
781 {
782 /* Huh? Shouldn't happen, but punt if it does. */
783 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
784 s->output_section->name, s->output_section->index,
785 s->output_section->flags);
786 continue;
787 }
788
789 symsize = bfd_get_symtab_upper_bound (b);
790 symbols = (asymbol **) xmalloc (symsize);
791 nsyms = bfd_canonicalize_symtab (b, symbols);
792
793 relsize = bfd_get_reloc_upper_bound (b, s);
794 relocs = (arelent **) xmalloc ((size_t) relsize);
795 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
796
797 for (i = 0; i < nrelocs; i++)
798 {
799 if (!relocs[i]->howto->pc_relative
800 && relocs[i]->howto->type != pe_details->imagebase_reloc)
801 {
802 bfd_vma sym_vma;
803 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
804 sym_vma = (relocs[i]->addend
805 + sym->value
806 + sym->section->vma
807 + sym->section->output_offset
808 + sym->section->output_section->vma);
809 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
810
811 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
812
813 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
814 relocs[i]->howto->rightshift)
815 {
816 case BITS_AND_SHIFT (32, 0):
817 reloc_data[total_relocs].type = 3;
818 total_relocs++;
819 break;
820 case BITS_AND_SHIFT (16, 0):
821 reloc_data[total_relocs].type = 2;
822 total_relocs++;
823 break;
824 case BITS_AND_SHIFT (16, 16):
825 reloc_data[total_relocs].type = 4;
826 /* FIXME: we can't know the symbol's right value
827 yet, but we probably can safely assume that
828 CE will relocate us in 64k blocks, so leaving
829 it zero is safe. */
830 reloc_data[total_relocs].extra = 0;
831 total_relocs++;
832 break;
833 case BITS_AND_SHIFT (26, 2):
834 reloc_data[total_relocs].type = 5;
835 total_relocs++;
836 break;
837 default:
838 /* xgettext:c-format */
839 einfo (_("%XError: %d-bit reloc in dll\n"),
840 relocs[i]->howto->bitsize);
841 break;
842 }
843 }
844 }
845 free (relocs);
846 /* Warning: the allocated symbols are remembered in BFD and
847 reused later, so don't free them! */
848 #if 0
849 free (symbol);
850 #endif
851 }
852 }
853
854 /* At this point, we have total_relocs relocation addresses in
855 reloc_addresses, which are all suitable for the .reloc section.
856 We must now create the new sections. */
857
858 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
859
860 for (i = 0; i < total_relocs; i++)
861 {
862 unsigned long this_page = (reloc_data[i].vma >> 12);
863
864 if (this_page != sec_page)
865 {
866 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
867 reloc_sz += 8;
868 sec_page = this_page;
869 }
870
871 reloc_sz += 2;
872
873 if (reloc_data[i].type == 4)
874 reloc_sz += 2;
875 }
876 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
877
878 reloc_d = (unsigned char *) xmalloc (reloc_sz);
879
880 sec_page = (unsigned long) (-1);
881 reloc_sz = 0;
882 page_ptr = (unsigned long) (-1);
883 page_count = 0;
884 for (i = 0; i < total_relocs; i++)
885 {
886 unsigned long rva = reloc_data[i].vma - image_base;
887 unsigned long this_page = (rva & ~0xfff);
888 if (this_page != sec_page)
889 {
890 while (reloc_sz & 3)
891 reloc_d[reloc_sz++] = 0;
892 if (page_ptr != (unsigned long) (-1))
893 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
894 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
895 page_ptr = reloc_sz;
896 reloc_sz += 8;
897 sec_page = this_page;
898 page_count = 0;
899 }
900 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
901 reloc_d + reloc_sz);
902 reloc_sz += 2;
903 if (reloc_data[i].type == 4)
904 {
905 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
906 reloc_sz += 2;
907 }
908 page_count++;
909 }
910 while (reloc_sz & 3)
911 reloc_d[reloc_sz++] = 0;
912 if (page_ptr != (unsigned long) (-1))
913 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
914 while (reloc_sz < reloc_s->_raw_size)
915 reloc_d[reloc_sz++] = 0;
916 }
917
918 /************************************************************************
919
920 Given the exiting def_file structure, print out a .DEF file that
921 corresponds to it.
922
923 ************************************************************************/
924
925 static void
926 quoteput (s, f, needs_quotes)
927 char *s;
928 FILE *f;
929 int needs_quotes;
930 {
931 char *cp;
932 for (cp = s; *cp; cp++)
933 if (*cp == '\''
934 || *cp == '"'
935 || *cp == '\\'
936 || isspace ((unsigned char) *cp)
937 || *cp == ','
938 || *cp == ';')
939 needs_quotes = 1;
940 if (needs_quotes)
941 {
942 putc ('"', f);
943 while (*s)
944 {
945 if (*s == '"' || *s == '\\')
946 putc ('\\', f);
947 putc (*s, f);
948 s++;
949 }
950 putc ('"', f);
951 }
952 else
953 fputs (s, f);
954 }
955
956 void
957 pe_dll_generate_def_file (pe_out_def_filename)
958 const char *pe_out_def_filename;
959 {
960 int i;
961 FILE *out = fopen (pe_out_def_filename, "w");
962 if (out == NULL)
963 {
964 /* xgettext:c-format */
965 einfo (_("%s: Can't open output def file %s\n"),
966 program_name, pe_out_def_filename);
967 }
968
969 if (pe_def_file)
970 {
971 if (pe_def_file->name)
972 {
973 if (pe_def_file->is_dll)
974 fprintf (out, "LIBRARY ");
975 else
976 fprintf (out, "NAME ");
977 quoteput (pe_def_file->name, out, 1);
978 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
979 fprintf (out, " BASE=0x%lx",
980 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
981 fprintf (out, "\n");
982 }
983
984 if (pe_def_file->description)
985 {
986 fprintf (out, "DESCRIPTION ");
987 quoteput (pe_def_file->description, out, 1);
988 fprintf (out, "\n");
989 }
990
991 if (pe_def_file->version_minor != -1)
992 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
993 pe_def_file->version_minor);
994 else if (pe_def_file->version_major != -1)
995 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
996
997 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
998 fprintf (out, "\n");
999
1000 if (pe_def_file->stack_commit != -1)
1001 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1002 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1003 else if (pe_def_file->stack_reserve != -1)
1004 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1005 if (pe_def_file->heap_commit != -1)
1006 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1007 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1008 else if (pe_def_file->heap_reserve != -1)
1009 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1010
1011 if (pe_def_file->num_section_defs > 0)
1012 {
1013 fprintf (out, "\nSECTIONS\n\n");
1014 for (i = 0; i < pe_def_file->num_section_defs; i++)
1015 {
1016 fprintf (out, " ");
1017 quoteput (pe_def_file->section_defs[i].name, out, 0);
1018 if (pe_def_file->section_defs[i].class)
1019 {
1020 fprintf (out, " CLASS ");
1021 quoteput (pe_def_file->section_defs[i].class, out, 0);
1022 }
1023 if (pe_def_file->section_defs[i].flag_read)
1024 fprintf (out, " READ");
1025 if (pe_def_file->section_defs[i].flag_write)
1026 fprintf (out, " WRITE");
1027 if (pe_def_file->section_defs[i].flag_execute)
1028 fprintf (out, " EXECUTE");
1029 if (pe_def_file->section_defs[i].flag_shared)
1030 fprintf (out, " SHARED");
1031 fprintf (out, "\n");
1032 }
1033 }
1034
1035 if (pe_def_file->num_exports > 0)
1036 {
1037 fprintf (out, "\nEXPORTS\n\n");
1038 for (i = 0; i < pe_def_file->num_exports; i++)
1039 {
1040 def_file_export *e = pe_def_file->exports + i;
1041 fprintf (out, " ");
1042 quoteput (e->name, out, 0);
1043 if (e->internal_name && strcmp (e->internal_name, e->name))
1044 {
1045 fprintf (out, " = ");
1046 quoteput (e->internal_name, out, 0);
1047 }
1048 if (e->ordinal != -1)
1049 fprintf (out, " @%d", e->ordinal);
1050 if (e->flag_private)
1051 fprintf (out, " PRIVATE");
1052 if (e->flag_constant)
1053 fprintf (out, " CONSTANT");
1054 if (e->flag_noname)
1055 fprintf (out, " NONAME");
1056 if (e->flag_data)
1057 fprintf (out, " DATA");
1058
1059 fprintf (out, "\n");
1060 }
1061 }
1062
1063 if (pe_def_file->num_imports > 0)
1064 {
1065 fprintf (out, "\nIMPORTS\n\n");
1066 for (i = 0; i < pe_def_file->num_imports; i++)
1067 {
1068 def_file_import *im = pe_def_file->imports + i;
1069 fprintf (out, " ");
1070 if (im->internal_name
1071 && (!im->name || strcmp (im->internal_name, im->name)))
1072 {
1073 quoteput (im->internal_name, out, 0);
1074 fprintf (out, " = ");
1075 }
1076 quoteput (im->module->name, out, 0);
1077 fprintf (out, ".");
1078 if (im->name)
1079 quoteput (im->name, out, 0);
1080 else
1081 fprintf (out, "%d", im->ordinal);
1082 fprintf (out, "\n");
1083 }
1084 }
1085 }
1086 else
1087 fprintf (out, _("; no contents available\n"));
1088
1089 if (fclose (out) == EOF)
1090 {
1091 /* xgettext:c-format */
1092 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1093 }
1094 }
1095
1096 /************************************************************************
1097
1098 Generate the import library
1099
1100 ************************************************************************/
1101
1102 static asymbol **symtab;
1103 static int symptr;
1104 static int tmp_seq;
1105 static const char *dll_filename;
1106 static char *dll_symname;
1107
1108 #define UNDSEC (asection *) &bfd_und_section
1109
1110 static asection *
1111 quick_section (abfd, name, flags, align)
1112 bfd *abfd;
1113 const char *name;
1114 int flags;
1115 int align;
1116 {
1117 asection *sec;
1118 asymbol *sym;
1119
1120 sec = bfd_make_section_old_way (abfd, name);
1121 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1122 bfd_set_section_alignment (abfd, sec, align);
1123 /* Remember to undo this before trying to link internally! */
1124 sec->output_section = sec;
1125
1126 sym = bfd_make_empty_symbol (abfd);
1127 symtab[symptr++] = sym;
1128 sym->name = sec->name;
1129 sym->section = sec;
1130 sym->flags = BSF_LOCAL;
1131 sym->value = 0;
1132
1133 return sec;
1134 }
1135
1136 static void
1137 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1138 bfd *abfd;
1139 char *n1;
1140 char *n2;
1141 char *n3;
1142 asection *sec;
1143 int flags;
1144 int addr;
1145 {
1146 asymbol *sym;
1147 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1148 strcpy (name, n1);
1149 strcat (name, n2);
1150 strcat (name, n3);
1151 sym = bfd_make_empty_symbol (abfd);
1152 sym->name = name;
1153 sym->section = sec;
1154 sym->flags = flags;
1155 sym->value = addr;
1156 symtab[symptr++] = sym;
1157 }
1158
1159 static arelent *reltab = 0;
1160 static int relcount = 0, relsize = 0;
1161
1162 static void
1163 quick_reloc (abfd, address, which_howto, symidx)
1164 bfd *abfd;
1165 int address;
1166 int which_howto;
1167 int symidx;
1168 {
1169 if (relcount >= (relsize - 1))
1170 {
1171 relsize += 10;
1172 if (reltab)
1173 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1174 else
1175 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1176 }
1177 reltab[relcount].address = address;
1178 reltab[relcount].addend = 0;
1179 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1180 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1181 relcount++;
1182 }
1183
1184 static void
1185 save_relocs (asection *sec)
1186 {
1187 int i;
1188 sec->relocation = reltab;
1189 sec->reloc_count = relcount;
1190 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1191 for (i = 0; i < relcount; i++)
1192 sec->orelocation[i] = sec->relocation + i;
1193 sec->orelocation[relcount] = 0;
1194 sec->flags |= SEC_RELOC;
1195 reltab = 0;
1196 relcount = relsize = 0;
1197 }
1198
1199 /*
1200 * .section .idata$2
1201 * .global __head_my_dll
1202 * __head_my_dll:
1203 * .rva hname
1204 * .long 0
1205 * .long 0
1206 * .rva __my_dll_iname
1207 * .rva fthunk
1208 *
1209 * .section .idata$5
1210 * .long 0
1211 * fthunk:
1212 *
1213 * .section .idata$4
1214 * .long 0
1215 * hname:
1216 */
1217
1218 static bfd *
1219 make_head (parent)
1220 bfd *parent;
1221 {
1222 asection *id2, *id5, *id4;
1223 unsigned char *d2, *d5, *d4;
1224 char *oname;
1225 bfd *abfd;
1226
1227 oname = (char *) xmalloc (20);
1228 sprintf (oname, "d%06d.o", tmp_seq);
1229 tmp_seq++;
1230
1231 abfd = bfd_create (oname, parent);
1232 bfd_find_target (pe_details->object_target, abfd);
1233 bfd_make_writable (abfd);
1234
1235 bfd_set_format (abfd, bfd_object);
1236 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1237
1238 symptr = 0;
1239 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1240 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1241 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1242 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1243 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1244 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1245
1246 /* OK, pay attention here. I got confused myself looking back at
1247 it. We create a four-byte section to mark the beginning of the
1248 list, and we include an offset of 4 in the section, so that the
1249 pointer to the list points to the *end* of this section, which is
1250 the start of the list of sections from other objects. */
1251
1252 bfd_set_section_size (abfd, id2, 20);
1253 d2 = (unsigned char *) xmalloc (20);
1254 id2->contents = d2;
1255 memset (d2, 0, 20);
1256 d2[0] = d2[16] = 4; /* reloc addend */
1257 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1258 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1259 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1260 save_relocs (id2);
1261
1262 bfd_set_section_size (abfd, id5, 4);
1263 d5 = (unsigned char *) xmalloc (4);
1264 id5->contents = d5;
1265 memset (d5, 0, 4);
1266
1267 bfd_set_section_size (abfd, id4, 4);
1268 d4 = (unsigned char *) xmalloc (4);
1269 id4->contents = d4;
1270 memset (d4, 0, 4);
1271
1272 bfd_set_symtab (abfd, symtab, symptr);
1273
1274 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1275 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1276 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1277
1278 bfd_make_readable (abfd);
1279 return abfd;
1280 }
1281
1282 /*
1283 * .section .idata$4
1284 * .long 0
1285 * .section .idata$5
1286 * .long 0
1287 * .section idata$7
1288 * .global __my_dll_iname
1289 *__my_dll_iname:
1290 * .asciz "my.dll"
1291 */
1292
1293 static bfd *
1294 make_tail (parent)
1295 bfd *parent;
1296 {
1297 asection *id4, *id5, *id7;
1298 unsigned char *d4, *d5, *d7;
1299 int len;
1300 char *oname;
1301 bfd *abfd;
1302
1303 oname = (char *) xmalloc (20);
1304 sprintf (oname, "d%06d.o", tmp_seq);
1305 tmp_seq++;
1306
1307 abfd = bfd_create (oname, parent);
1308 bfd_find_target (pe_details->object_target, abfd);
1309 bfd_make_writable (abfd);
1310
1311 bfd_set_format (abfd, bfd_object);
1312 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1313
1314 symptr = 0;
1315 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1316 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1317 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1318 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1319 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1320
1321 bfd_set_section_size (abfd, id4, 4);
1322 d4 = (unsigned char *) xmalloc (4);
1323 id4->contents = d4;
1324 memset (d4, 0, 4);
1325
1326 bfd_set_section_size (abfd, id5, 4);
1327 d5 = (unsigned char *) xmalloc (4);
1328 id5->contents = d5;
1329 memset (d5, 0, 4);
1330
1331 len = strlen (dll_filename) + 1;
1332 if (len & 1)
1333 len++;
1334 bfd_set_section_size (abfd, id7, len);
1335 d7 = (unsigned char *) xmalloc (len);
1336 id7->contents = d7;
1337 strcpy (d7, dll_filename);
1338
1339 bfd_set_symtab (abfd, symtab, symptr);
1340
1341 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1342 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1343 bfd_set_section_contents (abfd, id7, d7, 0, len);
1344
1345 bfd_make_readable (abfd);
1346 return abfd;
1347 }
1348
1349 /*
1350 * .text
1351 * .global _function
1352 * .global ___imp_function
1353 * .global __imp__function
1354 *_function:
1355 * jmp *__imp__function:
1356 *
1357 * .section idata$7
1358 * .long __head_my_dll
1359 *
1360 * .section .idata$5
1361 *___imp_function:
1362 *__imp__function:
1363 *iat?
1364 * .section .idata$4
1365 *iat?
1366 * .section .idata$6
1367 *ID<ordinal>:
1368 * .short <hint>
1369 * .asciz "function" xlate? (add underscore, kill at)
1370 */
1371
1372 static unsigned char jmp_ix86_bytes[] = {
1373 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1374 };
1375
1376 /*
1377 *_function:
1378 * mov.l ip+8,r0
1379 * mov.l @r0,r0
1380 * jmp @r0
1381 * nop
1382 * .dw __imp_function
1383 */
1384
1385 static unsigned char jmp_sh_bytes[] = {
1386 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1387 };
1388
1389 /*
1390 *_function:
1391 * lui $t0,<high:__imp_function>
1392 * lw $t0,<low:__imp_function>
1393 * jr $t0
1394 * nop
1395 */
1396
1397 static unsigned char jmp_mips_bytes[] = {
1398 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1399 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1400 };
1401
1402 static bfd *
1403 make_one (exp, parent)
1404 def_file_export *exp;
1405 bfd *parent;
1406 {
1407 asection *tx, *id7, *id5, *id4, *id6;
1408 unsigned char *td, *d7, *d5, *d4, *d6 = NULL;
1409 int len;
1410 char *oname;
1411 bfd *abfd;
1412 unsigned char *jmp_bytes = NULL;
1413 int jmp_byte_count = 0;
1414
1415 switch (pe_details->pe_arch)
1416 {
1417 case PE_ARCH_i386:
1418 jmp_bytes = jmp_ix86_bytes;
1419 jmp_byte_count = sizeof (jmp_ix86_bytes);
1420 break;
1421 case PE_ARCH_sh:
1422 jmp_bytes = jmp_sh_bytes;
1423 jmp_byte_count = sizeof (jmp_sh_bytes);
1424 break;
1425 case PE_ARCH_mips:
1426 jmp_bytes = jmp_mips_bytes;
1427 jmp_byte_count = sizeof (jmp_mips_bytes);
1428 break;
1429 }
1430
1431 oname = (char *) xmalloc (20);
1432 sprintf (oname, "d%06d.o", tmp_seq);
1433 tmp_seq++;
1434
1435 abfd = bfd_create (oname, parent);
1436 bfd_find_target (pe_details->object_target, abfd);
1437 bfd_make_writable (abfd);
1438
1439 bfd_set_format (abfd, bfd_object);
1440 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1441
1442 symptr = 0;
1443 symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
1444 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1445 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1446 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1447 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1448 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1449 if (! exp->flag_data)
1450 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1451 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1452 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1453 if (pe_dll_compat_implib)
1454 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1455 id5, BSF_GLOBAL, 0);
1456
1457 bfd_set_section_size (abfd, tx, jmp_byte_count);
1458 td = (unsigned char *) xmalloc (jmp_byte_count);
1459 tx->contents = td;
1460 memcpy (td, jmp_bytes, jmp_byte_count);
1461 switch (pe_details->pe_arch)
1462 {
1463 case PE_ARCH_i386:
1464 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1465 break;
1466 case PE_ARCH_sh:
1467 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1468 break;
1469 case PE_ARCH_mips:
1470 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1471 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1472 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1473 break;
1474 }
1475 save_relocs (tx);
1476
1477 bfd_set_section_size (abfd, id7, 4);
1478 d7 = (unsigned char *) xmalloc (4);
1479 id7->contents = d7;
1480 memset (d7, 0, 4);
1481 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1482 save_relocs (id7);
1483
1484 bfd_set_section_size (abfd, id5, 4);
1485 d5 = (unsigned char *) xmalloc (4);
1486 id5->contents = d5;
1487 memset (d5, 0, 4);
1488 if (exp->flag_noname)
1489 {
1490 d5[0] = exp->ordinal;
1491 d5[1] = exp->ordinal >> 8;
1492 d5[3] = 0x80;
1493 }
1494 else
1495 {
1496 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1497 save_relocs (id5);
1498 }
1499
1500 bfd_set_section_size (abfd, id4, 4);
1501 d4 = (unsigned char *) xmalloc (4);
1502 id4->contents = d4;
1503 memset (d4, 0, 4);
1504 if (exp->flag_noname)
1505 {
1506 d4[0] = exp->ordinal;
1507 d4[1] = exp->ordinal >> 8;
1508 d4[3] = 0x80;
1509 }
1510 else
1511 {
1512 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1513 save_relocs (id4);
1514 }
1515
1516 if (exp->flag_noname)
1517 {
1518 len = 0;
1519 bfd_set_section_size (abfd, id6, 0);
1520 }
1521 else
1522 {
1523 len = strlen (exp->name) + 3;
1524 if (len & 1)
1525 len++;
1526 bfd_set_section_size (abfd, id6, len);
1527 d6 = (unsigned char *) xmalloc (len);
1528 id6->contents = d6;
1529 memset (d6, 0, len);
1530 d6[0] = exp->hint & 0xff;
1531 d6[1] = exp->hint >> 8;
1532 strcpy (d6 + 2, exp->name);
1533 }
1534
1535 bfd_set_symtab (abfd, symtab, symptr);
1536
1537 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1538 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1539 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1540 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1541 if (!exp->flag_noname)
1542 bfd_set_section_contents (abfd, id6, d6, 0, len);
1543
1544 bfd_make_readable (abfd);
1545 return abfd;
1546 }
1547
1548 void
1549 pe_dll_generate_implib (def, impfilename)
1550 def_file *def;
1551 const char *impfilename;
1552 {
1553 int i;
1554 bfd *ar_head;
1555 bfd *ar_tail;
1556 bfd *outarch;
1557 bfd *head = 0;
1558
1559 dll_filename = (def->name) ? def->name : dll_name;
1560 dll_symname = xstrdup (dll_filename);
1561 for (i = 0; dll_symname[i]; i++)
1562 if (!isalnum ((unsigned char) dll_symname[i]))
1563 dll_symname[i] = '_';
1564
1565 unlink (impfilename);
1566
1567 outarch = bfd_openw (impfilename, 0);
1568
1569 if (!outarch)
1570 {
1571 /* xgettext:c-format */
1572 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1573 return;
1574 }
1575
1576 /* xgettext:c-format */
1577 einfo (_("Creating library file: %s\n"), impfilename);
1578
1579 bfd_set_format (outarch, bfd_archive);
1580 outarch->has_armap = 1;
1581
1582 /* Work out a reasonable size of things to put onto one line. */
1583
1584 ar_head = make_head (outarch);
1585
1586 for (i = 0; i < def->num_exports; i++)
1587 {
1588 /* The import library doesn't know about the internal name. */
1589 char *internal = def->exports[i].internal_name;
1590 bfd *n;
1591 def->exports[i].internal_name = def->exports[i].name;
1592 n = make_one (def->exports + i, outarch);
1593 n->next = head;
1594 head = n;
1595 def->exports[i].internal_name = internal;
1596 }
1597
1598 ar_tail = make_tail (outarch);
1599
1600 if (ar_head == NULL || ar_tail == NULL)
1601 return;
1602
1603 /* Now stick them all into the archive. */
1604
1605 ar_head->next = head;
1606 ar_tail->next = ar_head;
1607 head = ar_tail;
1608
1609 if (! bfd_set_archive_head (outarch, head))
1610 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1611
1612 if (! bfd_close (outarch))
1613 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1614
1615 while (head != NULL)
1616 {
1617 bfd *n = head->next;
1618 bfd_close (head);
1619 head = n;
1620 }
1621 }
1622
1623 static void
1624 add_bfd_to_link (abfd, name, link_info)
1625 bfd *abfd;
1626 char *name;
1627 struct bfd_link_info *link_info;
1628 {
1629 lang_input_statement_type *fake_file;
1630 fake_file = lang_add_input_file (name,
1631 lang_input_file_is_fake_enum,
1632 NULL);
1633 fake_file->the_bfd = abfd;
1634 ldlang_add_file (fake_file);
1635 if (!bfd_link_add_symbols (abfd, link_info))
1636 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
1637 }
1638
1639 void
1640 pe_process_import_defs (output_bfd, link_info)
1641 bfd *output_bfd;
1642 struct bfd_link_info *link_info;
1643 {
1644 def_file_module *module;
1645 pe_dll_id_target (bfd_get_target (output_bfd));
1646
1647 if (!pe_def_file)
1648 return;
1649
1650 for (module = pe_def_file->modules; module; module = module->next)
1651 {
1652 int i, do_this_dll;
1653
1654 dll_filename = module->name;
1655 dll_symname = xstrdup (module->name);
1656 for (i = 0; dll_symname[i]; i++)
1657 if (!isalnum (dll_symname[i]))
1658 dll_symname[i] = '_';
1659
1660 do_this_dll = 0;
1661
1662 for (i = 0; i < pe_def_file->num_imports; i++)
1663 if (pe_def_file->imports[i].module == module)
1664 {
1665 def_file_export exp;
1666 struct bfd_link_hash_entry *blhe;
1667
1668 /* See if we need this import. */
1669 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
1670 sprintf (name, "%s%s", U (""), pe_def_file->imports[i].internal_name);
1671 blhe = bfd_link_hash_lookup (link_info->hash, name,
1672 false, false, false);
1673 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
1674 {
1675 sprintf (name, "%s%s", U ("_imp__"),
1676 pe_def_file->imports[i].internal_name);
1677 blhe = bfd_link_hash_lookup (link_info->hash, name,
1678 false, false, false);
1679 }
1680 free (name);
1681 if (blhe && blhe->type == bfd_link_hash_undefined)
1682 {
1683 bfd *one;
1684 /* We do. */
1685 if (!do_this_dll)
1686 {
1687 bfd *ar_head = make_head (output_bfd);
1688 add_bfd_to_link (ar_head, ar_head->filename, link_info);
1689 do_this_dll = 1;
1690 }
1691 exp.internal_name = pe_def_file->imports[i].internal_name;
1692 exp.name = pe_def_file->imports[i].name;
1693 exp.ordinal = pe_def_file->imports[i].ordinal;
1694 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
1695 exp.flag_private = 0;
1696 exp.flag_constant = 0;
1697 exp.flag_data = 0;
1698 exp.flag_noname = exp.name ? 0 : 1;
1699 one = make_one (&exp, output_bfd);
1700 add_bfd_to_link (one, one->filename, link_info);
1701 }
1702 }
1703 if (do_this_dll)
1704 {
1705 bfd *ar_tail = make_tail (output_bfd);
1706 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
1707 }
1708
1709 free (dll_symname);
1710 }
1711 }
1712
1713 /************************************************************************
1714
1715 We were handed a *.DLL file. Parse it and turn it into a set of
1716 IMPORTS directives in the def file. Return true if the file was
1717 handled, false if not.
1718
1719 ************************************************************************/
1720
1721 static unsigned int
1722 pe_get16 (abfd, where)
1723 bfd *abfd;
1724 int where;
1725 {
1726 unsigned char b[2];
1727 bfd_seek (abfd, where, SEEK_SET);
1728 bfd_read (b, 1, 2, abfd);
1729 return b[0] + (b[1] << 8);
1730 }
1731
1732 static unsigned int
1733 pe_get32 (abfd, where)
1734 bfd *abfd;
1735 int where;
1736 {
1737 unsigned char b[4];
1738 bfd_seek (abfd, where, SEEK_SET);
1739 bfd_read (b, 1, 4, abfd);
1740 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
1741 }
1742
1743 #if 0 /* This is not currently used. */
1744
1745 static unsigned int
1746 pe_as16 (ptr)
1747 void *ptr;
1748 {
1749 unsigned char *b = ptr;
1750 return b[0] + (b[1] << 8);
1751 }
1752
1753 #endif
1754
1755 static unsigned int
1756 pe_as32 (ptr)
1757 void *ptr;
1758 {
1759 unsigned char *b = ptr;
1760 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
1761 }
1762
1763 boolean
1764 pe_implied_import_dll (filename)
1765 const char *filename;
1766 {
1767 bfd *dll;
1768 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
1769 unsigned long export_rva, export_size, nsections, secptr, expptr;
1770 unsigned char *expdata, *erva;
1771 unsigned long name_rvas, ordinals, nexp, ordbase;
1772 const char *dll_name;
1773
1774 /* No, I can't use bfd here. kernel32.dll puts its export table in
1775 the middle of the .rdata section. */
1776
1777 dll = bfd_openr (filename, pe_details->target_name);
1778 if (!dll)
1779 {
1780 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
1781 return false;
1782 }
1783 /* PEI dlls seem to be bfd_objects. */
1784 if (!bfd_check_format (dll, bfd_object))
1785 {
1786 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
1787 return false;
1788 }
1789
1790 dll_name = filename;
1791 for (i = 0; filename[i]; i++)
1792 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
1793 dll_name = filename + i + 1;
1794
1795 pe_header_offset = pe_get32 (dll, 0x3c);
1796 opthdr_ofs = pe_header_offset + 4 + 20;
1797 num_entries = pe_get32 (dll, opthdr_ofs + 92);
1798 if (num_entries < 1) /* no exports */
1799 return false;
1800 export_rva = pe_get32 (dll, opthdr_ofs + 96);
1801 export_size = pe_get32 (dll, opthdr_ofs + 100);
1802 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
1803 secptr = (pe_header_offset + 4 + 20 +
1804 pe_get16 (dll, pe_header_offset + 4 + 16));
1805 expptr = 0;
1806 for (i = 0; i < nsections; i++)
1807 {
1808 char sname[8];
1809 unsigned long secptr1 = secptr + 40 * i;
1810 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
1811 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
1812 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
1813 bfd_seek (dll, secptr1, SEEK_SET);
1814 bfd_read (sname, 1, 8, dll);
1815 if (vaddr <= export_rva && vaddr + vsize > export_rva)
1816 {
1817 expptr = fptr + (export_rva - vaddr);
1818 if (export_rva + export_size > vaddr + vsize)
1819 export_size = vsize - (export_rva - vaddr);
1820 break;
1821 }
1822 }
1823
1824 expdata = (unsigned char *) xmalloc (export_size);
1825 bfd_seek (dll, expptr, SEEK_SET);
1826 bfd_read (expdata, 1, export_size, dll);
1827 erva = expdata - export_rva;
1828
1829 if (pe_def_file == 0)
1830 pe_def_file = def_file_empty ();
1831
1832 nexp = pe_as32 (expdata + 24);
1833 name_rvas = pe_as32 (expdata + 32);
1834 ordinals = pe_as32 (expdata + 36);
1835 ordbase = pe_as32 (expdata + 16);
1836 for (i = 0; i < nexp; i++)
1837 {
1838 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
1839 def_file_import *imp;
1840 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
1841 i, 0);
1842 }
1843
1844 return true;
1845 }
1846
1847 /************************************************************************
1848
1849 These are the main functions, called from the emulation. The first
1850 is called after the bfds are read, so we can guess at how much space
1851 we need. The second is called after everything is placed, so we
1852 can put the right values in place.
1853
1854 ************************************************************************/
1855
1856 void
1857 pe_dll_build_sections (abfd, info)
1858 bfd *abfd;
1859 struct bfd_link_info *info;
1860 {
1861 pe_dll_id_target (bfd_get_target (abfd));
1862 process_def_file (abfd, info);
1863
1864 generate_edata (abfd, info);
1865 build_filler_bfd (1);
1866 }
1867
1868 void
1869 pe_exe_build_sections (abfd, info)
1870 bfd *abfd;
1871 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1872 {
1873 pe_dll_id_target (bfd_get_target (abfd));
1874 build_filler_bfd (0);
1875 }
1876
1877 void
1878 pe_dll_fill_sections (abfd, info)
1879 bfd *abfd;
1880 struct bfd_link_info *info;
1881 {
1882 pe_dll_id_target (bfd_get_target (abfd));
1883 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1884
1885 generate_reloc (abfd, info);
1886 if (reloc_sz > 0)
1887 {
1888 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1889
1890 /* Resize the sections. */
1891 lang_size_sections (stat_ptr->head, abs_output_section,
1892 &stat_ptr->head, 0, (bfd_vma) 0, false);
1893
1894 /* Redo special stuff. */
1895 ldemul_after_allocation ();
1896
1897 /* Do the assignments again. */
1898 lang_do_assignments (stat_ptr->head,
1899 abs_output_section,
1900 (fill_type) 0, (bfd_vma) 0);
1901 }
1902
1903 fill_edata (abfd, info);
1904
1905 pe_data (abfd)->dll = 1;
1906
1907 edata_s->contents = edata_d;
1908 reloc_s->contents = reloc_d;
1909 }
1910
1911 void
1912 pe_exe_fill_sections (abfd, info)
1913 bfd *abfd;
1914 struct bfd_link_info *info;
1915 {
1916 pe_dll_id_target (bfd_get_target (abfd));
1917 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1918
1919 generate_reloc (abfd, info);
1920 if (reloc_sz > 0)
1921 {
1922 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1923
1924 /* Resize the sections. */
1925 lang_size_sections (stat_ptr->head, abs_output_section,
1926 &stat_ptr->head, 0, (bfd_vma) 0, false);
1927
1928 /* Redo special stuff. */
1929 ldemul_after_allocation ();
1930
1931 /* Do the assignments again. */
1932 lang_do_assignments (stat_ptr->head,
1933 abs_output_section,
1934 (fill_type) 0, (bfd_vma) 0);
1935 }
1936 reloc_s->contents = reloc_d;
1937 }
This page took 0.113846 seconds and 4 git commands to generate.