Add an option to dlltool to allow the creation of deterministic libraries.

PR 29489
	* dlltool.c (deterministic): New variable.
	(gen_lib_file): If deterministic is true set the
	BFD_DETERMINISTIC_OUTPUT flag.
	(usage): Mention --deterministic-libraries and
	--non-deterministic-libraries.
	(long_options): Add new options.
	(main): Parse new options.
	* doc/binutils.texi: Document the new options.
	* NEWS: Mention the new feature.
This commit is contained in:
Nick Clifton
2022-08-23 09:54:52 +01:00
parent 179390a375
commit 25ee24d990
4 changed files with 94 additions and 41 deletions

View File

@@ -1,3 +1,16 @@
2022-08-23 Nick Clifton <nickc@redhat.com>
PR 29489
* dlltool.c (deterministic): New variable.
(gen_lib_file): If deterministic is true set the
BFD_DETERMINISTIC_OUTPUT flag.
(usage): Mention --deterministic-libraries and
--non-deterministic-libraries.
(long_options): Add new options.
(main): Parse new options.
* doc/binutils.texi: Document the new options.
* NEWS: Mention the new feature.
2022-08-22 Nick Clifton <nickc@redhat.com>
* readelf.c (check_magic_number): New function. Checks the magic

View File

@@ -1,5 +1,10 @@
-*- text -*-
* The dlltool program now accepts --deterministic-libraries and
--non-deterministic-libraries as command line options to control whether or
not it generates deterministic output libraries. If neither of these options
are used the default is whatever was set when the binutils were configured.
Changes in 2.39:
* Add --no-weak/-W option to nm to make it ignore weak symbols.

View File

