musl-gcc: неопределенная ссылка на __memcpy_chk

#c #gcc #musl

#c #gcc #musl

Вопрос:

Мне нужно скомпилировать программу на C с musl-libc, чтобы заставить ее работать на встроенном устройстве. Однако мне не удается скомпилировать программу. Исходный код зависит от пары библиотек, которые я передаю компоновщику следующим образом:

/usr/local/musl/bin/musl-gcc app.c -o app -I../lib -lzlog -lfilter

Это результат, который я получаю:

 /usr/local/musl/lib/libzlog.a(category.o): In function `strcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__memcpy_chk'
/usr/local/musl/lib/libzlog.a(conf.o): In function `strcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__strcpy_chk'
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__strcpy_chk'
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__strcpy_chk'
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__strcpy_chk'
/usr/local/musl/lib/libzlog.a(event.o): In function `sprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:33: undefined reference to `__sprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:33: undefined reference to `__sprintf_chk'
/usr/local/musl/lib/libzlog.a(format.o): In function `memcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:53: undefined reference to `__memcpy_chk'
/usr/local/musl/lib/libzlog.a(record.o): In function `strcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__memcpy_chk'
/usr/local/musl/lib/libzlog.a(rotater.o): In function `snprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64: undefined reference to `__snprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64: undefined reference to `__snprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64: undefined reference to `__snprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64: undefined reference to `__snprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64: undefined reference to `__snprintf_chk'
/usr/local/musl/lib/libzlog.a(rule.o): In function `syslog':
/usr/include/x86_64-linux-gnu/bits/syslog.h:31: undefined reference to `__syslog_chk'
/usr/local/musl/lib/libzlog.a(rule.o): In function `strcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__strcpy_chk'
/usr/local/musl/lib/libzlog.a(rule.o): In function `memcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:53: undefined reference to `__memcpy_chk'
/usr/local/musl/lib/libzlog.a(spec.o): In function `sprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:33: undefined reference to `__sprintf_chk'
/usr/local/musl/lib/libzlog.a(zc_profile.o): In function `vfprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:127: undefined reference to `__vfprintf_chk'
/usr/local/musl/lib/libzlog.a(zc_profile.o): In function `fprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:97: undefined reference to `__fprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:97: undefined reference to `__fprintf_chk'
/usr/local/musl/lib/libzlog.a(zc_util.o): In function `snprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64: undefined reference to `__snprintf_chk'
/usr/local/musl/lib/libzlog.a(buf.o): In function `strcpy':
/usr/include/x86_64-linux-gnu/bits/string3.h:110: undefined reference to `__memcpy_chk'
/usr/local/musl/lib/libzlog.a(buf.o): In function `vsnprintf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:77: undefined reference to `__vsnprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:77: undefined reference to `__vsnprintf_chk'
/usr/include/x86_64-linux-gnu/bits/stdio2.h:77: undefined reference to `__vsnprintf_chk'
collect2: error: ld returned 1 exit status

  

Та же команда с gcc работает нормально.
Эти функции не реализованы в musl?

Комментарии:

1. что касается: -I../lib Это указывает компилятору, где расположены файлы заголовков, а не где расположены библиотеки. Чтобы указать компоновщику, где расположены библиотеки, используйте -L../lib Обратите внимание на заглавную букву «L», а не на заглавную букву «I».

2. Вы, конечно, правы. Настройка была довольно странной. Файлы заголовков не были необходимы для рассматриваемой библиотеки. Эта библиотека находилась в стандартном пути поиска компоновщика.

Ответ №1:

Все пути включения в вашем вопросе являются файлами glibc, поэтому похоже, что библиотека, на которую вы пытаетесь установить ссылку, была создана с использованием glibc. Иногда это можно заставить работать, но есть ограничения. В вашем случае он был создан с использованием версии glibc _FORTIFY_SOURCE , которая использует символы из glibc, которые в настоящее время недоступны в musl ( _FORTIFY_SOURCE реализация, обычно используемая в musl, работает по-другому). Выполнение этой работы долгое время было в долгосрочной повестке дня, но не являлось приоритетом; если вы можете, гораздо лучше перестроить библиотеку под musl.

Комментарии:

1. @Antti ты имеешь в виду самого автора musl?

2. Конечно, так оно и было. Я смог получить доступ к исходному коду и скомпилировать его в musl. Работает нормально.

Ответ №2:

Возможно, это не имеет отношения к вашему случаю, но у меня была такая же __memcpy_chk проблема при кросс-компиляции с использованием MinGW под Linux.

И эта неопределенная ссылка была исправлена путем добавления -lssp флага в компоновщик. Если у вас есть configure , то вы можете сделать LDFLAGS="-lssp" ./configure ...