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