* dlltool.c (usage): Add file parameter. Change all callers.
(main): Don't treat '?' as a special case in getopt return. * binutils.texi (dlltool): Document new options. Add some uses of @var. Wed Aug 19 16:19:07 1998 Mumit Khan <khan@xraylith.wisc.edu> * dlltool.c (gen_def_file): Plug memory leak. Don't print demangled name if it is NULL. Support for exporting all symbols to an output export def file: * dlltool.c ({export_all_symbols, no_default_excludes, no_default_excludes, excludes}): New file static variables. (struct string_list): Type to hold list of symbols to exclude. (scan_drectve_symbols): Renamed from scan_open_obj_file. (scan_filtered_symbols): New static function. (add_excludes): New static function. (match_exclude): New static function. (set_default_excludes): New static function. (filter_symbols): New static function. (scan_all_symbols): New static function. (scan_open_obj_file): New static function. (usage): Document new options. (long_options): Add new options. (main): Handle new options.
This commit is contained in:
parent
6cf219acdf
commit
faad4b4786
|
@ -1,6 +1,43 @@
|
||||||
|
Wed Aug 19 16:19:51 1998 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* dlltool.c (usage): Add file parameter. Change all callers.
|
||||||
|
(main): Don't treat '?' as a special case in getopt return.
|
||||||
|
|
||||||
|
* binutils.texi (dlltool): Document new options. Add some uses of
|
||||||
|
@var.
|
||||||
|
|
||||||
|
Wed Aug 19 16:19:07 1998 Mumit Khan <khan@xraylith.wisc.edu>
|
||||||
|
|
||||||
|
* dlltool.c (gen_def_file): Plug memory leak. Don't print
|
||||||
|
demangled name if it is NULL.
|
||||||
|
|
||||||
|
Support for exporting all symbols to an output export def file:
|
||||||
|
* dlltool.c ({export_all_symbols, no_default_excludes,
|
||||||
|
no_default_excludes, excludes}): New file static variables.
|
||||||
|
(struct string_list): Type to hold list of symbols to exclude.
|
||||||
|
(scan_drectve_symbols): Renamed from scan_open_obj_file.
|
||||||
|
(scan_filtered_symbols): New static function.
|
||||||
|
(add_excludes): New static function.
|
||||||
|
(match_exclude): New static function.
|
||||||
|
(set_default_excludes): New static function.
|
||||||
|
(filter_symbols): New static function.
|
||||||
|
(scan_all_symbols): New static function.
|
||||||
|
(scan_open_obj_file): New static function.
|
||||||
|
(usage): Document new options.
|
||||||
|
(long_options): Add new options.
|
||||||
|
(main): Handle new options.
|
||||||
|
|
||||||
|
1998-07-31 21:24 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* readelf.c (process_program_headers): Print p_offset value with
|
||||||
|
six hex digits.
|
||||||
|
(dynamic_segment_mips_val): Add support for DT_MIPS_FLAGS,
|
||||||
|
DT_MIPS_IVERSION, and DT_MIPS_TIME_STAMP.
|
||||||
|
(process_mips_specific): Also print seconds of time stamp.
|
||||||
|
|
||||||
Fri Jul 31 10:04:23 1998 Catherine Moore <clm@cygnus.com>
|
Fri Jul 31 10:04:23 1998 Catherine Moore <clm@cygnus.com>
|
||||||
|
|
||||||
* readelf.c (dump_relocations): EM_ARM uses rela relocs.
|
* readelf.c (dump_relocations): EM_ARM uses rela relocs.
|
||||||
|
|
||||||
1998-07-30 16:25 Ulrich Drepper <drepper@cygnus.com>
|
1998-07-30 16:25 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
|
|
@ -2073,13 +2073,16 @@ utilities, since it is only useful for those targets which support DLLs.
|
||||||
@end quotation
|
@end quotation
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
dlltool [-d|--input-def <def-file-name>]
|
dlltool [-d|--input-def @var{def-file-name}]
|
||||||
[-b|--base-file <base-file-name>]
|
[-b|--base-file @var{base-file-name}]
|
||||||
[-e|--output-exp <exports-file-name>]
|
[-e|--output-exp @var{exports-file-name}]
|
||||||
[-z|--output-def <def-file-name>]
|
[-z|--output-def @var{def-file-name}]
|
||||||
[-l|--output-lib <library-file-name>]
|
[-l|--output-lib @var{library-file-name}]
|
||||||
[-S|--as <path-to-assembler>] [-f|--as-flags <options>]
|
[--export-all-symbols] [--no-export-all-symbols]
|
||||||
[-D|--dllname <name>] [-m|--machine <machine>]
|
[--exclude-symbols @var{list}]
|
||||||
|
[--no-default-excludes]
|
||||||
|
[-S|--as @var{path-to-assembler}] [-f|--as-flags @var{options}]
|
||||||
|
[-D|--dllname @var{name}] [-m|--machine @var{machine}]
|
||||||
[-a|--add-indirect] [-U|--add-underscore] [-k|--kill-at]
|
[-a|--add-indirect] [-U|--add-underscore] [-k|--kill-at]
|
||||||
[-x|--no-idata4] [-c|--no-idata5] [-i|--interwork]
|
[-x|--no-idata4] [-c|--no-idata5] [-i|--interwork]
|
||||||
[-n|--nodelete] [-v|--verbose] [-h|--help] [-V|--version]
|
[-n|--nodelete] [-v|--verbose] [-h|--help] [-V|--version]
|
||||||
|
@ -2107,12 +2110,12 @@ those functions which have been specially marked as being exported and
|
||||||
put entries for them in the .def file it creates.
|
put entries for them in the .def file it creates.
|
||||||
|
|
||||||
In order to mark a function as being exported from a DLL, it needs to
|
In order to mark a function as being exported from a DLL, it needs to
|
||||||
have an @samp{-export:<name_of_function>} entry in the @samp{.drective}
|
have an @samp{-export:<name_of_function>} entry in the @samp{.drectve}
|
||||||
section of the object file. This can be done in C by using the
|
section of the object file. This can be done in C by using the
|
||||||
asm() operator:
|
asm() operator:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
asm (".section .drective");
|
asm (".section .drectve");
|
||||||
asm (".ascii \"-export:my_func\"");
|
asm (".ascii \"-export:my_func\"");
|
||||||
|
|
||||||
int my_func (void) @{ @dots{} @}
|
int my_func (void) @{ @dots{} @}
|
||||||
|
@ -2154,37 +2157,64 @@ The command line options have the following meanings:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
|
||||||
@item -d FILENAME
|
@item -d @var{filename}
|
||||||
@itemx --input-def FILENAME
|
@itemx --input-def @var{filename}
|
||||||
@cindex input .def file
|
@cindex input .def file
|
||||||
Specifies the name of a .def file to be read in and processed.
|
Specifies the name of a .def file to be read in and processed.
|
||||||
|
|
||||||
@item -b FILENAME
|
@item -b @var{filename}
|
||||||
@itemx --base-file FILENAME
|
@itemx --base-file @var{filename}
|
||||||
@cindex base files
|
@cindex base files
|
||||||
Specifies the name of a base file to be read in and processed. The
|
Specifies the name of a base file to be read in and processed. The
|
||||||
contents of this file will be added to the relocation section in the
|
contents of this file will be added to the relocation section in the
|
||||||
exports file generated by dlltool.
|
exports file generated by dlltool.
|
||||||
|
|
||||||
@item -e FILENAME
|
@item -e @var{filename}
|
||||||
@itemx --output-exp FILENAME
|
@itemx --output-exp @var{filename}
|
||||||
Specifies the name of the export file to be created by dlltool.
|
Specifies the name of the export file to be created by dlltool.
|
||||||
|
|
||||||
@item -z FILENAME
|
@item -z @var{filename}
|
||||||
@itemx --output-def FILENAME
|
@itemx --output-def @var{filename}
|
||||||
Specifies the name of the .def file to be created by dlltool.
|
Specifies the name of the .def file to be created by dlltool.
|
||||||
|
|
||||||
@item -l FILENAME
|
@item -l @var{filename}
|
||||||
@itemx --output-lib FILENAME
|
@itemx --output-lib @var{filename}
|
||||||
Specifies the name of the library file to be created by dlltool.
|
Specifies the name of the library file to be created by dlltool.
|
||||||
|
|
||||||
@item -S PATH
|
@item --export-all-symbols
|
||||||
@itemx --as PATH
|
Treat all global and weak defined symbols found in the input object
|
||||||
|
files as symbols to be exported. There is a small list of symbols which
|
||||||
|
are not exported by default; see the @code{--no-default-excludes}
|
||||||
|
option. You may add to the list of symbols to not export by using the
|
||||||
|
@code{--exclude-symbols} option.
|
||||||
|
|
||||||
|
@item --no-export-all-symbols
|
||||||
|
Only export symbols explicitly listed in an input .def file or in
|
||||||
|
@samp{.drectve} sections in the input object files. This is the default
|
||||||
|
behaviour. The @samp{.drectve} sections are created by @samp{dllexport}
|
||||||
|
attributes in the source code.
|
||||||
|
|
||||||
|
@item --exclude-symbols @var{list}
|
||||||
|
Do not export the symbols in @var{list}. This is a list of symbol names
|
||||||
|
separated by comma or colon characters. The symbol names should not
|
||||||
|
contain a leading underscore. This is only meaningful when
|
||||||
|
@code{--export-all-symbols} is used.
|
||||||
|
|
||||||
|
@item --no-default-excludes
|
||||||
|
When @code{--export-all-symbols} is used, it will by default avoid
|
||||||
|
exporting certain special symbols. The current list of symbols to avoid
|
||||||
|
exporting is @samp{DllMain@@12}, @samp{DllEntryPoint@@0},
|
||||||
|
@samp{impure_ptr}. You may use the @code{--no-default-excludes} option
|
||||||
|
to go ahead and export these special symbols. This is only meaningful
|
||||||
|
when @code{--export-all-symbols} is used.
|
||||||
|
|
||||||
|
@item -S @var{path}
|
||||||
|
@itemx --as @var{path}
|
||||||
Specifies the path, including the filename, of the assembler to be used
|
Specifies the path, including the filename, of the assembler to be used
|
||||||
to create the exports file.
|
to create the exports file.
|
||||||
|
|
||||||
@item -f SWITCHES
|
@item -f @var{switches}
|
||||||
@itemx --as-flags SWITCHES
|
@itemx --as-flags @var{switches}
|
||||||
Specifies any specific command line switches to be passed to the
|
Specifies any specific command line switches to be passed to the
|
||||||
assembler when building the exports file. This option will work even if
|
assembler when building the exports file. This option will work even if
|
||||||
the @samp{-S} option is not used. This option only takes one argument,
|
the @samp{-S} option is not used. This option only takes one argument,
|
||||||
|
@ -2193,15 +2223,15 @@ occurrences will override earlier occurrences. So if it is necessary to
|
||||||
pass multiple switches to the assembler they should be enclosed in
|
pass multiple switches to the assembler they should be enclosed in
|
||||||
double quotes.
|
double quotes.
|
||||||
|
|
||||||
@item -D NAME
|
@item -D @var{name}
|
||||||
@itemx --dll-name NAME
|
@itemx --dll-name @var{name}
|
||||||
Specifies the name to be stored in the .def file as the name of the DLL
|
Specifies the name to be stored in the .def file as the name of the DLL
|
||||||
when the @samp{-e} option is used. If this option is not present, then
|
when the @samp{-e} option is used. If this option is not present, then
|
||||||
the filename given to the @samp{-e} option will be used as the name of
|
the filename given to the @samp{-e} option will be used as the name of
|
||||||
the DLL.
|
the DLL.
|
||||||
|
|
||||||
@item -m MACHINE
|
@item -m @var{machine}
|
||||||
@itemx -machine MACHINE
|
@itemx -machine @var{machine}
|
||||||
Specifies the type of machine for which the library file should be
|
Specifies the type of machine for which the library file should be
|
||||||
built. @code{dlltool} has a built in default type, depending upon how
|
built. @code{dlltool} has a built in default type, depending upon how
|
||||||
it was created, but this option can be used to override that. This is
|
it was created, but this option can be used to override that. This is
|
||||||
|
|
|
@ -323,6 +323,17 @@ static int dontdeltemps = 0;
|
||||||
static int interwork = 0;
|
static int interwork = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* True if we should export all symbols. Otherwise, we only export
|
||||||
|
symbols listed in .drectve sections or in the def file. */
|
||||||
|
static boolean export_all_symbols;
|
||||||
|
|
||||||
|
/* True if we should exclude the symbols in DEFAULT_EXCLUDES when
|
||||||
|
exporting all symbols. */
|
||||||
|
static boolean do_default_excludes;
|
||||||
|
|
||||||
|
/* Default symbols to exclude when exporting all the symbols. */
|
||||||
|
static const char *default_excludes = "DllMain@12,DllEntryPoint@0,impure_ptr";
|
||||||
|
|
||||||
static char *def_file;
|
static char *def_file;
|
||||||
|
|
||||||
extern char * program_name;
|
extern char * program_name;
|
||||||
|
@ -481,11 +492,28 @@ typedef struct export
|
||||||
}
|
}
|
||||||
export_type;
|
export_type;
|
||||||
|
|
||||||
|
/* A list of symbols which we should not export. */
|
||||||
|
|
||||||
|
struct string_list
|
||||||
|
{
|
||||||
|
struct string_list *next;
|
||||||
|
char *string;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct string_list *excludes;
|
||||||
|
|
||||||
static const char *rvaafter PARAMS ((int));
|
static const char *rvaafter PARAMS ((int));
|
||||||
static const char *rvabefore PARAMS ((int));
|
static const char *rvabefore PARAMS ((int));
|
||||||
static const char *asm_prefix PARAMS ((int));
|
static const char *asm_prefix PARAMS ((int));
|
||||||
static void append_import PARAMS ((const char *, const char *, int));
|
static void append_import PARAMS ((const char *, const char *, int));
|
||||||
static void run PARAMS ((const char *, char *));
|
static void run PARAMS ((const char *, char *));
|
||||||
|
static void scan_drectve_symbols PARAMS ((bfd *));
|
||||||
|
static void scan_filtered_symbols PARAMS ((bfd *, PTR, long, unsigned int));
|
||||||
|
static void add_excludes PARAMS ((const char *));
|
||||||
|
static boolean match_exclude PARAMS ((const char *));
|
||||||
|
static void set_default_excludes PARAMS ((void));
|
||||||
|
static long filter_symbols PARAMS ((bfd *, PTR, long, unsigned int));
|
||||||
|
static void scan_all_symbols PARAMS ((bfd *));
|
||||||
static void scan_open_obj_file PARAMS ((bfd *));
|
static void scan_open_obj_file PARAMS ((bfd *));
|
||||||
static void scan_obj_file PARAMS ((const char *));
|
static void scan_obj_file PARAMS ((const char *));
|
||||||
static void dump_def_info PARAMS ((FILE *));
|
static void dump_def_info PARAMS ((FILE *));
|
||||||
|
@ -495,7 +523,9 @@ static void gen_def_file PARAMS ((void));
|
||||||
static void generate_idata_ofile PARAMS ((FILE *));
|
static void generate_idata_ofile PARAMS ((FILE *));
|
||||||
static void gen_exp_file PARAMS ((void));
|
static void gen_exp_file PARAMS ((void));
|
||||||
static const char *xlate PARAMS ((const char *));
|
static const char *xlate PARAMS ((const char *));
|
||||||
|
#if 0
|
||||||
static void dump_iat PARAMS ((FILE *, export_type *));
|
static void dump_iat PARAMS ((FILE *, export_type *));
|
||||||
|
#endif
|
||||||
static char *make_label PARAMS ((const char *, const char *));
|
static char *make_label PARAMS ((const char *, const char *));
|
||||||
static bfd *make_one_lib_file PARAMS ((export_type *, int));
|
static bfd *make_one_lib_file PARAMS ((export_type *, int));
|
||||||
static bfd *make_head PARAMS ((void));
|
static bfd *make_head PARAMS ((void));
|
||||||
|
@ -509,13 +539,13 @@ static void process_duplicates PARAMS ((export_type **));
|
||||||
static void fill_ordinals PARAMS ((export_type **));
|
static void fill_ordinals PARAMS ((export_type **));
|
||||||
static int alphafunc PARAMS ((const void *, const void *));
|
static int alphafunc PARAMS ((const void *, const void *));
|
||||||
static void mangle_defs PARAMS ((void));
|
static void mangle_defs PARAMS ((void));
|
||||||
static void usage PARAMS ((int));
|
static void usage PARAMS ((FILE *, int));
|
||||||
static void tell PARAMS ((const char *, va_list));
|
static void display PARAMS ((const char *, va_list));
|
||||||
static void inform PARAMS ((const char *, ...));
|
static void inform PARAMS ((const char *, ...));
|
||||||
static void warn PARAMS ((const char *, ...));
|
static void warn PARAMS ((const char *, ...));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tell (message, args)
|
display (message, args)
|
||||||
const char * message;
|
const char * message;
|
||||||
va_list args;
|
va_list args;
|
||||||
{
|
{
|
||||||
|
@ -549,7 +579,7 @@ inform (message, va_alist)
|
||||||
va_start (args);
|
va_start (args);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tell (message, args);
|
display (message, args);
|
||||||
|
|
||||||
va_end (args);
|
va_end (args);
|
||||||
}
|
}
|
||||||
|
@ -571,7 +601,7 @@ warn (message, va_alist)
|
||||||
va_start (args);
|
va_start (args);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tell (message, args);
|
display (message, args);
|
||||||
|
|
||||||
va_end (args);
|
va_end (args);
|
||||||
}
|
}
|
||||||
|
@ -1017,8 +1047,11 @@ run (what, args)
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Look for a list of symbols to export in the .drectve section of
|
||||||
|
ABFD. Pass each one to def_exports. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
scan_open_obj_file (abfd)
|
scan_drectve_symbols (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
asection * s;
|
asection * s;
|
||||||
|
@ -1069,10 +1102,197 @@ scan_open_obj_file (abfd)
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
free (buf);
|
free (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Look through the symbols in MINISYMS, and add each one to list of
|
||||||
|
symbols to export. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
scan_filtered_symbols (abfd, minisyms, symcount, size)
|
||||||
|
bfd *abfd;
|
||||||
|
PTR minisyms;
|
||||||
|
long symcount;
|
||||||
|
unsigned int size;
|
||||||
|
{
|
||||||
|
asymbol *store;
|
||||||
|
bfd_byte *from, *fromend;
|
||||||
|
|
||||||
|
store = bfd_make_empty_symbol (abfd);
|
||||||
|
if (store == NULL)
|
||||||
|
bfd_fatal (bfd_get_filename (abfd));
|
||||||
|
|
||||||
|
from = (bfd_byte *) minisyms;
|
||||||
|
fromend = from + symcount * size;
|
||||||
|
for (; from < fromend; from += size)
|
||||||
|
{
|
||||||
|
asymbol *sym;
|
||||||
|
const char *symbol_name;
|
||||||
|
|
||||||
|
sym = bfd_minisymbol_to_symbol (abfd, false, from, store);
|
||||||
|
if (sym == NULL)
|
||||||
|
bfd_fatal (bfd_get_filename (abfd));
|
||||||
|
|
||||||
|
symbol_name = bfd_asymbol_name (sym);
|
||||||
|
if (bfd_get_symbol_leading_char (abfd) == symbol_name[0])
|
||||||
|
++symbol_name;
|
||||||
|
|
||||||
|
def_exports (xstrdup (symbol_name), 0, -1, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a list of symbols to exclude. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_excludes (new_excludes)
|
||||||
|
const char *new_excludes;
|
||||||
|
{
|
||||||
|
char *local_copy;
|
||||||
|
char *exclude_string;
|
||||||
|
|
||||||
|
local_copy = xstrdup (new_excludes);
|
||||||
|
|
||||||
|
exclude_string = strtok (local_copy, ",:");
|
||||||
|
for (; exclude_string; exclude_string = strtok (NULL, ",:"))
|
||||||
|
{
|
||||||
|
struct string_list *new_exclude;
|
||||||
|
|
||||||
|
new_exclude = ((struct string_list *)
|
||||||
|
xmalloc (sizeof (struct string_list)));
|
||||||
|
new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 2);
|
||||||
|
/* FIXME: Is it always right to add a leading underscore? */
|
||||||
|
sprintf (new_exclude->string, "_%s", exclude_string);
|
||||||
|
new_exclude->next = excludes;
|
||||||
|
excludes = new_exclude;
|
||||||
|
|
||||||
|
/* xgettext:c-format */
|
||||||
|
inform (_("Excluding symbol: %s\n"), exclude_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (local_copy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See if STRING is on the list of symbols to exclude. */
|
||||||
|
|
||||||
|
static boolean
|
||||||
|
match_exclude (string)
|
||||||
|
const char *string;
|
||||||
|
{
|
||||||
|
struct string_list *excl_item;
|
||||||
|
|
||||||
|
for (excl_item = excludes; excl_item; excl_item = excl_item->next)
|
||||||
|
if (strcmp (string, excl_item->string) == 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add the default list of symbols to exclude. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_default_excludes (void)
|
||||||
|
{
|
||||||
|
add_excludes (default_excludes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Choose which symbols to export. */
|
||||||
|
|
||||||
|
static long
|
||||||
|
filter_symbols (abfd, minisyms, symcount, size)
|
||||||
|
bfd *abfd;
|
||||||
|
PTR minisyms;
|
||||||
|
long symcount;
|
||||||
|
unsigned int size;
|
||||||
|
{
|
||||||
|
bfd_byte *from, *fromend, *to;
|
||||||
|
asymbol *store;
|
||||||
|
|
||||||
|
store = bfd_make_empty_symbol (abfd);
|
||||||
|
if (store == NULL)
|
||||||
|
bfd_fatal (bfd_get_filename (abfd));
|
||||||
|
|
||||||
|
from = (bfd_byte *) minisyms;
|
||||||
|
fromend = from + symcount * size;
|
||||||
|
to = (bfd_byte *) minisyms;
|
||||||
|
|
||||||
|
for (; from < fromend; from += size)
|
||||||
|
{
|
||||||
|
int keep = 0;
|
||||||
|
asymbol *sym;
|
||||||
|
|
||||||
|
sym = bfd_minisymbol_to_symbol (abfd, false, (const PTR) from, store);
|
||||||
|
if (sym == NULL)
|
||||||
|
bfd_fatal (bfd_get_filename (abfd));
|
||||||
|
|
||||||
|
/* Check for external and defined only symbols. */
|
||||||
|
keep = (((sym->flags & BSF_GLOBAL) != 0
|
||||||
|
|| (sym->flags & BSF_WEAK) != 0
|
||||||
|
|| bfd_is_com_section (sym->section))
|
||||||
|
&& ! bfd_is_und_section (sym->section));
|
||||||
|
|
||||||
|
keep = keep && ! match_exclude (sym->name);
|
||||||
|
|
||||||
|
if (keep)
|
||||||
|
{
|
||||||
|
memcpy (to, from, size);
|
||||||
|
to += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (to - (bfd_byte *) minisyms) / size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Export all symbols in ABFD, except for ones we were told not to
|
||||||
|
export. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
scan_all_symbols (abfd)
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
long symcount;
|
||||||
|
PTR minisyms;
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
|
if (! (bfd_get_file_flags (abfd) & HAS_SYMS))
|
||||||
|
{
|
||||||
|
/* xgettext:c-format */
|
||||||
|
warn (_("%s: no symbols\n"), bfd_get_filename (abfd));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
symcount = bfd_read_minisymbols (abfd, false, &minisyms, &size);
|
||||||
|
if (symcount < 0)
|
||||||
|
bfd_fatal (bfd_get_filename (abfd));
|
||||||
|
|
||||||
|
if (symcount == 0)
|
||||||
|
{
|
||||||
|
/* xgettext:c-format */
|
||||||
|
warn (_("%s: no symbols\n"), bfd_get_filename (abfd));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Discard the symbols we don't want to export. It's OK to do this
|
||||||
|
in place; we'll free the storage anyway. */
|
||||||
|
|
||||||
|
symcount = filter_symbols (abfd, minisyms, symcount, size);
|
||||||
|
scan_filtered_symbols (abfd, minisyms, symcount, size);
|
||||||
|
|
||||||
|
free (minisyms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Look at the object file to decide which symbols to export. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
scan_open_obj_file (abfd)
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
if (export_all_symbols)
|
||||||
|
scan_all_symbols (abfd);
|
||||||
|
else
|
||||||
|
scan_drectve_symbols (abfd);
|
||||||
|
|
||||||
/* FIXME: we ought to read in and block out the base relocations */
|
/* FIXME: we ought to read in and block out the base relocations */
|
||||||
|
|
||||||
inform (_("%s: Done reading\n"));
|
/* xgettext:c-format */
|
||||||
|
inform (_("%s: Done reading %s\n"), bfd_get_filename (abfd));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1187,6 +1407,8 @@ gen_def_file ()
|
||||||
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
|
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
|
||||||
{
|
{
|
||||||
char *quote = strchr (exp->name, '.') ? "\"" : "";
|
char *quote = strchr (exp->name, '.') ? "\"" : "";
|
||||||
|
char *res = cplus_demangle (exp->internal_name, DMGL_ANSI | DMGL_PARAMS);
|
||||||
|
|
||||||
fprintf (output_def, "\t%s%s%s @ %d%s%s ; %s\n",
|
fprintf (output_def, "\t%s%s%s @ %d%s%s ; %s\n",
|
||||||
quote,
|
quote,
|
||||||
exp->name,
|
exp->name,
|
||||||
|
@ -1194,7 +1416,9 @@ gen_def_file ()
|
||||||
exp->ordinal,
|
exp->ordinal,
|
||||||
exp->noname ? " NONAME" : "",
|
exp->noname ? " NONAME" : "",
|
||||||
exp->data ? " DATA" : "",
|
exp->data ? " DATA" : "",
|
||||||
cplus_demangle (exp->internal_name, DMGL_ANSI | DMGL_PARAMS));
|
res ? res : "");
|
||||||
|
if (res)
|
||||||
|
free (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
inform (_("Added exports to output file"));
|
inform (_("Added exports to output file"));
|
||||||
|
@ -1558,6 +1782,8 @@ xlate (name)
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump_iat (f, exp)
|
dump_iat (f, exp)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
@ -1577,6 +1803,8 @@ dump_iat (f, exp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
@ -2633,39 +2861,49 @@ mangle_defs ()
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage (status)
|
usage (file, status)
|
||||||
|
FILE *file;
|
||||||
int status;
|
int status;
|
||||||
{
|
{
|
||||||
/* xgetext:c-format */
|
/* xgetext:c-format */
|
||||||
fprintf (stderr, _("Usage %s <options> <object-files>\n"), program_name);
|
fprintf (file, _("Usage %s <options> <object-files>\n"), program_name);
|
||||||
/* xgetext:c-format */
|
/* xgetext:c-format */
|
||||||
fprintf (stderr, _(" -m --machine <machine> Create {arm, i386, ppc, thumb} DLL. [default: %s]\n"), mname);
|
fprintf (file, _(" -m --machine <machine> Create {arm, i386, ppc, thumb} DLL. [default: %s]\n"), mname);
|
||||||
fprintf (stderr, _(" -e --output-exp <outname> Generate an export file.\n"));
|
fprintf (file, _(" -e --output-exp <outname> Generate an export file.\n"));
|
||||||
fprintf (stderr, _(" -l --output-lib <outname> Generate an interface library.\n"));
|
fprintf (file, _(" -l --output-lib <outname> Generate an interface library.\n"));
|
||||||
fprintf (stderr, _(" -a --add-indirect Add dll indirects to export file.\n"));
|
fprintf (file, _(" -a --add-indirect Add dll indirects to export file.\n"));
|
||||||
fprintf (stderr, _(" -D --dllname <name> Name of input dll to put into interface lib.\n"));
|
fprintf (file, _(" -D --dllname <name> Name of input dll to put into interface lib.\n"));
|
||||||
fprintf (stderr, _(" -d --input-def <deffile> Name of .def file to be read in.\n"));
|
fprintf (file, _(" -d --input-def <deffile> Name of .def file to be read in.\n"));
|
||||||
fprintf (stderr, _(" -z --output-def <deffile> Name of .def file to be created.\n"));
|
fprintf (file, _(" -z --output-def <deffile> Name of .def file to be created.\n"));
|
||||||
fprintf (stderr, _(" -b --base-file <basefile> Read linker generated base file.\n"));
|
fprintf (file, _(" --export-all-symbols Export all symbols to .def\n"));
|
||||||
fprintf (stderr, _(" -x --no-idata4 Don't generate idata$4 section.\n"));
|
fprintf (file, _(" --no-export-all-symbols Only export listed symbols\n"));
|
||||||
fprintf (stderr, _(" -c --no-idata5 Don't generate idata$5 section.\n"));
|
fprintf (file, _(" --exclude-symbols <list> Don't export <list>\n"));
|
||||||
fprintf (stderr, _(" -U --add-underscore Add underscores to symbols in interface library.\n"));
|
fprintf (file, _(" --no-default-excludes Clear default exclude symbols\n"));
|
||||||
fprintf (stderr, _(" -k --kill-at Kill @<n> from exported names.\n"));
|
fprintf (file, _(" -b --base-file <basefile> Read linker generated base file.\n"));
|
||||||
fprintf (stderr, _(" -S --as <name> Use <name> for assembler.\n"));
|
fprintf (file, _(" -x --no-idata4 Don't generate idata$4 section.\n"));
|
||||||
fprintf (stderr, _(" -f --as-flags <flags> Pass <flags> to the assembler.\n"));
|
fprintf (file, _(" -c --no-idata5 Don't generate idata$5 section.\n"));
|
||||||
|
fprintf (file, _(" -U --add-underscore Add underscores to symbols in interface library.\n"));
|
||||||
|
fprintf (file, _(" -k --kill-at Kill @<n> from exported names.\n"));
|
||||||
|
fprintf (file, _(" -S --as <name> Use <name> for assembler.\n"));
|
||||||
|
fprintf (file, _(" -f --as-flags <flags> Pass <flags> to the assembler.\n"));
|
||||||
#ifdef DLLTOOL_ARM
|
#ifdef DLLTOOL_ARM
|
||||||
fprintf (stderr, _(" -i --interwork Support ARM/Thumb interworking.\n"));
|
fprintf (file, _(" -i --interwork Support ARM/Thumb interworking.\n"));
|
||||||
#endif
|
#endif
|
||||||
fprintf (stderr, _(" -n --no-delete Keep temp files (repeat for extra preservation).\n"));
|
fprintf (file, _(" -n --no-delete Keep temp files (repeat for extra preservation).\n"));
|
||||||
fprintf (stderr, _(" -v --verbose Be verbose.\n"));
|
fprintf (file, _(" -v --verbose Be verbose.\n"));
|
||||||
fprintf (stderr, _(" -V --version Display the program version.\n"));
|
fprintf (file, _(" -V --version Display the program version.\n"));
|
||||||
fprintf (stderr, _(" -h --help Display this information.\n"));
|
fprintf (file, _(" -h --help Display this information.\n"));
|
||||||
|
|
||||||
exit (status);
|
exit (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPTION_NO_IDATA4 'x'
|
#define OPTION_EXPORT_ALL_SYMS 150
|
||||||
#define OPTION_NO_IDATA5 'c'
|
#define OPTION_NO_EXPORT_ALL_SYMS (OPTION_EXPORT_ALL_SYMS + 1)
|
||||||
|
#define OPTION_EXCLUDE_SYMS (OPTION_NO_EXPORT_ALL_SYMS + 1)
|
||||||
|
#define OPTION_NO_DEFAULT_EXCLUDES (OPTION_EXCLUDE_SYMS + 1)
|
||||||
|
#define OPTION_NO_IDATA4 'x'
|
||||||
|
#define OPTION_NO_IDATA5 'c'
|
||||||
|
|
||||||
static const struct option long_options[] =
|
static const struct option long_options[] =
|
||||||
{
|
{
|
||||||
{"no-delete", no_argument, NULL, 'n'},
|
{"no-delete", no_argument, NULL, 'n'},
|
||||||
|
@ -2674,6 +2912,10 @@ static const struct option long_options[] =
|
||||||
{"no-idata5", no_argument, NULL, OPTION_NO_IDATA5},
|
{"no-idata5", no_argument, NULL, OPTION_NO_IDATA5},
|
||||||
{"output-exp", required_argument, NULL, 'e'},
|
{"output-exp", required_argument, NULL, 'e'},
|
||||||
{"output-def", required_argument, NULL, 'z'},
|
{"output-def", required_argument, NULL, 'z'},
|
||||||
|
{"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL_SYMS},
|
||||||
|
{"no-export-all-symbols", no_argument, NULL, OPTION_NO_EXPORT_ALL_SYMS},
|
||||||
|
{"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMS},
|
||||||
|
{"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
|
||||||
{"output-lib", required_argument, NULL, 'l'},
|
{"output-lib", required_argument, NULL, 'l'},
|
||||||
{"def", required_argument, NULL, 'd'}, /* for compatiblity with older versions */
|
{"def", required_argument, NULL, 'd'}, /* for compatiblity with older versions */
|
||||||
{"input-def", required_argument, NULL, 'd'},
|
{"input-def", required_argument, NULL, 'd'},
|
||||||
|
@ -2722,6 +2964,18 @@ main (ac, av)
|
||||||
case OPTION_NO_IDATA5:
|
case OPTION_NO_IDATA5:
|
||||||
no_idata5 = 1;
|
no_idata5 = 1;
|
||||||
break;
|
break;
|
||||||
|
case OPTION_EXPORT_ALL_SYMS:
|
||||||
|
export_all_symbols = true;
|
||||||
|
break;
|
||||||
|
case OPTION_NO_EXPORT_ALL_SYMS:
|
||||||
|
export_all_symbols = false;
|
||||||
|
break;
|
||||||
|
case OPTION_EXCLUDE_SYMS:
|
||||||
|
add_excludes (optarg);
|
||||||
|
break;
|
||||||
|
case OPTION_NO_DEFAULT_EXCLUDES:
|
||||||
|
do_default_excludes = false;
|
||||||
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
as_name = optarg;
|
as_name = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -2748,8 +3002,7 @@ main (ac, av)
|
||||||
exp_name = optarg;
|
exp_name = optarg;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case '?':
|
usage (stdout, 0);
|
||||||
usage (0);
|
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
mname = optarg;
|
mname = optarg;
|
||||||
|
@ -2793,7 +3046,8 @@ main (ac, av)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage (1);
|
usage (stderr, 1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2823,6 +3077,15 @@ main (ac, av)
|
||||||
strcat (dll_name, ".dll");
|
strcat (dll_name, ".dll");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Don't use the default exclude list if we're reading only the
|
||||||
|
symbols in the .drectve section. The default excludes are meant
|
||||||
|
to avoid exporting DLL entry point and Cygwin32 impure_ptr. */
|
||||||
|
if (! export_all_symbols)
|
||||||
|
do_default_excludes = false;
|
||||||
|
|
||||||
|
if (do_default_excludes)
|
||||||
|
set_default_excludes ();
|
||||||
|
|
||||||
if (def_file)
|
if (def_file)
|
||||||
process_def_file (def_file);
|
process_def_file (def_file);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue