[x264-devel] [bug] asm operand has impossible constraints (x86, -fstack-check)

Johannes Dewender videolan at JonnyJD.net
Tue Aug 18 19:00:15 CEST 2015


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


After checking and testing several things in my build environment
(like starting a git bisect for gcc) I found the actual problem:
- -fstack-check was recently added in my build environment wrappers.
This has nothing to do with gcc or kernel updates. Details below.

On 12/08/15 04:20, Loren Merritt wrote:
> On Mon, 10 Aug 2015, Johannes Dewender wrote:
>> yasm -I. -I. -DARCH_X86_64=0 -I./common/x86/ -f elf32 
>> -Worphan-labels -DSTACK_ALIGNMENT=32 -DPIC -DHIGH_BIT_DEPTH=0 
>> -DBIT_DEPTH=8 -o common/x86/pixel-32.o common/x86/pixel-32.asm
> 
> Btw, this isn't the command that produced the error. You're 
> probably using multithreaded make, which means that compilation 
> messages aren't necessarily displayed in order.

Yes, that was only a quick idea to also give that line.
Disabling multithreaded make and removing additional
optimization/debug CFLAGS on my system this is the problematic line:

gcc -Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -m32 -Wall -I.
- -I. -march=i686 -mfpmath=sse -msse -std=gnu99
- -mpreferred-stack-boundary=5     -fPIC -fomit-frame-pointer
- -fno-tree-vectorize  -c -o encoder/me.o encoder/me.c

However, on Arch Linux I also have
https://github.com/thestinger/hardening-wrapper
running, effectively adding more CFLAGS "hidden".
There the flag "-fstack-check" was recently added in version 10.

Effectively the failing (and minimized) line is:

gcc -Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -m32
- -fstack-check -Wall -I.
- -I. -march=i686 -mfpmath=sse -msse -std=gnu99
- -mpreferred-stack-boundary=5     -fPIC -fomit-frame-pointer
- -fno-tree-vectorize -c -o encoder/me.o encoder/me.c


>> In file included from ./common/common.h:1014:0, from 
>> encoder/me.c:28: encoder/me.c: In function 'x264_me_search_ref': 
>> ./common/x86/util.h:130:5: error: 'asm' operand has impossible 
>> constraints asm( ^ ./common/x86/util.h:193:5: error: 'asm' 
>> operand has impossible constraints asm( ^ <builtin>: recipe for 
>> target 'encoder/me.o' failed
>> 
>> The problem appears in building the Arch Linux 32 bit package 
>> "lib32-libx264": 
>> https://aur.archlinux.org/packages/lib32-libx264/
>> 
>> Built on a 64 bit machine with: ./configure --prefix=/usr 
>> --libdir=/usr/lib32 --host=i686-linux-gnu \ --enable-shared \ 
>> --enable-pic make
>> 
>> The 64 bit build runs fine on the same machine, but that isn't 
>> using files out of common/x86/, I guess.
> 
> The 64bit build does use the same code, it's just that it has more 
> registers available, so the same constraint is easier to solve.
>> 
>> I can't tell if that is a bug in the build tools or in x264 and I
>> don't have pratical experience in assembler.
> 
> It's a gcc bug. More precisely: Allocating registers to inline-asm 
> blocks is an NP Hard optimization problem. N is sufficiently small 
> that "NP Hard" doesn't imply "intractable", but it still requires
> a certain amount of intelligence on the compiler's part. That's
> true of ordinary C code too. The difference is that in C code, a 
> suboptimal compilation is just a bit slower than it could have 
> been, whereas in inline-asm it can result in the compiler 
> incorrectly throwing an "impossible constraints" error.
> 
> I have verified that the constraints are not in fact impossible. 
> But if you want to make it easier on the compiler, you could 
> disable pic.

Removing "--enable-pic" helps in general.

However, the full list of flags added by hardening-wrapper is:
- -fPIE -D_FORTIFY_SOURCE=2 -pie -fstack-check -fstack-protector-strong

- -fPIE is added when -fPIC is not.
To keep hardening-wrapper from adding -fPIE I added -fno-PIC in the
Arch Linux packaging CFLAGS now.

Thanks for the help.

- -- 
JonnyJD
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iEYEARECAAYFAlXTZJYACgkQaDBIOMxoZgeT2ACgp2N0vMerS7MzwZOm1FfbCgqz
WQgAn3IZnlhp3QLUxRWA/UNFbwQz6sHR
=1Df1
-----END PGP SIGNATURE-----


More information about the x264-devel mailing list