namespace
{
+// Recognize input and output target names. The GNU linker accepts
+// these with --format and --oformat. This code is intended to be
+// minimally compatible. 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".
+
+gold::General_options::Object_format
+string_to_object_format(const char* arg)
+{
+ if (strncmp(arg, "elf", 3) == 0)
+ return gold::General_options::OBJECT_FORMAT_ELF;
+ else if (strcmp(arg, "binary") == 0)
+ return gold::General_options::OBJECT_FORMAT_BINARY;
+ else
+ {
+ gold::gold_error(_("format '%s' not supported "
+ "(supported formats: elf, binary)"),
+ arg);
+ return gold::General_options::OBJECT_FORMAT_ELF;
+ }
+}
+
// Handle the special -l option, which adds an input file.
int
&Position_dependent_options::set_static_search),
GENERAL_NOARG('\0', "Bsymbolic", N_("Bind defined symbols locally"),
NULL, ONE_DASH, &General_options::set_symbolic),
+ POSDEP_ARG('b', "format", N_("Set input format (elf, binary)"),
+ N_("-b FORMAT, --format FORMAT"), TWO_DASHES,
+ &Position_dependent_options::set_input_format),
#ifdef HAVE_ZLIB_H
# define ZLIB_STR ",zlib"
#else
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
search_path_(),
optimization_level_(0),
output_file_name_("a.out"),
+ output_format_(OBJECT_FORMAT_ELF),
is_relocatable_(false),
strip_(STRIP_NONE),
allow_shlib_undefined_(false),
this->script_options_->define_symbol(arg);
}
+// Handle the --oformat option.
+
+void
+General_options::set_output_format(const char* arg)
+{
+ this->output_format_ = string_to_object_format(arg);
+}
+
// Handle the -z option.
void
Position_dependent_options::Position_dependent_options()
: do_static_search_(false),
as_needed_(false),
- include_whole_archive_(false)
+ include_whole_archive_(false),
+ input_format_(General_options::OBJECT_FORMAT_ELF)
+{
+}
+
+// Set the input format.
+
+void
+Position_dependent_options::set_input_format(const char* arg)
{
+ this->input_format_ = string_to_object_format(arg);
}
// Search_directory methods.
{
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)
{
if (this->options_.is_shared() && this->options_.is_relocatable())
gold_fatal(_("-shared and -r are incompatible"));
+ if (this->options_.output_format() != General_options::OBJECT_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())