Bug#888566: vim FTBFS on alpha: vim segfaults in the build
James McCoy
jamessan at debian.org
Mon Jan 29 02:05:15 UTC 2018
Control: reassign -1 src:glibc 2.24-2
Control: affects -1 src:vim
On Sat, Jan 27, 2018 at 02:37:21PM -0500, James McCoy wrote:
> On Sat, Jan 27, 2018 at 05:50:16PM +1300, Michael Cree wrote:
> > [snip useful details]
> >
> > Four of those bytes difference are due to the field b_ino in the
> > struct (of type ino_t). And indeed examining the build log [1]
> > one sees option.c is compiled with -DFILE_OFFSET_BITS=64 but
> > misc1.c is NOT compiled with that option, hence the difference
> > in offsets to fields in the buf_T struct.
>
> It looks like you came to the same conclusion as we did in #827319. Vim
> uses autoconf's AC_SYS_LARGEFILE to determine whether _FILE_OFFSET_BITS
> needs to be set (and decides it doesn't), however the Perl bindings
> always force _FILE_OFFSET_BITS=64[0].
Note that Vim handles this via config.h, so it's not actually evident
from the compile commands whether an individual module is being built
with -D_FILE_OFFSET_BITS=64. Having looked through Vim's source, I can
confirm that Vim does properly ensure config.h is loaded before any
system headers, though.
After some discussion on IRC, bunk pointed out this is an issue with
glibc on alpha and kfreebsd-*.
Alpha
-----
AC_SYS_LARGEFILE determines whether -D_FILE_OFFSET_BITS=64 is needed by
checking whether off_t is 64-bit on its own. For alpha, this is true
because
usr/include/alpha-linux-gnu/bits/typesizes.h
36:#define __OFF_T_TYPE __SLONGWORD_TYPE
67:#define __OFF_T_MATCHES_OFF64_T 1
On the other hand, ino_t is always defined to be 32-bits
usr/include/alpha-linux-gnu/bits/typesizes.h
32:#define __INO_T_TYPE __U32_TYPE
and struct stat's st_ino varies type based on whether
__USE_FILE_OFFSET64 is defined
usr/include/alpha-linux-gnu/bits/stat.h
69:struct stat
70- {
71- __dev_t st_dev; /* Device. */
72-#ifdef __USE_FILE_OFFSET64
73- __ino64_t st_ino; /* File serial number. */
74-#else
75- __ino_t st_ino; /* File serial number. */
76- int __pad0; /* 64-bit st_ino. */
So, st_ino is only 64-bit when __USE_FILE_OFFSET64 is set, but that won't
typically be the case because off_t is _always_ 64-bit.
kFreeBSD
--------
The situation here is pretty much the same as with alpha. off_t is
always a 64-bit type
glibc-amd64/usr/include/x86_64-kfreebsd-gnu/bits/typesizes.h
37:#define __OFF_T_TYPE __SQUAD_TYPE
85:#define __OFF_T_MATCHES_OFF64_T 1
glibc-i386/usr/include/i386-kfreebsd-gnu/bits/typesizes.h
37:#define __OFF_T_TYPE __SQUAD_TYPE
85:#define __OFF_T_MATCHES_OFF64_T 1
which means __USE_FILE_OFFSET64 is unlikely to get defined and yet
st_ino relies on that being set to use a 64-bit type
glibc-amd64/usr/include/x86_64-kfreebsd-gnu/bits/typesizes.h
33:#define __INO_T_TYPE __U32_TYPE
glibc-i386/usr/include/i386-kfreebsd-gnu/bits/typesizes.h
33:#define __INO_T_TYPE __U32_TYPE
bc-amd64/usr/include/x86_64-kfreebsd-gnu/bits/stat.h
40:struct stat
41- {
42- __dev_t st_dev; /* Device containing the file. */
43-#ifndef __USE_FILE_OFFSET64
44- __ino_t st_ino; /* File serial number. */
45-#else
46- __ino64_t st_ino; /* File serial number. */
47-#endif
glibc-i386/usr/include/i386-kfreebsd-gnu/bits/stat.h
40:struct stat
41- {
42- __dev_t st_dev; /* Device containing the file. */
43-#ifndef __USE_FILE_OFFSET64
44- __ino_t st_ino; /* File serial number. */
45-#else
46- __ino64_t st_ino; /* File serial number. */
47-#endif
Cheers,
--
James
GPG Key: 4096R/91BF BF4D 6956 BD5D F7B7 2D23 DFE6 91AE 331B A3DB
More information about the pkg-vim-maintainers
mailing list