On 4/14/11 11:48 AM, Markus Trippelsdorf wrote: > On 2011.04.14 at 11:31 -0500, Eric Sandeen wrote: >> On 4/14/11 11:28 AM, Markus Trippelsdorf wrote: >> >> <snip> >> >>> Yes, but we're still trying to find out what caused the zeros in the >>> binaries that coreutils installed on my system. >>> >>> Now the failure only happens when I use "gold" as my linker. With GNU ld >>> everything is OK. But I thought this must be a timing issue, because >>> gold is faster and the binaries in coreutils-8.11/src are all fine. >> >> maybe xfs_bmap (or filefrag) of the binaries with both linkers would be instructive; are they laid out significantly differently? >> >> does gold preallocate? > > Just checked and yes it does. That should explain the issue I was > seeing. Well, mystery solved there, at least! Now for the fixing part :) Thanks for checking, at least my view of the world is still intact ;) -Eric > bool > Output_file::map_no_anonymous() > { > const int o = this->o_; > > // If the output file is not a regular file, don't try to mmap it; > // instead, we'll mmap a block of memory (an anonymous buffer), and > // then later write the buffer to the file. > void* base; > struct stat statbuf; > if (o == STDOUT_FILENO || o == STDERR_FILENO > || ::fstat(o, &statbuf) != 0 > || !S_ISREG(statbuf.st_mode) > || this->is_temporary_) > return false; > > // Ensure that we have disk space available for the file. If we > // don't do this, it is possible that we will call munmap, close, > // and exit with dirty buffers still in the cache with no assigned > // disk blocks. If the disk is out of space at that point, the > // output file will wind up incomplete, but we will have already > // exited. The alternative to fallocate would be to use fdatasync, > // but that would be a more significant performance hit. > if (::posix_fallocate(o, 0, this->file_size_) < 0) > gold_fatal(_("%s: %s"), this->name_, strerror(errno)); > > // Map the file into memory. > base = ::mmap(NULL, this->file_size_, PROT_READ | PROT_WRITE, > MAP_SHARED, o, 0); > > // The mmap call might fail because of file system issues: the file > // system might not support mmap at all, or it might not support > // mmap with PROT_WRITE. > if (base == MAP_FAILED) > return false; > > this->map_is_anonymous_ = false; > this->base_ = static_cast<unsigned char*>(base); > return true; > } > > -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html