From: Nick Clifton Date: Wed, 27 May 2020 16:49:17 +0000 (+0100) Subject: [PATCH] allow empty string as argument to -Map X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=198204a7f0255c0e25dcda6b7d6a72e666d689c1;p=binutils-gdb.git [PATCH] allow empty string as argument to -Map * lexsup.c (parse_args): If the map filename is defined but empty create a name based upon the output file name. If the name is defined but refers to a directory create a file inside the directory based on the output file name. * ld.texi: Document the new feature. * testsuite/ld-script/map-address.exp: Add test of new feature. * NEWS: Mention the new feature. --- diff --git a/ld/ChangeLog b/ld/ChangeLog index 3fd9b7457ee..fa0510d8bf6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2020-05-27 Rasmus Villemoes + Nick Clifton + + * lexsup.c (parse_args): If the map filename is defined but empty + create a name based upon the output file name. If the name is + defined but refers to a directory create a file inside the + directory based on the output file name. + * ld.texi: Document the new feature. + * testsuite/ld-script/map-address.exp: Add test of new feature. + * NEWS: Mention the new feature. + 2020-05-27 H.J. Lu PR ld/22909 diff --git a/ld/NEWS b/ld/NEWS index 0aaa13d4874..98f07a73e12 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,10 @@ -*- text -*- +* The -Map= command line option has been extended so that if + is omitted then a file called .map will be + created. Plus if is a directory then + /.map will be created. + * Add a command-line option for ELF linker, --warn-textrel, to warn that DT_TEXTREL is set in a position-independent executable or shared object. diff --git a/ld/ld.texi b/ld/ld.texi index a7ec0d01b3d..52342523ed3 100644 --- a/ld/ld.texi +++ b/ld/ld.texi @@ -1760,7 +1760,12 @@ Print a summary of all target-specific options on the standard output and exit. @kindex -Map=@var{mapfile} @item -Map=@var{mapfile} Print a link map to the file @var{mapfile}. See the description of the -@option{-M} option, above. +@option{-M} option, above. Specifying the empty string as @var{mapfile} +(that is, @code{-Map=}) causes the link map to be written to a file +named after the @var{output} file, with @code{.map} appended. +Specifying a directory as @var{mapfile} causes the link map to be +written into a file inside the directory. The name of the file is +again based upon the @var{output} filename with @code{.map} appended. @cindex memory usage @kindex --no-keep-memory diff --git a/ld/lexsup.c b/ld/lexsup.c index 3733a7c8935..49c4f23950d 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -359,7 +359,7 @@ static const struct ld_option ld_options[] = { {"init", required_argument, NULL, OPTION_INIT}, '\0', N_("SYMBOL"), N_("Call SYMBOL at load-time"), ONE_DASH }, { {"Map", required_argument, NULL, OPTION_MAP}, - '\0', N_("FILE"), N_("Write a map file"), ONE_DASH }, + '\0', N_("[FILE]"), N_("Write a map file (default: .map)"), ONE_DASH }, { {"no-define-common", no_argument, NULL, OPTION_NO_DEFINE_COMMON}, '\0', NULL, N_("Do not define Common storage"), TWO_DASHES }, { {"no-demangle", no_argument, NULL, OPTION_NO_DEMANGLE }, @@ -1595,6 +1595,37 @@ parse_args (unsigned argc, char **argv) } } + /* Run a couple of checks on the map filename. */ + if (config.map_filename) + { + /* If name has been provided then use the + output filename with a .map extension. */ + if (config.map_filename[0] == 0) + { + /* FIXME: This is a memory leak as the string is never freed. */ + if (asprintf (&config.map_filename, "%s.map", output_filename) < 0) + einfo (_("%F%P: %s: can not create name of map file: %E\n")); + } + else + { + struct stat s; + + /* If the map filename is actually a directory then create + a file inside it, again based upon the output filename. */ + if (stat (config.map_filename, &s) >= 0 + && S_ISDIR (s.st_mode)) + { + char * new_name; + + /* FIXME: Another memory leak. */ + if (asprintf (&new_name, "%s/%s.map", + config.map_filename, output_filename) < 0) + einfo (_("%F%P: %s: can not create name of map file: %E\n")); + config.map_filename = new_name; + } + } + } + if (command_line.soname && command_line.soname[0] == '\0') { einfo (_("%P: SONAME must not be empty string; ignored\n")); diff --git a/ld/testsuite/ld-scripts/map-address.exp b/ld/testsuite/ld-scripts/map-address.exp index 0f9479a34f5..352a9d8f1ef 100644 --- a/ld/testsuite/ld-scripts/map-address.exp +++ b/ld/testsuite/ld-scripts/map-address.exp @@ -45,3 +45,25 @@ if {[regexp_diff \ } else { pass $testname } + +set testname "map to directory" + +if {![ld_link $ld tmpdir/map-address \ + "-T $srcdir/$subdir/map-address.t \ + tmpdir/map-address.o \ + -Map tmpdir --output fred"]} { + fail $testname + return +} + +if [is_remote host] then { + remote_upload host "tmpdir/fred.map" +} + +if {[regexp_diff \ + "tmpdir/fred.map" \ + "$srcdir/$subdir/map-address.d"]} { + fail $testname +} else { + pass $testname +}