* ld.h (lang_phase_type): Move to..
[deliverable/binutils-gdb.git] / ld / pe-dll.c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
5
6 This file is part of GLD, the Gnu Linker.
7
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
22
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "bfdlink.h"
26 #include "libiberty.h"
27 #include "safe-ctype.h"
28
29 #include <time.h>
30
31 #include "ld.h"
32 #include "ldexp.h"
33 #include "ldlang.h"
34 #include "ldwrite.h"
35 #include "ldmisc.h"
36 #include <ldgram.h>
37 #include "ldmain.h"
38 #include "ldfile.h"
39 #include "ldemul.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
42 #include "deffile.h"
43 #include "pe-dll.h"
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 /* Auto-import feature by Paul Sokolovsky
55
56 Quick facts:
57
58 1. With this feature on, DLL clients can import variables from DLL
59 without any concern from their side (for example, without any source
60 code modifications).
61
62 2. This is done completely in bounds of the PE specification (to be fair,
63 there's a place where it pokes nose out of, but in practice it works).
64 So, resulting module can be used with any other PE compiler/linker.
65
66 3. Auto-import is fully compatible with standard import method and they
67 can be mixed together.
68
69 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
70 reference to it; load time: negligible; virtual/physical memory: should be
71 less than effect of DLL relocation, and I sincerely hope it doesn't affect
72 DLL sharability (too much).
73
74 Idea
75
76 The obvious and only way to get rid of dllimport insanity is to make client
77 access variable directly in the DLL, bypassing extra dereference. I.e.,
78 whenever client contains something like
79
80 mov dll_var,%eax,
81
82 address of dll_var in the command should be relocated to point into loaded
83 DLL. The aim is to make OS loader do so, and than make ld help with that.
84 Import section of PE made following way: there's a vector of structures
85 each describing imports from particular DLL. Each such structure points
86 to two other parallel vectors: one holding imported names, and one which
87 will hold address of corresponding imported name. So, the solution is
88 de-vectorize these structures, making import locations be sparse and
89 pointing directly into code. Before continuing, it is worth a note that,
90 while authors strives to make PE act ELF-like, there're some other people
91 make ELF act PE-like: elfvector, ;-) .
92
93 Implementation
94
95 For each reference of data symbol to be imported from DLL (to set of which
96 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
97 import fixup entry is generated. That entry is of type
98 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
99 fixup entry contains pointer to symbol's address within .text section
100 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
101 (so, DLL name is referenced by multiple entries), and pointer to symbol
102 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
103 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
104 containing imported name. Here comes that "om the edge" problem mentioned
105 above: PE specification rambles that name vector (OriginalFirstThunk)
106 should run in parallel with addresses vector (FirstThunk), i.e. that they
107 should have same number of elements and terminated with zero. We violate
108 this, since FirstThunk points directly into machine code. But in practice,
109 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
110 puts addresses to FirstThunk, not something else. It once again should be
111 noted that dll and symbol name structures are reused across fixup entries
112 and should be there anyway to support standard import stuff, so sustained
113 overhead is 20 bytes per reference. Other question is whether having several
114 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
115 done even by native compiler/linker (libth32's functions are in fact reside
116 in windows9x kernel32.dll, so if you use it, you have two
117 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
118 referencing the same PE structures several times is valid. The answer is why
119 not, prohibiting that (detecting violation) would require more work on
120 behalf of loader than not doing it.
121
122 See also: ld/emultempl/pe.em. */
123
124 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
125
126 /* For emultempl/pe.em. */
127
128 def_file * pe_def_file = 0;
129 int pe_dll_export_everything = 0;
130 int pe_dll_do_default_excludes = 1;
131 int pe_dll_kill_ats = 0;
132 int pe_dll_stdcall_aliases = 0;
133 int pe_dll_warn_dup_exports = 0;
134 int pe_dll_compat_implib = 0;
135 int pe_dll_extra_pe_debug = 0;
136
137 /* Static variables and types. */
138
139 static bfd_vma image_base;
140 static bfd *filler_bfd;
141 static struct bfd_section *edata_s, *reloc_s;
142 static unsigned char *edata_d, *reloc_d;
143 static size_t edata_sz, reloc_sz;
144 static int runtime_pseudo_relocs_created = 0;
145
146 typedef struct
147 {
148 char *target_name;
149 char *object_target;
150 unsigned int imagebase_reloc;
151 int pe_arch;
152 int bfd_arch;
153 int underscored;
154 }
155 pe_details_type;
156
157 typedef struct
158 {
159 char *name;
160 int len;
161 }
162 autofilter_entry_type;
163
164 #define PE_ARCH_i386 1
165 #define PE_ARCH_sh 2
166 #define PE_ARCH_mips 3
167 #define PE_ARCH_arm 4
168 #define PE_ARCH_arm_epoc 5
169
170 static pe_details_type pe_detail_list[] =
171 {
172 {
173 "pei-i386",
174 "pe-i386",
175 7 /* R_IMAGEBASE */,
176 PE_ARCH_i386,
177 bfd_arch_i386,
178 1
179 },
180 {
181 "pei-shl",
182 "pe-shl",
183 16 /* R_SH_IMAGEBASE */,
184 PE_ARCH_sh,
185 bfd_arch_sh,
186 1
187 },
188 {
189 "pei-mips",
190 "pe-mips",
191 34 /* MIPS_R_RVA */,
192 PE_ARCH_mips,
193 bfd_arch_mips,
194 0
195 },
196 {
197 "pei-arm-little",
198 "pe-arm-little",
199 11 /* ARM_RVA32 */,
200 PE_ARCH_arm,
201 bfd_arch_arm,
202 1
203 },
204 {
205 "epoc-pei-arm-little",
206 "epoc-pe-arm-little",
207 11 /* ARM_RVA32 */,
208 PE_ARCH_arm_epoc,
209 bfd_arch_arm,
210 0
211 },
212 { NULL, NULL, 0, 0, 0, 0 }
213 };
214
215 static pe_details_type *pe_details;
216
217 static autofilter_entry_type autofilter_symbollist[] =
218 {
219 { "DllMain@12", 10 },
220 { "DllEntryPoint@0", 15 },
221 { "DllMainCRTStartup@12", 20 },
222 { "_cygwin_dll_entry@12", 20 },
223 { "_cygwin_crt0_common@8", 21 },
224 { "_cygwin_noncygwin_dll_entry@12", 30 },
225 { "impure_ptr", 10 },
226 { "_pei386_runtime_relocator", 25 },
227 { "do_pseudo_reloc", 15 },
228 { "cygwin_crt0", 11 },
229 { NULL, 0 }
230 };
231
232 /* Do not specify library suffix explicitly, to allow for dllized versions. */
233 static autofilter_entry_type autofilter_liblist[] =
234 {
235 { "libcygwin", 9 },
236 { "libgcc", 6 },
237 { "libstdc++", 9 },
238 { "libmingw32", 10 },
239 { "libmingwex", 10 },
240 { "libg2c", 6 },
241 { "libsupc++", 9 },
242 { "libobjc", 7 },
243 { "libgcj", 6 },
244 { NULL, 0 }
245 };
246
247 static autofilter_entry_type autofilter_objlist[] =
248 {
249 { "crt0.o", 6 },
250 { "crt1.o", 6 },
251 { "crt2.o", 6 },
252 { "dllcrt1.o", 9 },
253 { "dllcrt2.o", 9 },
254 { "gcrt0.o", 7 },
255 { "gcrt1.o", 7 },
256 { "gcrt2.o", 7 },
257 { "crtbegin.o", 10 },
258 { "crtend.o", 8 },
259 { NULL, 0 }
260 };
261
262 static autofilter_entry_type autofilter_symbolprefixlist[] =
263 {
264 /* { "__imp_", 6 }, */
265 /* Do __imp_ explicitly to save time. */
266 { "__rtti_", 7 },
267 /* Don't re-export auto-imported symbols. */
268 { "_nm_", 4 },
269 { "__builtin_", 10 },
270 /* Don't export symbols specifying internal DLL layout. */
271 { "_head_", 6 },
272 { "_fmode", 6 },
273 { "_impure_ptr", 11 },
274 { "cygwin_attach_dll", 17 },
275 { "cygwin_premain0", 15 },
276 { "cygwin_premain1", 15 },
277 { "cygwin_premain2", 15 },
278 { "cygwin_premain3", 15 },
279 { "environ", 7 },
280 { NULL, 0 }
281 };
282
283 static autofilter_entry_type autofilter_symbolsuffixlist[] =
284 {
285 { "_iname", 6 },
286 { NULL, 0 }
287 };
288
289 #define U(str) (pe_details->underscored ? "_" str : str)
290
291 void
292 pe_dll_id_target (const char *target)
293 {
294 int i;
295
296 for (i = 0; pe_detail_list[i].target_name; i++)
297 if (strcmp (pe_detail_list[i].target_name, target) == 0
298 || strcmp (pe_detail_list[i].object_target, target) == 0)
299 {
300 pe_details = pe_detail_list + i;
301 return;
302 }
303 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
304 exit (1);
305 }
306
307 /* Helper functions for qsort. Relocs must be sorted so that we can write
308 them out by pages. */
309
310 typedef struct
311 {
312 bfd_vma vma;
313 char type;
314 short extra;
315 }
316 reloc_data_type;
317
318 static int
319 reloc_sort (const void *va, const void *vb)
320 {
321 bfd_vma a = ((const reloc_data_type *) va)->vma;
322 bfd_vma b = ((const reloc_data_type *) vb)->vma;
323
324 return (a > b) ? 1 : ((a < b) ? -1 : 0);
325 }
326
327 static int
328 pe_export_sort (const void *va, const void *vb)
329 {
330 const def_file_export *a = va;
331 const def_file_export *b = vb;
332
333 return strcmp (a->name, b->name);
334 }
335
336 /* Read and process the .DEF file. */
337
338 /* These correspond to the entries in pe_def_file->exports[]. I use
339 exported_symbol_sections[i] to tag whether or not the symbol was
340 defined, since we can't export symbols we don't have. */
341
342 static bfd_vma *exported_symbol_offsets;
343 static struct bfd_section **exported_symbol_sections;
344 static int export_table_size;
345 static int count_exported;
346 static int count_exported_byname;
347 static int count_with_ordinals;
348 static const char *dll_name;
349 static int min_ordinal, max_ordinal;
350 static int *exported_symbols;
351
352 typedef struct exclude_list_struct
353 {
354 char *string;
355 struct exclude_list_struct *next;
356 int type;
357 }
358 exclude_list_struct;
359
360 static struct exclude_list_struct *excludes = 0;
361
362 void
363 pe_dll_add_excludes (const char *new_excludes, const int type)
364 {
365 char *local_copy;
366 char *exclude_string;
367
368 local_copy = xstrdup (new_excludes);
369
370 exclude_string = strtok (local_copy, ",:");
371 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
372 {
373 struct exclude_list_struct *new_exclude;
374
375 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
376 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
377 strcpy (new_exclude->string, exclude_string);
378 new_exclude->type = type;
379 new_exclude->next = excludes;
380 excludes = new_exclude;
381 }
382
383 free (local_copy);
384 }
385
386
387 /* abfd is a bfd containing n (or NULL)
388 It can be used for contextual checks. */
389
390 static int
391 auto_export (bfd *abfd, def_file *d, const char *n)
392 {
393 int i;
394 struct exclude_list_struct *ex;
395 autofilter_entry_type *afptr;
396 const char * libname = 0;
397 if (abfd && abfd->my_archive)
398 libname = lbasename (abfd->my_archive->filename);
399
400 /* We should not re-export imported stuff. */
401 if (strncmp (n, "_imp_", 5) == 0)
402 return 0;
403
404 for (i = 0; i < d->num_exports; i++)
405 if (strcmp (d->exports[i].name, n) == 0)
406 return 0;
407
408 if (pe_dll_do_default_excludes)
409 {
410 const char * p;
411 int len;
412
413 if (pe_dll_extra_pe_debug)
414 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
415 n, abfd, abfd->my_archive);
416
417 /* First of all, make context checks:
418 Don't export anything from standard libs. */
419 if (libname)
420 {
421 afptr = autofilter_liblist;
422
423 while (afptr->name)
424 {
425 if (strncmp (libname, afptr->name, afptr->len) == 0 )
426 return 0;
427 afptr++;
428 }
429 }
430
431 /* Next, exclude symbols from certain startup objects. */
432
433 if (abfd && (p = lbasename (abfd->filename)))
434 {
435 afptr = autofilter_objlist;
436 while (afptr->name)
437 {
438 if (strcmp (p, afptr->name) == 0)
439 return 0;
440 afptr++;
441 }
442 }
443
444 /* Don't try to blindly exclude all symbols
445 that begin with '__'; this was tried and
446 it is too restrictive. */
447
448 /* Then, exclude specific symbols. */
449 afptr = autofilter_symbollist;
450 while (afptr->name)
451 {
452 if (strcmp (n, afptr->name) == 0)
453 return 0;
454
455 afptr++;
456 }
457
458 /* Next, exclude symbols starting with ... */
459 afptr = autofilter_symbolprefixlist;
460 while (afptr->name)
461 {
462 if (strncmp (n, afptr->name, afptr->len) == 0)
463 return 0;
464
465 afptr++;
466 }
467
468 /* Finally, exclude symbols ending with ... */
469 len = strlen (n);
470 afptr = autofilter_symbolsuffixlist;
471 while (afptr->name)
472 {
473 if ((len >= afptr->len)
474 /* Add 1 to insure match with trailing '\0'. */
475 && strncmp (n + len - afptr->len, afptr->name,
476 afptr->len + 1) == 0)
477 return 0;
478
479 afptr++;
480 }
481 }
482
483 for (ex = excludes; ex; ex = ex->next)
484 {
485 if (ex->type == 1) /* exclude-libs */
486 {
487 if (libname
488 && ((strcmp (libname, ex->string) == 0)
489 || (strcasecmp ("ALL", ex->string) == 0)))
490 return 0;
491 }
492 else if (strcmp (n, ex->string) == 0)
493 return 0;
494 }
495
496 return 1;
497 }
498
499 static void
500 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
501 {
502 int i, j;
503 struct bfd_link_hash_entry *blhe;
504 bfd *b;
505 struct bfd_section *s;
506 def_file_export *e = 0;
507
508 if (!pe_def_file)
509 pe_def_file = def_file_empty ();
510
511 /* First, run around to all the objects looking for the .drectve
512 sections, and push those into the def file too. */
513 for (b = info->input_bfds; b; b = b->link_next)
514 {
515 s = bfd_get_section_by_name (b, ".drectve");
516 if (s)
517 {
518 long size = s->size;
519 char *buf = xmalloc (size);
520
521 bfd_get_section_contents (b, s, buf, 0, size);
522 def_file_add_directive (pe_def_file, buf, size);
523 free (buf);
524 }
525 }
526
527 /* If we are not building a DLL, when there are no exports
528 we do not build an export table at all. */
529 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
530 && info->executable)
531 return;
532
533 /* Now, maybe export everything else the default way. */
534 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
535 {
536 for (b = info->input_bfds; b; b = b->link_next)
537 {
538 asymbol **symbols;
539 int nsyms, symsize;
540
541 symsize = bfd_get_symtab_upper_bound (b);
542 symbols = xmalloc (symsize);
543 nsyms = bfd_canonicalize_symtab (b, symbols);
544
545 for (j = 0; j < nsyms; j++)
546 {
547 /* We should export symbols which are either global or not
548 anything at all. (.bss data is the latter)
549 We should not export undefined symbols. */
550 if (symbols[j]->section != &bfd_und_section
551 && ((symbols[j]->flags & BSF_GLOBAL)
552 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
553 {
554 const char *sn = symbols[j]->name;
555
556 /* We should not re-export imported stuff. */
557 {
558 char *name = xmalloc (strlen (sn) + 2 + 6);
559 sprintf (name, "%s%s", U("_imp_"), sn);
560
561 blhe = bfd_link_hash_lookup (info->hash, name,
562 FALSE, FALSE, FALSE);
563 free (name);
564
565 if (blhe && blhe->type == bfd_link_hash_defined)
566 continue;
567 }
568
569 if (*sn == '_')
570 sn++;
571
572 if (auto_export (b, pe_def_file, sn))
573 {
574 def_file_export *p;
575 p=def_file_add_export (pe_def_file, sn, 0, -1);
576 /* Fill data flag properly, from dlltool.c. */
577 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
578 }
579 }
580 }
581 }
582 }
583
584 #undef NE
585 #define NE pe_def_file->num_exports
586
587 /* Canonicalize the export list. */
588 if (pe_dll_kill_ats)
589 {
590 for (i = 0; i < NE; i++)
591 {
592 if (strchr (pe_def_file->exports[i].name, '@'))
593 {
594 /* This will preserve internal_name, which may have been
595 pointing to the same memory as name, or might not
596 have. */
597 int lead_at = (*pe_def_file->exports[i].name == '@');
598 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
599
600 *(strchr (tmp, '@')) = 0;
601 pe_def_file->exports[i].name = tmp;
602 }
603 }
604 }
605
606 if (pe_dll_stdcall_aliases)
607 {
608 for (i = 0; i < NE; i++)
609 {
610 if (strchr (pe_def_file->exports[i].name, '@'))
611 {
612 int lead_at = (*pe_def_file->exports[i].name == '@');
613 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
614
615 *(strchr (tmp, '@')) = 0;
616 if (auto_export (NULL, pe_def_file, tmp))
617 def_file_add_export (pe_def_file, tmp,
618 pe_def_file->exports[i].internal_name,
619 -1);
620 else
621 free (tmp);
622 }
623 }
624 }
625
626 /* Convenience, but watch out for it changing. */
627 e = pe_def_file->exports;
628
629 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
630 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
631
632 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
633 max_ordinal = 0;
634 min_ordinal = 65536;
635 count_exported = 0;
636 count_exported_byname = 0;
637 count_with_ordinals = 0;
638
639 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
640 pe_export_sort);
641 for (i = 0, j = 0; i < NE; i++)
642 {
643 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
644 {
645 /* This is a duplicate. */
646 if (e[j - 1].ordinal != -1
647 && e[i].ordinal != -1
648 && e[j - 1].ordinal != e[i].ordinal)
649 {
650 if (pe_dll_warn_dup_exports)
651 /* xgettext:c-format */
652 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
653 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
654 }
655 else
656 {
657 if (pe_dll_warn_dup_exports)
658 /* xgettext:c-format */
659 einfo (_("Warning, duplicate EXPORT: %s\n"),
660 e[j - 1].name);
661 }
662
663 if (e[i].ordinal != -1)
664 e[j - 1].ordinal = e[i].ordinal;
665 e[j - 1].flag_private |= e[i].flag_private;
666 e[j - 1].flag_constant |= e[i].flag_constant;
667 e[j - 1].flag_noname |= e[i].flag_noname;
668 e[j - 1].flag_data |= e[i].flag_data;
669 }
670 else
671 {
672 if (i != j)
673 e[j] = e[i];
674 j++;
675 }
676 }
677 pe_def_file->num_exports = j; /* == NE */
678
679 for (i = 0; i < NE; i++)
680 {
681 char *name;
682
683 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
684 if (pe_details->underscored
685 && (*pe_def_file->exports[i].internal_name != '@'))
686 {
687 *name = '_';
688 strcpy (name + 1, pe_def_file->exports[i].internal_name);
689 }
690 else
691 strcpy (name, pe_def_file->exports[i].internal_name);
692
693 blhe = bfd_link_hash_lookup (info->hash,
694 name,
695 FALSE, FALSE, TRUE);
696
697 if (blhe
698 && (blhe->type == bfd_link_hash_defined
699 || (blhe->type == bfd_link_hash_common)))
700 {
701 count_exported++;
702 if (!pe_def_file->exports[i].flag_noname)
703 count_exported_byname++;
704
705 /* Only fill in the sections. The actual offsets are computed
706 in fill_exported_offsets() after common symbols are laid
707 out. */
708 if (blhe->type == bfd_link_hash_defined)
709 exported_symbol_sections[i] = blhe->u.def.section;
710 else
711 exported_symbol_sections[i] = blhe->u.c.p->section;
712
713 if (pe_def_file->exports[i].ordinal != -1)
714 {
715 if (max_ordinal < pe_def_file->exports[i].ordinal)
716 max_ordinal = pe_def_file->exports[i].ordinal;
717 if (min_ordinal > pe_def_file->exports[i].ordinal)
718 min_ordinal = pe_def_file->exports[i].ordinal;
719 count_with_ordinals++;
720 }
721 }
722 else if (blhe && blhe->type == bfd_link_hash_undefined)
723 {
724 /* xgettext:c-format */
725 einfo (_("%XCannot export %s: symbol not defined\n"),
726 pe_def_file->exports[i].internal_name);
727 }
728 else if (blhe)
729 {
730 /* xgettext:c-format */
731 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
732 pe_def_file->exports[i].internal_name,
733 blhe->type, bfd_link_hash_defined);
734 }
735 else
736 {
737 /* xgettext:c-format */
738 einfo (_("%XCannot export %s: symbol not found\n"),
739 pe_def_file->exports[i].internal_name);
740 }
741 free (name);
742 }
743 }
744
745 /* Build the bfd that will contain .edata and .reloc sections. */
746
747 static void
748 build_filler_bfd (int include_edata)
749 {
750 lang_input_statement_type *filler_file;
751 filler_file = lang_add_input_file ("dll stuff",
752 lang_input_file_is_fake_enum,
753 NULL);
754 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
755 if (filler_bfd == NULL
756 || !bfd_set_arch_mach (filler_bfd,
757 bfd_get_arch (output_bfd),
758 bfd_get_mach (output_bfd)))
759 {
760 einfo ("%X%P: can not create BFD %E\n");
761 return;
762 }
763
764 if (include_edata)
765 {
766 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
767 if (edata_s == NULL
768 || !bfd_set_section_flags (filler_bfd, edata_s,
769 (SEC_HAS_CONTENTS
770 | SEC_ALLOC
771 | SEC_LOAD
772 | SEC_KEEP
773 | SEC_IN_MEMORY)))
774 {
775 einfo ("%X%P: can not create .edata section: %E\n");
776 return;
777 }
778 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
779 }
780
781 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
782 if (reloc_s == NULL
783 || !bfd_set_section_flags (filler_bfd, reloc_s,
784 (SEC_HAS_CONTENTS
785 | SEC_ALLOC
786 | SEC_LOAD
787 | SEC_KEEP
788 | SEC_IN_MEMORY)))
789 {
790 einfo ("%X%P: can not create .reloc section: %E\n");
791 return;
792 }
793
794 bfd_set_section_size (filler_bfd, reloc_s, 0);
795
796 ldlang_add_file (filler_file);
797 }
798
799 /* Gather all the exported symbols and build the .edata section. */
800
801 static void
802 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
803 {
804 int i, next_ordinal;
805 int name_table_size = 0;
806 const char *dlnp;
807
808 /* First, we need to know how many exported symbols there are,
809 and what the range of ordinals is. */
810 if (pe_def_file->name)
811 dll_name = pe_def_file->name;
812 else
813 {
814 dll_name = abfd->filename;
815
816 for (dlnp = dll_name; *dlnp; dlnp++)
817 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
818 dll_name = dlnp + 1;
819 }
820
821 if (count_with_ordinals && max_ordinal > count_exported)
822 {
823 if (min_ordinal > max_ordinal - count_exported + 1)
824 min_ordinal = max_ordinal - count_exported + 1;
825 }
826 else
827 {
828 min_ordinal = 1;
829 max_ordinal = count_exported;
830 }
831
832 export_table_size = max_ordinal - min_ordinal + 1;
833 exported_symbols = xmalloc (export_table_size * sizeof (int));
834 for (i = 0; i < export_table_size; i++)
835 exported_symbols[i] = -1;
836
837 /* Now we need to assign ordinals to those that don't have them. */
838 for (i = 0; i < NE; i++)
839 {
840 if (exported_symbol_sections[i])
841 {
842 if (pe_def_file->exports[i].ordinal != -1)
843 {
844 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
845 int pi = exported_symbols[ei];
846
847 if (pi != -1)
848 {
849 /* xgettext:c-format */
850 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
851 pe_def_file->exports[i].ordinal,
852 pe_def_file->exports[i].name,
853 pe_def_file->exports[pi].name);
854 }
855 exported_symbols[ei] = i;
856 }
857 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
858 }
859 }
860
861 next_ordinal = min_ordinal;
862 for (i = 0; i < NE; i++)
863 if (exported_symbol_sections[i])
864 if (pe_def_file->exports[i].ordinal == -1)
865 {
866 while (exported_symbols[next_ordinal - min_ordinal] != -1)
867 next_ordinal++;
868
869 exported_symbols[next_ordinal - min_ordinal] = i;
870 pe_def_file->exports[i].ordinal = next_ordinal;
871 }
872
873 /* OK, now we can allocate some memory. */
874 edata_sz = (40 /* directory */
875 + 4 * export_table_size /* addresses */
876 + 4 * count_exported_byname /* name ptrs */
877 + 2 * count_exported_byname /* ordinals */
878 + name_table_size + strlen (dll_name) + 1);
879 }
880
881 /* Fill the exported symbol offsets. The preliminary work has already
882 been done in process_def_file(). */
883
884 static void
885 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
886 {
887 int i;
888 struct bfd_link_hash_entry *blhe;
889
890 for (i = 0; i < pe_def_file->num_exports; i++)
891 {
892 char *name;
893
894 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
895 if (pe_details->underscored
896 && *pe_def_file->exports[i].internal_name != '@')
897 {
898 *name = '_';
899 strcpy (name + 1, pe_def_file->exports[i].internal_name);
900 }
901 else
902 strcpy (name, pe_def_file->exports[i].internal_name);
903
904 blhe = bfd_link_hash_lookup (info->hash,
905 name,
906 FALSE, FALSE, TRUE);
907
908 if (blhe && blhe->type == bfd_link_hash_defined)
909 exported_symbol_offsets[i] = blhe->u.def.value;
910
911 free (name);
912 }
913 }
914
915 static void
916 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
917 {
918 int s, hint;
919 unsigned char *edirectory;
920 unsigned char *eaddresses;
921 unsigned char *enameptrs;
922 unsigned char *eordinals;
923 char *enamestr;
924 time_t now;
925
926 time (&now);
927
928 edata_d = xmalloc (edata_sz);
929
930 /* Note use of array pointer math here. */
931 edirectory = edata_d;
932 eaddresses = edata_d + 40;
933 enameptrs = eaddresses + 4 * export_table_size;
934 eordinals = enameptrs + 4 * count_exported_byname;
935 enamestr = (char *) eordinals + 2 * count_exported_byname;
936
937 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
938 + edata_s->output_section->vma - image_base)
939
940 memset (edata_d, 0, edata_sz);
941 bfd_put_32 (abfd, now, edata_d + 4);
942 if (pe_def_file->version_major != -1)
943 {
944 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
945 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
946 }
947
948 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
949 strcpy (enamestr, dll_name);
950 enamestr += strlen (enamestr) + 1;
951 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
952 bfd_put_32 (abfd, export_table_size, edata_d + 20);
953 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
954 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
955 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
956 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
957
958 fill_exported_offsets (abfd, info);
959
960 /* Ok, now for the filling in part.
961 Scan alphabetically - ie the ordering in the exports[] table,
962 rather than by ordinal - the ordering in the exported_symbol[]
963 table. See dlltool.c and:
964 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
965 for more information. */
966 hint = 0;
967 for (s = 0; s < NE; s++)
968 {
969 struct bfd_section *ssec = exported_symbol_sections[s];
970 if (ssec && pe_def_file->exports[s].ordinal != -1)
971 {
972 unsigned long srva = (exported_symbol_offsets[s]
973 + ssec->output_section->vma
974 + ssec->output_offset);
975 int ord = pe_def_file->exports[s].ordinal;
976
977 bfd_put_32 (abfd, srva - image_base,
978 eaddresses + 4 * (ord - min_ordinal));
979
980 if (!pe_def_file->exports[s].flag_noname)
981 {
982 char *ename = pe_def_file->exports[s].name;
983
984 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
985 enameptrs += 4;
986 strcpy (enamestr, ename);
987 enamestr += strlen (enamestr) + 1;
988 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
989 eordinals += 2;
990 pe_def_file->exports[s].hint = hint++;
991 }
992 }
993 }
994 }
995
996
997 static struct bfd_section *current_sec;
998
999 void
1000 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1001 const char *name,
1002 int (*cb) (arelent *, asection *))
1003 {
1004 bfd *b;
1005 asection *s;
1006
1007 for (b = info->input_bfds; b; b = b->link_next)
1008 {
1009 asymbol **symbols;
1010 int nsyms, symsize;
1011
1012 symsize = bfd_get_symtab_upper_bound (b);
1013 symbols = xmalloc (symsize);
1014 nsyms = bfd_canonicalize_symtab (b, symbols);
1015
1016 for (s = b->sections; s; s = s->next)
1017 {
1018 arelent **relocs;
1019 int relsize, nrelocs, i;
1020 int flags = bfd_get_section_flags (b, s);
1021
1022 /* Skip discarded linkonce sections. */
1023 if (flags & SEC_LINK_ONCE
1024 && s->output_section == bfd_abs_section_ptr)
1025 continue;
1026
1027 current_sec = s;
1028
1029 relsize = bfd_get_reloc_upper_bound (b, s);
1030 relocs = xmalloc (relsize);
1031 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1032
1033 for (i = 0; i < nrelocs; i++)
1034 {
1035 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1036
1037 if (!strcmp (name, sym->name))
1038 cb (relocs[i], s);
1039 }
1040
1041 free (relocs);
1042
1043 /* Warning: the allocated symbols are remembered in BFD and reused
1044 later, so don't free them! */
1045 /* free (symbols); */
1046 }
1047 }
1048 }
1049
1050 /* Gather all the relocations and build the .reloc section. */
1051
1052 static void
1053 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1054 {
1055
1056 /* For .reloc stuff. */
1057 reloc_data_type *reloc_data;
1058 int total_relocs = 0;
1059 int i;
1060 unsigned long sec_page = (unsigned long) -1;
1061 unsigned long page_ptr, page_count;
1062 int bi;
1063 bfd *b;
1064 struct bfd_section *s;
1065
1066 total_relocs = 0;
1067 for (b = info->input_bfds; b; b = b->link_next)
1068 for (s = b->sections; s; s = s->next)
1069 total_relocs += s->reloc_count;
1070
1071 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1072
1073 total_relocs = 0;
1074 bi = 0;
1075 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1076 {
1077 arelent **relocs;
1078 int relsize, nrelocs, i;
1079
1080 for (s = b->sections; s; s = s->next)
1081 {
1082 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1083 asymbol **symbols;
1084 int nsyms, symsize;
1085
1086 /* If it's not loaded, we don't need to relocate it this way. */
1087 if (!(s->output_section->flags & SEC_LOAD))
1088 continue;
1089
1090 /* I don't know why there would be a reloc for these, but I've
1091 seen it happen - DJ */
1092 if (s->output_section == &bfd_abs_section)
1093 continue;
1094
1095 if (s->output_section->vma == 0)
1096 {
1097 /* Huh? Shouldn't happen, but punt if it does. */
1098 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1099 s->output_section->name, s->output_section->index,
1100 s->output_section->flags);
1101 continue;
1102 }
1103
1104 symsize = bfd_get_symtab_upper_bound (b);
1105 symbols = xmalloc (symsize);
1106 nsyms = bfd_canonicalize_symtab (b, symbols);
1107
1108 relsize = bfd_get_reloc_upper_bound (b, s);
1109 relocs = xmalloc (relsize);
1110 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1111
1112 for (i = 0; i < nrelocs; i++)
1113 {
1114 if (pe_dll_extra_pe_debug)
1115 {
1116 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1117 printf ("rel: %s\n", sym->name);
1118 }
1119 if (!relocs[i]->howto->pc_relative
1120 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1121 {
1122 bfd_vma sym_vma;
1123 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1124
1125 sym_vma = (relocs[i]->addend
1126 + sym->value
1127 + sym->section->vma
1128 + sym->section->output_offset
1129 + sym->section->output_section->vma);
1130 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1131
1132 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1133
1134 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1135 relocs[i]->howto->rightshift)
1136 {
1137 case BITS_AND_SHIFT (32, 0):
1138 reloc_data[total_relocs].type = 3;
1139 total_relocs++;
1140 break;
1141 case BITS_AND_SHIFT (16, 0):
1142 reloc_data[total_relocs].type = 2;
1143 total_relocs++;
1144 break;
1145 case BITS_AND_SHIFT (16, 16):
1146 reloc_data[total_relocs].type = 4;
1147 /* FIXME: we can't know the symbol's right value
1148 yet, but we probably can safely assume that
1149 CE will relocate us in 64k blocks, so leaving
1150 it zero is safe. */
1151 reloc_data[total_relocs].extra = 0;
1152 total_relocs++;
1153 break;
1154 case BITS_AND_SHIFT (26, 2):
1155 reloc_data[total_relocs].type = 5;
1156 total_relocs++;
1157 break;
1158 case BITS_AND_SHIFT (24, 2):
1159 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1160 Those ARM_xxx definitions should go in proper
1161 header someday. */
1162 if (relocs[i]->howto->type == 0
1163 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1164 || relocs[i]->howto->type == 5)
1165 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1166 that has already been fully processed during a
1167 previous link stage, so ignore it here. */
1168 break;
1169 /* Fall through. */
1170 default:
1171 /* xgettext:c-format */
1172 einfo (_("%XError: %d-bit reloc in dll\n"),
1173 relocs[i]->howto->bitsize);
1174 break;
1175 }
1176 }
1177 }
1178 free (relocs);
1179 /* Warning: the allocated symbols are remembered in BFD and
1180 reused later, so don't free them! */
1181 }
1182 }
1183
1184 /* At this point, we have total_relocs relocation addresses in
1185 reloc_addresses, which are all suitable for the .reloc section.
1186 We must now create the new sections. */
1187 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1188
1189 for (i = 0; i < total_relocs; i++)
1190 {
1191 unsigned long this_page = (reloc_data[i].vma >> 12);
1192
1193 if (this_page != sec_page)
1194 {
1195 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1196 reloc_sz += 8;
1197 sec_page = this_page;
1198 }
1199
1200 reloc_sz += 2;
1201
1202 if (reloc_data[i].type == 4)
1203 reloc_sz += 2;
1204 }
1205
1206 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1207 reloc_d = xmalloc (reloc_sz);
1208 sec_page = (unsigned long) -1;
1209 reloc_sz = 0;
1210 page_ptr = (unsigned long) -1;
1211 page_count = 0;
1212
1213 for (i = 0; i < total_relocs; i++)
1214 {
1215 unsigned long rva = reloc_data[i].vma - image_base;
1216 unsigned long this_page = (rva & ~0xfff);
1217
1218 if (this_page != sec_page)
1219 {
1220 while (reloc_sz & 3)
1221 reloc_d[reloc_sz++] = 0;
1222
1223 if (page_ptr != (unsigned long) -1)
1224 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1225
1226 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1227 page_ptr = reloc_sz;
1228 reloc_sz += 8;
1229 sec_page = this_page;
1230 page_count = 0;
1231 }
1232
1233 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1234 reloc_d + reloc_sz);
1235 reloc_sz += 2;
1236
1237 if (reloc_data[i].type == 4)
1238 {
1239 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1240 reloc_sz += 2;
1241 }
1242
1243 page_count++;
1244 }
1245
1246 while (reloc_sz & 3)
1247 reloc_d[reloc_sz++] = 0;
1248
1249 if (page_ptr != (unsigned long) -1)
1250 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1251
1252 while (reloc_sz < reloc_s->size)
1253 reloc_d[reloc_sz++] = 0;
1254 }
1255
1256 /* Given the exiting def_file structure, print out a .DEF file that
1257 corresponds to it. */
1258
1259 static void
1260 quoteput (char *s, FILE *f, int needs_quotes)
1261 {
1262 char *cp;
1263
1264 for (cp = s; *cp; cp++)
1265 if (*cp == '\''
1266 || *cp == '"'
1267 || *cp == '\\'
1268 || ISSPACE (*cp)
1269 || *cp == ','
1270 || *cp == ';')
1271 needs_quotes = 1;
1272
1273 if (needs_quotes)
1274 {
1275 putc ('"', f);
1276
1277 while (*s)
1278 {
1279 if (*s == '"' || *s == '\\')
1280 putc ('\\', f);
1281
1282 putc (*s, f);
1283 s++;
1284 }
1285
1286 putc ('"', f);
1287 }
1288 else
1289 fputs (s, f);
1290 }
1291
1292 void
1293 pe_dll_generate_def_file (const char *pe_out_def_filename)
1294 {
1295 int i;
1296 FILE *out = fopen (pe_out_def_filename, "w");
1297
1298 if (out == NULL)
1299 /* xgettext:c-format */
1300 einfo (_("%s: Can't open output def file %s\n"),
1301 program_name, pe_out_def_filename);
1302
1303 if (pe_def_file)
1304 {
1305 if (pe_def_file->name)
1306 {
1307 if (pe_def_file->is_dll)
1308 fprintf (out, "LIBRARY ");
1309 else
1310 fprintf (out, "NAME ");
1311
1312 quoteput (pe_def_file->name, out, 1);
1313
1314 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1315 fprintf (out, " BASE=0x%lx",
1316 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1317 fprintf (out, "\n");
1318 }
1319
1320 if (pe_def_file->description)
1321 {
1322 fprintf (out, "DESCRIPTION ");
1323 quoteput (pe_def_file->description, out, 1);
1324 fprintf (out, "\n");
1325 }
1326
1327 if (pe_def_file->version_minor != -1)
1328 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1329 pe_def_file->version_minor);
1330 else if (pe_def_file->version_major != -1)
1331 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1332
1333 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1334 fprintf (out, "\n");
1335
1336 if (pe_def_file->stack_commit != -1)
1337 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1338 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1339 else if (pe_def_file->stack_reserve != -1)
1340 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1341
1342 if (pe_def_file->heap_commit != -1)
1343 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1344 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1345 else if (pe_def_file->heap_reserve != -1)
1346 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1347
1348 if (pe_def_file->num_section_defs > 0)
1349 {
1350 fprintf (out, "\nSECTIONS\n\n");
1351
1352 for (i = 0; i < pe_def_file->num_section_defs; i++)
1353 {
1354 fprintf (out, " ");
1355 quoteput (pe_def_file->section_defs[i].name, out, 0);
1356
1357 if (pe_def_file->section_defs[i].class)
1358 {
1359 fprintf (out, " CLASS ");
1360 quoteput (pe_def_file->section_defs[i].class, out, 0);
1361 }
1362
1363 if (pe_def_file->section_defs[i].flag_read)
1364 fprintf (out, " READ");
1365
1366 if (pe_def_file->section_defs[i].flag_write)
1367 fprintf (out, " WRITE");
1368
1369 if (pe_def_file->section_defs[i].flag_execute)
1370 fprintf (out, " EXECUTE");
1371
1372 if (pe_def_file->section_defs[i].flag_shared)
1373 fprintf (out, " SHARED");
1374
1375 fprintf (out, "\n");
1376 }
1377 }
1378
1379 if (pe_def_file->num_exports > 0)
1380 {
1381 fprintf (out, "EXPORTS\n");
1382
1383 for (i = 0; i < pe_def_file->num_exports; i++)
1384 {
1385 def_file_export *e = pe_def_file->exports + i;
1386 fprintf (out, " ");
1387 quoteput (e->name, out, 0);
1388
1389 if (e->internal_name && strcmp (e->internal_name, e->name))
1390 {
1391 fprintf (out, " = ");
1392 quoteput (e->internal_name, out, 0);
1393 }
1394
1395 if (e->ordinal != -1)
1396 fprintf (out, " @%d", e->ordinal);
1397
1398 if (e->flag_private)
1399 fprintf (out, " PRIVATE");
1400
1401 if (e->flag_constant)
1402 fprintf (out, " CONSTANT");
1403
1404 if (e->flag_noname)
1405 fprintf (out, " NONAME");
1406
1407 if (e->flag_data)
1408 fprintf (out, " DATA");
1409
1410 fprintf (out, "\n");
1411 }
1412 }
1413
1414 if (pe_def_file->num_imports > 0)
1415 {
1416 fprintf (out, "\nIMPORTS\n\n");
1417
1418 for (i = 0; i < pe_def_file->num_imports; i++)
1419 {
1420 def_file_import *im = pe_def_file->imports + i;
1421 fprintf (out, " ");
1422
1423 if (im->internal_name
1424 && (!im->name || strcmp (im->internal_name, im->name)))
1425 {
1426 quoteput (im->internal_name, out, 0);
1427 fprintf (out, " = ");
1428 }
1429
1430 quoteput (im->module->name, out, 0);
1431 fprintf (out, ".");
1432
1433 if (im->name)
1434 quoteput (im->name, out, 0);
1435 else
1436 fprintf (out, "%d", im->ordinal);
1437
1438 fprintf (out, "\n");
1439 }
1440 }
1441 }
1442 else
1443 fprintf (out, _("; no contents available\n"));
1444
1445 if (fclose (out) == EOF)
1446 /* xgettext:c-format */
1447 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1448 }
1449
1450 /* Generate the import library. */
1451
1452 static asymbol **symtab;
1453 static int symptr;
1454 static int tmp_seq;
1455 static const char *dll_filename;
1456 static char *dll_symname;
1457
1458 #define UNDSEC (asection *) &bfd_und_section
1459
1460 static asection *
1461 quick_section (bfd *abfd, const char *name, int flags, int align)
1462 {
1463 asection *sec;
1464 asymbol *sym;
1465
1466 sec = bfd_make_section_old_way (abfd, name);
1467 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1468 bfd_set_section_alignment (abfd, sec, align);
1469 /* Remember to undo this before trying to link internally! */
1470 sec->output_section = sec;
1471
1472 sym = bfd_make_empty_symbol (abfd);
1473 symtab[symptr++] = sym;
1474 sym->name = sec->name;
1475 sym->section = sec;
1476 sym->flags = BSF_LOCAL;
1477 sym->value = 0;
1478
1479 return sec;
1480 }
1481
1482 static void
1483 quick_symbol (bfd *abfd,
1484 const char *n1,
1485 const char *n2,
1486 const char *n3,
1487 asection *sec,
1488 int flags,
1489 int addr)
1490 {
1491 asymbol *sym;
1492 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1493
1494 strcpy (name, n1);
1495 strcat (name, n2);
1496 strcat (name, n3);
1497 sym = bfd_make_empty_symbol (abfd);
1498 sym->name = name;
1499 sym->section = sec;
1500 sym->flags = flags;
1501 sym->value = addr;
1502 symtab[symptr++] = sym;
1503 }
1504
1505 static arelent *reltab = 0;
1506 static int relcount = 0, relsize = 0;
1507
1508 static void
1509 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1510 {
1511 if (relcount >= relsize - 1)
1512 {
1513 relsize += 10;
1514 if (reltab)
1515 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1516 else
1517 reltab = xmalloc (relsize * sizeof (arelent));
1518 }
1519 reltab[relcount].address = address;
1520 reltab[relcount].addend = 0;
1521 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1522 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1523 relcount++;
1524 }
1525
1526 static void
1527 save_relocs (asection *sec)
1528 {
1529 int i;
1530
1531 sec->relocation = reltab;
1532 sec->reloc_count = relcount;
1533 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1534 for (i = 0; i < relcount; i++)
1535 sec->orelocation[i] = sec->relocation + i;
1536 sec->orelocation[relcount] = 0;
1537 sec->flags |= SEC_RELOC;
1538 reltab = 0;
1539 relcount = relsize = 0;
1540 }
1541
1542 /* .section .idata$2
1543 .global __head_my_dll
1544 __head_my_dll:
1545 .rva hname
1546 .long 0
1547 .long 0
1548 .rva __my_dll_iname
1549 .rva fthunk
1550
1551 .section .idata$5
1552 .long 0
1553 fthunk:
1554
1555 .section .idata$4
1556 .long 0
1557 hname: */
1558
1559 static bfd *
1560 make_head (bfd *parent)
1561 {
1562 asection *id2, *id5, *id4;
1563 unsigned char *d2, *d5, *d4;
1564 char *oname;
1565 bfd *abfd;
1566
1567 oname = xmalloc (20);
1568 sprintf (oname, "d%06d.o", tmp_seq);
1569 tmp_seq++;
1570
1571 abfd = bfd_create (oname, parent);
1572 bfd_find_target (pe_details->object_target, abfd);
1573 bfd_make_writable (abfd);
1574
1575 bfd_set_format (abfd, bfd_object);
1576 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1577
1578 symptr = 0;
1579 symtab = xmalloc (6 * sizeof (asymbol *));
1580 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1581 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1582 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1583 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1584 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1585
1586 /* OK, pay attention here. I got confused myself looking back at
1587 it. We create a four-byte section to mark the beginning of the
1588 list, and we include an offset of 4 in the section, so that the
1589 pointer to the list points to the *end* of this section, which is
1590 the start of the list of sections from other objects. */
1591
1592 bfd_set_section_size (abfd, id2, 20);
1593 d2 = xmalloc (20);
1594 id2->contents = d2;
1595 memset (d2, 0, 20);
1596 d2[0] = d2[16] = 4; /* Reloc addend. */
1597 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1598 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1599 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1600 save_relocs (id2);
1601
1602 bfd_set_section_size (abfd, id5, 4);
1603 d5 = xmalloc (4);
1604 id5->contents = d5;
1605 memset (d5, 0, 4);
1606
1607 bfd_set_section_size (abfd, id4, 4);
1608 d4 = xmalloc (4);
1609 id4->contents = d4;
1610 memset (d4, 0, 4);
1611
1612 bfd_set_symtab (abfd, symtab, symptr);
1613
1614 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1615 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1616 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1617
1618 bfd_make_readable (abfd);
1619 return abfd;
1620 }
1621
1622 /* .section .idata$4
1623 .long 0
1624 .section .idata$5
1625 .long 0
1626 .section idata$7
1627 .global __my_dll_iname
1628 __my_dll_iname:
1629 .asciz "my.dll" */
1630
1631 static bfd *
1632 make_tail (bfd *parent)
1633 {
1634 asection *id4, *id5, *id7;
1635 unsigned char *d4, *d5, *d7;
1636 int len;
1637 char *oname;
1638 bfd *abfd;
1639
1640 oname = xmalloc (20);
1641 sprintf (oname, "d%06d.o", tmp_seq);
1642 tmp_seq++;
1643
1644 abfd = bfd_create (oname, parent);
1645 bfd_find_target (pe_details->object_target, abfd);
1646 bfd_make_writable (abfd);
1647
1648 bfd_set_format (abfd, bfd_object);
1649 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1650
1651 symptr = 0;
1652 symtab = xmalloc (5 * sizeof (asymbol *));
1653 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1654 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1655 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1656 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1657
1658 bfd_set_section_size (abfd, id4, 4);
1659 d4 = xmalloc (4);
1660 id4->contents = d4;
1661 memset (d4, 0, 4);
1662
1663 bfd_set_section_size (abfd, id5, 4);
1664 d5 = xmalloc (4);
1665 id5->contents = d5;
1666 memset (d5, 0, 4);
1667
1668 len = strlen (dll_filename) + 1;
1669 if (len & 1)
1670 len++;
1671 bfd_set_section_size (abfd, id7, len);
1672 d7 = xmalloc (len);
1673 id7->contents = d7;
1674 strcpy ((char *) d7, dll_filename);
1675
1676 bfd_set_symtab (abfd, symtab, symptr);
1677
1678 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1679 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1680 bfd_set_section_contents (abfd, id7, d7, 0, len);
1681
1682 bfd_make_readable (abfd);
1683 return abfd;
1684 }
1685
1686 /* .text
1687 .global _function
1688 .global ___imp_function
1689 .global __imp__function
1690 _function:
1691 jmp *__imp__function:
1692
1693 .section idata$7
1694 .long __head_my_dll
1695
1696 .section .idata$5
1697 ___imp_function:
1698 __imp__function:
1699 iat?
1700 .section .idata$4
1701 iat?
1702 .section .idata$6
1703 ID<ordinal>:
1704 .short <hint>
1705 .asciz "function" xlate? (add underscore, kill at) */
1706
1707 static unsigned char jmp_ix86_bytes[] =
1708 {
1709 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1710 };
1711
1712 /* _function:
1713 mov.l ip+8,r0
1714 mov.l @r0,r0
1715 jmp @r0
1716 nop
1717 .dw __imp_function */
1718
1719 static unsigned char jmp_sh_bytes[] =
1720 {
1721 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1722 };
1723
1724 /* _function:
1725 lui $t0,<high:__imp_function>
1726 lw $t0,<low:__imp_function>
1727 jr $t0
1728 nop */
1729
1730 static unsigned char jmp_mips_bytes[] =
1731 {
1732 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1733 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1734 };
1735
1736 static bfd *
1737 make_one (def_file_export *exp, bfd *parent)
1738 {
1739 asection *tx, *id7, *id5, *id4, *id6;
1740 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1741 int len;
1742 char *oname;
1743 bfd *abfd;
1744 unsigned char *jmp_bytes = NULL;
1745 int jmp_byte_count = 0;
1746
1747 switch (pe_details->pe_arch)
1748 {
1749 case PE_ARCH_i386:
1750 jmp_bytes = jmp_ix86_bytes;
1751 jmp_byte_count = sizeof (jmp_ix86_bytes);
1752 break;
1753 case PE_ARCH_sh:
1754 jmp_bytes = jmp_sh_bytes;
1755 jmp_byte_count = sizeof (jmp_sh_bytes);
1756 break;
1757 case PE_ARCH_mips:
1758 jmp_bytes = jmp_mips_bytes;
1759 jmp_byte_count = sizeof (jmp_mips_bytes);
1760 break;
1761 default:
1762 abort ();
1763 }
1764
1765 oname = xmalloc (20);
1766 sprintf (oname, "d%06d.o", tmp_seq);
1767 tmp_seq++;
1768
1769 abfd = bfd_create (oname, parent);
1770 bfd_find_target (pe_details->object_target, abfd);
1771 bfd_make_writable (abfd);
1772
1773 bfd_set_format (abfd, bfd_object);
1774 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1775
1776 symptr = 0;
1777 symtab = xmalloc (11 * sizeof (asymbol *));
1778 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1779 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1780 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1781 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1782 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1783
1784 if (*exp->internal_name == '@')
1785 {
1786 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1787 BSF_GLOBAL, 0);
1788 if (! exp->flag_data)
1789 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1790 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1791 BSF_GLOBAL, 0);
1792 /* Fastcall applies only to functions,
1793 so no need for auto-import symbol. */
1794 }
1795 else
1796 {
1797 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1798 BSF_GLOBAL, 0);
1799 if (! exp->flag_data)
1800 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1801 BSF_GLOBAL, 0);
1802 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1803 BSF_GLOBAL, 0);
1804 /* Symbol to reference ord/name of imported
1805 data symbol, used to implement auto-import. */
1806 if (exp->flag_data)
1807 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1808 BSF_GLOBAL,0);
1809 }
1810 if (pe_dll_compat_implib)
1811 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1812 BSF_GLOBAL, 0);
1813
1814 if (! exp->flag_data)
1815 {
1816 bfd_set_section_size (abfd, tx, jmp_byte_count);
1817 td = xmalloc (jmp_byte_count);
1818 tx->contents = td;
1819 memcpy (td, jmp_bytes, jmp_byte_count);
1820
1821 switch (pe_details->pe_arch)
1822 {
1823 case PE_ARCH_i386:
1824 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1825 break;
1826 case PE_ARCH_sh:
1827 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1828 break;
1829 case PE_ARCH_mips:
1830 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1831 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1832 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1833 break;
1834 default:
1835 abort ();
1836 }
1837 save_relocs (tx);
1838 }
1839
1840 bfd_set_section_size (abfd, id7, 4);
1841 d7 = xmalloc (4);
1842 id7->contents = d7;
1843 memset (d7, 0, 4);
1844 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1845 save_relocs (id7);
1846
1847 bfd_set_section_size (abfd, id5, 4);
1848 d5 = xmalloc (4);
1849 id5->contents = d5;
1850 memset (d5, 0, 4);
1851
1852 if (exp->flag_noname)
1853 {
1854 d5[0] = exp->ordinal;
1855 d5[1] = exp->ordinal >> 8;
1856 d5[3] = 0x80;
1857 }
1858 else
1859 {
1860 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1861 save_relocs (id5);
1862 }
1863
1864 bfd_set_section_size (abfd, id4, 4);
1865 d4 = xmalloc (4);
1866 id4->contents = d4;
1867 memset (d4, 0, 4);
1868
1869 if (exp->flag_noname)
1870 {
1871 d4[0] = exp->ordinal;
1872 d4[1] = exp->ordinal >> 8;
1873 d4[3] = 0x80;
1874 }
1875 else
1876 {
1877 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1878 save_relocs (id4);
1879 }
1880
1881 if (exp->flag_noname)
1882 {
1883 len = 0;
1884 bfd_set_section_size (abfd, id6, 0);
1885 }
1886 else
1887 {
1888 len = strlen (exp->name) + 3;
1889 if (len & 1)
1890 len++;
1891 bfd_set_section_size (abfd, id6, len);
1892 d6 = xmalloc (len);
1893 id6->contents = d6;
1894 memset (d6, 0, len);
1895 d6[0] = exp->hint & 0xff;
1896 d6[1] = exp->hint >> 8;
1897 strcpy ((char *) d6 + 2, exp->name);
1898 }
1899
1900 bfd_set_symtab (abfd, symtab, symptr);
1901
1902 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1903 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1904 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1905 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1906 if (!exp->flag_noname)
1907 bfd_set_section_contents (abfd, id6, d6, 0, len);
1908
1909 bfd_make_readable (abfd);
1910 return abfd;
1911 }
1912
1913 static bfd *
1914 make_singleton_name_thunk (const char *import, bfd *parent)
1915 {
1916 /* Name thunks go to idata$4. */
1917 asection *id4;
1918 unsigned char *d4;
1919 char *oname;
1920 bfd *abfd;
1921
1922 oname = xmalloc (20);
1923 sprintf (oname, "nmth%06d.o", tmp_seq);
1924 tmp_seq++;
1925
1926 abfd = bfd_create (oname, parent);
1927 bfd_find_target (pe_details->object_target, abfd);
1928 bfd_make_writable (abfd);
1929
1930 bfd_set_format (abfd, bfd_object);
1931 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1932
1933 symptr = 0;
1934 symtab = xmalloc (3 * sizeof (asymbol *));
1935 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1936 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1937 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1938
1939 bfd_set_section_size (abfd, id4, 8);
1940 d4 = xmalloc (4);
1941 id4->contents = d4;
1942 memset (d4, 0, 8);
1943 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1944 save_relocs (id4);
1945
1946 bfd_set_symtab (abfd, symtab, symptr);
1947
1948 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1949
1950 bfd_make_readable (abfd);
1951 return abfd;
1952 }
1953
1954 static char *
1955 make_import_fixup_mark (arelent *rel)
1956 {
1957 /* We convert reloc to symbol, for later reference. */
1958 static int counter;
1959 static char *fixup_name = NULL;
1960 static size_t buffer_len = 0;
1961
1962 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
1963
1964 bfd *abfd = bfd_asymbol_bfd (sym);
1965 struct bfd_link_hash_entry *bh;
1966
1967 if (!fixup_name)
1968 {
1969 fixup_name = xmalloc (384);
1970 buffer_len = 384;
1971 }
1972
1973 if (strlen (sym->name) + 25 > buffer_len)
1974 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1975 bigger than 20 digits long, we've got worse problems than
1976 overflowing this buffer... */
1977 {
1978 free (fixup_name);
1979 /* New buffer size is length of symbol, plus 25, but
1980 then rounded up to the nearest multiple of 128. */
1981 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1982 fixup_name = xmalloc (buffer_len);
1983 }
1984
1985 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
1986
1987 bh = NULL;
1988 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
1989 current_sec, /* sym->section, */
1990 rel->address, NULL, TRUE, FALSE, &bh);
1991
1992 if (0)
1993 {
1994 struct coff_link_hash_entry *myh;
1995
1996 myh = (struct coff_link_hash_entry *) bh;
1997 printf ("type:%d\n", myh->type);
1998 printf ("%s\n", myh->root.u.def.section->name);
1999 }
2000
2001 return fixup_name;
2002 }
2003
2004 /* .section .idata$3
2005 .rva __nm_thnk_SYM (singleton thunk with name of func)
2006 .long 0
2007 .long 0
2008 .rva __my_dll_iname (name of dll)
2009 .rva __fuNN_SYM (pointer to reference (address) in text) */
2010
2011 static bfd *
2012 make_import_fixup_entry (const char *name,
2013 const char *fixup_name,
2014 const char *dll_symname,
2015 bfd *parent)
2016 {
2017 asection *id3;
2018 unsigned char *d3;
2019 char *oname;
2020 bfd *abfd;
2021
2022 oname = xmalloc (20);
2023 sprintf (oname, "fu%06d.o", tmp_seq);
2024 tmp_seq++;
2025
2026 abfd = bfd_create (oname, parent);
2027 bfd_find_target (pe_details->object_target, abfd);
2028 bfd_make_writable (abfd);
2029
2030 bfd_set_format (abfd, bfd_object);
2031 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2032
2033 symptr = 0;
2034 symtab = xmalloc (6 * sizeof (asymbol *));
2035 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2036
2037 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2038 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2039 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2040
2041 bfd_set_section_size (abfd, id3, 20);
2042 d3 = xmalloc (20);
2043 id3->contents = d3;
2044 memset (d3, 0, 20);
2045
2046 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2047 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2048 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2049 save_relocs (id3);
2050
2051 bfd_set_symtab (abfd, symtab, symptr);
2052
2053 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2054
2055 bfd_make_readable (abfd);
2056 return abfd;
2057 }
2058
2059 /* .section .rdata_runtime_pseudo_reloc
2060 .long addend
2061 .rva __fuNN_SYM (pointer to reference (address) in text) */
2062
2063 static bfd *
2064 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2065 const char *fixup_name,
2066 int addend,
2067 bfd *parent)
2068 {
2069 asection *rt_rel;
2070 unsigned char *rt_rel_d;
2071 char *oname;
2072 bfd *abfd;
2073
2074 oname = xmalloc (20);
2075 sprintf (oname, "rtr%06d.o", tmp_seq);
2076 tmp_seq++;
2077
2078 abfd = bfd_create (oname, parent);
2079 bfd_find_target (pe_details->object_target, abfd);
2080 bfd_make_writable (abfd);
2081
2082 bfd_set_format (abfd, bfd_object);
2083 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2084
2085 symptr = 0;
2086 symtab = xmalloc (2 * sizeof (asymbol *));
2087 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2088 SEC_HAS_CONTENTS, 2);
2089
2090 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2091
2092 bfd_set_section_size (abfd, rt_rel, 8);
2093 rt_rel_d = xmalloc (8);
2094 rt_rel->contents = rt_rel_d;
2095 memset (rt_rel_d, 0, 8);
2096 bfd_put_32 (abfd, addend, rt_rel_d);
2097
2098 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2099 save_relocs (rt_rel);
2100
2101 bfd_set_symtab (abfd, symtab, symptr);
2102
2103 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2104
2105 bfd_make_readable (abfd);
2106 return abfd;
2107 }
2108
2109 /* .section .rdata
2110 .rva __pei386_runtime_relocator */
2111
2112 static bfd *
2113 pe_create_runtime_relocator_reference (bfd *parent)
2114 {
2115 asection *extern_rt_rel;
2116 unsigned char *extern_rt_rel_d;
2117 char *oname;
2118 bfd *abfd;
2119
2120 oname = xmalloc (20);
2121 sprintf (oname, "ertr%06d.o", tmp_seq);
2122 tmp_seq++;
2123
2124 abfd = bfd_create (oname, parent);
2125 bfd_find_target (pe_details->object_target, abfd);
2126 bfd_make_writable (abfd);
2127
2128 bfd_set_format (abfd, bfd_object);
2129 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2130
2131 symptr = 0;
2132 symtab = xmalloc (2 * sizeof (asymbol *));
2133 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2134
2135 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2136 BSF_NO_FLAGS, 0);
2137
2138 bfd_set_section_size (abfd, extern_rt_rel, 4);
2139 extern_rt_rel_d = xmalloc (4);
2140 extern_rt_rel->contents = extern_rt_rel_d;
2141
2142 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2143 save_relocs (extern_rt_rel);
2144
2145 bfd_set_symtab (abfd, symtab, symptr);
2146
2147 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2148
2149 bfd_make_readable (abfd);
2150 return abfd;
2151 }
2152
2153 void
2154 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2155 {
2156 char buf[300];
2157 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2158 struct bfd_link_hash_entry *name_thunk_sym;
2159 const char *name = sym->name;
2160 char *fixup_name = make_import_fixup_mark (rel);
2161 bfd *b;
2162
2163 sprintf (buf, U ("_nm_thnk_%s"), name);
2164
2165 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2166
2167 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2168 {
2169 bfd *b = make_singleton_name_thunk (name, output_bfd);
2170 add_bfd_to_link (b, b->filename, &link_info);
2171
2172 /* If we ever use autoimport, we have to cast text section writable. */
2173 config.text_read_only = FALSE;
2174 output_bfd->flags &= ~WP_TEXT;
2175 }
2176
2177 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2178 {
2179 extern char * pe_data_import_dll;
2180 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2181
2182 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2183 add_bfd_to_link (b, b->filename, &link_info);
2184 }
2185
2186 if (addend != 0)
2187 {
2188 if (link_info.pei386_runtime_pseudo_reloc)
2189 {
2190 if (pe_dll_extra_pe_debug)
2191 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2192 fixup_name, addend);
2193 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2194 add_bfd_to_link (b, b->filename, &link_info);
2195
2196 if (runtime_pseudo_relocs_created == 0)
2197 {
2198 b = pe_create_runtime_relocator_reference (output_bfd);
2199 add_bfd_to_link (b, b->filename, &link_info);
2200 }
2201 runtime_pseudo_relocs_created++;
2202 }
2203 else
2204 {
2205 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2206 s->owner, s, rel->address, sym->name);
2207 einfo ("%X");
2208 }
2209 }
2210 }
2211
2212
2213 void
2214 pe_dll_generate_implib (def_file *def, const char *impfilename)
2215 {
2216 int i;
2217 bfd *ar_head;
2218 bfd *ar_tail;
2219 bfd *outarch;
2220 bfd *head = 0;
2221
2222 dll_filename = (def->name) ? def->name : dll_name;
2223 dll_symname = xstrdup (dll_filename);
2224 for (i = 0; dll_symname[i]; i++)
2225 if (!ISALNUM (dll_symname[i]))
2226 dll_symname[i] = '_';
2227
2228 unlink_if_ordinary (impfilename);
2229
2230 outarch = bfd_openw (impfilename, 0);
2231
2232 if (!outarch)
2233 {
2234 /* xgettext:c-format */
2235 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2236 return;
2237 }
2238
2239 /* xgettext:c-format */
2240 einfo (_("Creating library file: %s\n"), impfilename);
2241
2242 bfd_set_format (outarch, bfd_archive);
2243 outarch->has_armap = 1;
2244
2245 /* Work out a reasonable size of things to put onto one line. */
2246 ar_head = make_head (outarch);
2247
2248 for (i = 0; i < def->num_exports; i++)
2249 {
2250 /* The import library doesn't know about the internal name. */
2251 char *internal = def->exports[i].internal_name;
2252 bfd *n;
2253
2254 /* Don't add PRIVATE entries to import lib. */
2255 if (pe_def_file->exports[i].flag_private)
2256 continue;
2257 def->exports[i].internal_name = def->exports[i].name;
2258 n = make_one (def->exports + i, outarch);
2259 n->next = head;
2260 head = n;
2261 def->exports[i].internal_name = internal;
2262 }
2263
2264 ar_tail = make_tail (outarch);
2265
2266 if (ar_head == NULL || ar_tail == NULL)
2267 return;
2268
2269 /* Now stick them all into the archive. */
2270 ar_head->next = head;
2271 ar_tail->next = ar_head;
2272 head = ar_tail;
2273
2274 if (! bfd_set_archive_head (outarch, head))
2275 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2276
2277 if (! bfd_close (outarch))
2278 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2279
2280 while (head != NULL)
2281 {
2282 bfd *n = head->next;
2283 bfd_close (head);
2284 head = n;
2285 }
2286 }
2287
2288 static void
2289 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2290 {
2291 lang_input_statement_type *fake_file;
2292
2293 fake_file = lang_add_input_file (name,
2294 lang_input_file_is_fake_enum,
2295 NULL);
2296 fake_file->the_bfd = abfd;
2297 ldlang_add_file (fake_file);
2298
2299 if (!bfd_link_add_symbols (abfd, link_info))
2300 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2301 }
2302
2303 void
2304 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2305 {
2306 def_file_module *module;
2307
2308 pe_dll_id_target (bfd_get_target (output_bfd));
2309
2310 if (!pe_def_file)
2311 return;
2312
2313 for (module = pe_def_file->modules; module; module = module->next)
2314 {
2315 int i, do_this_dll;
2316
2317 dll_filename = module->name;
2318 dll_symname = xstrdup (module->name);
2319 for (i = 0; dll_symname[i]; i++)
2320 if (!ISALNUM (dll_symname[i]))
2321 dll_symname[i] = '_';
2322
2323 do_this_dll = 0;
2324
2325 for (i = 0; i < pe_def_file->num_imports; i++)
2326 if (pe_def_file->imports[i].module == module)
2327 {
2328 def_file_export exp;
2329 struct bfd_link_hash_entry *blhe;
2330 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2331 /* See if we need this import. */
2332 size_t len = strlen (pe_def_file->imports[i].internal_name);
2333 char *name = xmalloc (len + 2 + 6);
2334
2335 if (lead_at)
2336 sprintf (name, "%s%s", "",
2337 pe_def_file->imports[i].internal_name);
2338 else
2339 sprintf (name, "%s%s",U (""),
2340 pe_def_file->imports[i].internal_name);
2341
2342 blhe = bfd_link_hash_lookup (link_info->hash, name,
2343 FALSE, FALSE, FALSE);
2344
2345 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2346 {
2347 if (lead_at)
2348 sprintf (name, "%s%s", U ("_imp_"),
2349 pe_def_file->imports[i].internal_name);
2350 else
2351 sprintf (name, "%s%s", U ("_imp__"),
2352 pe_def_file->imports[i].internal_name);
2353
2354 blhe = bfd_link_hash_lookup (link_info->hash, name,
2355 FALSE, FALSE, FALSE);
2356 }
2357 free (name);
2358
2359 if (blhe && blhe->type == bfd_link_hash_undefined)
2360 {
2361 bfd *one;
2362 /* We do. */
2363 if (!do_this_dll)
2364 {
2365 bfd *ar_head = make_head (output_bfd);
2366 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2367 do_this_dll = 1;
2368 }
2369 exp.internal_name = pe_def_file->imports[i].internal_name;
2370 exp.name = pe_def_file->imports[i].name;
2371 exp.ordinal = pe_def_file->imports[i].ordinal;
2372 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2373 exp.flag_private = 0;
2374 exp.flag_constant = 0;
2375 exp.flag_data = pe_def_file->imports[i].data;
2376 exp.flag_noname = exp.name ? 0 : 1;
2377 one = make_one (&exp, output_bfd);
2378 add_bfd_to_link (one, one->filename, link_info);
2379 }
2380 }
2381 if (do_this_dll)
2382 {
2383 bfd *ar_tail = make_tail (output_bfd);
2384 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2385 }
2386
2387 free (dll_symname);
2388 }
2389 }
2390
2391 /* We were handed a *.DLL file. Parse it and turn it into a set of
2392 IMPORTS directives in the def file. Return TRUE if the file was
2393 handled, FALSE if not. */
2394
2395 static unsigned int
2396 pe_get16 (bfd *abfd, int where)
2397 {
2398 unsigned char b[2];
2399
2400 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2401 bfd_bread (b, (bfd_size_type) 2, abfd);
2402 return b[0] + (b[1] << 8);
2403 }
2404
2405 static unsigned int
2406 pe_get32 (bfd *abfd, int where)
2407 {
2408 unsigned char b[4];
2409
2410 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2411 bfd_bread (b, (bfd_size_type) 4, abfd);
2412 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2413 }
2414
2415 static unsigned int
2416 pe_as32 (void *ptr)
2417 {
2418 unsigned char *b = ptr;
2419
2420 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2421 }
2422
2423 bfd_boolean
2424 pe_implied_import_dll (const char *filename)
2425 {
2426 bfd *dll;
2427 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2428 unsigned long export_rva, export_size, nsections, secptr, expptr;
2429 unsigned long exp_funcbase;
2430 unsigned char *expdata;
2431 char *erva;
2432 unsigned long name_rvas, ordinals, nexp, ordbase;
2433 const char *dll_name;
2434 /* Initialization with start > end guarantees that is_data
2435 will not be set by mistake, and avoids compiler warning. */
2436 unsigned long data_start = 1;
2437 unsigned long data_end = 0;
2438 unsigned long rdata_start = 1;
2439 unsigned long rdata_end = 0;
2440 unsigned long bss_start = 1;
2441 unsigned long bss_end = 0;
2442
2443 /* No, I can't use bfd here. kernel32.dll puts its export table in
2444 the middle of the .rdata section. */
2445 dll = bfd_openr (filename, pe_details->target_name);
2446 if (!dll)
2447 {
2448 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2449 return FALSE;
2450 }
2451
2452 /* PEI dlls seem to be bfd_objects. */
2453 if (!bfd_check_format (dll, bfd_object))
2454 {
2455 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2456 return FALSE;
2457 }
2458
2459 /* Get pe_header, optional header and numbers of export entries. */
2460 pe_header_offset = pe_get32 (dll, 0x3c);
2461 opthdr_ofs = pe_header_offset + 4 + 20;
2462 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2463
2464 if (num_entries < 1) /* No exports. */
2465 return FALSE;
2466
2467 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2468 export_size = pe_get32 (dll, opthdr_ofs + 100);
2469 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2470 secptr = (pe_header_offset + 4 + 20 +
2471 pe_get16 (dll, pe_header_offset + 4 + 16));
2472 expptr = 0;
2473
2474 /* Get the rva and size of the export section. */
2475 for (i = 0; i < nsections; i++)
2476 {
2477 char sname[8];
2478 unsigned long secptr1 = secptr + 40 * i;
2479 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2480 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2481 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2482
2483 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2484 bfd_bread (sname, (bfd_size_type) 8, dll);
2485
2486 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2487 {
2488 expptr = fptr + (export_rva - vaddr);
2489 if (export_rva + export_size > vaddr + vsize)
2490 export_size = vsize - (export_rva - vaddr);
2491 break;
2492 }
2493 }
2494
2495 /* Scan sections and store the base and size of the
2496 data and bss segments in data/base_start/end. */
2497 for (i = 0; i < nsections; i++)
2498 {
2499 unsigned long secptr1 = secptr + 40 * i;
2500 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2501 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2502 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2503 char sec_name[9];
2504
2505 sec_name[8] = '\0';
2506 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2507 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2508
2509 if (strcmp(sec_name,".data") == 0)
2510 {
2511 data_start = vaddr;
2512 data_end = vaddr + vsize;
2513
2514 if (pe_dll_extra_pe_debug)
2515 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2516 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2517 }
2518 else if (strcmp(sec_name,".rdata") == 0)
2519 {
2520 rdata_start = vaddr;
2521 rdata_end = vaddr + vsize;
2522
2523 if (pe_dll_extra_pe_debug)
2524 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2525 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2526 }
2527 else if (strcmp (sec_name,".bss") == 0)
2528 {
2529 bss_start = vaddr;
2530 bss_end = vaddr + vsize;
2531
2532 if (pe_dll_extra_pe_debug)
2533 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2534 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2535 }
2536 }
2537
2538 expdata = xmalloc (export_size);
2539 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2540 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2541 erva = (char *) expdata - export_rva;
2542
2543 if (pe_def_file == 0)
2544 pe_def_file = def_file_empty ();
2545
2546 nexp = pe_as32 (expdata + 24);
2547 name_rvas = pe_as32 (expdata + 32);
2548 ordinals = pe_as32 (expdata + 36);
2549 ordbase = pe_as32 (expdata + 16);
2550 exp_funcbase = pe_as32 (expdata + 28);
2551
2552 /* Use internal dll name instead of filename
2553 to enable symbolic dll linking. */
2554 dll_name = erva + pe_as32 (expdata + 12);
2555
2556 /* Check to see if the dll has already been added to
2557 the definition list and if so return without error.
2558 This avoids multiple symbol definitions. */
2559 if (def_get_module (pe_def_file, dll_name))
2560 {
2561 if (pe_dll_extra_pe_debug)
2562 printf ("%s is already loaded\n", dll_name);
2563 return TRUE;
2564 }
2565
2566 /* Iterate through the list of symbols. */
2567 for (i = 0; i < nexp; i++)
2568 {
2569 /* Pointer to the names vector. */
2570 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2571 def_file_import *imp;
2572 /* Pointer to the function address vector. */
2573 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2574 int is_data = 0;
2575
2576 /* Skip unwanted symbols, which are
2577 exported in buggy auto-import releases. */
2578 if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2579 {
2580 /* is_data is true if the address is in the data, rdata or bss
2581 segment. */
2582 is_data =
2583 (func_rva >= data_start && func_rva < data_end)
2584 || (func_rva >= rdata_start && func_rva < rdata_end)
2585 || (func_rva >= bss_start && func_rva < bss_end);
2586
2587 imp = def_file_add_import (pe_def_file, erva + name_rva,
2588 dll_name, i, 0);
2589 /* Mark symbol type. */
2590 imp->data = is_data;
2591
2592 if (pe_dll_extra_pe_debug)
2593 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2594 __FUNCTION__, dll_name, erva + name_rva,
2595 func_rva, is_data ? "(data)" : "");
2596 }
2597 }
2598
2599 return TRUE;
2600 }
2601
2602 /* These are the main functions, called from the emulation. The first
2603 is called after the bfds are read, so we can guess at how much space
2604 we need. The second is called after everything is placed, so we
2605 can put the right values in place. */
2606
2607 void
2608 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2609 {
2610 pe_dll_id_target (bfd_get_target (abfd));
2611 process_def_file (abfd, info);
2612
2613 if (pe_def_file->num_exports == 0 && !info->shared)
2614 return;
2615
2616 generate_edata (abfd, info);
2617 build_filler_bfd (1);
2618 }
2619
2620 void
2621 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2622 {
2623 pe_dll_id_target (bfd_get_target (abfd));
2624 build_filler_bfd (0);
2625 }
2626
2627 void
2628 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2629 {
2630 pe_dll_id_target (bfd_get_target (abfd));
2631 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2632
2633 generate_reloc (abfd, info);
2634 if (reloc_sz > 0)
2635 {
2636 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2637
2638 /* Resize the sections. */
2639 lang_size_sections (NULL, TRUE);
2640
2641 /* Redo special stuff. */
2642 ldemul_after_allocation ();
2643
2644 /* Do the assignments again. */
2645 lang_do_assignments ();
2646 }
2647
2648 fill_edata (abfd, info);
2649
2650 if (info->shared && !info->pie)
2651 pe_data (abfd)->dll = 1;
2652
2653 edata_s->contents = edata_d;
2654 reloc_s->contents = reloc_d;
2655 }
2656
2657 void
2658 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2659 {
2660 pe_dll_id_target (bfd_get_target (abfd));
2661 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2662
2663 generate_reloc (abfd, info);
2664 if (reloc_sz > 0)
2665 {
2666 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2667
2668 /* Resize the sections. */
2669 lang_size_sections (NULL, TRUE);
2670
2671 /* Redo special stuff. */
2672 ldemul_after_allocation ();
2673
2674 /* Do the assignments again. */
2675 lang_do_assignments ();
2676 }
2677 reloc_s->contents = reloc_d;
2678 }
This page took 0.116161 seconds and 4 git commands to generate.