Как мне скомпилировать FFMPEG & Libaom без PIE

1311
Georgе Stoyanov

Я пытаюсь скомпилировать FFMPEG и Libaom из исходного кода, очевидно, потому что компиляторы gcc и g ++ в Ubuntu 18.04 по умолчанию включили следующую опцию по умолчанию: --enable-default-pie

$ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-16ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --with-as=/usr/bin/x86_64-linux-gnu-as --with-ld=/usr/bin/x86_64-linux-gnu-ld --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3) 

Я пытался пройти, --extra-ldexeflags="-no-pie -fno-pic -fno-pie"но это не помогло. У меня такая же проблема при попытке скомпилировать libaom. Я пытался установить более старую версию gcc, но даже в 5.X эта --enable-default-pieопция включена по умолчанию, так что это не очень хорошо. По-видимому, эта опция была включена в Ubuntu 18.04, и нет никакого способа обойти это.

Это моя ошибка при попытке установить libaom:

64%] Linking CXX executable examples/decode_with_drops /usr/bin/x86_64-linux-gnu-ld: libaom.a(fwd_txfm_ssse3_x86_64.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC /usr/bin/x86_64-linux-gnu-ld: libaom.a(quantize_ssse3_x86_64.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC /usr/bin/x86_64-linux-gnu-ld: libaom.a(subpel_variance_sse2.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC /usr/bin/x86_64-linux-gnu-ld: libaom.a(highbd_subpel_variance_impl_sse2.asm.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC /usr/bin/x86_64-linux-gnu-ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status CMakeFiles/decode_with_drops.dir/build.make:155: recipe for target 'examples/decode_with_drops' failed make[2]: *** [examples/decode_with_drops] Error 1 CMakeFiles/Makefile2:936: recipe for target 'CMakeFiles/decode_with_drops.dir/all' failed make[1]: *** [CMakeFiles/decode_with_drops.dir/all] Error 2 Makefile:129: recipe for target 'all' failed make: *** [all] Error 2 

[РЕДАКТИРОВАТЬ]: Добавление моей команды компиляции ffmpeg.

Я следовал руководству по компиляции Ubuntu, опубликованному в разделе «Моя команда», хотя и немного по-другому. Я отключил ffplay, так как я устанавливаю ffmpeg на сервере и включил libsrt (Haivision Secure Reliable Transport Protocol) и libaom (AV1). Я также изменил ссылку для скачивания стабильной версии 4.0 вместо последней ночной сборки. Это моя команда компиляции ffmpeg:

cd ~/ffmpeg_sources && \ wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2 && \ tar xjvf ffmpeg-snapshot.tar.bz2 && \ cd ffmpeg-4.0 && \ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include" \ --extra-ldflags="-L$HOME/ffmpeg_build/lib" \ --extra-libs="-lpthread -lm" \ --bindir="$HOME/bin" \ --enable-shared \ --enable-gpl \ --enable-nonfree \ --enable-ladspa \ --enable-libsrt \ --enable-libsoxr \ --enable-libspeex \ --enable-avfilter \ --enable-avresample \ --enable-postproc \ --enable-pthreads \ --enable-libfdk-aac \ --enable-libopus \ --enable-libass \ --enable-libtheora \ --enable-libvorbis \ --enable-libvpx \ --enable-libx264 \ --enable-libx265 \ --enable-libfreetype \ --enable-libkvazaar \ --disable-ffplay \ --enable-libopenjpeg \ --enable-libwebp \ --enable-libxvid \ --enable-libvidstab \ --enable-libopenh264 \ --enable-zlib \ --enable-openssl && \ PATH="$HOME/bin:$PATH" make -j8 && \ sudo make install && \ hash -r 
3
Я бы сказал, что это принадлежит StackOverflow. Компиляция ffmpeg в любом случае требует тайных знаний. 5 лет назад 0
любая идея, как я могу переместить это отсюда туда? Когда я пытался создать новую тему в Stackoverflow, он сказал, что я могу публиковать сообщения только один раз каждые 90 минут. Georgе Stoyanov 5 лет назад 0
Я пометил его для передачи. Так что просто подожди. 5 лет назад 0
Если вы спрашиваете, чтобы скомпилировать программу как пользователь, а не как разработчик, ее не нужно переносить. Тем не менее, это может быть полезно, если вы (а) измените название вопроса, например, "как мне скомпилировать FFMPEG без PIE?", И (б) объясните, почему вам нужно отключить PIE. Возможно, есть [альтернативное решение] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Bob 5 лет назад 2
PIE по умолчанию в gcc v.5.5, а не в 5.4. ... Вы можете использовать новый "no-pie" `gcc54-c ++ _ 5.4.0-ubuntu16_amd64.deb` для 18.04 (и 16.04) https://drive.google.com/file/d/1ptHLaZXImpeMzq4xuuGGn5VjrvxNSop3/view ? usp = shared ... Предоставляет `/ usr / bin / `. Установить: `sudo gdebi Downloads / gcc54-c ++ _ 5.4.0-ubuntu16_amd64.deb` Knud Larsen 5 лет назад 0
У меня работает в 18.04. Покажите свою команду `cmake` или любую другую информацию, необходимую для дублирования проблемы. LordNeckbeard 5 лет назад 0
Благодаря @KnudLarsen я смог успешно скомпилировать ffmpeg и libaom. Я также изменил название, как предложено «альтернативное решение». Georgе Stoyanov 5 лет назад 0
Мне не нужно было использовать gie для компиляции без PIE: я должен уточнить, что я имел в виду, когда сказал, что это «работает для меня». Я хотел решить вашу конкретную проблему, прежде чем предоставить инструкции по компиляции (поэтому я попросил команды, которые вы использовали, чтобы я мог повторить вашу проблему). Если вы нашли решение, вы также можете добавить его в качестве ответа. LordNeckbeard 5 лет назад 0

2 ответа на вопрос

3
LordNeckbeard

Я обновил руководство, которым вы следовали, чтобы включить инструкции по компиляции libaom без необходимости устанавливать другое gccили решать любые проблемы с PIE:

cd ~/ffmpeg_sources && \ git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom && \ mkdir aom_build && \ cd aom_build && \ PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off -DENABLE_NASM=on ../aom && \ PATH="$HOME/bin:$PATH" make && \ make install 

Эти инструкции могут быть изменены. Всегда обращайтесь к FFmpeg Wiki: Компиляция для Ubuntu для получения актуальных инструкций.

Затем скомпилируйте, ffmpegкак показано в руководстве.

Кстати, когда я использую команду libaom, которую вы поместили в [FFmpeg Wiki: Компиляция для Ubuntu] (https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu), я получаю ошибку: `error: ' AV1_COMMON 'не имеет члена с именем' extensionment_layers_cnt 'operating_point> = pbi-> common.enhancement_layers_cnt`. Georgе Stoyanov 5 лет назад 0
@ GeorgеStoyanov Я не могу продублировать эту ошибку (или я ее пропустил). Какой шаг в инструкции дает вам это сообщение? Это фатальная ошибка? LordNeckbeard 5 лет назад 0
1
Georgе Stoyanov

Таким образом, проблема заключалась в том, что gcc7 компилятор идет со встроенным, --enable-default-pieтак что решение было либо перекомпилировать GCC с -no-pieи -fno-pieфлагами или установить версию без поддержки пирога. Как предположил Кнуд Ларсен, я установил gcc-5.4.0 и связал gcc и g ++, чтобы указать на эту версию:

sudo rm /usr/bin/gcc /usr/bin/g++ sudo ln -s /usr/bin/gcc54 /usr/bin/gcc sudo ln -s /usr/bin/g++54 /usr/bin/g++ 

и затем выполняется в папке компиляции

make clean  make distclean  

и перекомпилировал снова ffmpeg, и это решило мою проблему. Хорошая идея после того, как вы закончите, - это заново связать вашу gccи g++последнюю установленную версию, в моем случае это было 7.