Как мне скомпилировать FFMPEG & Libaom без PIE
1311
Georgе Stoyanov
Я пытаюсь скомпилировать FFMPEG и Libaom из исходного кода, очевидно, потому что компиляторы gcc и g ++ в Ubuntu 18.04 по умолчанию включили следующую опцию по умолчанию: --enable-default-pie
Я пытался пройти, --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:
Я бы сказал, что это принадлежит 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:
Затем скомпилируйте, 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 ++, чтобы указать на эту версию:
и перекомпилировал снова ffmpeg, и это решило мою проблему. Хорошая идея после того, как вы закончите, - это заново связать вашу gccи g++последнюю установленную версию, в моем случае это было 7.