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 定義が変更される恐れもあることをお忘れなく。