Mention mi0 and mi1 as --interpreter options.
[deliverable/binutils-gdb.git] / binutils / dlltool.c
index b618b96994658d8bab223fab8480514de3edc4f5..4295e0add1b725c1abca75a4490b7b2fc3478c03 100644 (file)
@@ -1,5 +1,6 @@
 /* dlltool.c -- tool to generate stuff for PE style DLLs
-   Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
+   Copyright 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
    LIBRARY <name> [ , <base> ]
    The result is going to be <name>.DLL
 
-   EXPORTS  ( <name1> [ = <name2> ] [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
+   EXPORTS  ( (  ( <name1> [ = <name2> ] )
+               | ( <name1> = <module-name> . <external-name>))
+            [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
    Declares name1 as an exported symbol from the
-   DLL, with optional ordinal number <integer>
+   DLL, with optional ordinal number <integer>.
+   Or declares name1 as an alias (forward) of the function <external-name>
+   in the DLL <module-name>.
 
    IMPORTS  (  (   <internal-name> =   <module-name> . <integer> )
              | ( [ <internal-name> = ] <module-name> . <external-name> )) *
@@ -362,7 +367,7 @@ static boolean export_all_symbols;
 
 /* True if we should exclude the symbols in DEFAULT_EXCLUDES when
    exporting all symbols.  */
-static boolean do_default_excludes;
+static boolean do_default_excludes=true;
 
 /* Default symbols to exclude when exporting all the symbols.  */
 static const char *default_excludes = "DllMain@12,DllEntryPoint@0,impure_ptr";
@@ -383,8 +388,12 @@ static FILE *output_def;
 static FILE *base_file;
 
 #ifdef DLLTOOL_ARM
+#ifdef DLLTOOL_ARM_EPOC
+static const char *mname = "arm-epoc";
+#else
 static const char *mname = "arm";
 #endif
+#endif
 
 #ifdef DLLTOOL_I386
 static const char *mname = "i386";
@@ -605,7 +614,7 @@ mtable[] =
   ,
   {
 #define MARM_EPOC 9
-    "arm", ".byte", ".short", ".long", ".asciz", "@",
+    "arm-epoc", ".byte", ".short", ".long", ".asciz", "@",
     "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long",
     ".global", ".space", ".align\t2",".align\t4", "",
     "epoc-pe-arm-little", bfd_arch_arm,
@@ -631,6 +640,7 @@ typedef struct export
     int noname;
     int data;
     int hint;
+    int forward;       /* number of forward label, 0 means no forward */
     struct export *next;
   }
 export_type;
@@ -726,6 +736,7 @@ rvaafter (machine)
     case MMCORE_LE:
     case MMCORE_ELF:
     case MMCORE_ELF_LE:
+    case MARM_EPOC:
       break;
     default:
       /* xgettext:c-format */
@@ -750,6 +761,7 @@ rvabefore (machine)
     case MMCORE_LE:
     case MMCORE_ELF:
     case MMCORE_ELF_LE:
+    case MARM_EPOC:
       return ".rva\t";
     default:
       /* xgettext:c-format */
@@ -773,6 +785,7 @@ asm_prefix (machine)
     case MMCORE_LE:
     case MMCORE_ELF:
     case MMCORE_ELF_LE:
+    case MARM_EPOC:
       break;
     case M386:
       return "_";
@@ -840,6 +853,7 @@ static export_type *d_exports;      /*list of exported functions */
 static export_type **d_exports_lexically;      /* vector of exported functions in alpha order */
 static dlist_type *d_list;     /* Descriptions */
 static dlist_type *a_list;     /* Stuff to go in directives */
+static int d_nforwards = 0;    /* Number of forwarded exports */
 
 static int d_is_dll;
 static int d_is_exe;
@@ -874,6 +888,12 @@ def_exports (name, internal_name, ordinal, noname, constant, data)
   p->next = d_exports;
   d_exports = p;
   d_nfuncs++;
+  
+  if ((internal_name != NULL) 
+      && (strchr (internal_name, '.') != NULL))
+    p->forward = ++d_nforwards;
+  else
+    p->forward = 0; /* no forward */
 }
 
 void
@@ -1811,9 +1831,14 @@ gen_exp_file ()
                  i++;
                }
            }
-         fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
-                   ASM_PREFIX,
-                   exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+
+         if (exp->forward == 0)
+           fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
+                    ASM_PREFIX,
+                    exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+         else
+           fprintf (f, "\t%sf%d%s\t%s %d\n", ASM_RVA_BEFORE,
+                    exp->forward, ASM_RVA_AFTER, ASM_C, exp->ordinal);
          i++;
        }
 
@@ -1838,8 +1863,13 @@ gen_exp_file ()
       fprintf(f,"%s Export Name Table\n", ASM_C);
       for (i = 0; (exp = d_exports_lexically[i]); i++)
        if (!exp->noname || show_allnames)
-         fprintf (f, "n%d:     %s      \"%s\"\n",
-                  exp->ordinal, ASM_TEXT, exp->name);
+         {
+           fprintf (f, "n%d:   %s      \"%s\"\n",
+                    exp->ordinal, ASM_TEXT, exp->name);
+           if (exp->forward != 0)
+             fprintf (f, "f%d: %s      \"%s\"\n",
+                      exp->forward, ASM_TEXT, exp->internal_name);
+         }
 
       if (a_list)
        {
@@ -2046,16 +2076,22 @@ typedef struct
 
 #define NSECS 7
 
-#define INIT_SEC_DATA(id, name, flags, align) { id, name, flags, align, NULL, NULL, NULL, 0, NULL }
+#define TEXT_SEC_FLAGS   \
+        (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS)
+#define DATA_SEC_FLAGS   (SEC_ALLOC | SEC_LOAD | SEC_DATA)
+#define BSS_SEC_FLAGS     SEC_ALLOC
+
+#define INIT_SEC_DATA(id, name, flags, align) \
+        { id, name, flags, align, NULL, NULL, NULL, 0, NULL }
 static sinfo secdata[NSECS] =
 {
-  INIT_SEC_DATA (TEXT,   ".text",    SEC_CODE | SEC_HAS_CONTENTS, 2),
-  INIT_SEC_DATA (DATA,   ".data",    SEC_DATA,                    2),
-  INIT_SEC_DATA (BSS,    ".bss",     0,                           2),
-  INIT_SEC_DATA (IDATA7, ".idata$7", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (IDATA5, ".idata$5", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (IDATA4, ".idata$4", SEC_HAS_CONTENTS,            2),
-  INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS,            1)
+  INIT_SEC_DATA (TEXT,   ".text",    TEXT_SEC_FLAGS,   2),
+  INIT_SEC_DATA (DATA,   ".data",    DATA_SEC_FLAGS,   2),
+  INIT_SEC_DATA (BSS,    ".bss",     BSS_SEC_FLAGS,    2),
+  INIT_SEC_DATA (IDATA7, ".idata$7", SEC_HAS_CONTENTS, 2),
+  INIT_SEC_DATA (IDATA5, ".idata$5", SEC_HAS_CONTENTS, 2),
+  INIT_SEC_DATA (IDATA4, ".idata$4", SEC_HAS_CONTENTS, 2),
+  INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS, 1)
 };
 
 #else
@@ -2201,7 +2237,7 @@ make_one_lib_file (exp, i)
     {
       bfd *      abfd;
       asymbol *  exp_label;
-      asymbol *  iname;
+      asymbol *  iname = 0;
       asymbol *  iname2;
       asymbol *  iname_lab;
       asymbol ** iname_lab_pp;
@@ -2215,6 +2251,7 @@ make_one_lib_file (exp, i)
 #define EXTRA    0
 #endif
       asymbol *  ptrs[NSECS + 4 + EXTRA + 1];
+      flagword   applicable;
 
       char *     outname = xmalloc (10);
       int        oidx = 0;
@@ -2239,6 +2276,8 @@ make_one_lib_file (exp, i)
        bfd_set_private_flags (abfd, F_INTERWORK);
 #endif
       
+      applicable = bfd_applicable_section_flags (abfd);
       /* First make symbols for the sections */
       for (i = 0; i < NSECS; i++)
        {
@@ -2248,7 +2287,7 @@ make_one_lib_file (exp, i)
          si->sec = bfd_make_section_old_way (abfd, si->name);
          bfd_set_section_flags (abfd,
                                 si->sec,
-                                si->flags);
+                                si->flags & applicable);
 
          bfd_set_section_alignment(abfd, si->sec, si->align);
          si->sec->output_section = si->sec;
This page took 0.025933 seconds and 4 git commands to generate.