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