aboutsummaryrefslogtreecommitdiff
path: root/gold/options.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gold/options.cc')
-rw-r--r--gold/options.cc30
1 files changed, 28 insertions, 2 deletions
diff --git a/gold/options.cc b/gold/options.cc
index 420f795..b660ed0 100644
--- a/gold/options.cc
+++ b/gold/options.cc
@@ -477,6 +477,9 @@ options::Command_line_options::options[] =
GENERAL_ARG('O', NULL, N_("Optimize output file size"),
N_("-O level"), ONE_DASH,
&General_options::set_optimization_level),
+ GENERAL_ARG('\0', "oformat", N_("Set output format (only binary supported)"),
+ N_("--oformat FORMAT"), EXACTLY_TWO_DASHES,
+ &General_options::set_output_format),
GENERAL_NOARG('r', NULL, N_("Generate relocatable output"), NULL,
ONE_DASH, &General_options::set_relocatable),
// -R really means -rpath, but can mean --just-symbols for
@@ -605,6 +608,7 @@ General_options::General_options(Script_options* script_options)
search_path_(),
optimization_level_(0),
output_file_name_("a.out"),
+ output_format_(OUTPUT_FORMAT_ELF),
is_relocatable_(false),
strip_(STRIP_NONE),
allow_shlib_undefined_(false),
@@ -643,6 +647,24 @@ General_options::define_symbol(const char* arg)
this->script_options_->define_symbol(arg);
}
+// Handle the --oformat option. The GNU linker accepts a target name
+// with --oformat. In practice for an ELF target this would be the
+// same target as the input files. That name always start with "elf".
+// Non-ELF targets would be "srec", "symbolsrec", "tekhex", "binary",
+// "ihex".
+
+void
+General_options::set_output_format(const char* arg)
+{
+ if (strncmp(arg, "elf", 3) == 0)
+ this->output_format_ = OUTPUT_FORMAT_ELF;
+ else if (strcmp(arg, "binary") == 0)
+ this->output_format_ = OUTPUT_FORMAT_BINARY;
+ else
+ gold_error(_("format '%s' not supported (supported formats: elf, binary)"),
+ arg);
+}
+
// Handle the -z option.
void
@@ -855,8 +877,8 @@ Command_line::process_one_option(int argc, char** argv, int i,
{
if (options[j].long_option != NULL
&& (dashes == 2
- || (options[j].dash
- != options::One_option::EXACTLY_TWO_DASHES))
+ || (options[j].dash
+ != options::One_option::EXACTLY_TWO_DASHES))
&& first == options[j].long_option[0]
&& strcmp(opt, options[j].long_option) == 0)
{
@@ -1023,6 +1045,10 @@ Command_line::normalize_options()
if (this->options_.is_shared() && this->options_.is_relocatable())
gold_fatal(_("-shared and -r are incompatible"));
+ if (this->options_.output_format() != General_options::OUTPUT_FORMAT_ELF
+ && (this->options_.is_shared() || this->options_.is_relocatable()))
+ gold_fatal(_("binary output format not compatible with -shared or -r"));
+
// If the user specifies both -s and -r, convert the -s as -S.
// -r requires us to keep externally visible symbols!
if (this->options_.strip_all() && this->options_.is_relocatable())