gold/
authorRoland McGrath <roland@gnu.org>
Fri, 10 May 2013 22:33:35 +0000 (22:33 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 10 May 2013 22:33:35 +0000 (22:33 +0000)
* options.h (General_options): Add --rosegment-gap option.
* options.cc (finalize): --rosegment-gap implies --rosegment.
* layout.cc (set_segment_offsets): Let user option override
target->rosegment_gap().

gold/ChangeLog
gold/layout.cc
gold/options.cc
gold/options.h

index 67c871ae7a1a691417b4700872cb337377c5fcf1..3e2f7f6ca9b83600920e264afcf54f3d4767fa23 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-10  Roland McGrath  <mcgrathr@google.com>
+
+       * options.h (General_options): Add --rosegment-gap option.
+       * options.cc (finalize): --rosegment-gap implies --rosegment.
+       * layout.cc (set_segment_offsets): Let user option override
+       target->rosegment_gap().
+
 2013-05-10  Roland McGrath  <mcgrathr@google.com>
 
        * options.h (General_options): Remove leading space from help
index 85b1db7a7f142c90da806091a486c6b204821390..33fa473c1aac9b422935ae0e450d56add3ac2b4e 100644 (file)
@@ -1,6 +1,6 @@
 // layout.cc -- lay out output file sections for gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
 // Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
@@ -244,10 +244,10 @@ class Hash_task : public Task
 {
  public:
   Hash_task(const unsigned char* src,
-            size_t size,
-            unsigned char* dst,
-            Task_token* build_id_blocker,
-            Task_token* final_blocker)
+           size_t size,
+           unsigned char* dst,
+           Task_token* build_id_blocker,
+           Task_token* final_blocker)
     : src_(src), size_(size), dst_(dst), build_id_blocker_(build_id_blocker),
       final_blocker_(final_blocker)
   { }
@@ -1098,7 +1098,7 @@ Layout::special_ordering_of_input_section(const char* name)
   // wind up in the .text section.  Sections that start with these
   // prefixes must appear first, and must appear in the order listed
   // here.
-  static const char* const text_section_sort[] = 
+  static const char* const text_section_sort[] =
   {
     ".text.unlikely",
     ".text.exit",
@@ -1158,7 +1158,7 @@ Layout::layout(Sized_relobj_file<size, big_endian>* object, unsigned int shndx,
          = this->section_segment_map_.find(Const_section_id(object, shndx));
       if (it == this->section_segment_map_.end())
        {
-          os = this->choose_output_section(object, name, sh_type,
+         os = this->choose_output_section(object, name, sh_type,
                                           shdr.get_sh_flags(), true,
                                           ORDER_INVALID, false);
        }
@@ -1254,7 +1254,7 @@ void
 Layout::insert_section_segment_map(Const_section_id secn,
                                   Unique_segment_info *s)
 {
-  gold_assert(this->unique_segment_for_sections_specified_); 
+  gold_assert(this->unique_segment_for_sections_specified_);
   this->section_segment_map_[secn] = s;
 }
 
@@ -1890,44 +1890,44 @@ Layout::attach_allocated_section_to_segment(const Target* target,
   if (!os->is_unique_segment())
     {
       for (p = this->segment_list_.begin();
-          p != this->segment_list_.end();
+          p != this->segment_list_.end();
           ++p)
        {
-         if ((*p)->type() != elfcpp::PT_LOAD)                        
-           continue;                        
-         if ((*p)->is_unique_segment())                        
-           continue;                        
-         if (!parameters->options().omagic()                        
-             && ((*p)->flags() & elfcpp::PF_W) != (seg_flags & elfcpp::PF_W))                        
-           continue;                        
-         if ((target->isolate_execinstr() || parameters->options().rosegment())                        
-             && ((*p)->flags() & elfcpp::PF_X) != (seg_flags & elfcpp::PF_X))                        
-           continue;                        
-         // If -Tbss was specified, we need to separate the data and BSS                        
-         // segments.                        
-         if (parameters->options().user_set_Tbss())                        
-           {                        
-             if ((os->type() == elfcpp::SHT_NOBITS)                        
-                 == (*p)->has_any_data_sections())                        
-               continue;                        
-           }                        
-         if (os->is_large_data_section() && !(*p)->is_large_data_segment())                        
-           continue;                        
-                           
-         if (is_address_set)                        
-           {                        
-             if ((*p)->are_addresses_set())                        
-               continue;                        
-                           
-             (*p)->add_initial_output_data(os);                        
-             (*p)->update_flags_for_output_section(seg_flags);                        
-             (*p)->set_addresses(addr, addr);                        
-             break;                        
-           }                        
-                           
-         (*p)->add_output_section_to_load(this, os, seg_flags);                        
-         break;                        
-       }                        
+         if ((*p)->type() != elfcpp::PT_LOAD)
+           continue;
+         if ((*p)->is_unique_segment())
+           continue;
+         if (!parameters->options().omagic()
+             && ((*p)->flags() & elfcpp::PF_W) != (seg_flags & elfcpp::PF_W))
+           continue;
+         if ((target->isolate_execinstr() || parameters->options().rosegment())
+             && ((*p)->flags() & elfcpp::PF_X) != (seg_flags & elfcpp::PF_X))
+           continue;
+         // If -Tbss was specified, we need to separate the data and BSS
+         // segments.
+         if (parameters->options().user_set_Tbss())
+           {
+             if ((os->type() == elfcpp::SHT_NOBITS)
+                 == (*p)->has_any_data_sections())
+               continue;
+           }
+         if (os->is_large_data_section() && !(*p)->is_large_data_segment())
+           continue;
+
+         if (is_address_set)
+           {
+             if ((*p)->are_addresses_set())
+               continue;
+
+             (*p)->add_initial_output_data(os);
+             (*p)->update_flags_for_output_section(seg_flags);
+             (*p)->set_addresses(addr, addr);
+             break;
+           }
+
+         (*p)->add_output_section_to_load(this, os, seg_flags);
+         break;
+       }
     }
 
   if (p == this->segment_list_.end()
@@ -3457,7 +3457,10 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
 
                  // If the target wants a fixed minimum distance from the
                  // text segment to the read-only segment, move up now.
-                 uint64_t min_addr = start_addr + target->rosegment_gap();
+                 uint64_t min_addr =
+                   start_addr + (parameters->options().user_set_rosegment_gap()
+                                 ? parameters->options().rosegment_gap()
+                                 : target->rosegment_gap());
                  if (addr < min_addr)
                    addr = min_addr;
 
@@ -5270,20 +5273,20 @@ Layout::write_sections_after_input_sections(Output_file* of)
 
 Task_token*
 Layout::queue_build_id_tasks(Workqueue* workqueue, Task_token* build_id_blocker,
-                             Output_file* of)
+                            Output_file* of)
 {
   const size_t filesize = (this->output_file_size() <= 0 ? 0
-                           : static_cast<size_t>(this->output_file_size()));
+                          : static_cast<size_t>(this->output_file_size()));
   if (this->build_id_note_ != NULL
       && strcmp(parameters->options().build_id(), "tree") == 0
       && parameters->options().build_id_chunk_size_for_treehash() > 0
       && filesize > 0
       && (filesize >=
-          parameters->options().build_id_min_file_size_for_treehash()))
+         parameters->options().build_id_min_file_size_for_treehash()))
     {
       static const size_t MD5_OUTPUT_SIZE_IN_BYTES = 16;
       const size_t chunk_size =
-          parameters->options().build_id_chunk_size_for_treehash();
+         parameters->options().build_id_chunk_size_for_treehash();
       const size_t num_hashes = ((filesize - 1) / chunk_size) + 1;
       Task_token* post_hash_tasks_blocker = new Task_token(true);
       post_hash_tasks_blocker->add_blockers(num_hashes);
@@ -5293,15 +5296,15 @@ Layout::queue_build_id_tasks(Workqueue* workqueue, Task_token* build_id_blocker,
       unsigned char *dst = new unsigned char[this->size_of_array_of_hashes_];
       this->array_of_hashes_ = dst;
       for (size_t i = 0, src_offset = 0; i < num_hashes;
-           i++, dst += MD5_OUTPUT_SIZE_IN_BYTES, src_offset += chunk_size)
-        {
-          size_t size = std::min(chunk_size, filesize - src_offset);
-          workqueue->queue(new Hash_task(src + src_offset,
-                                         size,
-                                         dst,
-                                         build_id_blocker,
-                                         post_hash_tasks_blocker));
-        }
+          i++, dst += MD5_OUTPUT_SIZE_IN_BYTES, src_offset += chunk_size)
+       {
+         size_t size = std::min(chunk_size, filesize - src_offset);
+         workqueue->queue(new Hash_task(src + src_offset,
+                                        size,
+                                        dst,
+                                        build_id_blocker,
+                                        post_hash_tasks_blocker));
+       }
       return post_hash_tasks_blocker;
     }
   return build_id_blocker;
@@ -5318,7 +5321,7 @@ Layout::write_build_id(Output_file* of) const
     return;
 
   unsigned char* ov = of->get_output_view(this->build_id_note_->offset(),
-                                          this->build_id_note_->data_size());
+                                         this->build_id_note_->data_size());
 
   if (this->array_of_hashes_ == NULL)
     {
@@ -5329,11 +5332,11 @@ Layout::write_build_id(Output_file* of) const
       // If we get here with style == "tree" then the output must be
       // too small for chunking, and we use SHA-1 in that case.
       if ((strcmp(style, "sha1") == 0) || (strcmp(style, "tree") == 0))
-        sha1_buffer(reinterpret_cast<const char*>(iv), output_file_size, ov);
+       sha1_buffer(reinterpret_cast<const char*>(iv), output_file_size, ov);
       else if (strcmp(style, "md5") == 0)
-        md5_buffer(reinterpret_cast<const char*>(iv), output_file_size, ov);
+       md5_buffer(reinterpret_cast<const char*>(iv), output_file_size, ov);
       else
-        gold_unreachable();
+       gold_unreachable();
 
       of->free_input_view(0, output_file_size, iv);
     }
@@ -5342,7 +5345,7 @@ Layout::write_build_id(Output_file* of) const
       // Non-overlapping substrings of the output file have been hashed.
       // Compute SHA-1 hash of the hashes.
       sha1_buffer(reinterpret_cast<const char*>(this->array_of_hashes_),
-                  this->size_of_array_of_hashes_, ov);
+                 this->size_of_array_of_hashes_, ov);
       delete[] this->array_of_hashes_;
       of->free_input_view(0, this->output_file_size(), this->input_view_);
     }
