use __init_array_start to determine readonly data section;

b72e94fa used _etext and _edata to distinguish C string literals from heap allocated strings,
but using _edata, global char arrays may be considered as string literals.  to avoid the issue,
we have to use __init_array_start, which might be less portable.  you can still use _edata, by
using MRB_NO_INIT_ARRAY_START.
parent ae140300
...@@ -41,6 +41,10 @@ ...@@ -41,6 +41,10 @@
/* if _etext and _edata available, mruby can reduce memory used by symbols */ /* if _etext and _edata available, mruby can reduce memory used by symbols */
//#define MRB_USE_ETEXT_EDATA //#define MRB_USE_ETEXT_EDATA
/* 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
/* turn off generational GC by default */ /* turn off generational GC by default */
//#define MRB_GC_TURN_OFF_GENERATIONAL //#define MRB_GC_TURN_OFF_GENERATIONAL
......
...@@ -213,6 +213,7 @@ mrb_undef_value(void) ...@@ -213,6 +213,7 @@ mrb_undef_value(void)
#ifdef MRB_USE_ETEXT_EDATA #ifdef MRB_USE_ETEXT_EDATA
extern char _etext[]; extern char _etext[];
#ifdef MRB_NO_INIT_ARRAY_START
extern char _edata[]; extern char _edata[];
static inline mrb_bool static inline mrb_bool
...@@ -221,6 +222,15 @@ mrb_ro_data_p(const char *p) ...@@ -221,6 +222,15 @@ mrb_ro_data_p(const char *p)
return _etext < p && p < _edata; return _etext < p && p < _edata;
} }
#else #else
extern char __init_array_start[];
static inline mrb_bool
mrb_ro_data_p(const char *p)
{
return _etext < p && p < (char*)&__init_array_start;
}
#endif
#else
# define mrb_ro_data_p(p) FALSE # define mrb_ro_data_p(p) FALSE
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment