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