index 5b94faefa5e5c1438028c5b6a44d0ea50a045605..000e6d07a32c79eb6236f10d052dca6646da5d7f 100644 (file)
@@ -1,6 +1,7 @@
 // options.c -- handle command line options for gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2013
+// Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -101,11 +102,11 @@ One_option::print() const
     {
       len += printf("-%c", this->shortname);
       if (this->helparg)
-        {
-          // -z takes long-names only.
-          gold_assert(this->dashes != DASH_Z);
-          len += printf(" %s", gettext(this->helparg));
-        }
+       {
+         // -z takes long-names only.
+         gold_assert(this->dashes != DASH_Z);
+         len += printf(" %s", gettext(this->helparg));
+       }
       comma = true;
     }
   if (!this->longname.empty()
@@ -113,29 +114,29 @@ One_option::print() const
           && this->longname[1] == '\0'))
     {
       if (comma)
-        len += printf(", ");
+       len += printf(", ");
       switch (this->dashes)
-        {
-        case options::ONE_DASH: case options::EXACTLY_ONE_DASH:
-          len += printf("-");
-          break;
-        case options::TWO_DASHES: case options::EXACTLY_TWO_DASHES:
-          len += printf("--");
-          break;
-        case options::DASH_Z:
-          len += printf("-z ");
-          break;
-        default:
-          gold_unreachable();
-        }
+       {
+       case options::ONE_DASH: case options::EXACTLY_ONE_DASH:
+         len += printf("-");
+         break;
+       case options::TWO_DASHES: case options::EXACTLY_TWO_DASHES:
+         len += printf("--");
+         break;
+       case options::DASH_Z:
+         len += printf("-z ");
+         break;
+       default:
+         gold_unreachable();
+       }
       len += printf("%s", this->longname.c_str());
       if (this->helparg)
-        {
-          // For most options, we print "--frob FOO".  But for -z
-          // we print "-z frob=FOO".
-          len += printf("%c%s", this->dashes == options::DASH_Z ? '=' : ' ',
-                        gettext(this->helparg));
-        }
+       {
+         // For most options, we print "--frob FOO".  But for -z
+         // we print "-z frob=FOO".
+         len += printf("%c%s", this->dashes == options::DASH_Z ? '=' : ' ',
+                       gettext(this->helparg));
+       }
     }
 
   if (len >= 30)