@@ -356,6 +356,7 @@ static char *imp_name;
static char *delayimp_name;
static char *identify_imp_name;
static bool identify_strict;
static bool deterministic = DEFAULT_AR_DETERMINISTIC;
/* Types used to implement a linked list of dllnames associated
with the specified import lib. Used by the identify_* code.
@@ -2942,6 +2943,9 @@ gen_lib_file (int delay)
outarch->has_armap = 1;
outarch->is_thin_archive = 0;
if (deterministic)
outarch->flags |= BFD_DETERMINISTIC_OUTPUT;
/* Work out a reasonable size of things to put onto one line. */
if (delay)
{
@@ -3674,6 +3678,16 @@ usage (FILE *file, int status)
fprintf (file, _(" -e --output-exp <outname> Generate an export file.\n"));
fprintf (file, _(" -l --output-lib <outname> Generate an interface library.\n"));
fprintf (file, _(" -y --output-delaylib <outname> Create a delay-import library.\n"));
fprintf (file, _(" --deterministic-libraries\n"));
if (DEFAULT_AR_DETERMINISTIC)
fprintf (file, _(" Use zero for timestamps and uids/gids in output libraries (default)\n"));
else
fprintf (file, _(" Use zero for timestamps and uids/gids in output libraries\n"));
fprintf (file, _(" --non-deterministic-libraries\n"));
if (DEFAULT_AR_DETERMINISTIC)
fprintf (file, _(" Use actual timestamps and uids/gids in output libraries\n"));
else
fprintf (file, _(" Use actual timestamps and uids/gids in output libraries (default)\n"));
fprintf (file, _(" -a --add-indirect Add dll indirects to export file.\n"));
fprintf (file, _(" -D --dllname <name> Name of input dll to put into interface lib.\n"));
fprintf (file, _(" -d --input-def <deffile> Name of .def file to be read in.\n"));
@@ -3714,55 +3728,61 @@ usage (FILE *file, int status)
exit (status);
}
#define OPTION_EXPORT_ALL_SYMS 150
#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_ADD_STDCALL_UNDERSCORE (OPTION_NO_DEFAULT_EXCLUDES + 1)
#define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \
(OPTION_ADD_STDCALL_UNDERSCORE + 1)
#define OPTION_IDENTIFY_STRICT (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1)
#define OPTION_NO_LEADING_UNDERSCORE (OPTION_IDENTIFY_STRICT + 1)
#define OPTION_LEADING_UNDERSCORE (OPTION_NO_LEADING_UNDERSCORE + 1)
/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
enum command_line_switch
{
OPTION_EXPORT_ALL_SYMS = 150,
OPTION_NO_EXPORT_ALL_SYMS,
OPTION_EXCLUDE_SYMS,
OPTION_NO_DEFAULT_EXCLUDES,
OPTION_ADD_STDCALL_UNDERSCORE,
OPTION_USE_NUL_PREFIXED_IMPORT_TABLES,
OPTION_IDENTIFY_STRICT,
OPTION_NO_LEADING_UNDERSCORE,
OPTION_LEADING_UNDERSCORE,
OPTION_DETERMINISTIC_LIBRARIES,
OPTION_NON_DETERMINISTIC_LIBRARIES
};
static const struct option long_options[] =
{
{"no-delete", no_argument, NULL, 'n'},
{"dllname", required_argument, NULL, 'D'},
{"no-idata4", no_argument, NULL, 'x'},
{"no-idata5", no_argument, NULL, 'c'},
{"use-nul-prefixed-import-tables", no_argument, NULL,
OPTION_USE_NUL_PREFIXED_IMPORT_TABLES},
{"output-exp", required_argument, NULL, 'e'},
{"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'},
{"def", required_argument, NULL, 'd'}, /* for compatibility with older versions */
{"input-def", required_argument, NULL, 'd'},
{"add-underscore", no_argument, NULL, 'U'},
{"add-stdcall-underscore", no_argument, NULL, OPTION_ADD_STDCALL_UNDERSCORE},
{"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
{"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE},
{"kill-at", no_argument, NULL, 'k'},
{"add-stdcall-alias", no_argument, NULL, 'A'},
{"ext-prefix-alias", required_argument, NULL, 'p'},
{"identify", required_argument, NULL, 'I'},
{"identify-strict", no_argument, NULL, OPTION_IDENTIFY_STRICT},
{"verbose", no_argument, NULL, 'v'},
{"version", no_argument, NULL, 'V'},
{"help", no_argument, NULL, 'h'},
{"machine", required_argument, NULL, 'm'},
{"add-indirect", no_argument, NULL, 'a'},
{"base-file", required_argument, NULL, 'b'},
{"add-stdcall-alias", no_argument, NULL, 'A'},
{"add-stdcall-underscore", no_argument, NULL, OPTION_ADD_STDCALL_UNDERSCORE},
{"add-underscore", no_argument, NULL, 'U'},
{"as", required_argument, NULL, 'S'},
{"as-flags", required_argument, NULL, 'f'},
{"mcore-elf", required_argument, NULL, 'M'},
{"base-file", required_argument, NULL, 'b'},
{"compat-implib", no_argument, NULL, 'C'},
{"temp-prefix", required_argument, NULL, 't'},
{"def", required_argument, NULL, 'd'}, /* For compatibility with older versions. */
{"deterministic-libraries", no_argument, NULL, OPTION_DETERMINISTIC_LIBRARIES},
{"dllname", required_argument, NULL, 'D'},
{"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMS},
{"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL_SYMS},
{"ext-prefix-alias", required_argument, NULL, 'p'},
{"help", no_argument, NULL, 'h'},
{"identify", required_argument, NULL, 'I'},
{"identify-strict", no_argument, NULL, OPTION_IDENTIFY_STRICT},
{"input-def", required_argument, NULL, 'd'},
{"kill-at", no_argument, NULL, 'k'},
{"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE},
{"machine", required_argument, NULL, 'm'},
{"mcore-elf", required_argument, NULL, 'M'},
{"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
{"no-delete", no_argument, NULL, 'n'},
{"no-export-all-symbols", no_argument, NULL, OPTION_NO_EXPORT_ALL_SYMS},
{"no-idata4", no_argument, NULL, 'x'},
{"no-idata5", no_argument, NULL, 'c'},
{"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
{"non-deterministic-libraries", no_argument, NULL, OPTION_NON_DETERMINISTIC_LIBRARIES},
{"output-def", required_argument, NULL, 'z'},
{"output-delaylib", required_argument, NULL, 'y'},
{"output-exp", required_argument, NULL, 'e'},
{"output-lib", required_argument, NULL, 'l'},
{"temp-prefix", required_argument, NULL, 't'},
{"use-nul-prefixed-import-tables", no_argument, NULL, OPTION_USE_NUL_PREFIXED_IMPORT_TABLES},
{"verbose", no_argument, NULL, 'v'},
{"version", no_argument, NULL, 'V'},
{NULL,0,NULL,0}
};
@@ -3924,6 +3944,12 @@ main (int ac, char **av)
case 'y':
delayimp_name = optarg;
break;
case OPTION_DETERMINISTIC_LIBRARIES:
deterministic = true;
break;
case OPTION_NON_DETERMINISTIC_LIBRARIES:
deterministic = false;
break;
default:
usage (stderr, 1);
break;

View File

@@ -4510,6 +4510,7 @@ dlltool [@option{-d}|@option{--input-def} @var{def-file-name}]
[@option{-v}|@option{--verbose}]
[@option{-h}|@option{--help}] [@option{-V}|@option{--version}]
[@option{--no-leading-underscore}] [@option{--leading-underscore}]
[@option{--deterministic-libraries}] [@option{--non-deterministic-libraries}]
[object-file @dots{}]
@c man end
@end smallexample
@@ -4629,6 +4630,14 @@ Specifies the name of the library file to be created by dlltool.
@itemx --output-delaylib @var{filename}
Specifies the name of the delay-import library file to be created by dlltool.
@item --deterministic-libraries
@itemx --non-deterministic-libraries
When creating output libraries in response to either the
@option{--output-lib} or @option{--output-delaylib} options either use
the value of zero for any timestamps, user ids and group ids created
(@option{--deterministic-libraries}) or the actual timestamps, user
ids and group ids (@option{--non-deterministic-libraries}).
@item --export-all-symbols
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