Pass down alignment when adding input section to orphan section.
[deliverable/binutils-gdb.git] / gold / options.cc
index 420f795201b3f5ccccdee7e9269296da13810240..e83b78d6e5dfbecc6b0c07ef69b86d0fc31c3918 100644 (file)
@@ -135,6 +135,29 @@ class options::Command_line_options
 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
@@ -428,6 +451,9 @@ options::Command_line_options::options[] =
               &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
@@ -477,6 +503,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 +634,7 @@ General_options::General_options(Script_options* script_options)
     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),
@@ -643,6 +673,14 @@ General_options::define_symbol(const char* arg)
   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
@@ -716,8 +754,17 @@ General_options::add_sysroot()
 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.
@@ -855,8 +902,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 +1070,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::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())
This page took 0.02603 seconds and 4 git commands to generate.