@@ -200,7 +201,7 @@ parse_uint(const char* option_name, const char* arg, int* retval)
   *retval = strtol(arg, &endptr, 0);
   if (*endptr != '\0' || *retval < 0)
     gold_fatal(_("%s: invalid option value (expected an integer): %s"),
-               option_name, arg);
+              option_name, arg);
 }
 
 void
@@ -210,7 +211,7 @@ parse_int(const char* option_name, const char* arg, int* retval)
   *retval = strtol(arg, &endptr, 0);
   if (*endptr != '\0')
     gold_fatal(_("%s: invalid option value (expected an integer): %s"),
-               option_name, arg);
+              option_name, arg);
 }
 
 void
@@ -220,7 +221,7 @@ parse_uint64(const char* option_name, const char* arg, uint64_t* retval)
   *retval = strtoull(arg, &endptr, 0);
   if (*endptr != '\0')
     gold_fatal(_("%s: invalid option value (expected an integer): %s"),
-               option_name, arg);
+              option_name, arg);
 }
 
 void
@@ -273,13 +274,13 @@ parse_set(const char*, const char* arg, String_set* retval)
 
 void
 parse_choices(const char* option_name, const char* arg, const char** retval,
-              const char* choices[], int num_choices)
+             const char* choices[], int num_choices)
 {
   for (int i = 0; i < num_choices; i++)
     if (strcmp(choices[i], arg) == 0)
       {
-        *retval = arg;
-        return;
+       *retval = arg;
+       return;
       }
 
   // If we get here, the user did not enter a valid choice, so we die.
@@ -288,10 +289,10 @@ parse_choices(const char* option_name, const char* arg, const char** retval,
     {
       choices_list += choices[i];
       if (i != num_choices - 1)
-        choices_list += ", ";
+       choices_list += ", ";
     }
   gold_fatal(_("%s: must take one of the following arguments: %s"),
-             option_name, choices_list.c_str());
+            option_name, choices_list.c_str());
 }
 
 } // End namespace options.
