[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.
This commit is contained in:
parent
17ee85fc2a
commit
198204a7f0
11
ld/ChangeLog
11
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
|
||||
|
|
5
ld/NEWS
5
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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
33
ld/lexsup.c
33
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"));
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue