* ldlang.h (struct lang_input_statement_flags): Add pushed

member.
        * ldlex.h (enum option_values): Add OPTION_PUSH_STATE and
        OPTION_POP_STATE.
        * lexsup.c (ld_options): Add entries for --push-state and
        --pop-state.
        (parse_args): Handle OPTION_PUSH_STATE and OPTION_POP_STATE.
        * ld.texinfo: Document --push-state and --pop-state.
This commit is contained in:
Ulrich Drepper 2014-08-08 20:26:41 -04:00
parent 236bbb8388
commit 26278bb871
5 changed files with 67 additions and 0 deletions

View File

@ -1,3 +1,14 @@
2014-08-08 Ulrich Drepper <drepper@gmail.com>
* ldlang.h (struct lang_input_statement_flags): Add pushed
member.
* ldlex.h (enum option_values): Add OPTION_PUSH_STATE and
OPTION_POP_STATE.
* lexsup.c (ld_options): Add entries for --push-state and
--pop-state.
(parse_args): Handle OPTION_PUSH_STATE and OPTION_POP_STATE.
* ld.texinfo: Document --push-state and --pop-state.
2014-08-06 H.J. Lu <hongjiu.lu@intel.com>
PR14918

View File

@ -827,6 +827,34 @@ the linker may make more use of this option. Also currently there is
no difference in the linker's behaviour for different non-zero values
of this option. Again this may change with future releases.
@kindex --push-state
@cindex push state governing input file handling
@item --push-state
The @option{--push-state} allows to preserve the current state of the
flags which govern the input file handling so that they can all be
restored with one corresponding @option{--pop-state} option.
The option which are covered are: @option{-Bdynamic}, @option{-Bstatic},
@option{-dn}, @option{-dy}, @option{-call_shared}, @option{-non_shared},
@option{-static}, @option{-N}, @option{-n}, @option{--whole-archive},
@option{--no-whole-archive}, @option{-r}, @option{-Ur},
@option{--copy-dt-needed-entries}, @option{--no-copy-dt-needed-entries},
@option{--as-needed}, @option{--no-as-needed}, and @option{-a}.
One target for this option are specifications for @file{pkg-config}. When
used with the @option{--libs} option all possibly needed libraries are
listed and then possibly linked with all the time. It is better to return
something as follows:
@smallexample
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
@end smallexample
@kindex --pop-state
@cindex pop state governing input file handling
Undoes the effect of --push-state, restores the previous values of the
flags governing input file handling.
@kindex -q
@kindex --emit-relocs
@cindex retain relocations in final executable

View File

@ -282,6 +282,9 @@ struct lang_input_statement_flags
/* Set if reloading an archive or --as-needed lib. */
unsigned int reload : 1;
#endif /* ENABLE_PLUGINS */
/* Head of list of pushed flags. */
struct lang_input_statement_flags *pushed;
};
typedef struct lang_input_statement_struct

View File

@ -137,6 +137,8 @@ enum option_values
OPTION_DEFAULT_SCRIPT,
OPTION_PRINT_OUTPUT_FORMAT,
OPTION_IGNORE_UNRESOLVED_SYMBOL,
OPTION_PUSH_STATE,
OPTION_POP_STATE,
};
/* The initial parser states. */

View File

@ -505,6 +505,12 @@ static const struct ld_option ld_options[] =
OPTION_IGNORE_UNRESOLVED_SYMBOL},
'\0', N_("SYMBOL"),
N_("Unresolved SYMBOL will not cause an error or warning"), TWO_DASHES },
{ {"push-state", no_argument, NULL, OPTION_PUSH_STATE},
'\0', NULL, N_("Push state of flags governing input file handling"),
TWO_DASHES },
{ {"pop-state", no_argument, NULL, OPTION_POP_STATE},
'\0', NULL, N_("Pop state of flags governing input file handling"),
TWO_DASHES },
};
#define OPTION_COUNT ARRAY_SIZE (ld_options)
@ -1444,6 +1450,23 @@ parse_args (unsigned argc, char **argv)
einfo (_("%P%X: --hash-size needs a numeric argument\n"));
}
break;
case OPTION_PUSH_STATE:
input_flags.pushed = xmemdup (&input_flags,
sizeof (input_flags),
sizeof (input_flags));
break;
case OPTION_POP_STATE:
if (input_flags.pushed == NULL)
einfo (_("%P%F: no state pushed before popping\n"));
else
{
struct lang_input_statement_flags *oldp = input_flags.pushed;
memcpy (&input_flags, oldp, sizeof (input_flags));
free (oldp);
}
break;
}
}