@@ -340,21 +341,21 @@ General_options::parse_V(const char*, const char*, Command_line*)
 
 void
 General_options::parse_defsym(const char*, const char* arg,
-                              Command_line* cmdline)
+                             Command_line* cmdline)
 {
   cmdline->script_options().define_symbol(arg);
 }
 
 void
 General_options::parse_incremental(const char*, const char*,
-                                   Command_line*)
+                                  Command_line*)
 {
   this->incremental_mode_ = INCREMENTAL_AUTO;
 }
 
 void
 General_options::parse_no_incremental(const char*, const char*,
-                                      Command_line*)
+                                     Command_line*)
 {
   this->incremental_mode_ = INCREMENTAL_OFF;
 }
@@ -375,7 +376,7 @@ General_options::parse_incremental_update(const char*, const char*,
 
 void
 General_options::parse_incremental_changed(const char*, const char*,
-                                           Command_line*)
+                                          Command_line*)
 {
   this->implicit_incremental_ = true;
   this->incremental_disposition_ = INCREMENTAL_CHANGED;
@@ -383,7 +384,7 @@ General_options::parse_incremental_changed(const char*, const char*,
 
 void
 General_options::parse_incremental_unchanged(const char*, const char*,
-                                             Command_line*)
+                                            Command_line*)
 {
   this->implicit_incremental_ = true;
   this->incremental_disposition_ = INCREMENTAL_UNCHANGED;
@@ -391,7 +392,7 @@ General_options::parse_incremental_unchanged(const char*, const char*,
 
 void
 General_options::parse_incremental_unknown(const char*, const char*,
-                                           Command_line*)
+                                          Command_line*)
 {
   this->implicit_incremental_ = true;
   this->incremental_disposition_ = INCREMENTAL_CHECK;
@@ -407,7 +408,7 @@ General_options::parse_incremental_startup_unchanged(const char*, const char*,
 
 void
 General_options::parse_library(const char*, const char* arg,
-                               Command_line* cmdline)
+                              Command_line* cmdline)
 {
   Input_file_argument::Input_file_type type;
   const char* name;
@@ -428,7 +429,7 @@ General_options::parse_library(const char*, const char* arg,
 #ifdef ENABLE_PLUGINS
 void
 General_options::parse_plugin(const char*, const char* arg,
-                              Command_line*)
+                             Command_line*)
 {
   this->add_plugin(arg);
 }
@@ -437,7 +438,7 @@ General_options::parse_plugin(const char*, const char* arg,
 
 void
 General_options::parse_plugin_opt(const char*, const char* arg,
-                                  Command_line*)
+                                 Command_line*)
 {
   this->add_plugin_option(arg);
 }
@@ -445,7 +446,7 @@ General_options::parse_plugin_opt(const char*, const char* arg,
 
 void
 General_options::parse_R(const char* option, const char* arg,
-                         Command_line* cmdline)
+                        Command_line* cmdline)
 {
   struct stat s;
   if (::stat(arg, &s) != 0 || S_ISDIR(s.st_mode))
@@ -456,7 +457,7 @@ General_options::parse_R(const char* option, const char* arg,
 
 void
 General_options::parse_just_symbols(const char*, const char* arg,
-                                    Command_line* cmdline)
+                                   Command_line* cmdline)
 {
   Input_file_argument file(arg, Input_file_argument::INPUT_FILE_TYPE_FILE,
                           "", true, *this);
@@ -528,7 +529,7 @@ General_options::parse_static(const char*, const char*, Command_line*)
 
 void
 General_options::parse_script(const char*, const char* arg,
-                              Command_line* cmdline)
+                             Command_line* cmdline)
 {
   if (!read_commandline_script(arg, cmdline))
     gold::gold_fatal(_("unable to parse script file %s"), arg);
@@ -536,7 +537,7 @@ General_options::parse_script(const char*, const char* arg,
 
 void
 General_options::parse_version_script(const char*, const char* arg,
-                                      Command_line* cmdline)
+                                     Command_line* cmdline)
 {
   if (!read_version_script(arg, cmdline))
     gold::gold_fatal(_("unable to parse version script file %s"), arg);
@@ -544,7 +545,7 @@ General_options::parse_version_script(const char*, const char* arg,
 
 void
 General_options::parse_dynamic_list(const char*, const char* arg,
-                                    Command_line* cmdline)
+                                   Command_line* cmdline)
 {
   if (!read_dynamic_list(arg, cmdline, &this->dynamic_list_))
     gold::gold_fatal(_("unable to parse dynamic-list script file %s"), arg);
@@ -552,28 +553,28 @@ General_options::parse_dynamic_list(const char*, const char* arg,
 
 void
 General_options::parse_start_group(const char*, const char*,
-                                   Command_line* cmdline)
+                                  Command_line* cmdline)
 {
   cmdline->inputs().start_group();
 }
 
 void
 General_options::parse_end_group(const char*, const char*,
-                                 Command_line* cmdline)
+                                Command_line* cmdline)
 {
   cmdline->inputs().end_group();
 }
 
 void
 General_options::parse_start_lib(const char*, const char*,
-                                 Command_line* cmdline)
+                                Command_line* cmdline)
 {
   cmdline->inputs().start_lib(cmdline->position_dependent_options());
 }
 
 void
 General_options::parse_end_lib(const char*, const char*,
-                               Command_line* cmdline)
+                              Command_line* cmdline)
 {
   cmdline->inputs().end_lib();
 }
@@ -585,7 +586,7 @@ General_options::parse_end_lib(const char*, const char*,
 
 void
 General_options::parse_exclude_libs(const char*, const char* arg,
-                                    Command_line*)
+                                   Command_line*)
 {
   const char* p = arg;
 
@@ -659,15 +660,15 @@ General_options::string_to_object_format(const char* arg)
   else
     {
       gold::gold_error(_("format '%s' not supported; treating as elf "
-                         "(supported formats: elf, binary)"),
-                       arg);
+                        "(supported formats: elf, binary)"),
+                      arg);
       return gold::General_options::OBJECT_FORMAT_ELF;
     }
 }
 
 void
 General_options::parse_fix_v4bx(const char*, const char*,
-                                Command_line*)
+                               Command_line*)
 {
   this->fix_v4bx_ = FIX_V4BX_REPLACE;
 }
@@ -700,8 +701,8 @@ void
 usage()
 {
   fprintf(stderr,
-          _("%s: use the --help option for usage information\n"),
-          gold::program_name);
+         _("%s: use the --help option for usage information\n"),
+         gold::program_name);
   ::exit(EXIT_FAILURE);
 }
 
@@ -709,8 +710,8 @@ void
 usage(const char* msg, const char* opt)
 {
   fprintf(stderr,
-          _("%s: %s: %s\n"),
-          gold::program_name, opt, msg);
+         _("%s: %s: %s\n"),
+         gold::program_name, opt, msg);
   usage();
 }
 
