强制源文件中的变量进入 OS X 上的初始化数据段?
Force variable in source file into initialized data segment on OS X?
我在 CPP 源文件中有一个 bool
类型。变量 不能 设为静态。我想把变量放在一个初始化的数据段中。
根据 OS X ABI Mach-O File Format Reference,我相信我希望变量驻留的位置是 Table 2.
中的 __DATA,__data
如何使用 Apple 编译器在 OS X 上强制变量初始化数据段?
我意识到我可能不得不使用特定于平台的东西。我也意识到它不会是可移植的 C++。
要在 OS X 和 Linux(但不是 GNU Hurd)上可用时强制数据进入初始化数据段,请执行以下操作。请注意,此技术是特定于平台的,但它避开了 C/C++ 可见性和存储方面的限制 类。
#if defined(__clang__ ) && !defined(__apple_build_version__)
#define LLVM_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#elif defined(__clang__ ) && defined(__apple_build_version__)
#define APPLE_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#elif defined(__GNUC__)
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
...
#if ((__MACH__ >= 1) && ((LLVM_CLANG_VERSION >= 30600) || (APPLE_CLANG_VERSION >= 70100) || (GCC_VERSION >= 40300)))
#define INIT_SECTION __attribute__((section ("__DATA,__data")))
#elif ((__ELF__ >= 1) && (GCC_VERSION >= 40300))
#define INIT_SECTION __attribute__((section ("nocommon")))
#else
#define INIT_SECTION
#endif
foo.h:
extern bool g_x;
extern bool g_y;
foo.cpp:
bool INIT_SECTION g_x, INIT_SECTION g_y;
我仍在处理编译器版本号,因此它们可能不会尽可能准确。他们在 LLVM Clang、Apple Clang、GCC 和 MacPorts GCC 下测试正常。但是我怀疑Clang可以向下移动,而GCC可能需要向上移动。
我在 CPP 源文件中有一个 bool
类型。变量 不能 设为静态。我想把变量放在一个初始化的数据段中。
根据 OS X ABI Mach-O File Format Reference,我相信我希望变量驻留的位置是 Table 2.
中的__DATA,__data
如何使用 Apple 编译器在 OS X 上强制变量初始化数据段?
我意识到我可能不得不使用特定于平台的东西。我也意识到它不会是可移植的 C++。
要在 OS X 和 Linux(但不是 GNU Hurd)上可用时强制数据进入初始化数据段,请执行以下操作。请注意,此技术是特定于平台的,但它避开了 C/C++ 可见性和存储方面的限制 类。
#if defined(__clang__ ) && !defined(__apple_build_version__)
#define LLVM_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#elif defined(__clang__ ) && defined(__apple_build_version__)
#define APPLE_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#elif defined(__GNUC__)
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
...
#if ((__MACH__ >= 1) && ((LLVM_CLANG_VERSION >= 30600) || (APPLE_CLANG_VERSION >= 70100) || (GCC_VERSION >= 40300)))
#define INIT_SECTION __attribute__((section ("__DATA,__data")))
#elif ((__ELF__ >= 1) && (GCC_VERSION >= 40300))
#define INIT_SECTION __attribute__((section ("nocommon")))
#else
#define INIT_SECTION
#endif
foo.h:
extern bool g_x;
extern bool g_y;
foo.cpp:
bool INIT_SECTION g_x, INIT_SECTION g_y;
我仍在处理编译器版本号,因此它们可能不会尽可能准确。他们在 LLVM Clang、Apple Clang、GCC 和 MacPorts GCC 下测试正常。但是我怀疑Clang可以向下移动,而GCC可能需要向上移动。