summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/guides/mrbconf.md17
-rw-r--r--include/mrbconf.h10
-rw-r--r--include/mruby/value.h32
-rw-r--r--src/load.c2
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;