diff options
| -rw-r--r-- | doc/guides/mrbconf.md | 17 | ||||
| -rw-r--r-- | include/mrbconf.h | 10 | ||||
| -rw-r--r-- | include/mruby/value.h | 32 | ||||
| -rw-r--r-- | src/load.c | 2 |
4 files changed, 20 insertions, 41 deletions
diff --git a/doc/guides/mrbconf.md b/doc/guides/mrbconf.md index 4f5349e77..2f81776df 100644 --- a/doc/guides/mrbconf.md +++ b/doc/guides/mrbconf.md @@ -134,21 +134,16 @@ largest value of required alignment. ## Reduce heap memory configuration. -`MRB_USE_ETEXT_EDATA` +`MRB_USE_LINK_TIME_RO_DATA_P` +* Only available on ELF platforms. * If you specify the address of a read-only section when creating a symbol or string, that string will be used as it is. * Heap memory can be saved. -* Uses `_etext` and `__init_array_start`. -* It must be `_etext < data_addr < &__init_array_start`. - -`MRB_NO_INIT_ARRAY_START` -* Ignored if `MRB_USE_ETEXT_EDATA` is not defined. -* Please try if `__init_array_start` is not available. -* Uses `_etext` and `_edata`. -* It must be `_etext < data_addr < _edata`. +* Uses `__ehdr_start` and `__init_array_start`. +* It must be `__ehdr_start < data_addr < __init_array_start`. `MRB_USE_CUSTOM_RO_DATA_P` -* Takes precedence over `MRB_USE_ETEXT_EDATA`. -* Please try if both `MRB_USE_ETEXT_EDATA` and `MRB_NO_INIT_ARRAY_START` are not available. +* Takes precedence over `MRB_USE_LINK_TIME_RO_DATA_P`. +* Please try if `MRB_USE_LINK_TIME_RO_DATA_P` is not available. * The `mrb_ro_data_p()` function is implemented by the user in an arbitrary file. * The prototype declaration is `mrb_bool mrb_ro_data_p(const char *ptr)`. * Return `TRUE` if `ptr` is in read-only section, otherwise return `FALSE`. diff --git a/include/mrbconf.h b/include/mrbconf.h index c5b9afd05..b86ce82e8 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -88,14 +88,10 @@ /* number of object per heap page */ //#define MRB_HEAP_PAGE_SIZE 1024 -/* if _etext and _edata available, mruby can reduce memory used by symbols */ -//#define MRB_USE_ETEXT_EDATA +/* if __ehdr_start is available, mruby can reduce memory used by symbols */ +//#define MRB_USE_LINK_TIME_RO_DATA_P -/* do not use __init_array_start to determine readonly data section; - effective only when MRB_USE_ETEXT_EDATA is defined */ -//#define MRB_NO_INIT_ARRAY_START - -/* if do not works both MRB_USE_ETEXT_EDATA and MRB_NO_INIT_ARRAY_START, +/* if MRB_USE_LINK_TIME_RO_DATA_P does not work, you can try mrb_ro_data_p() that you have implemented yourself in any file; prototype is `mrb_bool mrb_ro_data_p(const char *ptr)` */ //#define MRB_USE_CUSTOM_RO_DATA_P diff --git a/include/mruby/value.h b/include/mruby/value.h index 52ce93d58..831334b9d 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -309,37 +309,25 @@ mrb_undef_value(void) return v; } +#if defined(MRB_USE_ETEXT_EDATA) && !defined(MRB_USE_LINK_TIME_RO_DATA_P) +# ifdef __GNUC__ +# warning MRB_USE_ETEXT_EDATA is deprecated. Define MRB_USE_LINK_TIME_RO_DATA_P instead. +# endif +# define MRB_USE_LINK_TIME_RO_DATA_P +#endif + #if defined(MRB_USE_CUSTOM_RO_DATA_P) /* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */ mrb_bool mrb_ro_data_p(const char *p); -#elif defined(MRB_USE_ETEXT_EDATA) -#if (defined(__APPLE__) && defined(__MACH__)) -#include <mach-o/getsect.h> -static inline mrb_bool -mrb_ro_data_p(const char *p) -{ - return (const char*)get_etext() < p && p < (const char*)get_edata(); -} -#else -extern char _etext[]; -#ifdef MRB_NO_INIT_ARRAY_START -extern char _edata[]; - -static inline mrb_bool -mrb_ro_data_p(const char *p) -{ - return _etext < p && p < _edata; -} -#else +#elif defined(MRB_USE_LINK_TIME_RO_DATA_P) +extern char __ehdr_start[]; extern char __init_array_start[]; static inline mrb_bool mrb_ro_data_p(const char *p) { - return _etext < p && p < (char*)&__init_array_start; + return __ehdr_start < p && p < __init_array_start; } -#endif -#endif #else # define mrb_ro_data_p(p) FALSE #endif diff --git a/src/load.c b/src/load.c index 2aa2c576f..471ff3841 100644 --- a/src/load.c +++ b/src/load.c @@ -554,7 +554,7 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags) mrb_irep* mrb_read_irep(mrb_state *mrb, const uint8_t *bin) { -#if defined(MRB_USE_ETEXT_EDATA) || defined(MRB_USE_CUSTOM_RO_DATA_P) +#if defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P) uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC; #else uint8_t flags = FLAG_SRC_STATIC; |
