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