Ignore:
Timestamp:
Aug 16, 2003, 6:59:22 PM (22 years ago)
Author:
bird
Message:

binutils v2.14 - offical sources.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GNU/src/binutils/ld/pe-dll.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r608 r609  
    11/* Routines to help build PEI-format DLLs (Win32 etc)
    2    Copyright 1998, 1999, 2000 Free Software Foundation, Inc.
     2   Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    33   Written by DJ Delorie <dj@cygnus.com>
    44
     
    2424#include "bfdlink.h"
    2525#include "libiberty.h"
     26#include "safe-ctype.h"
    2627
    2728#include <time.h>
    28 #include <ctype.h>
    2929
    3030#include "ld.h"
     
    3333#include "ldwrite.h"
    3434#include "ldmisc.h"
    35 #include "ldgram.h"
     35#include <ldgram.h>
    3636#include "ldmain.h"
    3737#include "ldfile.h"
     
    4242#include "pe-dll.h"
    4343
    44 /************************************************************************
    45 
    46  This file turns a regular Windows PE image into a DLL.  Because of
    47  the complexity of this operation, it has been broken down into a
    48  number of separate modules which are all called by the main function
    49  at the end of this file.  This function is not re-entrant and is
    50  normally only called once, so static variables are used to reduce
    51  the number of parameters and return values required.
    52 
    53  See also: ld/emultempl/pe.em
    54 
    55  ************************************************************************/
    56 
    57 /* for emultempl/pe.em */
    58 
    59 def_file *pe_def_file = 0;
     44/*  This file turns a regular Windows PE image into a DLL.  Because of
     45    the complexity of this operation, it has been broken down into a
     46    number of separate modules which are all called by the main function
     47    at the end of this file.  This function is not re-entrant and is
     48    normally only called once, so static variables are used to reduce
     49    the number of parameters and return values required.
     50
     51    See also: ld/emultempl/pe.em.  */
     52
     53/*  Auto-import feature by Paul Sokolovsky
     54
     55    Quick facts:
     56
     57    1. With this feature on, DLL clients can import variables from DLL
     58    without any concern from their side (for example, without any source
     59    code modifications).
     60
     61    2. This is done completely in bounds of the PE specification (to be fair,
     62    there's a place where it pokes nose out of, but in practice it works).
     63    So, resulting module can be used with any other PE compiler/linker.
     64
     65    3. Auto-import is fully compatible with standard import method and they
     66    can be mixed together.
     67
     68    4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
     69    reference to it; load time: negligible; virtual/physical memory: should be
     70    less than effect of DLL relocation, and I sincerely hope it doesn't affect
     71    DLL sharability (too much).
     72
     73    Idea
     74
     75    The obvious and only way to get rid of dllimport insanity is to make client
     76    access variable directly in the DLL, bypassing extra dereference. I.e.,
     77    whenever client contains something like
     78
     79    mov dll_var,%eax,
     80
     81    address of dll_var in the command should be relocated to point into loaded
     82    DLL. The aim is to make OS loader do so, and than make ld help with that.
     83    Import section of PE made following way: there's a vector of structures
     84    each describing imports from particular DLL. Each such structure points
     85    to two other parallel vectors: one holding imported names, and one which
     86    will hold address of corresponding imported name. So, the solution is
     87    de-vectorize these structures, making import locations be sparse and
     88    pointing directly into code. Before continuing, it is worth a note that,
     89    while authors strives to make PE act ELF-like, there're some other people
     90    make ELF act PE-like: elfvector, ;-) .
     91
     92    Implementation
     93
     94    For each reference of data symbol to be imported from DLL (to set of which
     95    belong symbols with name <sym>, if __imp_<sym> is found in implib), the
     96    import fixup entry is generated. That entry is of type
     97    IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
     98    fixup entry contains pointer to symbol's address within .text section
     99    (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
     100    (so, DLL name is referenced by multiple entries), and pointer to symbol
     101    name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
     102    pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
     103    containing imported name. Here comes that "om the edge" problem mentioned
     104    above: PE specification rambles that name vector (OriginalFirstThunk)
     105    should run in parallel with addresses vector (FirstThunk), i.e. that they
     106    should have same number of elements and terminated with zero. We violate
     107    this, since FirstThunk points directly into machine code. But in practice,
     108    OS loader implemented the sane way: it goes thru OriginalFirstThunk and
     109    puts addresses to FirstThunk, not something else. It once again should be
     110    noted that dll and symbol name structures are reused across fixup entries
     111    and should be there anyway to support standard import stuff, so sustained
     112    overhead is 20 bytes per reference. Other question is whether having several
     113    IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
     114    done even by native compiler/linker (libth32's functions are in fact reside
     115    in windows9x kernel32.dll, so if you use it, you have two
     116    IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
     117    referencing the same PE structures several times is valid. The answer is why
     118    not, prohibiting that (detecting violation) would require more work on
     119    behalf of loader than not doing it.
     120
     121    See also: ld/emultempl/pe.em.  */
     122
     123static void
     124add_bfd_to_link PARAMS ((bfd *, const char *, struct bfd_link_info *));
     125
     126/* For emultempl/pe.em.  */
     127
     128def_file * pe_def_file = 0;
    60129int pe_dll_export_everything = 0;
    61130int pe_dll_do_default_excludes = 1;
     
    64133int pe_dll_warn_dup_exports = 0;
    65134int pe_dll_compat_implib = 0;
    66 
    67 /************************************************************************
    68 
    69  static variables and types
    70 
    71  ************************************************************************/
     135int pe_dll_extra_pe_debug = 0;
     136
     137/* Static variables and types.  */
    72138
    73139static bfd_vma image_base;
    74 
    75140static bfd *filler_bfd;
    76141static struct sec *edata_s, *reloc_s;
    77142static unsigned char *edata_d, *reloc_d;
    78143static size_t edata_sz, reloc_sz;
    79 
    80 typedef struct {
    81   char *target_name;
    82   char *object_target;
    83   unsigned int imagebase_reloc;
    84   int pe_arch;
    85   int bfd_arch;
    86   int underscored;
    87 } pe_details_type;
     144static int runtime_pseudo_relocs_created = 0;
     145
     146typedef struct
     147  {
     148    char *target_name;
     149    char *object_target;
     150    unsigned int imagebase_reloc;
     151    int pe_arch;
     152    int bfd_arch;
     153    int underscored;
     154  }
     155pe_details_type;
     156
     157typedef struct
     158  {
     159    char *name;
     160    int len;
     161  }
     162autofilter_entry_type;
    88163
    89164#define PE_ARCH_i386    1
     
    91166#define PE_ARCH_mips    3
    92167#define PE_ARCH_arm     4
    93 
    94 static pe_details_type pe_detail_list[] = {
     168#define PE_ARCH_arm_epoc 5
     169
     170static pe_details_type pe_detail_list[] =
     171{
    95172  {
    96173    "pei-i386",
     
    123200    PE_ARCH_arm,
    124201    bfd_arch_arm,
     202    1
     203  },
     204  {
     205    "epoc-pei-arm-little",
     206    "epoc-pe-arm-little",
     207    11 /* ARM_RVA32 */,
     208    PE_ARCH_arm_epoc,
     209    bfd_arch_arm,
    125210    0
    126211  },
     
    130215static pe_details_type *pe_details;
    131216
     217static autofilter_entry_type autofilter_symbollist[] =
     218{
     219  { "DllMain@12", 10 },
     220  { "DllEntryPoint@0", 15 },
     221  { "DllMainCRTStartup@12", 20 },
     222  { "_cygwin_dll_entry@12", 20 },
     223  { "_cygwin_crt0_common@8", 21 },
     224  { "_cygwin_noncygwin_dll_entry@12", 30 },
     225  { "impure_ptr", 10 },
     226  { "_pei386_runtime_relocator", 25 },
     227  { "do_pseudo_reloc", 15 },
     228  { "cygwin_crt0", 11 },
     229  { NULL, 0 }
     230};
     231
     232/* Do not specify library suffix explicitly, to allow for dllized versions.  */
     233static autofilter_entry_type autofilter_liblist[] =
     234{
     235  { "libgcc", 6 },
     236  { "libstdc++", 9 },
     237  { "libmingw32", 10 },
     238  { "libmingwex", 10 },
     239  { "libg2c", 6 },
     240  { "libsupc++", 9 },
     241  { "libobjc", 7 },
     242  { "libgcj", 6 },
     243  { NULL, 0 }
     244};
     245
     246static autofilter_entry_type autofilter_objlist[] =
     247{
     248  { "crt0.o", 6 },
     249  { "crt1.o", 6 },
     250  { "crt2.o", 6 },
     251  { "dllcrt1.o", 9 },
     252  { "dllcrt2.o", 9 },
     253  { "gcrt0.o", 7 },
     254  { "gcrt1.o", 7 },
     255  { "gcrt2.o", 7 },
     256  { "crtbegin.o", 10 },
     257  { "crtend.o", 8 },
     258  { NULL, 0 }
     259};
     260
     261static autofilter_entry_type autofilter_symbolprefixlist[] =
     262{
     263  /*  { "__imp_", 6 }, */
     264  /* Do __imp_ explicitly to save time.  */
     265  { "__rtti_", 7 },
     266  /* Don't re-export auto-imported symbols.  */
     267  { "_nm_", 4 },
     268  { "__builtin_", 10 },
     269  /* Don't export symbols specifying internal DLL layout.  */
     270  { "_head_", 6 },
     271  { "_fmode", 6 },
     272  { "_impure_ptr", 11 },
     273  { "cygwin_attach_dll", 17 },
     274  { "cygwin_premain0", 15 },
     275  { "cygwin_premain1", 15 },
     276  { "cygwin_premain2", 15 },
     277  { "cygwin_premain3", 15 },
     278  { "environ", 7 },
     279  { NULL, 0 }
     280};
     281
     282static autofilter_entry_type autofilter_symbolsuffixlist[] =
     283{
     284  { "_iname", 6 },
     285  { NULL, 0 }
     286};
     287
    132288#define U(str) (pe_details->underscored ? "_" str : str)
     289
     290static int reloc_sort PARAMS ((const void *, const void *));
     291static int pe_export_sort PARAMS ((const void *, const void *));
     292static int auto_export PARAMS ((bfd *, def_file *, const char *));
     293static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
     294static void build_filler_bfd PARAMS ((int));
     295static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
     296static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
     297static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
     298static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
     299static void quoteput PARAMS ((char *, FILE *, int));
     300static asection *quick_section PARAMS ((bfd *, const char *, int, int));
     301static void quick_symbol
     302  PARAMS ((bfd *, const char *, const char *, const char *,
     303           asection *, int, int));
     304static void quick_reloc PARAMS ((bfd *, int, int, int));
     305static bfd *make_head PARAMS ((bfd *));
     306static bfd *make_tail PARAMS ((bfd *));
     307static bfd *make_one PARAMS ((def_file_export *, bfd *));
     308static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
     309static char *make_import_fixup_mark PARAMS ((arelent *));
     310static bfd *make_import_fixup_entry
     311  PARAMS ((const char *, const char *, const char *, bfd *));
     312static bfd *make_runtime_pseudo_reloc
     313  PARAMS ((const char *, const char *, int, bfd *));
     314static bfd *pe_create_runtime_relocator_reference
     315  PARAMS ((bfd *));
     316static unsigned int pe_get16 PARAMS ((bfd *, int));
     317static unsigned int pe_get32 PARAMS ((bfd *, int));
     318static unsigned int pe_as32 PARAMS ((void *));
    133319
    134320void
     
    137323{
    138324  int i;
     325
    139326  for (i = 0; pe_detail_list[i].target_name; i++)
    140327    if (strcmp (pe_detail_list[i].target_name, target) == 0
     
    148335}
    149336
    150 /************************************************************************
    151 
    152  Helper functions for qsort.  Relocs must be sorted so that we can write
    153  them out by pages.
    154 
    155  ************************************************************************/
    156 
    157 typedef struct {
    158   bfd_vma vma;
    159   char type;
    160   short extra;
    161 } reloc_data_type;
     337/* Helper functions for qsort.  Relocs must be sorted so that we can write
     338   them out by pages.  */
     339
     340typedef struct
     341  {
     342    bfd_vma vma;
     343    char type;
     344    short extra;
     345  }
     346reloc_data_type;
    162347
    163348static int
     
    167352  bfd_vma a = ((reloc_data_type *) va)->vma;
    168353  bfd_vma b = ((reloc_data_type *) vb)->vma;
     354
    169355  return (a > b) ? 1 : ((a < b) ? -1 : 0);
    170356}
     
    176362  def_file_export *a = (def_file_export *) va;
    177363  def_file_export *b = (def_file_export *) vb;
     364
    178365  return strcmp (a->name, b->name);
    179366}
    180367
    181 /************************************************************************
    182 
    183  Read and process the .DEF file
    184 
    185  ************************************************************************/
     368/* Read and process the .DEF file.  */
    186369
    187370/* These correspond to the entries in pe_def_file->exports[].  I use
     
    191374static bfd_vma *exported_symbol_offsets;
    192375static struct sec **exported_symbol_sections;
    193 
    194376static int export_table_size;
    195377static int count_exported;
     
    200382static int *exported_symbols;
    201383
    202 typedef struct exclude_list_struct {
    203   char *string;
    204   struct exclude_list_struct *next;
    205 } exclude_list_struct;
     384typedef struct exclude_list_struct
     385  {
     386    char *string;
     387    struct exclude_list_struct *next;
     388    int type;
     389  }
     390exclude_list_struct;
    206391
    207392static struct exclude_list_struct *excludes = 0;
    208393
    209394void
    210 pe_dll_add_excludes (new_excludes)
     395pe_dll_add_excludes (new_excludes, type)
    211396     const char *new_excludes;
     397     const int type;
    212398{
    213399  char *local_copy;
     
    225411      new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
    226412      strcpy (new_exclude->string, exclude_string);
     413      new_exclude->type = type;
    227414      new_exclude->next = excludes;
    228415      excludes = new_exclude;
     
    232419}
    233420
     421
     422/* abfd is a bfd containing n (or NULL)
     423   It can be used for contextual checks.  */
     424
    234425static int
    235 auto_export (d, n)
     426auto_export (abfd, d, n)
     427     bfd *abfd;
    236428     def_file *d;
    237429     const char *n;
     
    239431  int i;
    240432  struct exclude_list_struct *ex;
     433  autofilter_entry_type *afptr;
     434  const char * libname = 0;
     435  if (abfd && abfd->my_archive)
     436    libname = lbasename (abfd->my_archive->filename);
     437
     438  /* We should not re-export imported stuff.  */
     439  if (strncmp (n, "_imp__", 6) == 0)
     440    return 0;
     441
    241442  for (i = 0; i < d->num_exports; i++)
    242443    if (strcmp (d->exports[i].name, n) == 0)
    243444      return 0;
     445
    244446  if (pe_dll_do_default_excludes)
    245447    {
    246       if (strcmp (n, "DllMain@12") == 0)
     448      const char * p;
     449      int    len;
     450
     451      if (pe_dll_extra_pe_debug)
     452        printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
     453                n, abfd, abfd->my_archive);
     454
     455      /* First of all, make context checks:
     456         Don't export anything from standard libs.  */
     457      if (libname)
     458        {
     459          afptr = autofilter_liblist;
     460
     461          while (afptr->name)
     462            {
     463              if (strncmp (libname, afptr->name, afptr->len) == 0 )
     464                return 0;
     465              afptr++;
     466            }
     467        }
     468
     469      /* Next, exclude symbols from certain startup objects.  */
     470
     471      if (abfd && (p = lbasename (abfd->filename)))
     472        {
     473          afptr = autofilter_objlist;
     474          while (afptr->name)
     475            {
     476              if (strcmp (p, afptr->name) == 0)
     477                return 0;
     478              afptr++;
     479            }
     480        }
     481
     482      /* Don't try to blindly exclude all symbols
     483         that begin with '__'; this was tried and
     484         it is too restrictive.  */
     485
     486      /* Then, exclude specific symbols.  */
     487      afptr = autofilter_symbollist;
     488      while (afptr->name)
     489        {
     490          if (strcmp (n, afptr->name) == 0)
     491            return 0;
     492
     493          afptr++;
     494        }
     495
     496      /* Next, exclude symbols starting with ...  */
     497      afptr = autofilter_symbolprefixlist;
     498      while (afptr->name)
     499        {
     500          if (strncmp (n, afptr->name, afptr->len) == 0)
     501            return 0;
     502
     503          afptr++;
     504        }
     505
     506      /* Finally, exclude symbols ending with ...  */
     507      len = strlen (n);
     508      afptr = autofilter_symbolsuffixlist;
     509      while (afptr->name)
     510        {
     511          if ((len >= afptr->len)
     512              /* Add 1 to insure match with trailing '\0'.  */
     513              && strncmp (n + len - afptr->len, afptr->name,
     514                          afptr->len + 1) == 0)
     515            return 0;
     516
     517          afptr++;
     518        }
     519    }
     520
     521  for (ex = excludes; ex; ex = ex->next)
     522    {
     523      if (ex->type == 1) /* exclude-libs */
     524        {
     525          if (libname
     526              && ((strcmp (libname, ex->string) == 0)
     527                   || (strcasecmp ("ALL", ex->string) == 0)))
     528            return 0;
     529        }
     530      else if (strcmp (n, ex->string) == 0)
    247531        return 0;
    248       if (strcmp (n, "DllEntryPoint@0") == 0)
    249         return 0;
    250       if (strcmp (n, "impure_ptr") == 0)
    251         return 0;
    252     }
    253   for (ex = excludes; ex; ex = ex->next)
    254     if (strcmp (n, ex->string) == 0)
    255       return 0;
     532    }
     533
    256534  return 1;
    257535}
     
    273551  /* First, run around to all the objects looking for the .drectve
    274552     sections, and push those into the def file too.  */
    275 
    276553  for (b = info->input_bfds; b; b = b->link_next)
    277554    {
     
    281558          int size = bfd_get_section_size_before_reloc (s);
    282559          char *buf = xmalloc (size);
     560
    283561          bfd_get_section_contents (b, s, buf, 0, size);
    284562          def_file_add_directive (pe_def_file, buf, size);
     
    287565    }
    288566
     567  /* If we are not building a DLL, when there are no exports
     568     we do not build an export table at all.  */
     569  if (!pe_dll_export_everything && pe_def_file->num_exports == 0
     570      && !(info->shared))
     571    return;
     572
    289573  /* Now, maybe export everything else the default way.  */
    290 
    291574  if (pe_dll_export_everything || pe_def_file->num_exports == 0)
    292575    {
     
    303586            {
    304587              /* We should export symbols which are either global or not
    305                  anything at all.  (.bss data is the latter)  */
    306               if ((symbols[j]->flags & BSF_GLOBAL)
    307                   || (symbols[j]->flags == BSF_NO_FLAGS))
     588                 anything at all.  (.bss data is the latter)
     589                 We should not export undefined symbols.  */
     590              if (symbols[j]->section != &bfd_und_section
     591                  && ((symbols[j]->flags & BSF_GLOBAL)
     592                      || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
    308593                {
    309594                  const char *sn = symbols[j]->name;
     595
     596                  /* We should not re-export imported stuff.  */
     597                  {
     598                    char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
     599                    sprintf (name, "%s%s", U("_imp_"), sn);
     600
     601                    blhe = bfd_link_hash_lookup (info->hash, name,
     602                                                 FALSE, FALSE, FALSE);
     603                    free (name);
     604
     605                    if (blhe && blhe->type == bfd_link_hash_defined)
     606                      continue;
     607                  }
     608
    310609                  if (*sn == '_')
    311610                    sn++;
    312                   if (auto_export (pe_def_file, sn))
    313                     {
    314                       def_file_export *p;
    315                       p=def_file_add_export (pe_def_file, sn, 0, -1);
    316                       /* Fill data flag properly, from dlltool.c */
    317                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
    318                     }
     611
     612                  if (auto_export (b, pe_def_file, sn))
     613                    {
     614                      def_file_export *p;
     615                      p=def_file_add_export (pe_def_file, sn, 0, -1);
     616                      /* Fill data flag properly, from dlltool.c.  */
     617                      p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
     618                    }
    319619                }
    320620            }
     
    326626
    327627  /* Canonicalize the export list.  */
    328 
    329628  if (pe_dll_kill_ats)
    330629    {
     
    336635                 pointing to the same memory as name, or might not
    337636                 have.  */
    338               char *tmp = xstrdup (pe_def_file->exports[i].name);
     637              int lead_at = (*pe_def_file->exports[i].name =='@');
     638              char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
     639
    339640              *(strchr (tmp, '@')) = 0;
    340641              pe_def_file->exports[i].name = tmp;
     
    349650          if (strchr (pe_def_file->exports[i].name, '@'))
    350651            {
    351               char *tmp = xstrdup (pe_def_file->exports[i].name);
     652              int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
     653              char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
     654
    352655              *(strchr (tmp, '@')) = 0;
    353               if (auto_export (pe_def_file, tmp))
     656              if (auto_export (NULL, pe_def_file, tmp))
    354657                def_file_add_export (pe_def_file, tmp,
    355                                      pe_def_file->exports[i].internal_name, -1);
     658                                     pe_def_file->exports[i].internal_name,
     659                                     -1);
    356660              else
    357661                free (tmp);
     
    395699                       e[j - 1].name);
    396700            }
     701
    397702          if (e[i].ordinal != -1)
    398703            e[j - 1].ordinal = e[i].ordinal;
     
    414719    {
    415720      char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
    416       if (pe_details->underscored)
     721
     722      if (pe_details->underscored
     723          && (*pe_def_file->exports[i].internal_name != '@'))
    417724        {
    418725          *name = '_';
     
    424731      blhe = bfd_link_hash_lookup (info->hash,
    425732                                   name,
    426                                    false, false, true);
     733                                   FALSE, FALSE, TRUE);
    427734
    428735      if (blhe
     
    474781}
    475782
    476 /************************************************************************
    477 
    478  Build the bfd that will contain .edata and .reloc sections
    479 
    480  ************************************************************************/
     783/* Build the bfd that will contain .edata and .reloc sections.  */
    481784
    482785static void
     
    527830      return;
    528831    }
     832
    529833  bfd_set_section_size (filler_bfd, reloc_s, 0);
    530834
     
    532836}
    533837
    534 /************************************************************************
    535 
    536  Gather all the exported symbols and build the .edata section
    537 
    538  ************************************************************************/
     838/* Gather all the exported symbols and build the .edata section.  */
    539839
    540840static void
     
    549849  /* First, we need to know how many exported symbols there are,
    550850     and what the range of ordinals is.  */
    551 
    552851  if (pe_def_file->name)
    553     {
    554       dll_name = pe_def_file->name;
    555     }
     852    dll_name = pe_def_file->name;
    556853  else
    557854    {
    558855      dll_name = abfd->filename;
     856
    559857      for (dlnp = dll_name; *dlnp; dlnp++)
    560         {
    561           if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
    562             dll_name = dlnp + 1;
    563         }
     858        if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
     859          dll_name = dlnp + 1;
    564860    }
    565861
     
    574870      max_ordinal = count_exported;
    575871    }
     872
    576873  export_table_size = max_ordinal - min_ordinal + 1;
    577 
    578874  exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
    579875  for (i = 0; i < export_table_size; i++)
     
    589885              int ei = pe_def_file->exports[i].ordinal - min_ordinal;
    590886              int pi = exported_symbols[ei];
     887
    591888              if (pi != -1)
    592889                {
     
    610907          while (exported_symbols[next_ordinal - min_ordinal] != -1)
    611908            next_ordinal++;
     909
    612910          exported_symbols[next_ordinal - min_ordinal] = i;
    613911          pe_def_file->exports[i].ordinal = next_ordinal;
     
    615913
    616914  /* OK, now we can allocate some memory.  */
    617 
    618   edata_sz = (40                /* directory */
    619               + 4 * export_table_size   /* addresses */
     915  edata_sz = (40                                /* directory */
     916              + 4 * export_table_size           /* addresses */
    620917              + 4 * count_exported_byname       /* name ptrs */
    621918              + 2 * count_exported_byname       /* ordinals */
     
    637934    {
    638935      char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
    639       if (pe_details->underscored)
     936
     937      if (pe_details->underscored
     938          && (*pe_def_file->exports[i].internal_name != '@'))
    640939        {
    641940          *name = '_';
     
    647946      blhe = bfd_link_hash_lookup (info->hash,
    648947                                   name,
    649                                    false, false, true);
     948                                   FALSE, FALSE, TRUE);
    650949
    651950      if (blhe && (blhe->type == bfd_link_hash_defined))
    652         {
    653           exported_symbol_offsets[i] = blhe->u.def.value;
    654         }
     951        exported_symbol_offsets[i] = blhe->u.def.value;
     952
    655953      free (name);
    656954    }
     
    690988      bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
    691989    }
     990
    692991  bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
    693992  strcpy (enamestr, dll_name);
     
    7071006    {
    7081007      int s = exported_symbols[i];
     1008
    7091009      if (s != -1)
    7101010        {
     
    7171017          bfd_put_32 (abfd, srva - image_base,
    7181018                      (void *) (eaddresses + ord - min_ordinal));
     1019
    7191020          if (!pe_def_file->exports[s].flag_noname)
    7201021            {
     
    7321033}
    7331034
    734 /************************************************************************
    735 
    736  Gather all the relocations and build the .reloc section
    737 
    738  ************************************************************************/
     1035
     1036static struct sec *current_sec;
     1037
     1038void
     1039pe_walk_relocs_of_symbol (info, name, cb)
     1040     struct bfd_link_info *info;
     1041     const char *name;
     1042     int (*cb) (arelent *, asection *);
     1043{
     1044  bfd *b;
     1045  asection *s;
     1046
     1047  for (b = info->input_bfds; b; b = b->link_next)
     1048    {
     1049      asymbol **symbols;
     1050      int nsyms, symsize;
     1051
     1052      symsize = bfd_get_symtab_upper_bound (b);
     1053      symbols = (asymbol **) xmalloc (symsize);
     1054      nsyms   = bfd_canonicalize_symtab (b, symbols);
     1055
     1056      for (s = b->sections; s; s = s->next)
     1057        {
     1058          arelent **relocs;
     1059          int relsize, nrelocs, i;
     1060          int flags = bfd_get_section_flags (b, s);
     1061
     1062          /* Skip discarded linkonce sections.  */
     1063          if (flags & SEC_LINK_ONCE
     1064              && s->output_section == bfd_abs_section_ptr)
     1065            continue;
     1066
     1067          current_sec = s;
     1068
     1069          relsize = bfd_get_reloc_upper_bound (b, s);
     1070          relocs = (arelent **) xmalloc ((size_t) relsize);
     1071          nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
     1072
     1073          for (i = 0; i < nrelocs; i++)
     1074            {
     1075              struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
     1076
     1077              if (!strcmp (name, sym->name))
     1078                cb (relocs[i], s);
     1079            }
     1080
     1081          free (relocs);
     1082
     1083          /* Warning: the allocated symbols are remembered in BFD and reused
     1084             later, so don't free them! */
     1085          /* free (symbols); */
     1086        }
     1087    }
     1088}
     1089
     1090/* Gather all the relocations and build the .reloc section.  */
    7391091
    7401092static void
     
    7591111      total_relocs += s->reloc_count;
    7601112
    761   reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
     1113  reloc_data =
     1114    (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
    7621115
    7631116  total_relocs = 0;
     
    8021155          for (i = 0; i < nrelocs; i++)
    8031156            {
     1157              if (pe_dll_extra_pe_debug)
     1158                {
     1159                  struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
     1160                  printf ("rel: %s\n", sym->name);
     1161                }
    8041162              if (!relocs[i]->howto->pc_relative
    8051163                  && relocs[i]->howto->type != pe_details->imagebase_reloc)
     
    8071165                  bfd_vma sym_vma;
    8081166                  struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
     1167
    8091168                  sym_vma = (relocs[i]->addend
    8101169                             + sym->value
     
    8601219     reloc_addresses, which are all suitable for the .reloc section.
    8611220     We must now create the new sections.  */
    862 
    8631221  qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
    8641222
     
    8691227      if (this_page != sec_page)
    8701228        {
    871           reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align */
     1229          reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align. */
    8721230          reloc_sz += 8;
    8731231          sec_page = this_page;
     
    8791237        reloc_sz += 2;
    8801238    }
    881   reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align */
    882 
     1239
     1240  reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
    8831241  reloc_d = (unsigned char *) xmalloc (reloc_sz);
    884 
    8851242  sec_page = (unsigned long) (-1);
    8861243  reloc_sz = 0;
    8871244  page_ptr = (unsigned long) (-1);
    8881245  page_count = 0;
     1246
    8891247  for (i = 0; i < total_relocs; i++)
    8901248    {
    8911249      unsigned long rva = reloc_data[i].vma - image_base;
    8921250      unsigned long this_page = (rva & ~0xfff);
     1251
    8931252      if (this_page != sec_page)
    8941253        {
    8951254          while (reloc_sz & 3)
    8961255            reloc_d[reloc_sz++] = 0;
     1256
    8971257          if (page_ptr != (unsigned long) (-1))
    8981258            bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
     1259
    8991260          bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
    9001261          page_ptr = reloc_sz;
     
    9031264          page_count = 0;
    9041265        }
     1266
    9051267      bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
    9061268                  reloc_d + reloc_sz);
    9071269      reloc_sz += 2;
     1270
    9081271      if (reloc_data[i].type == 4)
    9091272        {
     
    9111274          reloc_sz += 2;
    9121275        }
     1276
    9131277      page_count++;
    9141278    }
     1279
    9151280  while (reloc_sz & 3)
    9161281    reloc_d[reloc_sz++] = 0;
     1282
    9171283  if (page_ptr != (unsigned long) (-1))
    9181284    bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
     1285
    9191286  while (reloc_sz < reloc_s->_raw_size)
    9201287    reloc_d[reloc_sz++] = 0;
    9211288}
    9221289
    923 /************************************************************************
    924 
    925  Given the exiting def_file structure, print out a .DEF file that
    926  corresponds to it.
    927 
    928  ************************************************************************/
     1290/* Given the exiting def_file structure, print out a .DEF file that
     1291   corresponds to it.  */
    9291292
    9301293static void
     
    9351298{
    9361299  char *cp;
     1300
    9371301  for (cp = s; *cp; cp++)
    9381302    if (*cp == '\''
    9391303        || *cp == '"'
    9401304        || *cp == '\\'
    941         || isspace ((unsigned char) *cp)
     1305        || ISSPACE (*cp)
    9421306        || *cp == ','
    9431307        || *cp == ';')
    9441308      needs_quotes = 1;
     1309
    9451310  if (needs_quotes)
    9461311    {
    9471312      putc ('"', f);
     1313
    9481314      while (*s)
    9491315        {
    9501316          if (*s == '"' || *s == '\\')
    9511317            putc ('\\', f);
     1318
    9521319          putc (*s, f);
    9531320          s++;
    9541321        }
     1322
    9551323      putc ('"', f);
    9561324    }
     
    9651333  int i;
    9661334  FILE *out = fopen (pe_out_def_filename, "w");
     1335
    9671336  if (out == NULL)
    968     {
    969       /* xgettext:c-format */
    970       einfo (_("%s: Can't open output def file %s\n"),
    971              program_name, pe_out_def_filename);
    972     }
     1337    /* xgettext:c-format */
     1338    einfo (_("%s: Can't open output def file %s\n"),
     1339           program_name, pe_out_def_filename);
    9731340
    9741341  if (pe_def_file)
     
    9801347          else
    9811348            fprintf (out, "NAME ");
     1349
    9821350          quoteput (pe_def_file->name, out, 1);
     1351
    9831352          if (pe_data (output_bfd)->pe_opthdr.ImageBase)
    9841353            fprintf (out, " BASE=0x%lx",
     
    10081377      else if (pe_def_file->stack_reserve != -1)
    10091378        fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
     1379
    10101380      if (pe_def_file->heap_commit != -1)
    10111381        fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
     
    10171387        {
    10181388          fprintf (out, "\nSECTIONS\n\n");
     1389
    10191390          for (i = 0; i < pe_def_file->num_section_defs; i++)
    10201391            {
    10211392              fprintf (out, "    ");
    10221393              quoteput (pe_def_file->section_defs[i].name, out, 0);
     1394
    10231395              if (pe_def_file->section_defs[i].class)
    10241396                {
     
    10261398                  quoteput (pe_def_file->section_defs[i].class, out, 0);
    10271399                }
     1400
    10281401              if (pe_def_file->section_defs[i].flag_read)
    10291402                fprintf (out, " READ");
     1403
    10301404              if (pe_def_file->section_defs[i].flag_write)
    10311405                fprintf (out, " WRITE");
     1406
    10321407              if (pe_def_file->section_defs[i].flag_execute)
    10331408                fprintf (out, " EXECUTE");
     1409
    10341410              if (pe_def_file->section_defs[i].flag_shared)
    10351411                fprintf (out, " SHARED");
     1412
    10361413              fprintf (out, "\n");
    10371414            }
     
    10401417      if (pe_def_file->num_exports > 0)
    10411418        {
    1042           fprintf (out, "\nEXPORTS\n\n");
     1419          fprintf (out, "EXPORTS\n");
     1420
    10431421          for (i = 0; i < pe_def_file->num_exports; i++)
    10441422            {
     
    10461424              fprintf (out, "    ");
    10471425              quoteput (e->name, out, 0);
     1426
    10481427              if (e->internal_name && strcmp (e->internal_name, e->name))
    10491428                {
     
    10511430                  quoteput (e->internal_name, out, 0);
    10521431                }
     1432
    10531433              if (e->ordinal != -1)
    10541434                fprintf (out, " @%d", e->ordinal);
     1435
    10551436              if (e->flag_private)
    10561437                fprintf (out, " PRIVATE");
     1438
    10571439              if (e->flag_constant)
    10581440                fprintf (out, " CONSTANT");
     1441
    10591442              if (e->flag_noname)
    10601443                fprintf (out, " NONAME");
     1444
    10611445              if (e->flag_data)
    10621446                fprintf (out, " DATA");
     
    10691453        {
    10701454          fprintf (out, "\nIMPORTS\n\n");
     1455
    10711456          for (i = 0; i < pe_def_file->num_imports; i++)
    10721457            {
    10731458              def_file_import *im = pe_def_file->imports + i;
    10741459              fprintf (out, "    ");
     1460
    10751461              if (im->internal_name
    10761462                  && (!im->name || strcmp (im->internal_name, im->name)))
     
    10791465                  fprintf (out, " = ");
    10801466                }
     1467
    10811468              quoteput (im->module->name, out, 0);
    10821469              fprintf (out, ".");
     1470
    10831471              if (im->name)
    10841472                quoteput (im->name, out, 0);
    10851473              else
    10861474                fprintf (out, "%d", im->ordinal);
     1475
    10871476              fprintf (out, "\n");
    10881477            }
     
    10931482
    10941483  if (fclose (out) == EOF)
    1095     {
    1096       /* xgettext:c-format */
    1097       einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
    1098     }
    1099 }
    1100 
    1101 /************************************************************************
    1102 
    1103  Generate the import library
    1104 
    1105  ************************************************************************/
     1484    /* xgettext:c-format */
     1485    einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
     1486}
     1487
     1488/* Generate the import library.  */
    11061489
    11071490static asymbol **symtab;
     
    11421525quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
    11431526     bfd *abfd;
    1144      char *n1;
    1145      char *n2;
    1146      char *n3;
     1527     const char *n1;
     1528     const char *n2;
     1529     const char *n3;
    11471530     asection *sec;
    11481531     int flags;
     
    11511534  asymbol *sym;
    11521535  char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
     1536
    11531537  strcpy (name, n1);
    11541538  strcat (name, n2);
     
    11911575{
    11921576  int i;
     1577
    11931578  sec->relocation = reltab;
    11941579  sec->reloc_count = relcount;
     
    12021587}
    12031588
    1204 /*
    1205  *      .section        .idata$2
    1206  *      .global         __head_my_dll
    1207  * __head_my_dll:
    1208  *      .rva            hname
    1209  *      .long           0
    1210  *      .long           0
    1211  *      .rva            __my_dll_iname
    1212  *      .rva            fthunk
    1213  *
    1214  *      .section        .idata$5
    1215  *      .long           0
    1216  * fthunk:
    1217  *
    1218  *      .section        .idata$4
    1219  *      .long           0
    1220  * hname:
    1221  */
     1589/*      .section        .idata$2
     1590        .global         __head_my_dll
     1591   __head_my_dll:
     1592        .rva            hname
     1593        .long           0
     1594        .long           0
     1595        .rva            __my_dll_iname
     1596        .rva            fthunk
     1597
     1598        .section        .idata$5
     1599        .long           0
     1600   fthunk:
     1601
     1602        .section        .idata$4
     1603        .long           0
     1604   hname:                              */
    12221605
    12231606static bfd *
     
    12591642  id2->contents = d2;
    12601643  memset (d2, 0, 20);
    1261   d2[0] = d2[16] = 4; /* reloc addend */
     1644  d2[0] = d2[16] = 4; /* Reloc addend. */
    12621645  quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
    12631646  quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
     
    12851668}
    12861669
    1287 /*
    1288  *      .section        .idata$4
    1289  *      .long           0
    1290  *      .section        .idata$5
    1291  *      .long           0
    1292  *      .section        idata$7
    1293  *      .global         __my_dll_iname
    1294  *__my_dll_iname:
    1295  *      .asciz          "my.dll"
    1296  */
     1670/*      .section        .idata$4
     1671        .long           0
     1672        .section        .idata$5
     1673        .long           0
     1674        .section        idata$7
     1675        .global         __my_dll_iname
     1676  __my_dll_iname:
     1677        .asciz          "my.dll"       */
    12971678
    12981679static bfd *
     
    13521733}
    13531734
    1354 /*
    1355  *      .text
    1356  *      .global         _function
    1357  *      .global         ___imp_function
    1358  *      .global         __imp__function
    1359  *_function:
    1360  *      jmp             *__imp__function:
    1361  *
    1362  *      .section        idata$7
    1363  *      .long           __head_my_dll
    1364  *
    1365  *      .section        .idata$5
    1366  *___imp_function:
    1367  *__imp__function:
    1368  *iat?
    1369  *      .section        .idata$4
    1370  *iat?
    1371  *      .section        .idata$6
    1372  *ID<ordinal>:
    1373  *      .short          <hint>
    1374  *      .asciz          "function" xlate? (add underscore, kill at)
    1375  */
    1376 
    1377 static unsigned char jmp_ix86_bytes[] = {
     1735/*      .text
     1736        .global         _function
     1737        .global         ___imp_function
     1738        .global         __imp__function
     1739  _function:
     1740        jmp             *__imp__function:
     1741
     1742        .section        idata$7
     1743        .long           __head_my_dll
     1744
     1745        .section        .idata$5
     1746  ___imp_function:
     1747  __imp__function:
     1748  iat?
     1749        .section        .idata$4
     1750  iat?
     1751        .section        .idata$6
     1752  ID<ordinal>:
     1753        .short          <hint>
     1754        .asciz          "function" xlate? (add underscore, kill at)  */
     1755
     1756static unsigned char jmp_ix86_bytes[] =
     1757{
    13781758  0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
    13791759};
    13801760
    1381 /*
    1382  *_function:
    1383  *      mov.l   ip+8,r0
    1384  *      mov.l   @r0,r0
    1385  *      jmp     @r0
    1386  *      nop
    1387  *      .dw     __imp_function
    1388  */
    1389 
    1390 static unsigned char jmp_sh_bytes[] = {
     1761/* _function:
     1762        mov.l   ip+8,r0
     1763        mov.l   @r0,r0
     1764        jmp     @r0
     1765        nop
     1766        .dw     __imp_function   */
     1767
     1768static unsigned char jmp_sh_bytes[] =
     1769{
    13911770  0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
    13921771};
    13931772
    1394 /*
    1395  *_function:
    1396  *      lui     $t0,<high:__imp_function>
    1397  *      lw      $t0,<low:__imp_function>
    1398  *      jr      $t0
    1399  *      nop
    1400  */
    1401 
    1402 static unsigned char jmp_mips_bytes[] = {
     1773/* _function:
     1774        lui     $t0,<high:__imp_function>
     1775        lw      $t0,<low:__imp_function>
     1776        jr      $t0
     1777        nop                              */
     1778
     1779static unsigned char jmp_mips_bytes[] =
     1780{
    14031781  0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
    14041782  0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
     
    14321810      jmp_byte_count = sizeof (jmp_mips_bytes);
    14331811      break;
     1812    default:
     1813      abort ();
    14341814    }
    14351815
     
    14461826
    14471827  symptr = 0;
    1448   symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
     1828  symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
    14491829  tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
    14501830  id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
     
    14521832  id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
    14531833  id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
    1454   if (! exp->flag_data)
    1455     quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
    1456   quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
    1457   quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
     1834
     1835  if  (*exp->internal_name == '@')
     1836    {
     1837      if (! exp->flag_data)
     1838        quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
     1839      quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
     1840      quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
     1841      /* Fastcall applies only to functions,
     1842         so no need for auto-import symbol.  */
     1843    }
     1844  else
     1845    {
     1846      if (! exp->flag_data)
     1847        quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
     1848      quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
     1849      quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
     1850      /* Symbol to reference ord/name of imported
     1851         data symbol, used to implement auto-import.  */
     1852      if (exp->flag_data)
     1853        quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
     1854    }
    14581855  if (pe_dll_compat_implib)
    14591856    quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
     
    14611858
    14621859  if (! exp->flag_data)
    1463   {
    1464     bfd_set_section_size (abfd, tx, jmp_byte_count);
    1465     td = (unsigned char *) xmalloc (jmp_byte_count);
    1466     tx->contents = td;
    1467     memcpy (td, jmp_bytes, jmp_byte_count);
    1468     switch (pe_details->pe_arch)
    1469       {
    1470       case PE_ARCH_i386:
    1471         quick_reloc (abfd, 2, BFD_RELOC_32, 2);
    1472         break;
    1473       case PE_ARCH_sh:
    1474         quick_reloc (abfd, 8, BFD_RELOC_32, 2);
    1475         break;
    1476       case PE_ARCH_mips:
    1477         quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
    1478         quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
    1479         quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
    1480         break;
    1481       }
    1482     save_relocs (tx);
    1483   }
     1860    {
     1861      bfd_set_section_size (abfd, tx, jmp_byte_count);
     1862      td = (unsigned char *) xmalloc (jmp_byte_count);
     1863      tx->contents = td;
     1864      memcpy (td, jmp_bytes, jmp_byte_count);
     1865
     1866      switch (pe_details->pe_arch)
     1867        {
     1868        case PE_ARCH_i386:
     1869          quick_reloc (abfd, 2, BFD_RELOC_32, 2);
     1870          break;
     1871        case PE_ARCH_sh:
     1872          quick_reloc (abfd, 8, BFD_RELOC_32, 2);
     1873          break;
     1874        case PE_ARCH_mips:
     1875          quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
     1876          quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
     1877          quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
     1878          break;
     1879        default:
     1880          abort ();
     1881        }
     1882      save_relocs (tx);
     1883    }
    14841884
    14851885  bfd_set_section_size (abfd, id7, 4);
     
    14941894  id5->contents = d5;
    14951895  memset (d5, 0, 4);
     1896
    14961897  if (exp->flag_noname)
    14971898    {
     
    15101911  id4->contents = d4;
    15111912  memset (d4, 0, 4);
     1913
    15121914  if (exp->flag_noname)
    15131915    {
     
    15541956}
    15551957
     1958static bfd *
     1959make_singleton_name_thunk (import, parent)
     1960     const char *import;
     1961     bfd *parent;
     1962{
     1963  /* Name thunks go to idata$4.  */
     1964  asection *id4;
     1965  unsigned char *d4;
     1966  char *oname;
     1967  bfd *abfd;
     1968
     1969  oname = (char *) xmalloc (20);
     1970  sprintf (oname, "nmth%06d.o", tmp_seq);
     1971  tmp_seq++;
     1972
     1973  abfd = bfd_create (oname, parent);
     1974  bfd_find_target (pe_details->object_target, abfd);
     1975  bfd_make_writable (abfd);
     1976
     1977  bfd_set_format (abfd, bfd_object);
     1978  bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
     1979
     1980  symptr = 0;
     1981  symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
     1982  id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
     1983  quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
     1984  quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
     1985
     1986  bfd_set_section_size (abfd, id4, 8);
     1987  d4 = (unsigned char *) xmalloc (4);
     1988  id4->contents = d4;
     1989  memset (d4, 0, 8);
     1990  quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
     1991  save_relocs (id4);
     1992
     1993  bfd_set_symtab (abfd, symtab, symptr);
     1994
     1995  bfd_set_section_contents (abfd, id4, d4, 0, 8);
     1996
     1997  bfd_make_readable (abfd);
     1998  return abfd;
     1999}
     2000
     2001static char *
     2002make_import_fixup_mark (rel)
     2003     arelent *rel;
     2004{
     2005  /* We convert reloc to symbol, for later reference.  */
     2006  static int counter;
     2007  static char *fixup_name = NULL;
     2008  static size_t buffer_len = 0;
     2009
     2010  struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
     2011
     2012  bfd *abfd = bfd_asymbol_bfd (sym);
     2013  struct bfd_link_hash_entry *bh;
     2014
     2015  if (!fixup_name)
     2016    {
     2017      fixup_name = (char *) xmalloc (384);
     2018      buffer_len = 384;
     2019    }
     2020
     2021  if (strlen (sym->name) + 25 > buffer_len)
     2022  /* Assume 25 chars for "__fu" + counter + "_".  If counter is
     2023     bigger than 20 digits long, we've got worse problems than
     2024     overflowing this buffer...  */
     2025    {
     2026      free (fixup_name);
     2027      /* New buffer size is length of symbol, plus 25, but
     2028         then rounded up to the nearest multiple of 128.  */
     2029      buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
     2030      fixup_name = (char *) xmalloc (buffer_len);
     2031    }
     2032
     2033  sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
     2034
     2035  bh = NULL;
     2036  bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
     2037                                current_sec, /* sym->section, */
     2038                                rel->address, NULL, TRUE, FALSE, &bh);
     2039
     2040  if (0)
     2041    {
     2042      struct coff_link_hash_entry *myh;
     2043
     2044      myh = (struct coff_link_hash_entry *) bh;
     2045      printf ("type:%d\n", myh->type);
     2046      printf ("%s\n", myh->root.u.def.section->name);
     2047    }
     2048
     2049  return fixup_name;
     2050}
     2051
     2052/*      .section        .idata$3
     2053        .rva            __nm_thnk_SYM (singleton thunk with name of func)
     2054        .long           0
     2055        .long           0
     2056        .rva            __my_dll_iname (name of dll)
     2057        .rva            __fuNN_SYM (pointer to reference (address) in text)  */
     2058
     2059static bfd *
     2060make_import_fixup_entry (name, fixup_name, dll_symname, parent)
     2061     const char *name;
     2062     const char *fixup_name;
     2063     const char *dll_symname;
     2064     bfd *parent;
     2065{
     2066  asection *id3;
     2067  unsigned char *d3;
     2068  char *oname;
     2069  bfd *abfd;
     2070
     2071  oname = (char *) xmalloc (20);
     2072  sprintf (oname, "fu%06d.o", tmp_seq);
     2073  tmp_seq++;
     2074
     2075  abfd = bfd_create (oname, parent);
     2076  bfd_find_target (pe_details->object_target, abfd);
     2077  bfd_make_writable (abfd);
     2078
     2079  bfd_set_format (abfd, bfd_object);
     2080  bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
     2081
     2082  symptr = 0;
     2083  symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
     2084  id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
     2085
     2086#if 0
     2087  quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
     2088#endif
     2089  quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
     2090  quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
     2091  quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
     2092
     2093  bfd_set_section_size (abfd, id3, 20);
     2094  d3 = (unsigned char *) xmalloc (20);
     2095  id3->contents = d3;
     2096  memset (d3, 0, 20);
     2097
     2098  quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
     2099  quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
     2100  quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
     2101  save_relocs (id3);
     2102
     2103  bfd_set_symtab (abfd, symtab, symptr);
     2104
     2105  bfd_set_section_contents (abfd, id3, d3, 0, 20);
     2106
     2107  bfd_make_readable (abfd);
     2108  return abfd;
     2109}
     2110
     2111/*      .section        .rdata_runtime_pseudo_reloc
     2112        .long           addend
     2113        .rva            __fuNN_SYM (pointer to reference (address) in text)  */
     2114
     2115static bfd *
     2116make_runtime_pseudo_reloc (name, fixup_name, addend, parent)
     2117     const char *name ATTRIBUTE_UNUSED;
     2118     const char *fixup_name;
     2119     int addend;
     2120     bfd *parent;
     2121{
     2122  asection *rt_rel;
     2123  unsigned char *rt_rel_d;
     2124  char *oname;
     2125  bfd *abfd;
     2126
     2127  oname = (char *) xmalloc (20);
     2128  sprintf (oname, "rtr%06d.o", tmp_seq);
     2129  tmp_seq++;
     2130
     2131  abfd = bfd_create (oname, parent);
     2132  bfd_find_target (pe_details->object_target, abfd);
     2133  bfd_make_writable (abfd);
     2134
     2135  bfd_set_format (abfd, bfd_object);
     2136  bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
     2137
     2138  symptr = 0;
     2139  symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
     2140  rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
     2141
     2142  quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
     2143
     2144  bfd_set_section_size (abfd, rt_rel, 8);
     2145  rt_rel_d = (unsigned char *) xmalloc (8);
     2146  rt_rel->contents = rt_rel_d;
     2147  memset (rt_rel_d, 0, 8);
     2148  bfd_put_32 (abfd, addend, rt_rel_d);
     2149
     2150  quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
     2151  save_relocs (rt_rel);
     2152
     2153  bfd_set_symtab (abfd, symtab, symptr);
     2154
     2155  bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
     2156
     2157  bfd_make_readable (abfd);
     2158  return abfd;
     2159}
     2160
     2161/*      .section        .rdata
     2162        .rva            __pei386_runtime_relocator  */
     2163
     2164static bfd *
     2165pe_create_runtime_relocator_reference (parent)
     2166     bfd *parent;
     2167{
     2168  asection *extern_rt_rel;
     2169  unsigned char *extern_rt_rel_d;
     2170  char *oname;
     2171  bfd *abfd;
     2172
     2173  oname = (char *) xmalloc (20);
     2174  sprintf (oname, "ertr%06d.o", tmp_seq);
     2175  tmp_seq++;
     2176
     2177  abfd = bfd_create (oname, parent);
     2178  bfd_find_target (pe_details->object_target, abfd);
     2179  bfd_make_writable (abfd);
     2180
     2181  bfd_set_format (abfd, bfd_object);
     2182  bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
     2183
     2184  symptr = 0;
     2185  symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
     2186  extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
     2187
     2188  quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, BSF_NO_FLAGS, 0);
     2189
     2190  bfd_set_section_size (abfd, extern_rt_rel, 4);
     2191  extern_rt_rel_d = (unsigned char *) xmalloc (4);
     2192  extern_rt_rel->contents = extern_rt_rel_d;
     2193
     2194  quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
     2195  save_relocs (extern_rt_rel);
     2196
     2197  bfd_set_symtab (abfd, symtab, symptr);
     2198
     2199  bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
     2200
     2201  bfd_make_readable (abfd);
     2202  return abfd;
     2203}
     2204
     2205void
     2206pe_create_import_fixup (rel, s, addend)
     2207     arelent *rel;
     2208     asection *s;
     2209     int addend;
     2210{
     2211  char buf[300];
     2212  struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
     2213  struct bfd_link_hash_entry *name_thunk_sym;
     2214  const char *name = sym->name;
     2215  char *fixup_name = make_import_fixup_mark (rel);
     2216  bfd *b;
     2217
     2218  sprintf (buf, U ("_nm_thnk_%s"), name);
     2219
     2220  name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
     2221
     2222  if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
     2223    {
     2224      bfd *b = make_singleton_name_thunk (name, output_bfd);
     2225      add_bfd_to_link (b, b->filename, &link_info);
     2226
     2227      /* If we ever use autoimport, we have to cast text section writable.  */
     2228      config.text_read_only = FALSE;
     2229    }
     2230
     2231  if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
     2232    {
     2233      extern char * pe_data_import_dll;
     2234      char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
     2235
     2236      b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
     2237      add_bfd_to_link (b, b->filename, &link_info);
     2238    }
     2239
     2240  if (addend != 0)
     2241    {
     2242      if (link_info.pei386_runtime_pseudo_reloc)
     2243        {
     2244          if (pe_dll_extra_pe_debug)
     2245            printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
     2246                   fixup_name, addend);
     2247          b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
     2248          add_bfd_to_link (b, b->filename, &link_info);
     2249
     2250          if (runtime_pseudo_relocs_created == 0)
     2251            {
     2252              b = pe_create_runtime_relocator_reference (output_bfd);
     2253              add_bfd_to_link (b, b->filename, &link_info);
     2254            }
     2255          runtime_pseudo_relocs_created++;
     2256        }
     2257      else
     2258        {
     2259          einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
     2260                 s->owner, s, rel->address, sym->name);
     2261          einfo ("%X");
     2262        }
     2263    }
     2264}
     2265
     2266
    15562267void
    15572268pe_dll_generate_implib (def, impfilename)
     
    15682279  dll_symname = xstrdup (dll_filename);
    15692280  for (i = 0; dll_symname[i]; i++)
    1570     if (!isalnum ((unsigned char) dll_symname[i]))
     2281    if (!ISALNUM (dll_symname[i]))
    15712282      dll_symname[i] = '_';
    15722283
     
    15892300
    15902301  /* Work out a reasonable size of things to put onto one line.  */
    1591 
    15922302  ar_head = make_head (outarch);
    15932303
     
    15972307      char *internal = def->exports[i].internal_name;
    15982308      bfd *n;
     2309
    15992310      def->exports[i].internal_name = def->exports[i].name;
    16002311      n = make_one (def->exports + i, outarch);
     
    16102321
    16112322  /* Now stick them all into the archive.  */
    1612 
    16132323  ar_head->next = head;
    16142324  ar_tail->next = ar_head;
     
    16322342add_bfd_to_link (abfd, name, link_info)
    16332343     bfd *abfd;
    1634      char *name;
     2344     const char *name;
    16352345     struct bfd_link_info *link_info;
    16362346{
    16372347  lang_input_statement_type *fake_file;
     2348
    16382349  fake_file = lang_add_input_file (name,
    16392350                                   lang_input_file_is_fake_enum,
     
    16412352  fake_file->the_bfd = abfd;
    16422353  ldlang_add_file (fake_file);
     2354
    16432355  if (!bfd_link_add_symbols (abfd, link_info))
    16442356    einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
     
    16512363{
    16522364  def_file_module *module;
     2365
    16532366  pe_dll_id_target (bfd_get_target (output_bfd));
    16542367
     
    16632376      dll_symname = xstrdup (module->name);
    16642377      for (i = 0; dll_symname[i]; i++)
    1665         if (!isalnum (dll_symname[i]))
     2378        if (!ISALNUM (dll_symname[i]))
    16662379          dll_symname[i] = '_';
    16672380
     
    16732386            def_file_export exp;
    16742387            struct bfd_link_hash_entry *blhe;
    1675 
     2388            int lead_at = (*pe_def_file->imports[i].internal_name == '@');
    16762389            /* See if we need this import.  */
    16772390            char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
    1678             sprintf (name, "%s%s", U (""), pe_def_file->imports[i].internal_name);
     2391
     2392            if (lead_at)
     2393              sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
     2394            else
     2395              sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
     2396
    16792397            blhe = bfd_link_hash_lookup (link_info->hash, name,
    1680                                          false, false, false);
     2398                                         FALSE, FALSE, FALSE);
     2399
    16812400            if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
    16822401              {
    1683                 sprintf (name, "%s%s", U ("_imp__"),
    1684                          pe_def_file->imports[i].internal_name);
     2402                if (lead_at)
     2403                  sprintf (name, "%s%s", U ("_imp_"),
     2404                           pe_def_file->imports[i].internal_name);
     2405                else
     2406                  sprintf (name, "%s%s", U ("_imp__"),
     2407                           pe_def_file->imports[i].internal_name);
     2408
    16852409                blhe = bfd_link_hash_lookup (link_info->hash, name,
    1686                                              false, false, false);
     2410                                             FALSE, FALSE, FALSE);
    16872411              }
    16882412            free (name);
     2413
    16892414            if (blhe && blhe->type == bfd_link_hash_undefined)
    16902415              {
     
    17032428                exp.flag_private = 0;
    17042429                exp.flag_constant = 0;
    1705                 exp.flag_data = 0;
     2430                exp.flag_data = pe_def_file->imports[i].data;
    17062431                exp.flag_noname = exp.name ? 0 : 1;
    17072432                one = make_one (&exp, output_bfd);
     
    17192444}
    17202445
    1721 /************************************************************************
    1722 
    1723  We were handed a *.DLL file.  Parse it and turn it into a set of
    1724  IMPORTS directives in the def file.  Return true if the file was
    1725  handled, false if not.
    1726 
    1727  ************************************************************************/
     2446/* We were handed a *.DLL file.  Parse it and turn it into a set of
     2447   IMPORTS directives in the def file.  Return TRUE if the file was
     2448   handled, FALSE if not.  */
    17282449
    17292450static unsigned int
     
    17332454{
    17342455  unsigned char b[2];
    1735   bfd_seek (abfd, where, SEEK_SET);
    1736   bfd_read (b, 1, 2, abfd);
     2456
     2457  bfd_seek (abfd, (file_ptr) where, SEEK_SET);
     2458  bfd_bread (b, (bfd_size_type) 2, abfd);
    17372459  return b[0] + (b[1] << 8);
    17382460}
     
    17442466{
    17452467  unsigned char b[4];
    1746   bfd_seek (abfd, where, SEEK_SET);
    1747   bfd_read (b, 1, 4, abfd);
     2468
     2469  bfd_seek (abfd, (file_ptr) where, SEEK_SET);
     2470  bfd_bread (b, (bfd_size_type) 4, abfd);
    17482471  return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
    17492472}
     
    17562479{
    17572480  unsigned char *b = ptr;
     2481
    17582482  return b[0] + (b[1] << 8);
    17592483}
     
    17662490{
    17672491  unsigned char *b = ptr;
     2492
    17682493  return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
    17692494}
    17702495
    1771 boolean
     2496bfd_boolean
    17722497pe_implied_import_dll (filename)
    17732498     const char *filename;
     
    17762501  unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
    17772502  unsigned long export_rva, export_size, nsections, secptr, expptr;
     2503  unsigned long exp_funcbase;
    17782504  unsigned char *expdata, *erva;
    17792505  unsigned long name_rvas, ordinals, nexp, ordbase;
    17802506  const char *dll_name;
     2507  /* Initialization with start > end guarantees that is_data
     2508     will not be set by mistake, and avoids compiler warning.  */
     2509  unsigned long data_start = 1;
     2510  unsigned long data_end   = 0;
     2511  unsigned long bss_start  = 1;
     2512  unsigned long bss_end    = 0;
    17812513
    17822514  /* No, I can't use bfd here.  kernel32.dll puts its export table in
    17832515     the middle of the .rdata section.  */
    1784 
    17852516  dll = bfd_openr (filename, pe_details->target_name);
    17862517  if (!dll)
    17872518    {
    17882519      einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
    1789       return false;
    1790     }
     2520      return FALSE;
     2521    }
     2522
    17912523  /* PEI dlls seem to be bfd_objects.  */
    17922524  if (!bfd_check_format (dll, bfd_object))
    17932525    {
    17942526      einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
    1795       return false;
    1796     }
    1797 
    1798   dll_name = filename;
    1799   for (i = 0; filename[i]; i++)
    1800     if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
    1801       dll_name = filename + i + 1;
    1802 
     2527      return FALSE;
     2528    }
     2529
     2530  /* Get pe_header, optional header and numbers of export entries.  */
    18032531  pe_header_offset = pe_get32 (dll, 0x3c);
    18042532  opthdr_ofs = pe_header_offset + 4 + 20;
    18052533  num_entries = pe_get32 (dll, opthdr_ofs + 92);
    1806   if (num_entries < 1) /* no exports */
    1807     return false;
     2534
     2535  if (num_entries < 1) /* No exports.  */
     2536    return FALSE;
     2537
    18082538  export_rva = pe_get32 (dll, opthdr_ofs + 96);
    18092539  export_size = pe_get32 (dll, opthdr_ofs + 100);
     
    18122542            pe_get16 (dll, pe_header_offset + 4 + 16));
    18132543  expptr = 0;
     2544
     2545  /* Get the rva and size of the export section.  */
    18142546  for (i = 0; i < nsections; i++)
    18152547    {
     
    18192551      unsigned long vsize = pe_get32 (dll, secptr1 + 16);
    18202552      unsigned long fptr = pe_get32 (dll, secptr1 + 20);
    1821       bfd_seek (dll, secptr1, SEEK_SET);
    1822       bfd_read (sname, 1, 8, dll);
     2553
     2554      bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
     2555      bfd_bread (sname, (bfd_size_type) 8, dll);
     2556
    18232557      if (vaddr <= export_rva && vaddr + vsize > export_rva)
    18242558        {
     
    18302564    }
    18312565
     2566  /* Scan sections and store the base and size of the
     2567     data and bss segments in data/base_start/end.  */
     2568  for (i = 0; i < nsections; i++)
     2569    {
     2570      unsigned long secptr1 = secptr + 40 * i;
     2571      unsigned long vsize = pe_get32 (dll, secptr1 + 8);
     2572      unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
     2573      unsigned long flags = pe_get32 (dll, secptr1 + 36);
     2574      char sec_name[9];
     2575
     2576      sec_name[8] = '\0';
     2577      bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
     2578      bfd_bread (sec_name, (bfd_size_type) 8, dll);
     2579
     2580      if (strcmp(sec_name,".data") == 0)
     2581        {
     2582          data_start = vaddr;
     2583          data_end = vaddr + vsize;
     2584
     2585          if (pe_dll_extra_pe_debug)
     2586            printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
     2587                    __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
     2588        }
     2589      else if (strcmp (sec_name,".bss") == 0)
     2590        {
     2591          bss_start = vaddr;
     2592          bss_end = vaddr + vsize;
     2593
     2594          if (pe_dll_extra_pe_debug)
     2595            printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
     2596                    __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
     2597        }
     2598    }
     2599
    18322600  expdata = (unsigned char *) xmalloc (export_size);
    1833   bfd_seek (dll, expptr, SEEK_SET);
    1834   bfd_read (expdata, 1, export_size, dll);
     2601  bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
     2602  bfd_bread (expdata, (bfd_size_type) export_size, dll);
    18352603  erva = expdata - export_rva;
    18362604
     
    18422610  ordinals = pe_as32 (expdata + 36);
    18432611  ordbase = pe_as32 (expdata + 16);
     2612  exp_funcbase = pe_as32 (expdata + 28);
     2613
     2614  /* Use internal dll name instead of filename
     2615     to enable symbolic dll linking.  */
     2616  dll_name = pe_as32 (expdata + 12) + erva;
     2617
     2618  /* Check to see if the dll has already been added to
     2619     the definition list and if so return without error.
     2620     This avoids multiple symbol definitions.  */
     2621  if (def_get_module (pe_def_file, dll_name))
     2622    {
     2623      if (pe_dll_extra_pe_debug)
     2624        printf ("%s is already loaded\n", dll_name);
     2625      return TRUE;
     2626    }
     2627
     2628  /* Iterate through the list of symbols.  */
    18442629  for (i = 0; i < nexp; i++)
    18452630    {
     2631      /* Pointer to the names vector.  */
    18462632      unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
    18472633      def_file_import *imp;
    1848       imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
    1849                                  i, 0);
    1850     }
    1851 
    1852   return true;
    1853 }
    1854 
    1855 /************************************************************************
    1856 
    1857  These are the main functions, called from the emulation.  The first
    1858  is called after the bfds are read, so we can guess at how much space
    1859  we need.  The second is called after everything is placed, so we
    1860  can put the right values in place.
    1861 
    1862  ************************************************************************/
     2634      /* Pointer to the function address vector.  */
     2635      unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
     2636      int is_data = 0;
     2637
     2638      /* Skip unwanted symbols, which are
     2639         exported in buggy auto-import releases.  */
     2640      if (strncmp (erva + name_rva, "_nm_", 4) != 0)
     2641        {
     2642          /* is_data is true if the address is in the data or bss segment.  */
     2643          is_data =
     2644            (func_rva >= data_start && func_rva < data_end)
     2645            || (func_rva >= bss_start && func_rva < bss_end);
     2646
     2647          imp = def_file_add_import (pe_def_file, erva + name_rva,
     2648                                     dll_name, i, 0);
     2649          /* Mark symbol type.  */
     2650          imp->data = is_data;
     2651 
     2652          if (pe_dll_extra_pe_debug)
     2653            printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
     2654                    __FUNCTION__, dll_name, erva + name_rva,
     2655                    func_rva, is_data ? "(data)" : "");
     2656        }
     2657    }
     2658
     2659  return TRUE;
     2660}
     2661
     2662/* These are the main functions, called from the emulation.  The first
     2663   is called after the bfds are read, so we can guess at how much space
     2664   we need.  The second is called after everything is placed, so we
     2665   can put the right values in place.  */
    18632666
    18642667void
     
    18702673  process_def_file (abfd, info);
    18712674
     2675  if (pe_def_file->num_exports == 0 && !(info->shared))
     2676    return;
     2677
    18722678  generate_edata (abfd, info);
    18732679  build_filler_bfd (1);
     
    18982704      /* Resize the sections.  */
    18992705      lang_size_sections (stat_ptr->head, abs_output_section,
    1900                           &stat_ptr->head, 0, (bfd_vma) 0, false);
     2706                          &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
    19012707
    19022708      /* Redo special stuff.  */
     
    19062712      lang_do_assignments (stat_ptr->head,
    19072713                           abs_output_section,
    1908                            (fill_type) 0, (bfd_vma) 0);
     2714                           (fill_type *) 0, (bfd_vma) 0);
    19092715    }
    19102716
    19112717  fill_edata (abfd, info);
    19122718
    1913   pe_data (abfd)->dll = 1;
     2719  if (info->shared)
     2720    pe_data (abfd)->dll = 1;
    19142721
    19152722  edata_s->contents = edata_d;
     
    19322739      /* Resize the sections.  */
    19332740      lang_size_sections (stat_ptr->head, abs_output_section,
    1934                           &stat_ptr->head, 0, (bfd_vma) 0, false);
     2741                          &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
    19352742
    19362743      /* Redo special stuff.  */
     
    19402747      lang_do_assignments (stat_ptr->head,
    19412748                           abs_output_section,
    1942                            (fill_type) 0, (bfd_vma) 0);
     2749                           (fill_type *) 0, (bfd_vma) 0);
    19432750    }
    19442751  reloc_s->contents = reloc_d;
Note: See TracChangeset for help on using the changeset viewer.