Версионирование символов в Alpine Linux - PullRequest
0 голосов
/ 22 января 2019

Библиотека musl C имеет только примерную реализацию версионирования символов .Это может привести к тому, что символы будут связаны друг с другом с разными версиями символов, чего не произойдет в полной реализации.Проекты, которые ожидают быть построенными с использованием musl, поэтому лучше избегать использования версий символов в целом.(Не поддержка версий символов сама по себе не обязательно является плохим выбором для цепочки инструментов; все зависит от целевой аудитории.)

Тем не менее, цепочка инструментов Alpine Linux компилирует binutils с полной поддержкой версий символов: GAS поддерживает *Директива 1005 *, а редактор ссылок обрабатывает сценарии версий и назначает версии символов (так же, как в GNU / Linux).Простая проверка компилятора / ассемблера или компоновщика показывает, что поддержка символов поддерживается .В результате некоторые из общих объектов, которые Alpine Linux включает в дистрибутив, фактически используют управление версиями символов, хотя динамический загрузчик musl будет игнорировать эти данные.(Данные просто раздувают двоичные файлы.)

В некоторых случаях программное обеспечение не запускается (после очень хорошей сборки), потому что оно использует символы совместимости (символы без версии по умолчанию) способами, которые не поддерживаются в muslдинамический компоновщик.Вот небольшой пример того, что не работает:

cat > symver.c <<EOF
void
compat_function (void)
{
}
__asm__ (".symver compat_function,compat_function@SYMVER");

void
call_compat_function (void)
{
  return compat_function ();
}
EOF

echo "SYMVER { };" > symver.map

cat > main.c <<EOF
extern void call_compat_function (void);

int
main (void)
{
  call_compat_function ();
}
EOF

gcc -fpic -shared -o symver.so -Wl,--version-script=symver.map symver.c
gcc -Wl,--rpath=. -o main main.c symver.so
./main

Сбой выполнения с Error relocating ./symver.so: compat_function: symbol not found.Он успешно работает без директивы .symver.

Как эта комбинация поддержки binutils для управления версиями символов в сочетании с динамическим компоновщиком, который его не поддерживает, должна работать на практике?Должны ли проекты проверять целевой триплет *-musl и отключать управление версиями символов?

Проверка во время выполнения для поддержки динамического компоновщика сделает эту работу, но она нарушит кросс-компиляцию.Следует ли это исправить в самой Alpine Linux, отключив поддержку версий символов в binutils?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...