Ошибка компоновщика gcc: узел версии не найден для символа - PullRequest
4 голосов
/ 28 июня 2010

Я пытаюсь создать общую библиотеку и получаю следующую ошибку:

libavformat.so: узел версии не найден для символа av_dup_packet @ LIBAVFORMAT_52

л.д.: не удалось установить динамические размеры раздела: Неверное значение

Кто-нибудь знает, что означает эта ошибка? Хост - i586-linux, цель - arm-linux

Редактировать: Решено, см. Комментарии

Ответы [ 4 ]

3 голосов
/ 28 июня 2010

Это было вызвано директивой о встроенной сборке .symver.Мое решение состояло в том, чтобы вручную изменить сгенерированный config.h, чтобы отключить символы узлов версий.

Извлечь internal.h строки 214-223

2 голосов
/ 24 января 2017

Я столкнулся с этой ошибкой при сборке libsctp в пользовательской среде сборки.

Управление версиями символов объясняется здесь , и для управления им может использоваться скрипт компоновщика. В моем случае я смог добавить существующий скрипт компоновщика версии, добавив к целевой переменной makefile LDFLAGS:

$(LIB_PATH)/libsctp.so: LDFLAGS += \
    -Xlinker --version-script=$(MODULE_PATH)/src/lib/Versions.map
1 голос
/ 06 декабря 2011

О, функция была перемещена в апреле 2009 года из libavformat/util.c в новый файл в libavcodec/avpacket.c. Комментарий во internal.h прямо указывает:

Если функция перемещается из одной библиотеки в другую, обертка должна сохраняться в исходном месте для сохранения двоичной совместимости.

Но невозможно сохранить двоичную совместимость при перемещении функции между библиотеками.

Обратите внимание, что об этой ошибке сообщалось в проекте Chromium больше, чем год назад.

Кстати, нет необходимости редактировать config.h вручную: вы можете запустить ./configure --disable-symver.

0 голосов
/ 06 декабря 2011

Потребовался кто-то другой, чтобы указать мне на это, поэтому я подумал, что я мог бы также поставить это здесь, чтобы другие, как я, могли понять ответ Огниана:

Это означает редактирование config.h после запуска ./configure и установки значений, связанных с SYMVER, равными 0. Примерно так:

#define HAVE_SYMVER 0
#define HAVE_SYMVER_GNU_ASM 0
#define HAVE_SYMVER_ASM_LABEL 0
...