/* 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> )) *
/* 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";
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";
static const char *mname = "ppc";
#endif
+#ifdef DLLTOOL_SH
+static const char *mname = "sh";
+#endif
+
+#ifdef DLLTOOL_MIPS
+static const char *mname = "mips";
+#endif
+
#ifdef DLLTOOL_MCORE
static const char * mname = "mcore-le";
#endif
,
{
#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,
int noname;
int data;
int hint;
+ int forward; /* number of forward label, 0 means no forward */
struct export *next;
}
export_type;
static int alphafunc PARAMS ((const void *, const void *));
static void mangle_defs PARAMS ((void));
static void usage PARAMS ((FILE *, int));
-static void display PARAMS ((const char *, va_list));
static void inform PARAMS ((const char *, ...));
-static void warn PARAMS ((const char *, ...));
-
-static void
-display (message, args)
- const char * message;
- va_list args;
-{
- if (program_name != NULL)
- fprintf (stderr, "%s: ", program_name);
-
- vfprintf (stderr, message, args);
-
- if (message [strlen (message) - 1] != '\n')
- fputc ('\n', stderr);
-}
static void
va_start (args);
#endif
- display (message, args);
-
- va_end (args);
-}
-
-static void
-#ifdef __STDC__
-warn (const char * message, ...)
-#else
-warn (message, va_alist)
- const char * message;
- va_dcl
-#endif
-{
- va_list args;
-
-#ifdef __STDC__
- va_start (args, message);
-#else
- va_start (args);
-#endif
+ report (message, args);
- display (message, args);
-
va_end (args);
}
case MMCORE_LE:
case MMCORE_ELF:
case MMCORE_ELF_LE:
+ case MARM_EPOC:
break;
default:
/* xgettext:c-format */
- fatal (_("Internal error: Unknown machine type: %d\n"), machine);
+ fatal (_("Internal error: Unknown machine type: %d"), machine);
break;
}
return "";
case MMCORE_LE:
case MMCORE_ELF:
case MMCORE_ELF_LE:
+ case MARM_EPOC:
return ".rva\t";
default:
/* xgettext:c-format */
- fatal (_("Internal error: Unknown machine type: %d\n"), machine);
+ fatal (_("Internal error: Unknown machine type: %d"), machine);
break;
}
return "";
case MMCORE_LE:
case MMCORE_ELF:
case MMCORE_ELF_LE:
+ case MARM_EPOC:
break;
case M386:
return "_";
default:
/* xgettext:c-format */
- fatal (_("Internal error: Unknown machine type: %d\n"), machine);
+ fatal (_("Internal error: Unknown machine type: %d"), machine);
break;
}
return "";
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;
const char * err ATTRIBUTE_UNUSED;
{
/* xgettext:c-format */
- warn (_("Syntax error in def file %s:%d\n"), def_file, linenumber);
+ non_fatal (_("Syntax error in def file %s:%d"), def_file, linenumber);
return 0;
}
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
inform (_("NAME: %s base: %x"), name, base);
if (d_is_dll)
- warn (_("Can't have LIBRARY and NAME\n"));
+ non_fatal (_("Can't have LIBRARY and NAME"));
d_name = name;
/* if --dllname not provided, use the one in the DEF file.
inform (_("LIBRARY: %s base: %x"), name, base);
if (d_is_exe)
- warn (_("%s: Can't have LIBRARY and NAME\n"), program_name);
+ non_fatal (_("Can't have LIBRARY and NAME"));
d_name = name;
/* if --dllname not provided, use the one in the DEF file. */
char *errmsg_fmt, *errmsg_arg;
char *temp_base = choose_temp_base ();
- inform ("run: %s %s\n", what, args);
+ inform ("run: %s %s", what, args);
/* Count the args */
i = 0;
{
if (WEXITSTATUS (wait_status) != 0)
/* xgettext:c-format */
- warn (_("%s exited with status %d\n"),
- what, WEXITSTATUS (wait_status));
+ non_fatal (_("%s exited with status %d"),
+ what, WEXITSTATUS (wait_status));
}
else
abort ();
bfd_get_section_contents (abfd, s, buf, 0, size);
/* xgettext:c-format */
- inform (_("Sucking in info from %s section in %s\n"),
+ inform (_("Sucking in info from %s section in %s"),
DRECTVE_SECTION_NAME, bfd_get_filename (abfd));
/* Search for -export: strings. The exported symbols can optionally
excludes = new_exclude;
/* xgettext:c-format */
- inform (_("Excluding symbol: %s\n"), exclude_string);
+ inform (_("Excluding symbol: %s"), exclude_string);
}
free (local_copy);
if (! (bfd_get_file_flags (abfd) & HAS_SYMS))
{
/* xgettext:c-format */
- warn (_("%s: no symbols\n"), bfd_get_filename (abfd));
+ non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
return;
}
if (symcount == 0)
{
/* xgettext:c-format */
- warn (_("%s: no symbols\n"), bfd_get_filename (abfd));
+ non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
return;
}
/* FIXME: we ought to read in and block out the base relocations */
/* xgettext:c-format */
- inform (_("Done reading %s\n"), bfd_get_filename (abfd));
+ inform (_("Done reading %s"), bfd_get_filename (abfd));
}
static void
dlist_type *dl;
/* xgettext:c-format */
- inform (_("Generating export file: %s\n"), exp_name);
+ inform (_("Generating export file: %s"), exp_name);
f = fopen (TMP_ASM, FOPEN_WT);
if (!f)
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++;
}
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)
{
#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
{
bfd * abfd;
asymbol * exp_label;
- asymbol * iname;
+ asymbol * iname = 0;
asymbol * iname2;
asymbol * iname_lab;
asymbol ** iname_lab_pp;
#define EXTRA 0
#endif
asymbol * ptrs[NSECS + 4 + EXTRA + 1];
+ flagword applicable;
char * outname = xmalloc (10);
int oidx = 0;
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++)
{
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;
fatal (_("Can't open .lib file: %s"), imp_name);
/* xgettext:c-format */
- inform (_("Creating library file: %s\n"), imp_name);
+ inform (_("Creating library file: %s"), imp_name);
bfd_set_format (outarch, bfd_archive);
outarch->has_armap = 1;
sprintf (name, "%s%05d.o", TMP_STUB, i);
if (unlink (name) < 0)
/* xgettext:c-format */
- warn (_("cannot delete %s: %s\n"), name, strerror (errno));
+ non_fatal (_("cannot delete %s: %s"), name, strerror (errno));
}
}
more = 1;
/* xgettext:c-format */
- inform (_("Warning, ignoring duplicate EXPORT %s %d,%d\n"),
+ inform (_("Warning, ignoring duplicate EXPORT %s %d,%d"),
a->name, a->ordinal, b->ordinal);
if (a->ordinal != -1