У меня возникли проблемы с попыткой собрать статический двоичный файл ffmpeg - у меня работает почти вся сборка, за исключением двух библиотек - libvorbis и libmp3lame.

Эти две библиотеки дают сбой во время ./configure, в частности, для неопределенных функций из math.h/libm:

libvorbis:

gcc -L/vol/build/lib -static -static-libstdc++ -static-libgcc -Wl,--as-needed -Wl,-z,noexecstack -I/vol/build/include -L/vol/build/lib -o /tmp/ffconf.UKKLGhCv/test /tmp/ffconf.UKKLGhCv/test.o -lvorbis -lm -logg -lstdc++ -lpthread -lexpat -ldl -lm --enable-libopencore-amrnb
/vol/build/lib/libvorbis.a(envelope.o): In function `_ve_envelope_init':
envelope.c:(.text+0x983): undefined reference to `_ZGVbN2v_sin'
envelope.c:(.text+0x9a9): undefined reference to `_ZGVbN2v_sin'
/vol/build/lib/libvorbis.a(lsp.o): In function `vorbis_lsp_to_curve':
lsp.c:(.text+0x650): undefined reference to `_ZGVbN2v_cos'
lsp.c:(.text+0x669): undefined reference to `_ZGVbN2v_cos'


libmp3lame:

gcc -L/vol/build/lib -static -static-libstdc++ -static-libgcc -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.dC4w1f5B/test /tmp/ffconf.dC4w1f5B/test.o -lmp3lame -lm -lstdc++ -lpthread -lexpat -ldl -lm --enable-libopencore-amrnb
/vol/build/lib/libmp3lame.a(psymodel.o): In function `init_s3_values':
psymodel.c:(.text+0x14d3): undefined reference to `_ZGVbN2v___exp_finite'
psymodel.c:(.text+0x14fa): undefined reference to `_ZGVbN2v___exp_finite'
/vol/build/lib/libmp3lame.a(psymodel.o): In function `psymodel_init':
psymodel.c:(.text+0xb62d): undefined reference to `_ZGVbN4vv___powf_finite'
psymodel.c:(.text+0xb677): undefined reference to `_ZGVbN4vv___powf_finite'
psymodel.c:(.text+0xb6c4): undefined reference to `_ZGVbN4vv___powf_finite'
psymodel.c:(.text+0xb711): undefined reference to `_ZGVbN4vv___powf_finite'
psymodel.c:(.text+0xb75b): undefined reference to `_ZGVbN4vv___powf_finite'
/vol/build/lib/libmp3lame.a(psymodel.o):psymodel.c:(.text+0xb7a2): more undefined references to `_ZGVbN4vv___powf_finite' follow
/vol/build/lib/libmp3lame.a(util.o): In function `fill_buffer':
util.c:(.text+0x28a6): undefined reference to `_ZGVbN2v_cos'
util.c:(.text+0x28cc): undefined reference to `_ZGVbN2v_cos'
util.c:(.text+0x28fb): undefined reference to `_ZGVbN2v_cos'
util.c:(.text+0x2921): undefined reference to `_ZGVbN2v_cos'
util.c:(.text+0x29cc): undefined reference to `_ZGVbN2v_sin'
util.c:(.text+0x29e8): undefined reference to `_ZGVbN2v_sin'

Я не могу понять, как заставить их успешно строить. Насколько я понимаю, передачи опции -lm должно быть достаточно, но, по-видимому, этого недостаточно. Проверил на наличие libm.a, который находится по адресу /usr/lib/x86_64-linux-gnu/libm.a, также пытался передать этот каталог во флагах -L, но без разницы. Библиотеки собираются нормально при удалении флага -static, но полученный двоичный файл (да) связан с libm.so.

На всякий случай вот флаги, которые я использую для сборки двух библиотек:

libvorbis:
./configure --prefix=${CMAKE_BINARY_DIR} --disable-shared --disable-oggtest

libmp3lame:
./configure --prefix=${CMAKE_BINARY_DIR} --disable-shared

Я был бы признателен за любые указания о том, как исправить или отладить это дальше.

Редактировать: поиграв с ним еще немного, кажется, что libm становится связанным - когда я удаляю флаг -lm, я получаю массу неопределенных ссылок - sin , cos, __pow_finite и т. д. Когда я вставляю его обратно, большинство из них исчезают, и остаются только искаженные символы, такие как _ZGVbN4vv___powf_finite и _ZGVbN2v_cos.

2
kralewitz 27 Май 2018 в 23:27
Эти символы могут действительно отсутствовать в libm. Вы можете подтвердить с помощью: readelf -s [path-to-libm] | grep [symname]
 – 
valiano
28 Май 2018 в 00:43
Я могу ошибаться, но кажется, что эти символы не в libm - они плохо разбираются. Они могут быть частью самой библиотеки. Проверьте эту ссылку: https://dev.solus-project.com/file/data/7dedblvkcdk5kmw3ltvn/PHID-FILE-27qhoqo6wsubrntfj2xc/D1210.diff
 – 
valiano
28 Май 2018 в 00:47

1 ответ

Лучший ответ

Что ж, мне удалось решить эту проблему — гугление искаженных символов, таких как _ZGVbN2v_cos, привело меня к в этом патче упоминается векторная математика, а в сочетании с выводом ldd во время динамического связывания упоминается libmvec, я понял, что мне, возможно, придется связать и это.

Для libmp3lame он должен быть подключен перед libm:

gcc -L/vol/build/lib -static -o /tmp/ffconf.dC4w1f5B/test /tmp/ffconf.dC4w1f5B/test.o -lmp3lame -lmvec -lm

Для libvorbis порядок -lm и -lmvec не имеет значения, он строится в любом случае.

2
kralewitz 28 Май 2018 в 10:09