aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2014-08-08 20:26:41 -0400
committerUlrich Drepper <drepper@gmail.com>2014-08-08 20:26:41 -0400
commit26278bb8717a16139b3a4da9ba1cd2aed435f1ee (patch)
tree8eede31c3d86f0e483c69163df79ea57009c185c
parent236bbb83885fbdf108e714fb0bcf9355d84dbd20 (diff)
downloadgdb-26278bb8717a16139b3a4da9ba1cd2aed435f1ee.zip
gdb-26278bb8717a16139b3a4da9ba1cd2aed435f1ee.tar.gz
gdb-26278bb8717a16139b3a4da9ba1cd2aed435f1ee.tar.bz2
* 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.
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/ld.texinfo28
-rw-r--r--ld/ldlang.h3
-rw-r--r--ld/ldlex.h2
-rw-r--r--ld/lexsup.c23
5 files changed, 67 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index b34d360..b80e69f 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 5762dc6..b559b4f 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -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
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 0f7fdd4..45420cd 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -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
diff --git a/ld/ldlex.h b/ld/ldlex.h
index b2753c3..63f4c81 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -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. */
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 52b4fdb..3a1ea9e 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -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;
}
}