- void* p = ::mmap(NULL, psize, PROT_READ, MAP_PRIVATE,
- this->descriptor_, poff);
- if (p == MAP_FAILED)
- gold_fatal(_("%s: mmap offset %lld size %lld failed: %s"),
- this->filename().c_str(),
- static_cast<long long>(poff),
- static_cast<long long>(psize),
- strerror(errno));
-
- this->mapped_bytes_ += psize;
-
- const unsigned char* pbytes = static_cast<const unsigned char*>(p);
- v = new File_read::View(poff, psize, pbytes, 0, cache,
- View::DATA_MMAPPED);
+ p = ::mmap(NULL, psize, PROT_READ, MAP_PRIVATE, this->descriptor_, poff);
+ if (p != MAP_FAILED)
+ {
+ ownership = View::DATA_MMAPPED;
+ this->mapped_bytes_ += psize;
+ }
+ else
+ {
+ p = malloc(psize);
+ if (p == NULL)
+ gold_nomem();
+ this->do_read(poff, psize, p);
+ ownership = View::DATA_ALLOCATED_ARRAY;
+ }