Re: How to write files > 4GB with pwrite in Mono C# in 32-bit OS?

Jonathan Pryor <[email protected]>
Newsgroups gmane.comp.gnome.mono.devel
Message-ID <[email protected]>
On Mar 18, 2017, at 5:47 PM, pedrom71 <[email protected]> wrote:
> I'm trying to write a new file with size > 64 gb using mono c# and Mono.Posix
> library, with the Syscall.pwrite() function. But in a 32-bit OS, I get error
> EOVERFLOW when the offset reach 4GB.

Because libMonoPosixHelper.so believes you can’t do that:

	https://github.com/mono/mono/blob/9b824c3/support/unistd.c#L60-L67

Specifically, it asserts that your `offset` value can fit within a `off_t`. On 32-bit platforms, `off_t` is usually a 32-bit value, so your 64-bit value cannot fit, so it returns EOVERFLOW.

Though I also see:

	https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html

> Macro: _FILE_OFFSET_BITS
> …
> If the macro is defined to the value 64, the large file interface replaces the old interface. I.e., the functions are not made available under different names (as they are with _LARGEFILE64_SOURCE).

This doesn’t mention what happens with `off_t`, but I also see:

	http://users.suse.com/~aj/linux_lfs.html
> Compile your programs with "gcc -D_FILE_OFFSET_BITS=64". This forces all file access calls to use the 64 bit variants. Several types change also, e.g. off_t becomes off64_t.

This strongly implies that your libMonoPosixHelper.so isn’t being compiled with `-D_FILE_OFFSET_BITS=64`. You should investigate the compilation flags that are used when building within the mono/support directory.

 - Jon

_______________________________________________
Mono-devel-list mailing list
[email protected]
http://lists.dot.net/mailman/listinfo/mono-devel-list
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.