@@ -721,12 +722,12 @@ static char*
 get_relative_sysroot(const char* from)
 {
   char* path = make_relative_prefix(gold::program_name, from,
-                                    TARGET_SYSTEM_ROOT);
+                                   TARGET_SYSTEM_ROOT);
   if (path != NULL)
     {
       struct stat s;
       if (::stat(path, &s) == 0 && S_ISDIR(s.st_mode))
-        return path;
+       return path;
       free(path);
     }
 
@@ -749,9 +750,9 @@ get_default_sysroot()
     {
       char* path = get_relative_sysroot(BINDIR);
       if (path == NULL)
-        path = get_relative_sysroot(TOOLBINDIR);
+       path = get_relative_sysroot(TOOLBINDIR);
       if (path != NULL)
-        return path;
+       return path;
     }
 
   return sysroot;
@@ -768,14 +769,14 @@ get_default_sysroot()
 // NOTE: it is safe for argv and arg to point to the same place.
 gold::options::One_option*
 parse_long_option(int argc, const char** argv, bool equals_only,
-                  const char** arg, int* i)
+                 const char** arg, int* i)
 {
   const char* const this_argv = argv[*i];
 
   const char* equals = strchr(this_argv, '=');
   const char* option_start = this_argv + strspn(this_argv, "-");
   std::string option(option_start,
-                     equals ? equals - option_start : strlen(option_start));
+                    equals ? equals - option_start : strlen(option_start));
 
   gold::options::Option_map::iterator it
       = gold::options::long_options->find(option);
