-pid_t ldso_stub__wait3(int *status, int options, struct rusage *rusage)
-{
- return wait3(status, options, rusage);
+ /*
+ * Display a (hopefully) helpful warning if it looks like we won't
+ * be able to allocate enough memory.
+ */
+ getrlimit (RLIMIT_DATA, &rl);
+ if (dynamic_space_size + READ_ONLY_SPACE_SIZE + STATIC_SPACE_SIZE +
+ LINKAGE_TABLE_SPACE_SIZE + wantfree > rl.rlim_cur)
+ fprintf (stderr,
+ "RUNTIME WARNING: data size resource limit may be too low,\n"
+ " try decreasing the dynamic space size with --dynamic-space-size\n"
+ " or raising the datasize or datasize-max limits in /etc/login.conf\n");
+}
+
+/* OpenBSD's dlsym() relies on the gcc bulitin
+ * __builtin_return_address(0) returning an address in the
+ * executable's text segment, but when called from lisp it will return
+ * an address in the dynamic space. Work around this by calling this
+ * wrapper function instead. Note that tail-call optimization will
+ * defeat this, disable it by saving the dlsym() return value in a
+ * volatile variable.
+*/
+void *
+os_dlsym(void *handle, const char *symbol)
+{
+ void * volatile ret = dlsym(handle, symbol);
+ return ret;