V8 の RTLD_DEFAULT が見つからないビルドエラー
MacOSX 10.6 を使用。
JavaScript V8 エンジンを scons でビルドする際、以下のエラーが発生。
src/platform-macos.cc:500: error: 'RTLD_DEFAULT' was not declared in this scope
scons: *** [obj/release/platform-macos.o] Error 1
scons: building terminated because of errors.
問題のソースコード (v8/src/platform-macos.cc) を見てみると、
#include <dlfcn.h> (略) static void SetThreadName(const char* name) { // pthread_setname_np is only available in 10.6 or later, so test // for it at runtime. int (*dynamic_pthread_setname_np)(const char*); *reinterpret_cast<void**>(&dynamic_pthread_setname_np) = dlsym(RTLD_DEFAULT, "pthread_setname_np"); if (!dynamic_pthread_setname_np) return; // Mac OS X does not expose the length limit of the name, so hardcode it. static const int kMaxNameLength = 63; USE(kMaxNameLength); ASSERT(Thread::kMaxThreadNameLength <= kMaxNameLength); dynamic_pthread_setname_np(name); }
RTLD_DEFAULT は /usr/include/dlfcn.h に定義されているけど、
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) のマクロ状態でないと読み込まれないようになっている。
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) #define RTLD_NOLOAD 0x10 #define RTLD_NODELETE 0x80 #define RTLD_FIRST 0x100 /* Mac OS X 10.5 and later */ /* * Special handle arguments for dlsym(). */ #define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */ #define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */ #define RTLD_SELF ((void *) -3) /* Search this and subsequent objects (Mac OS X 10.5 and later) */ #define RTLD_MAIN_ONLY ((void *) -5) /* Search main executable only (Mac OS X 10.5 and later) */ #endif /* not POSIX */
- 対応策
むやみに _DARWIN_C_SOURCE を定義するのが嫌だったので、v8/src/platform-macos.cc の先頭に #define RTLD_DEFAULT ((void *) -2) のマクロを定義することにしました。
#define RTLD_DEFAULT ((void *) -2) #include <dlfcn.h> (略)
その後、ビルドに成功しました。
ただ、プラットフォーム(OS バージョン)が変化すると RTLD_DEFAULT 定義が変更される恐れもあることをお忘れなく。