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