summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorFangrui Song <[email protected]>2019-09-16 07:44:05 -0700
committerFangrui Song <[email protected]>2019-09-21 17:55:14 -0700
commit7f044341f9f5c227d7c13c9c8ac2e9b00c8ed287 (patch)
tree23f8f74bdf6c3a172fde8cd6d390030aede4cb82 /include
parent8db7dfb5c41fcb52d1a571823147589ab2a03a6c (diff)
downloadmruby-7f044341f9f5c227d7c13c9c8ac2e9b00c8ed287.tar.gz
mruby-7f044341f9f5c227d7c13c9c8ac2e9b00c8ed287.zip
Rename MRB_USE_ETEXT_EDATA to MRB_USE_LINK_TIME_RO_DATA_P and support lld linked programs
In lld linked programs, .rodata comes before .text, thus mrb_ro_data_p will return false for strings in .rodata. Change the lower bound from _etext to __ehdr_start to catch these cases. This works for ld.bfd, gold and lld, and it does not have false positives even if .init_array does not exist. Remove the branch that uses _edata: strings in .data can be modified so this is semantically incorrect. Delete the __APPLE__ branch (its manpages say get_etext() and get_edata() are strongly discouraged). .init_array has been adopted by most ELF platforms to supersede .ctors. Neither _etext nor _edata is used, so rename MRB_USE_ETEXT_EDATA to MRB_USE_EHDR_START.
Diffstat (limited to 'include')
-rw-r--r--include/mrbconf.h10
-rw-r--r--include/mruby/value.h32
2 files changed, 13 insertions, 29 deletions
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