OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [ld/] [pe-dll.c] - Blame information for rev 163

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.