}
void
-load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u)
+load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump)
{
dynlib_handle_ptr handle = comp_u->handle;
struct thread_state ***current_thread_reloc =
*current_thread_reloc = ¤t_thread;
*pure_reloc = (EMACS_INT **)&pure;
- /* Imported data. */
- Lisp_Object d_vec = load_static_obj (handle, TEXT_DATA_RELOC_SYM);
- EMACS_INT d_vec_len = XFIXNUM (Flength (d_vec));
-
- for (EMACS_INT i = 0; i < d_vec_len; i++)
- data_relocs[i] = AREF (d_vec, i);
-
- comp_u->data_vec = d_vec;
/* Imported functions. */
*freloc_link_table = freloc.link_table;
- Lisp_Object comp_u_obj;
- XSETNATIVE_COMP_UNIT (comp_u_obj, comp_u);
+ /* Imported data. */
+ if (!loading_dump)
+ comp_u->data_vec = load_static_obj (handle, TEXT_DATA_RELOC_SYM);
+
+ EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec));
+
+ for (EMACS_INT i = 0; i < d_vec_len; i++)
+ data_relocs[i] = AREF (comp_u->data_vec, i);
- /* Executing this will perform all the expected environment modification. */
- top_level_run (comp_u_obj);
+ if (!loading_dump)
+ {
+ Lisp_Object comp_u_obj;
+ XSETNATIVE_COMP_UNIT (comp_u_obj, comp_u);
+ /* Executing this will perform all the expected environment
+ modification. */
+ top_level_run (comp_u_obj);
+ }
return;
}
if (!comp_u->handle)
xsignal2 (Qnative_lisp_load_failed, file, build_string (dynlib_error ()));
comp_u->file = file;
- load_comp_unit (comp_u);
+ comp_u->data_vec = Qnil;
+ load_comp_unit (comp_u, false);
return Qt;
}
}
/* Defined in comp.c. */
-extern void load_comp_unit (struct Lisp_Native_Comp_Unit *);
+extern void load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u,
+ bool loading_dump);
extern void syms_of_comp (void);
/* Fill the freloc structure. Must be called before any eln is loaded. */
extern void fill_freloc (void);
/* dump_ptr = dump_ptr + dump_base */
RELOC_DUMP_TO_DUMP_PTR_RAW,
/* dump_mpz = [rebuild bignum] */
+ RELOC_NATIVE_COMP_UNIT,
RELOC_BIGNUM,
/* dump_lv = make_lisp_ptr (dump_lv + dump_base,
type - RELOC_DUMP_TO_DUMP_LV)
out->handle = NULL;
dump_off comp_u_off = finish_dump_pvec (ctx, &out->header);
+ if (ctx->flags.dump_object_contents)
+ /* We'll do the real elf load during the LATE_RELOCS_1 relocation time. */
+ dump_push (&ctx->dump_relocs[LATE_RELOCS_1],
+ list2 (make_fixnum (RELOC_NATIVE_COMP_UNIT),
+ dump_off_to_lisp (comp_u_off)));
return comp_u_off;
}
#endif
dump_write_word_to_dump (dump_base, reloc_offset, value);
break;
}
+ case RELOC_NATIVE_COMP_UNIT:
+ {
+ struct Lisp_Native_Comp_Unit *comp_u =
+ dump_ptr (dump_base, reloc_offset);
+ comp_u->handle = dynlib_open (SSDATA (comp_u->file));
+ if (!comp_u->handle)
+ error ("%s", dynlib_error ());
+ load_comp_unit (comp_u, true);
+ }
+ break;
case RELOC_BIGNUM:
{
struct Lisp_Bignum *bignum = dump_ptr (dump_base, reloc_offset);