@@ -788,21 +789,21 @@ parse_long_option(int argc, const char** argv, bool equals_only,
   if (this_argv[0] != '-')  // no dashes at all: had better be "-z <longopt>"
     {
       if (retval->dashes != gold::options::DASH_Z)
-        return NULL;
+       return NULL;
     }
   else if (this_argv[1] != '-')   // one dash
     {
       if (retval->dashes != gold::options::ONE_DASH
-          && retval->dashes != gold::options::EXACTLY_ONE_DASH
-          && retval->dashes != gold::options::TWO_DASHES)
-        return NULL;
+         && retval->dashes != gold::options::EXACTLY_ONE_DASH
+         && retval->dashes != gold::options::TWO_DASHES)
+       return NULL;
     }
   else                            // two dashes (or more!)
     {
       if (retval->dashes != gold::options::TWO_DASHES
-          && retval->dashes != gold::options::EXACTLY_TWO_DASHES
-          && retval->dashes != gold::options::ONE_DASH)
-        return NULL;
+         && retval->dashes != gold::options::EXACTLY_TWO_DASHES
+         && retval->dashes != gold::options::ONE_DASH)
+       return NULL;
     }
 
   // Now that we know the option is good (or else bad in a way that
@@ -813,20 +814,20 @@ parse_long_option(int argc, const char** argv, bool equals_only,
   if (!retval->takes_argument())
     {
       if (equals)
-        usage(_("unexpected argument"), this_argv);
+       usage(_("unexpected argument"), this_argv);
       else
-        *arg = NULL;
+       *arg = NULL;
     }
   else
     {
       if (equals)
-        *arg = equals + 1;
+       *arg = equals + 1;
       else if (retval->takes_optional_argument())
        *arg = retval->default_value;
       else if (*i < argc && !equals_only)
-        *arg = argv[(*i)++];
+       *arg = argv[(*i)++];
       else
-        usage(_("missing argument"), this_argv);
+       usage(_("missing argument"), this_argv);
     }
 
   return retval;
@@ -844,7 +845,7 @@ parse_long_option(int argc, const char** argv, bool equals_only,
 // another short option in the same word.
 gold::options::One_option*
 parse_short_option(int argc, const char** argv, int pos_in_argv_i,
-                   const char** arg, int* i)
+                  const char** arg, int* i)
 {
   const char* const this_argv = argv[*i];
 
@@ -853,7 +854,7 @@ parse_short_option(int argc, const char** argv, int pos_in_argv_i,
 
   // We handle -z as a special case.
   static gold::options::One_option dash_z("", gold::options::DASH_Z,
-                                          'z', "", NULL, "Z-OPTION", false,
+                                         'z', "", NULL, "Z-OPTION", false,
                                          NULL);
   gold::options::One_option* retval = NULL;
   if (this_argv[pos_in_argv_i] == 'z')
@@ -862,7 +863,7 @@ parse_short_option(int argc, const char** argv, int pos_in_argv_i,
     {
       const int char_as_int = static_cast<int>(this_argv[pos_in_argv_i]);
       if (char_as_int > 0 && char_as_int < 128)
-        retval = gold::options::short_options[char_as_int];
+       retval = gold::options::short_options[char_as_int];
     }
 
   if (retval == NULL)
@@ -874,20 +875,20 @@ parse_short_option(int argc, const char** argv, int pos_in_argv_i,
       *arg = NULL;
       // We only advance past this argument if it's the only one in argv.
       if (this_argv[pos_in_argv_i + 1] == '\0')
-        ++(*i);
+       ++(*i);
     }
   else
     {
       // If we take an argument, we'll eat up this entire argv entry.
       ++(*i);
       if (this_argv[pos_in_argv_i + 1] != '\0')
-        *arg = this_argv + pos_in_argv_i + 1;
+       *arg = this_argv + pos_in_argv_i + 1;
       else if (retval->takes_optional_argument())
        *arg = retval->default_value;
       else if (*i < argc)
-        *arg = argv[(*i)++];
+       *arg = argv[(*i)++];
       else
-        usage(_("missing argument"), this_argv);
+       usage(_("missing argument"), this_argv);
     }
 
   // If we're a -z option, we need to parse our argument as a
@@ -898,7 +899,7 @@ parse_short_option(int argc, const char** argv, int pos_in_argv_i,
       const char* dash_z_arg = *arg;
       retval = parse_long_option(1, arg, true, arg, &dummy_i);
       if (retval == NULL)
-        usage(_("unknown -z option"), dash_z_arg);
+       usage(_("unknown -z option"), dash_z_arg);
     }
 
   return retval;
@@ -952,7 +953,7 @@ General_options::add_sysroot()
     {
       this->set_sysroot(get_default_sysroot());
       if (this->sysroot() == NULL || this->sysroot()[0] == '\0')
-        return;
+       return;
     }
 
   char* canonical_sysroot = lrealpath(this->sysroot());
@@ -1117,8 +1118,8 @@ General_options::finalize()
   if (this->thread_count() > 0 || this->thread_count_initial() > 0
       || this->thread_count_middle() > 0 || this->thread_count_final() > 0)
     gold_warning(_("ignoring --thread-count: "
-                   "%s was compiled without thread support"),
-                 program_name);
+                  "%s was compiled without thread support"),
+                program_name);
 #endif
 
   std::string libpath;
@@ -1170,17 +1171,17 @@ General_options::finalize()
       std::ifstream in;
       in.open(this->retain_symbols_file());
       if (!in)
-        gold_fatal(_("unable to open -retain-symbols-file file %s: %s"),
-                   this->retain_symbols_file(), strerror(errno));
+       gold_fatal(_("unable to open -retain-symbols-file file %s: %s"),
+                  this->retain_symbols_file(), strerror(errno));
       std::string line;
       std::getline(in, line);   // this chops off the trailing \n, if any
       while (in)
-        {
-          if (!line.empty() && line[line.length() - 1] == '\r')   // Windows
-            line.resize(line.length() - 1);
-          this->symbols_to_retain_.insert(line);
-          std::getline(in, line);
-        }
+       {
+         if (!line.empty() && line[line.length() - 1] == '\r')   // Windows
+           line.resize(line.length() - 1);
+         this->symbols_to_retain_.insert(line);
+         std::getline(in, line);
+       }
     }
 
   // -Bgroup implies --unresolved-symbols=report-all.
@@ -1239,7 +1240,7 @@ General_options::finalize()
 
   if (this->implicit_incremental_ && this->incremental_mode_ == INCREMENTAL_OFF)
     gold_fatal(_("Options --incremental-changed, --incremental-unchanged, "
-                 "--incremental-unknown require the use of --incremental"));
+                "--incremental-unknown require the use of --incremental"));
 
   // Check for options that are not compatible with incremental linking.
   // Where an option can be disabled without seriously changing the semantics
