[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1063140: mpg123: NMU diff for 64-bit time_t transition



Hi Sebastian,


Am Sat, 23 Mar 2024 10:40:43 +0100
schrieb Sebastian Ramacher <sramacher@debian.org>: 

> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_decode_frame_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_feedseek_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_framebyframe_decode_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_framelength_32@Base 1.23.8
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_framepos_32@Base 1.14.0
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_index_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_length_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_open_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_open_fd_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_open_fixed_32@Base 1.26.0
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_open_handle_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_position_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_replace_reader_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_replace_reader_handle_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_seek_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_seek_frame_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_set_filesize_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_set_index_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_tell_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_tell_stream_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_tellframe_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)mpg123_timeframe_32@Base 1.13.7
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)syn123_resample_intotal_32@Base 1.26.2
> +#MISSING: 1.32.5-1+b1# (arch-bits=32|arch=!x32)syn123_resample_total_32@Base 1.26.2
> Do you know what's happenig here?

This looks just like the list of wrapper functions offered for
applications that do not enable LFS (_FILE_OFFSET_BITS unset or 32).

Steve mentioned this:

> (you can't enable 64-bit time_t compatibility to use the other
> libraries it calls, without also turning on LFS).

So I take it you build mpg123 with enforced LFS so that the build does
not detect ambiguity in off_t and hence doesn't offer 32 bit wrappers.

I recently took pains to make the actual library code independent of
LFS choice, using explicit 64 bit API. But If you build with
-D_FILE_OFFSET_BITS=64 enforced, mpg123's configure will _not_ set

  lfs_sensitive=yes
  AC_DEFINE(LFS_SENSITIVE, 1, [ System redefines off_t when defining _FILE_OFFSET_BITS to 64. ])

as defining the offset bits to 64 doesn't change the size of off_t, so
it looks like a pure 64 bit offset system. But this doesn't control the
symbols, only usage of libmpg123 API by the mpg123 application.

That happens in src/libmpg123/lfs_wrap.c:

off_t attribute_align_arg mpg123_tell(mpg123_handle *mh)
{
        int64_t pos = mpg123_tell64(mh);
        OFF_RETURN(pos, mh)
}

#if SIZEOF_OFF_T == 4

int attribute_align_arg mpg123_open_32(mpg123_handle *mh, const char *path)
{
        return mpg123_open(mh, path);
}

#endif

#if defined(LFS_LARGEFILE_64) || (SIZEOF_OFF_T == 8)

#ifdef LFS_LARGEFILE_64
#define OFF64 off64_t
#else
#define OFF64 off_t
#endif

OFF64 attribute_align_arg mpg123_tell_64(mpg123_handle *mh)
{
        return mpg123_tell64(mh);
}

#endif

So, there is the new portable mpg123_tell64 which works with int64_t,
always. There is a 'native' off_t wrapper over this with no suffix. If 
the 'native' off_t is 32 bits, an _32 alias to that is added. If
the 'native' off_t is 64 bits, or if off64_t is available, a _64 alias
is created with _64 suffix.

The changed Debian build seems to trigger the case of 'native 64 bit
off_t'. Is that really an issue if you rebuild all software with that
setting? It should only ever use the _64 symbols. Should we explicitly
add 32 bit wrappers that nobody needs?

What compatibility considerations do you have for that transition? Is
it expected to possibly break user-compiled software that now sees a
changed ABI that that is why all time_t-affected libs get an soname
change?

Do I need to add a

	./configure --enable-off_t-is-really-32-bits-please-add-wrappers

?

I could forcibly undef _FILE_OFFSET_BITS in the build to get at the
truth, but since you set that (I presume), my build script should
honour that you do not want to deal with 32 bit off_t. So … does Debian
_want_ 32 bit off_t ABI at all in the 64 bit time_t world?

Or can we just disable that for libmpg123 as time_t is an internal
detail?

Glancing at

	https://www.gnu.org/software/libc/manual/html_node/64_002dbit-time-symbol-handling.html

suggests to me that we're repeating the same mess that already plagued
the world with the botched LFS handling. Shape-shifting off_t … now
shape-shifting time_t, too. Why do we have to do dual-time
configurations?

So maybe I'll have to revise large file API/ABI crap for the dozenth
time. It's never over, appparently. Should I go full $TRIGGERWORD and
always add the _32 symbols using int32_t, regardless of native off_t
size (adding senseless bloat on 64 bit systems)?

So … now … I _do_ use time_t internally. Once in libout123, for a timeout
while reading data (where 32 bits probably are adequate enough), but
also in libout123 for clock_gettime(), which also is intended for short
sleeps, but does work by subtracting full system time values, so
possibly affected post-2038.

So, maybe I'll have to change the native off_t size check to also
forcibly undefine _FILE_OFFSET_BITS. Then, since I apparently need (?)
both _FILE_OFFSET_BITS and _TIME_BITS for working 64 bit time_t on 32
bit platforms, I need to rephrase the LFS wrapper code not to touch
off_t at all, but use int32_t instead?

This would mean adding the _32 wrappers for anyone specifying
_FILE_OFFSET_BITS=64 at mpg123 build time, which does strike me as
suboptimal. My assumption so far is that, if the user does specify this
during build, it should be taken as a platform property. It should be
always on. Right now, this also results in the non-suffixed plain

	off_t mpg123_tell()

returning a 64 bit value. Without that setting, this would be the 32
bit variant and aliased by mpg123_tell_32(). When I ignore
_FILE_OFFSET_BITS at build-time for that now, I break ABI with earlier
builds where people intended to just get the 64 bit functions.

Regardless of how often I revise LFS stuff, I always end up in a mess.



Alrighty then,

Thomas

PS: Will Debian support 32 bit platforms in 2038 and beyond, apart from
embedded platforms that could just settle on _one_ time_t size?


Reply to: