[FFmpeg-trac] #6527(build system:new): NASM 2.11.06 doesn't load config.asm
FFmpeg
trac at avcodec.org
Sat Jul 15 02:37:31 EEST 2017
#6527: NASM 2.11.06 doesn't load config.asm
-------------------------------------+-------------------------------------
Reporter: forbyta | Type: defect
Status: new | Priority: normal
Component: build | Version: git-
system | master
Keywords: nasm | Blocked By:
configuration | Reproduced by developer: 0
Blocking: |
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
NASM version 2.11.06 doesn't seem to work correctly and configure should
check to see if NASM is newer then 2.11.06 before allowing it to be used.
Background:
On July 12, 2017, I tried to build from git master on a system that had no
problems building from master a few months earlier (March 29, 2017).
The problems stem from changes to "configure" (on June 21, 2017) that
prefers nasm over yasm
[http://git.ffmpeg.org/gitweb/ffmpeg.git/commit/4f9297ac3b39098547863d28fbc8d2a906d5be49].
My system has both, but nasm is old... and apparently too old.
After downloading the latest git master (at the time, July 12, 2017),
"make" displayed the following errors:
{{{
$ git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg-20170712
...
$ cd ffmpeg-20170712
$ configure
...
$ make
...
X86ASM libavfilter/x86/af_afir.o
libavutil/x86/x86inc.asm:45: error: symbol `HAVE_ALIGNED_STACK' not
defined before use
libavutil/x86/x86inc.asm:58: error: symbol `ARCH_X86_64' not defined
before use
libavutil/x86/x86inc.asm:193: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:194: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:195: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:196: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:197: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:198: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:199: error: (DECLARE_REG_SIZE:11) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:225: error: symbol `ARCH_X86_64' not defined
before use
libavutil/x86/x86inc.asm:938: error: (INIT_XMM:5) symbol `ARCH_X86_64' not
defined before use
libavutil/x86/x86inc.asm:938: error: (INIT_CPUFLAGS:32) symbol
`ARCH_X86_64' not defined before use
libavutil/x86/x86inc.asm:938: error: (CPUNOP:1) symbol `HAVE_CPUNOP' not
defined before use
libavutil/x86/x86inc.asm:938: error: unknown 'cpu' type
libavfilter/x86/af_afir.asm:30: error: (INIT_XMM:5) symbol `ARCH_X86_64'
not defined before use
libavfilter/x86/af_afir.asm:30: error: (INIT_CPUFLAGS:32) symbol
`ARCH_X86_64' not defined before use
libavfilter/x86/af_afir.asm:30: error: (CPUNOP:1) symbol `HAVE_CPUNOP' not
defined before use
libavfilter/x86/af_afir.asm:30: error: unknown 'cpu' type
libavfilter/x86/af_afir.asm:31: error: (INIT_XMM:5) symbol `ARCH_X86_64'
not defined before use
libavfilter/x86/af_afir.asm:31: error: (INIT_CPUFLAGS:32) symbol
`ARCH_X86_64' not defined before use
libavfilter/x86/af_afir.asm:31: error: (CPUNOP:1) symbol `HAVE_CPUNOP' not
defined before use
libavfilter/x86/af_afir.asm:31: error: unknown 'cpu' type
make: *** [libavfilter/x86/af_afir.o] Error 1
}}}
I eventually, figured out what command was actually used by running "make
-n" and grepping for 'X86ASM.*af_afir':
{{{
printf "X86ASM\t%s\n" libavfilter/x86/af_afir.o; nasm -f elf32 -g -F dwarf
-I./ -I.// -Ilibavfilter/x86/ -Pconfig.asm -MD libavfilter/x86/af_afir.d
-o libavfilter/x86/af_afir.o libavfilter/x86/af_afir.asm
}}}
When the "nasm ..." line above is run by itself, it generates the same
errors. It appears the -Pconfig.asm option is ignored with NASM version
2.11.06. The symbols it's looking for ARE defined in config.asm:
{{{
$ egrep 'HAVE_ALIGNED_STACK|ARCH_X86_64' config.asm
%define ARCH_X86_64 0
%define HAVE_ALIGNED_STACK 1
}}}
I also tried "nasm -DARCH_X86_64=0 ..." but that fails as well. The only
thing that did work was to add the above "%define" directly to
libavutil/x86/x86inc.asm.
If NASM version 2.11.08 is used, then the original nasm command works fine
(without modifying x86inc.asm)
I think a change to configure to check the version of nasm before allowing
it to be used would avoid this problem. Maybe, something like the
following:
{{{
--- a/configure 2017-07-14 13:18:02.493845243 -0700
+++ b/configure 2017-07-14 13:26:02.205575931 -0700
@@ -5502,9 +5502,19 @@
enabled ssse3 && check_inline_asm ssse3_inline '"pabsw %xmm0,
%xmm0"'
enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0,
%mm1"'
+ check_nasm(){
+ log "$1 -v"
+ nasmverstr=$($1 -v 2>&1 | tee -a $logfile)
+ nasmver=$(expr "$nasmverstr" : 'NASM version \([0-9.][0-9.]*\).*')
+ [ -z "$nasmver" ] && return 1
+ n_nasmver=$(echo "$nasmver" | sed 's/[^0-9]//g')
+ [ "$n_nasmver" -lt '21108' ] && die "NASM version [$nasmver] is too
old. Upgrade NASM or try configure --x86asmexe=yasm"
+ return 0
+ }
+
probe_x86asm(){
x86asmexe_probe=$1
- if check_cmd $x86asmexe_probe -v; then
+ if check_nasm $x86asmexe_probe; then
x86asmexe=$x86asmexe_probe
x86asm_type=nasm
x86asm_debug="-g -F dwarf"
}}}
On a slightly related note, while investigating this issue, I had to go
through several changes before finding the one that caused the problems.
The log message in this change
([http://git.ffmpeg.org/gitweb/ffmpeg.git/commit/3cc73d3d6d2a98cd0da3deda90760729c82cdeeb])
is incorrect. I says "nasm --version" has worked since 2.11, but nasm
didn't support the "--version" option until 2.13. The change itself is
fine, it's just the log message that's misleading.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/6527>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list