私は、フォーマットされていないビッグ エンディアン バイナリ ファイルから多種多様なデータを読み取るかなりモノリシックなコードを持っています。通常、コードは、環境変数 GFORTRAN_CONVERT_UNIT='native;big_endian:60-70,80-89' を設定する bash スクリプト内から実行され、それらのユニット番号の 1 つを使用してビッグ エンディアン データ ファイルを開きます。これは、Fedora と RHEL で正常に機能します。ただし、Debian (および Ubuntu と Linux Mint を含む派生物)、OpenSUSE、および Arch Linux でプログラムを実行すると、Fortran コードが実行される直前に次の malloc エラーが発生します。
malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted
この問題をさらに実証するために、2 つの Fortran プログラムを作成しました。
プログラムを書く:
shane@linux-0r5g:~/temp> cat test_write.f90
program test_write
implicit none
integer, parameter :: NUM = 10
integer :: i
open (unit=88,form='unformatted',convert='big_endian')
do i = 1,NUM
write (88) i
end do
close (88)
end program test_write
プログラムを読む:
shane@linux-0r5g:~/temp> cat test_read.f90
program test_read
implicit none
integer, parameter :: NUM = 10
integer :: readInt
integer :: i
open (unit=88,form='unformatted')
do i = 1,NUM
read (88) readInt
write (*,*) readInt
end do
close (88)
end program test_read
プログラムの実行 (これは OpenSUSE 12.2 32 ビットで GCC 4.7.1 を使用していますが、Ubuntu 32 ビットでも失敗します):
shane@linux-0r5g:~/temp> ./test_write
shane@linux-0r5g:~/temp> ./test_read
16777216
At line 10 of file test_read.f90 (unit = 88, file = 'fort.88')
Fortran runtime error: End of file
shane@linux-0r5g:~/temp> GFORTRAN_CONVERT_UNIT='native;big_endian:88' ./test_read
test_read: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted
shane@linux-0r5g:~/temp>
明らかに、リトル エンディアンの読み込みでビッグ エンディアン ファイルを読み込もうとしているため、最初の試行は失敗しますが、2 回目の試行は機能するはずです。実際、多くのシステムで動作します。ユニット番号を選択する代わりに GFORTRAN_CONVERT_UNIT='big_endian' を設定することも、すべてのシステムで機能します。
モノリシックコードは64ビットサーバー上にあり、環境変数は関係なく機能するはずなので、32ビットと64ビットの問題ではないと思います...私は今これらを32ビットで実行しています。私はラップトップに持っています。
何か案は?