summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/NEWS5
-rw-r--r--ld/ld.texi7
-rw-r--r--ld/lexsup.c33
-rw-r--r--ld/testsuite/ld-scripts/map-address.exp22
5 files changed, 76 insertions, 2 deletions
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 <rv@rasmusvillemoes.dk>
+ Nick Clifton <nickc@redhat.com>
+
+ * 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 <hongjiu.lu@intel.com>
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=<filename> command line option has been extended so that if
+ <filename> is omitted then a file called <output-filename>.map will be
+ created. Plus if <filename> is a directory then
+ <filename>/<output-filename>.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: <outputname>.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
+}