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.
This commit is contained in:
Andrea Corallo 2020-04-10 22:30:34 +01:00
parent d85b803b78
commit f4156b452f
2 changed files with 17 additions and 1 deletions

View file

@ -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)

View file

@ -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);