aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog6
-rw-r--r--gold/archive.cc11
-rw-r--r--gold/readsyms.cc13
3 files changed, 16 insertions, 14 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index bd4b9d2..3c4cbda 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-23 Ian Lance Taylor <iant@google.com>
+
+ * readsyms.cc (Read_symbols::do_read_symbols): Use get_view rather
+ than read for file header.
+ * archive.cc (Archive::include_member): Likewise.
+
2008-04-23 Paolo Bonzini <bonzini@gnu.org>
* aclocal.m4: Regenerate.
diff --git a/gold/archive.cc b/gold/archive.cc
index 25708ee..be623b5 100644
--- a/gold/archive.cc
+++ b/gold/archive.cc
@@ -464,9 +464,6 @@ Archive::include_member(Symbol_table* symtab, Layout* layout,
memoff = 0;
}
- // Read enough of the file to pick up the entire ELF header.
- unsigned char ehdr_buf[elfcpp::Elf_sizes<64>::ehdr_size];
-
off_t filesize = input_file->file().filesize();
int read_size = elfcpp::Elf_sizes<64>::ehdr_size;
if (filesize - memoff < read_size)
@@ -479,14 +476,15 @@ Archive::include_member(Symbol_table* symtab, Layout* layout,
return;
}
- input_file->file().read(memoff, read_size, ehdr_buf);
+ const unsigned char* ehdr = input_file->file().get_view(memoff, 0, read_size,
+ true, false);
static unsigned char elfmagic[4] =
{
elfcpp::ELFMAG0, elfcpp::ELFMAG1,
elfcpp::ELFMAG2, elfcpp::ELFMAG3
};
- if (memcmp(ehdr_buf, elfmagic, 4) != 0)
+ if (memcmp(ehdr, elfmagic, 4) != 0)
{
gold_error(_("%s: member at %zu is not an ELF object"),
this->name().c_str(), static_cast<size_t>(off));
@@ -495,8 +493,7 @@ Archive::include_member(Symbol_table* symtab, Layout* layout,
Object* obj = make_elf_object((std::string(this->input_file_->filename())
+ "(" + n + ")"),
- input_file, memoff, ehdr_buf,
- read_size);
+ input_file, memoff, ehdr, read_size);
if (input_objects->add_object(obj))
{
diff --git a/gold/readsyms.cc b/gold/readsyms.cc
index d0bf264..18b91b4 100644
--- a/gold/readsyms.cc
+++ b/gold/readsyms.cc
@@ -152,13 +152,12 @@ Read_symbols::do_read_symbols(Workqueue* workqueue)
return false;
}
- unsigned char ehdr_buf[elfcpp::Elf_sizes<64>::ehdr_size];
-
int read_size = elfcpp::Elf_sizes<64>::ehdr_size;
if (filesize < read_size)
read_size = filesize;
- input_file->file().read(0, read_size, ehdr_buf);
+ const unsigned char* ehdr = input_file->file().get_view(0, 0, read_size,
+ true, false);
if (read_size >= 4)
{
@@ -167,12 +166,12 @@ Read_symbols::do_read_symbols(Workqueue* workqueue)
elfcpp::ELFMAG0, elfcpp::ELFMAG1,
elfcpp::ELFMAG2, elfcpp::ELFMAG3
};
- if (memcmp(ehdr_buf, elfmagic, 4) == 0)
+ if (memcmp(ehdr, elfmagic, 4) == 0)
{
// This is an ELF object.
Object* obj = make_elf_object(input_file->filename(),
- input_file, 0, ehdr_buf, read_size);
+ input_file, 0, ehdr, read_size);
if (obj == NULL)
return false;
@@ -205,9 +204,9 @@ Read_symbols::do_read_symbols(Workqueue* workqueue)
if (read_size >= Archive::sarmag)
{
bool is_thin_archive
- = memcmp(ehdr_buf, Archive::armagt, Archive::sarmag) == 0;
+ = memcmp(ehdr, Archive::armagt, Archive::sarmag) == 0;
if (is_thin_archive
- || memcmp(ehdr_buf, Archive::armag, Archive::sarmag) == 0)
+ || memcmp(ehdr, Archive::armag, Archive::sarmag) == 0)
{
// This is an archive.
Archive* arch = new Archive(this->input_argument_->file().name(),