summaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorDoug Kwan <dougkwan@google.com>2010-02-24 20:50:59 +0000
committerDoug Kwan <dougkwan@google.com>2010-02-24 20:50:59 +0000
commit101654612f383f5427e2d727556eda80537de76b (patch)
treeb57e25c9d904f79e0cd79d05af1fdc32f1be34b9 /gold
parent24291992dac3f63bef7ee031d4d5f2f96920e070 (diff)
2010-02-24 Doug Kwan <dougkwan@google.com>
* arm.cc (Target_arm::do_finalize_sections): Skip processor specific flags and attributes merging if an input file is a binary file. * fileread.cc (Input_file::open): Record format of original file. * fileread.h (Input_file::Format): New enum type. (Input_file::Input_file): Initialize data member format_. (Input_file::format): New method definition. (Input_file::format_):: New data member.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/arm.cc9
-rw-r--r--gold/fileread.cc7
-rw-r--r--gold/fileread.h16
4 files changed, 40 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index a7bf29943a..92f8344835 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,15 @@
2010-02-24 Doug Kwan <dougkwan@google.com>
+ * arm.cc (Target_arm::do_finalize_sections): Skip processor specific
+ flags and attributes merging if an input file is a binary file.
+ * fileread.cc (Input_file::open): Record format of original file.
+ * fileread.h (Input_file::Format): New enum type.
+ (Input_file::Input_file): Initialize data member format_.
+ (Input_file::format): New method definition.
+ (Input_file::format_):: New data member.
+
+2010-02-24 Doug Kwan <dougkwan@google.com>
+
* arm.cc (Arm_output_data_got): New class.
(ARM_TCB_SIZE): New constant
(Target_arm): Use Arm_output_data_got instead of Output_data_got.
diff --git a/gold/arm.cc b/gold/arm.cc
index ca34023f43..497072a870 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -7922,6 +7922,15 @@ Target_arm<big_endian>::do_finalize_sections(
p != input_objects->relobj_end();
++p)
{
+ // If this input file is a binary file, it has no processor
+ // specific flags and attributes section.
+ Input_file::Format format = (*p)->input_file()->format();
+ if (format != Input_file::FORMAT_ELF)
+ {
+ gold_assert(format == Input_file::FORMAT_BINARY);
+ continue;
+ }
+
Arm_relobj<big_endian>* arm_relobj =
Arm_relobj<big_endian>::as_arm_relobj(*p);
this->merge_processor_specific_flags(
diff --git a/gold/fileread.cc b/gold/fileread.cc
index 4e8157f795..9f190990a6 100644
--- a/gold/fileread.cc
+++ b/gold/fileread.cc
@@ -938,17 +938,22 @@ Input_file::open(const Dirsearch& dirpath, const Task* task, int *pindex)
this->input_argument_->options().format_enum();
bool ok;
if (format == General_options::OBJECT_FORMAT_ELF)
- ok = this->file_.open(task, name);
+ {
+ ok = this->file_.open(task, name);
+ this->format_ = FORMAT_ELF;
+ }
else
{
gold_assert(format == General_options::OBJECT_FORMAT_BINARY);
ok = this->open_binary(task, name);
+ this->format_ = FORMAT_BINARY;
}
if (!ok)
{
gold_error(_("cannot open %s: %s"),
name.c_str(), strerror(errno));
+ this->format_ = FORMAT_NONE;
return false;
}
diff --git a/gold/fileread.h b/gold/fileread.h
index 5aac7ad627..9933460d5a 100644
--- a/gold/fileread.h
+++ b/gold/fileread.h
@@ -464,9 +464,16 @@ class File_view
class Input_file
{
public:
+ enum Format
+ {
+ FORMAT_NONE,
+ FORMAT_ELF,
+ FORMAT_BINARY
+ };
+
Input_file(const Input_file_argument* input_argument)
: input_argument_(input_argument), found_name_(), file_(),
- is_in_sysroot_(false)
+ is_in_sysroot_(false), format_(FORMAT_NONE)
{ }
// Create an input file with the contents already provided. This is
@@ -536,6 +543,11 @@ class Input_file
bool
just_symbols() const;
+ // Return the format of the unconverted input file.
+ Format
+ format() const
+ { return this->format_; }
+
private:
Input_file(const Input_file&);
Input_file& operator=(const Input_file&);
@@ -555,6 +567,8 @@ class Input_file
File_read file_;
// Whether we found the file in a directory in the system root.
bool is_in_sysroot_;
+ // Format of unconverted input file.
+ Format format_;
};
} // end namespace gold