From f4156b452fd45ed4a706a2083755212c16ef88bb Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 10 Apr 2020 22:30:34 +0100 Subject: [PATCH] Implement position independent dump. Set the filename for every compilation unit as realtive to obtain a position independent dump. * lisp/loadup.el: Modify filename for every compilation unit as position independent. * src/pdumper.c (dump_do_dump_relocation): Update to be invocation directory relative. --- lisp/loadup.el | 15 +++++++++++++++ src/pdumper.c | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lisp/loadup.el b/lisp/loadup.el index 97525b27086..bda9919cbbc 100644 --- a/lisp/loadup.el +++ b/lisp/loadup.el @@ -449,6 +449,21 @@ lost after dumping"))) ;; At this point, we're ready to resume undo recording for scratch. (buffer-enable-undo "*scratch*") +(when (boundp 'comp-ctxt) ; FIXME better native-comp build discriminant? + ;; Set the filename for every compilation unit as realtive + ;; to obtain a position independent dump. + (let ((h (make-hash-table :test #'eq))) + (mapatoms (lambda (s) + (let ((f (symbol-function s))) + (when (subr-native-elisp-p f) + (puthash (subr-native-comp-unit f) nil h))))) + (maphash (lambda (cu _) + (native-comp-unit-set-file + cu + (file-relative-name (native-comp-unit-file cu) + invocation-directory))) + h))) + (when (hash-table-p purify-flag) (let ((strings 0) (vectors 0) diff --git a/src/pdumper.c b/src/pdumper.c index 03c31681cd5..7fbacfe4a1a 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -5298,7 +5298,8 @@ dump_do_dump_relocation (const uintptr_t dump_base, { struct Lisp_Native_Comp_Unit *comp_u = dump_ptr (dump_base, reloc_offset); - comp_u->handle = dynlib_open (SSDATA (comp_u->file)); + comp_u->handle = + dynlib_open (SSDATA (concat2 (Vinvocation_directory, comp_u->file))); if (!comp_u->handle) error ("%s", dynlib_error ()); load_comp_unit (comp_u, true, false); -- 2.39.5