glibc 2.5 에서 2.7 사이의 gettext()는 쓰레드에 안전하기 않기 때문에
VLC에서 상기버전의 glibc를 사용하고 있다면 실행시에 에러를 발생하고 실행을 하지 않는다.
vlc-1.0.5/src/misc/linux_specific.c 파일의 75라인부터 아래의 내용이 존재한다.
#ifdef __GLIBC__
# include
# include
#endif
void system_Init (libvlc_int_t *libvlc, int *argc, const char *argv[])
{
#ifdef __GLIBC__
const char *glcv = gnu_get_libc_version ();
/* gettext in glibc 2.5-2.7 is not thread-safe. LibVLC keeps crashing,
* especially in sterror_r(). Even if we have NLS disabled, the calling
* process might have called setlocale(). */
if (strverscmp (glcv, "2.5") >= 0 && strverscmp (glcv, "2.8") < 0)
{
fputs ("LibVLC has detected an unusable buggy GNU/libc version.\n"
"Please update to version 2.8 or newer.\n", stderr);
fflush (stderr);
#ifndef DISABLE_BUGGY_GLIBC_CHECK
abort ();
#endif
}
#endif
그리고 vlc-1.0.5/configure.ac 의 532 라인에는 다음과 같은 내용이 존재한다.
dnl
dnl Buggy glibc prevention. Purposedly not cached.
dnl Ubuntu alone has 20 bug numbers for this...
dnl
AC_MSG_CHECKING(for buggy GNU/libc versions)
AC_PREPROC_IFELSE([
#include <limits.h>
#if defined (__GLIBC__) && (__GLIBC__ == 2) \
&& (__GLIBC_MINOR__ >= 5) && (__GLIBC_MINOR__ <= 7)
# error GNU/libc with dcgettext killer bug!
#endif
], [
AC_MSG_RESULT([not present])
], [
AC_MSG_RESULT([found])
AS_IF([test "x${enable_nls}" != "xno" || test "x${enable_mozilla}" != "xno"], [
AC_MSG_ERROR([Buggy GNU/libc (version 2.5 - 2.7) present. VLC would crash; there is no viable
work-around for this. Check with your distribution vendor on how to update the
glibc run-time. Alternatively, build with --disable-nls --disable-mozilla and
be sure to not use LibVLC from other applications/wrappers.])
], [
AC_DEFINE(DISABLE_BUGGY_GLIBC_CHECK, 1, [Disables runtime check for buggy glibc.])
])
])
|
위의 abort(); 를 주석처리 하거나
DISABLE_BUGGY_CLIBC_CHECK를 미리 선언하거나 하면 될꺼 같은데 어떻게 해야 하려나?
(아무튼 abort(); 를 주석처리 하면 실행은 된다.)