@@ -1272,6 +1273,10 @@ General_options::finalize()
        }
     }
 
+  // --rosegment-gap implies --rosegment.
+  if (this->user_set_rosegment_gap())
+    this->set_rosegment(true);
+
   // FIXME: we can/should be doing a lot more sanity checking here.
 }
 
@@ -1282,14 +1287,14 @@ General_options::finalize()
 
 void
 Search_directory::add_sysroot(const char* sysroot,
-                              const char* canonical_sysroot)
+                             const char* canonical_sysroot)
 {
   gold_assert(*sysroot != '\0');
   if (this->put_in_sysroot_)
     {
       if (!IS_DIR_SEPARATOR(this->name_[0])
-          && !IS_DIR_SEPARATOR(sysroot[strlen(sysroot) - 1]))
-        this->name_ = '/' + this->name_;
+         && !IS_DIR_SEPARATOR(sysroot[strlen(sysroot) - 1]))
+       this->name_ = '/' + this->name_;
       this->name_ = sysroot + this->name_;
       this->is_in_sysroot_ = true;
     }
@@ -1302,12 +1307,12 @@ Search_directory::add_sysroot(const char* sysroot,
       int canonical_name_len = strlen(canonical_name);
       int canonical_sysroot_len = strlen(canonical_sysroot);
       if (canonical_name_len > canonical_sysroot_len
-          && IS_DIR_SEPARATOR(canonical_name[canonical_sysroot_len]))
-        {
-          canonical_name[canonical_sysroot_len] = '\0';
-          if (FILENAME_CMP(canonical_name, canonical_sysroot) == 0)
-            this->is_in_sysroot_ = true;
-        }
+         && IS_DIR_SEPARATOR(canonical_name[canonical_sysroot_len]))
+       {
+         canonical_name[canonical_sysroot_len] = '\0';
+         if (FILENAME_CMP(canonical_name, canonical_sysroot) == 0)
+           this->is_in_sysroot_ = true;
+       }
       free(canonical_name);
     }
 }
