Статически построенная ошибка двоичной сегментации FFMPEG - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу создать пользовательскую сборку FFMPEG, которая уничтожает все, кроме возможности трансмутировать видео HLS в MP4, и мне нужно, чтобы эта сборка была 100% -ной c без внешних зависимостей

Я попытался использовать следующую конфигурацию:

./configure \
    --extra-cflags='-static -static-libstdc++ -static-libgcc' \
    --extra-cxxflags='-static -static-libstdc++ -static-libgcc' \
    --extra-ldflags='-static -static-libstdc++ -static-libgcc' \
    --pkg-config-flags='--static' \
    --enable-static \
    --disable-shared \
    --disable-runtime-cpudetect \
    --disable-autodetect \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --disable-avdevice \
    --disable-swresample \
    --disable-swscale \
    --disable-postproc \
    --disable-pthreads \
    --disable-w32threads \
    --disable-os2threads \
    --enable-network \
    --disable-dct \
    --disable-dwt \
    --disable-error-resilience \
    --disable-lsp \
    --disable-lzo \
    --disable-mdct \
    --disable-rdft \
    --disable-fft \
    --disable-faan \
    --disable-pixelutils \
    --disable-encoders \
    --disable-decoders \
    --disable-hwaccels \
    --disable-muxers \
    --enable-muxer=mov \
    --enable-muxer=mp4 \
    --disable-demuxers \
    --enable-demuxer=hls \
    --enable-demuxer=mpegts \
    --enable-demuxer=h264 \
    --enable-demuxer=aac \
    --disable-parsers \
    --enable-parser=h264 \
    --enable-parser=aac \
    --disable-bsfs \
    --disable-protocols \
    --enable-protocol=tcp \
    --enable-protocol=tls \
    --enable-protocol=http \
    --enable-protocol=https \
    --enable-protocol=hls \
    --disable-indevs \
    --disable-outdevs \
    --disable-devices \
    --disable-filters \
    --disable-alsa \
    --disable-appkit \
    --disable-avfoundation \
    --disable-bzlib \
    --disable-coreimage \
    --disable-iconv \
    --disable-lzma \
    --enable-openssl \
    --disable-sndio \
    --disable-sdl2 \
    --disable-securetransport \
    --disable-xlib \
    --disable-zlib \
    --disable-amf \
    --disable-audiotoolbox \
    --disable-cuda-llvm \
    --disable-cuvid \
    --disable-d3d11va \
    --disable-dxva2 \
    --disable-ffnvcodec \
    --disable-nvdec \
    --disable-nvenc \
    --disable-v4l2-m2m \
    --disable-vaapi \
    --disable-vdpau \
    --disable-videotoolbox \
    --disable-debug

Это выглядело примерно так, как я хотел:

install prefix            /usr/local
source path               .
C compiler                gcc
C library                 glibc
ARCH                      x86 (generic)
big-endian                no
runtime cpu detection     no
standalone assembly       yes
x86 assembler             nasm
MMX enabled               yes
MMXEXT enabled            yes
3DNow! enabled            yes
3DNow! extended enabled   yes
SSE enabled               yes
SSSE3 enabled             yes
AESNI enabled             yes
AVX enabled               yes
AVX2 enabled              yes
AVX-512 enabled           yes
XOP enabled               yes
FMA3 enabled              yes
FMA4 enabled              yes
i686 features enabled     yes
CMOV is fast              yes
EBX available             yes
EBP available             yes
debug symbols             no
strip symbols             yes
optimize for size         no
optimizations             yes
static                    yes
shared                    no
postprocessing support    no
network support           yes
threading support         no
safe bitstream reader     yes
texi2html enabled         no
perl enabled              yes
pod2man enabled           yes
makeinfo enabled          no
makeinfo supports HTML    no

External libraries:
openssl

External libraries providing hardware acceleration:

Libraries:
avcodec                 avfilter                avformat                avutil

Programs:
ffmpeg

Enabled decoders:

Enabled encoders:

Enabled hwaccels:

Enabled parsers:
aac                     h264

Enabled demuxers:
aac                     h264                    hls                     mpegts

Enabled muxers:
mov                     mp4

Enabled protocols:
hls                     http                    https                   tcp                     tls

Enabled filters:
aformat                 anull                   atrim                   format                  hflip                   null                    transpose               trim                    vflip

Enabled bsfs:
null

Enabled indevs:

Enabled outdevs:

License: LGPL version 2.1 or later

В него входило несколько фильтров, которые мне никогда не понадобятся или не будут использоваться, но эти фильтры загружаются автоматически, если вы не указали --disable-avfilter, а указание --disable-avfilter предотвращает создание двоичного файла ffmpeg. Так что я застрял с ними.

Используя эти параметры и затем запустив make, я получил двоичный файл размером около 5,9 МБ и выглядел вправо :

$> ldd ffmpeg
        not a dynamic executable

Но когда я пытаюсь запустить его:

$> ./ffmpeg -version
Segmentation fault

Использование valgrind для проверки причины ошибки сегментации:

$> valgrind ./ffmpeg -version
.... lots of stuff ...
==61362== Jump to the invalid address stated on the next line
==61362==    at 0x0: ???
==61362==    by 0x70BB1B: ??? (in /src/FFmpeg/ffmpeg)
==61362==    by 0x70B2E6: ??? (in /src/FFmpeg/ffmpeg)
==61362==    by 0x4033F9: ??? (in /src/FFmpeg/ffmpeg)
==61362==    by 0x1FFF000677: ???
==61362==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==61362==
==61362==
==61362== Process terminating with default action of signal 11 (SIGSEGV)
==61362==  Bad permissions for mapped region at address 0x0
==61362==    at 0x0: ???
==61362==    by 0x70BB1B: ??? (in /src/FFmpeg/ffmpeg)
==61362==    by 0x70B2E6: ??? (in /src/FFmpeg/ffmpeg)
==61362==    by 0x4033F9: ??? (in /src/FFmpeg/ffmpeg)
==61362==    by 0x1FFF000677: ???
==61362==
==61362== HEAP SUMMARY:
==61362==     in use at exit: 0 bytes in 0 blocks
==61362==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==61362==
==61362== All heap blocks were freed -- no leaks are possible
==61362==
==61362== For counts of detected and suppressed errors, rerun with: -v
==61362== Use --track-origins=yes to see where uninitialised values come from
==61362== ERROR SUMMARY: 93 errors from 90 contexts (suppressed: 0 from 0)
Segmentation fault

Попытка доступ к памяти в местоположении 0x0 звучит как , пытающийся следовать нулевому указателю. Но я не уверен, как это исправить.

обратная трассировка gdb

Когда я впервые запустил gdb ./ffmpeg, gdb немедленно дал мне ошибку сегментации, и меня не пнули в REPL GDB, поэтому я не смог исследовать

После перестройки ffmpeg я смог получить в это время:

$> gdb ./ffmpeg

GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ffmpeg...done.
(gdb) r
Starting program: /src/FFmpeg/ffmpeg
warning: Error disabling address space randomization: Operation not permitted

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x0000000000f9a8d5 in __register_frame_info_bases.part.6 ()
#2  0x00000000004445fd in frame_dummy ()
#3  0x0000000000000001 in ?? ()
#4  0x0000000000ebd20c in __libc_csu_init ()
#5  0x0000000000ebc9d7 in __libc_start_main ()
#6  0x000000000044451a in _start ()
(gdb)

Я попытался выполнить grep'ing базы кода для __register_frame_info_bases и ничего не нашел. Так что я не совсем уверен, куда go отсюда

Исправление, но не объяснение

Случайным образом удалив параметры конфигурации и восстановив, я обнаружил, что --disable-pthreads вызывает сегментацию неисправность. Когда я удаляю это, ffmpeg работает нормально

Я не знаю почему это так, хотя. Почему они позволяют удалить то, что вам нужно для запуска?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...