[Interest] tst_qatomicinteger build failure (5.9 i386/x86_64)

Christian Gagneraud chgans at gmail.com
Fri Sep 1 10:10:09 CEST 2017

On 1 September 2017 at 19:21, Christian Gagneraud <chgans at gmail.com> wrote:
> On 1 September 2017 at 18:37, Christian Gagneraud <chgans at gmail.com> wrote:
>> Hi there,
>> Back on my 32 bits build of Qt
>> I'm having a build failure on tst_qatomicinteger for qlonglong.
>> Static failure: Q_STATIC_ASSERT(Q_ALIGNOF(QAtomicInteger<T>) ==
>> Q_ALIGNOF(TypeInStruct));
>> Sounds very much like a 32/64 bits issue.
> Actually i have more test build failure:
> 2 about qlonglong and qulonglong, and a bunch of other that look like
> this (simple) one:
> g++ -m32 -Wl,-O1 -fuse-ld=gold -Wl,--enable-new-dtags
> -Wl,-rpath,/home/krys/Projects/qt5/qtbase/lib -o tst_qline
> .obj/tst_qline.o   -lm -L/home/krys/Projects/qt5/qtbase/lib -lQt5Test
> -lQt5Core -lpthread
> .obj/tst_qline.o(.qtversion+0x0): error: unexpected reloc 3 against
> global symbol qt_version_tag without base register in object file when
> generating a position-independent output file
> collect2: error: ld returned 1 exit status
> Should I disabled the gold linker? I've heard of problems with it
> while cross building Qt...

OK, so disabling the gold linker fixed the weird symbols issues.

So I'm down to only 2 build failure, static asserts about alignment of
QAtomicInteger using qlonglong and qulonglong

Looking at tst_qatomicinteger.cpp

I'm passing the first static assert:
    Q_STATIC_ASSERT(sizeof(QAtomicInteger<T>) == sizeof(T));

But fail the second one:
    Q_STATIC_ASSERT(Q_ALIGNOF(QAtomicInteger<T>) == Q_ALIGNOF(TypeInStruct));

TypeInStruct is, as the name suggest, as simple as a variable of the
tested type inside a struct:
struct TypeInStruct { TEST_TYPE type; };

So QAtomicInteger<qlonglong> has the same size as qlonglong, but not
the same alignment!?!

Looking at qglobal.h, i've found this interesting piece of code:
    // x86 ABI weirdness
    // Alignment of naked type is 8, but inside struct has alignment 4.
    template <> struct AlignOf<double>  :
AlignOf_WorkaroundForI386Abi<double> {};
    template <> struct AlignOf<qint64>  :
AlignOf_WorkaroundForI386Abi<qint64> {};
    template <> struct AlignOf<quint64> :
AlignOf_WorkaroundForI386Abi<quint64> {};

And my Qt configure says:
Checking for target architecture... i386s
Checking for 64 bit atomics... yes

So does that mean that QAtomicInteger is broken or cannot be used on linux-32 ?
Which by the way is not supported anymore since Qt-5.6...

Any insight, comment or suggestion on how to get that fixed are very welcome! ;)


More information about the Interest mailing list