@@ -1406,7 +1411,7 @@ Command_line::Pre_options::Pre_options()
 
 int
 Command_line::process_one_option(int argc, const char** argv, int i,
-                                 bool* no_more_options)
+                                bool* no_more_options)
 {
   gold_assert(argv[i][0] == '-' && !(*no_more_options));
 
@@ -1437,7 +1442,7 @@ Command_line::process_one_option(int argc, const char** argv, int i,
     {
       option = parse_short_option(argc, argv, pos_in_argv_i, &arg, &new_i);
       if (!option)
-        break;
+       break;
       option->reader->parse_to_value(argv[i], arg, this, &this->options_);
       ++pos_in_argv_i;
     }
@@ -1459,15 +1464,15 @@ Command_line::process(int argc, const char** argv)
     {
       this->position_options_.copy_from_options(this->options());
       if (no_more_options || argv[i][0] != '-')
-        {
+       {
          Input_file_argument file(argv[i],
                                   Input_file_argument::INPUT_FILE_TYPE_FILE,
                                   "", false, this->position_options_);
-          this->inputs_.add_file(file);
-          ++i;
-        }
+         this->inputs_.add_file(file);
+         ++i;
+       }
       else
-        i = process_one_option(argc, argv, i, &no_more_options);
+       i = process_one_option(argc, argv, i, &no_more_options);
     }
 
   if (this->inputs_.in_group())
index c00e69ad32d0ace84b955557bc84743f47211c14..005582690c9ec64e323e419e7cc847f048d28d56 100644 (file)
@@ -927,6 +927,10 @@ class General_options
              N_("Put read-only non-executable sections in their own segment"),
              NULL);
 
+  DEFINE_uint64(rosegment_gap, options::TWO_DASHES, '\0', -1U,
+               N_("Set offset between executable and read-only segments"),
+               N_("OFFSET"));
+
   DEFINE_string(m, options::EXACTLY_ONE_DASH, 'm', "",
                N_("Set GNU linker emulation; obsolete"), N_("EMULATION"));