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