Re: [PATCH 2/2] Add LoongArch64 basic support
Jinyang He <[email protected]> Tue, 16 Jul 2024 09:59:02 +0800
| Newsgroups | gmane.lisp.gcl.devel |
|---|---|
| Message-ID | <[email protected]> |
On 2024-07-15 20:11, Camm Maguire wrote: > ============================================================================= > 0890adf6cf6aabd719c32f99c962356126919a14 > Author: Camm Maguire<[email protected]> > AuthorDate: Sun Jul 14 15:26:59 2024 -0400 > Commit: Camm Maguire<[email protected]> > CommitDate: Sun Jul 14 15:26:59 2024 -0400 > > Parent: 0fc02b307 debian version 2.7.0-23 > Contained: Version_2_7_0pre master > Follows: Version_2_7_0pre26 (1) > > Link libboot.so into pre_ images with ld to fix address, not dlopen > > 3 files changed, 10 insertions(+), 4 deletions(-) > gcl/makefile | 4 ++-- > gcl/unixport/makefile | 4 ++-- > gcl/unixport/sys_init.c | 6 ++++++ > > modified gcl/makefile > @@ -96,11 +96,11 @@ $(PORTDIR)/saved_pre_gcl: $(HDIR)cmpinclude.h > (cd $(ODIR); $(MAKE) all) > $(MAKE) $< > rm -f o/cmpinclude.h ; cp h/cmpinclude.h o > - cd $(@D) && $(MAKE) $(@F) > + cd $(@D) && LD_LIBRARY_PATH=$(@D):$$LD_LIBRARY_PATH $(MAKE) $(@F) > touch $< $@ > > $(PORTDIR)/saved_gcl0: $(PORTDIR)/saved_pre_gcl $(HDIR)cmpinclude.h > - cd $(@D) && echo '(time (load "boot.lisp"))' | ../$< > + cd $(@D) && echo '(time (load "boot.lisp"))' | LD_LIBRARY_PATH=$(@D):$$LD_LIBRARY_PATH ../$< > cd $(@D) && $(MAKE) saved_gcl && mv saved_gcl $(@F) > > $(PORTDIR)/saved_gcl1: $(PORTDIR)/saved_gcl0 $(HDIR)cmpinclude.h > modified gcl/unixport/makefile > @@ -155,9 +155,9 @@ ifeq ($(GNU_LD),1) > $(CC) $(LD_FLAGS) -o raw_$*$(EXE) $(filter %.o,$^) \ > $(shell if echo $@ | grep -q gprof ; then echo "-pg"; else echo ""; fi) \ > -rdynamic -L. $(EXTRA_LD_LIBS) $(LD_STACK_FLAGS) \ > - -Wl,-Map raw_$*_map $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST) > + -Wl,-Map raw_$*_map $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST) -lboot > else > - $(CC) $(LD_FLAGS) -o raw_$*$(EXE) $(filter %.o,$^) $(shell if grep -q gprof $@ ; then echo "-pg"; else echo ""; fi) -L. $(EXTRA_LD_LIBS) $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST) > + $(CC) $(LD_FLAGS) -o raw_$*$(EXE) $(filter %.o,$^) $(shell if grep -q gprof $@ ; then echo "-pg"; else echo ""; fi) -L. $(EXTRA_LD_LIBS) $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST) -lboot > endif > > map_%: > modified gcl/unixport/sys_init.c > @@ -20,6 +20,12 @@ gcl_init_init() > #endif > } > #endif > + > +#if defined(pre_gcl) > + gcl_init_boot();/*Superfluous call to hard link boot.so into pre > + image only, where it is used in raw_ and saved_ > + images and must have a fixed address*/ > +#endif > > lsp_init("lsp","gcl_export"); > ============================================================================= It doesn't mmap to same.. The strace shows, for raw_pre_gcl, [...] Map libboot.so to memroy (, from dynamic linker ld.so.1) openat(AT_FDCWD, "libboot.so", O_RDONLY|O_CLOEXEC) = 3 read(3, ... statx(3, ... mmap(NULL, 120864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffff01b0000 mmap(0x7ffff01c4000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x7ffff01c4000 mmap(0x7ffff01cc000, 6176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffff01cc000 close(3) [...] Set rlimit_stack in gcl_init_alloc as gcl_alloc_initialized == 0 prlimit64(0, RLIMIT_STACK, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}, NULL) = 0 [...] Set no_randomize and re-exec personality(PER_LINUX|ADDR_NO_RANDOMIZE) = 0x400000 (PER_LINUX|READ_IMPLIES_EXEC) personality(0xffffffff) = 0x40000 (PER_LINUX|ADDR_NO_RANDOMIZE) brk(0x56ead0d5f) = 0x56ead0d5f execve("raw_pre_gcl", ... brk(NULL) [...] Map libboot.so to memroy after re-exec openat(AT_FDCWD, "libboot.so", O_RDONLY|O_CLOEXEC) = 3 read(3, ... statx(3, ... mmap(NULL, 120864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2aaaab114000 mmap(0x2aaaab128000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x2aaaab128000 mmap(0x2aaaab130000, 6176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2aaaab130000 close(3) [...] Then we can see it maps to another position. 0x2aaaab114000 vs 0x7ffff01b0000 for saved_pre_gcl, [...] Map libboot.so to memroy openat(AT_FDCWD, "libboot.so", O_RDONLY|O_CLOEXEC) = 3 read(3, ... statx(3, ... mmap(NULL, 120864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffff2a68000 mmap(0x7ffff2a7c000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x7ffff2a7c000 mmap(0x7ffff2a84000, 6176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffff2a84000 close(3) [...] Because "gcl_alloc_initialized == 1", so it didn't call gcl_init_alloc before. Re-exec. personality(PER_LINUX|READ_IMPLIES_EXEC) = 0 (PER_LINUX) personality(PER_LINUX|ADDR_NO_RANDOMIZE) = 0x400000 (PER_LINUX|READ_IMPLIES_EXEC) personality(0xffffffff) = 0x40000 (PER_LINUX|ADDR_NO_RANDOMIZE) brk(0x43930dd9) = 0x43930dd9 execve("saved_pre_gcl", ... [...] Map libboot.so to memroy after re-exec openat(AT_FDCWD, "libboot.so", O_RDONLY|O_CLOEXEC) = 3 read(3, ... statx(3, ... mmap(NULL, 120864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffff2a68000 mmap(0x7ffff2a7c000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x7ffff2a7c000 mmap(0x7ffff2a84000, 6176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffff2a84000 close(3) So the patch didn't link libboot.so to fixed address becuase the dynamic linker use mmap to map libboot.so, gcl_init_alloc also influence the re-exec dynamic linker mmap range. Thanks, Jinyang