gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/2] Add LoongArch64 basic support


From: Camm Maguire
Subject: Re: [PATCH 2/2] Add LoongArch64 basic support
Date: Tue, 16 Jul 2024 15:03:19 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux)

Greetings, and thanks as always again for your very helpful feedback!

Could you please try again with the latest master?  New approach is to
allow the address to be variable.  Please let me know if it works for
you.

Separately, are you perchance involved in the maintenance of the cfarm
loongarch64 machines?  Is there any way to get the gcl build
dependencies installed on one of those machines, e.g. cfarm400?  Even
better would be a Debian (dd-)schroot setup.

It appears that all 5 gcl applications have now built successfully on
this platform in the Debian autobuilders.  Congratulations!

Take care,

Jinyang He <hejinyang@loongson.cn> writes:

> On 2024-07-15 20:11, Camm Maguire wrote:
>
>> =============================================================================
>> 0890adf6cf6aabd719c32f99c962356126919a14
>> Author:     Camm Maguire<camm@transcendence.maguirefamily.org>
>> AuthorDate: Sun Jul 14 15:26:59 2024 -0400
>> Commit:     Camm Maguire<camm@transcendence.maguirefamily.org>
>> 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
>
>
>
>

-- 
Camm Maguire                                        camm@maguirefamily.org
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah



reply via email to

[Prev in Thread] Current Thread [Next in Thread]