> Date: Mon, 23 Nov 2020 22:59:19 -0500
> From: George Koehler <[email protected]>
> 
> With this diff, lld can link macppc's kernel.
> 
> The first part of the diff adds R_PPC_ADDR24 to lld.  I didn't find
> code in upstream lld's git for R_PPC_ADDR24.  We need R_PPC_ADDR24 for
> "ba" and "bla" in locore.S.

I suppose llvm doesn't generate these relocations.

> The second part edits the kernel's Makefile.macppc.  I add gapdummy
> (like in Makefile.powerpc64) to avoid an lld error.  I also adapt a
> part of Makefile.i386, so my powerpc64 can build and link the macppc
> kernel.  (I didn't boot that kernel.)  My macppc can now build, link,
> and boot the GENERIC kernel with either ld.bfd or ld.lld.
> 
> ok to commit?

ok kettenis@

> Index: gnu/llvm/lld/ELF/Arch/PPC.cpp
> ===================================================================
> RCS file: /cvs/src/gnu/llvm/lld/ELF/Arch/PPC.cpp,v
> retrieving revision 1.1.1.1
> diff -u -p -r1.1.1.1 PPC.cpp
> --- gnu/llvm/lld/ELF/Arch/PPC.cpp     3 Aug 2020 14:32:29 -0000       1.1.1.1
> +++ gnu/llvm/lld/ELF/Arch/PPC.cpp     23 Nov 2020 19:49:47 -0000
> @@ -220,6 +220,7 @@ RelExpr PPC::getRelExpr(RelType type, co
>    case R_PPC_ADDR16_HA:
>    case R_PPC_ADDR16_HI:
>    case R_PPC_ADDR16_LO:
> +  case R_PPC_ADDR24:
>    case R_PPC_ADDR32:
>      return R_ABS;
>    case R_PPC_DTPREL16:
> @@ -344,6 +345,7 @@ void PPC::relocateOne(uint8_t *loc, RelT
>      break;
>    }
>    case R_PPC_REL24:
> +  case R_PPC_ADDR24:
>    case R_PPC_LOCAL24PC:
>    case R_PPC_PLTREL24: {
>      uint32_t mask = 0x03FFFFFC;
> Index: sys/arch/macppc/conf/Makefile.macppc
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/conf/Makefile.macppc,v
> retrieving revision 1.99
> diff -u -p -r1.99 Makefile.macppc
> --- sys/arch/macppc/conf/Makefile.macppc      7 Nov 2019 20:42:28 -0000       
> 1.99
> +++ sys/arch/macppc/conf/Makefile.macppc      23 Nov 2020 19:49:49 -0000
> @@ -53,6 +53,13 @@ CFLAGS=            ${DEBUG} ${CWARNFLAGS} ${CMACHF
>  AFLAGS=              -D_LOCORE ${CMACHFLAGS}
>  LINKFLAGS=   -N -Ttext 100114 -e start --warn-common -nopie
>  
> +.if ${MACHINE} == "powerpc64"
> +CFLAGS+=     -m32
> +AFLAGS+=     -m32
> +LDFLAGS=     -melf32ppc
> +LINKFLAGS+=  ${LDFLAGS}
> +.endif
> +
>  HOSTCC?=     ${CC}
>  HOSTED_CPPFLAGS=${CPPFLAGS:S/^-nostdinc$//}
>  HOSTED_CFLAGS=       ${CFLAGS}
> @@ -123,12 +130,16 @@ ioconf.o: ioconf.c
>  ld.script: ${_machdir}/conf/ld.script
>       cp ${_machdir}/conf/ld.script $@
>  
> +gapdummy.o:
> +     echo '__asm(".section .rodata,\"a\"");' > gapdummy.c
> +     ${CC} -c ${CFLAGS} ${CPPFLAGS} gapdummy.c -o $@
> +
>  makegap.sh:
>       cp $S/conf/makegap.sh $@
>  
> -MAKE_GAP = LD="${LD}" sh makegap.sh 0x00000000       # guaranteed illegal
> +MAKE_GAP = LD="${LD}" sh makegap.sh 0x00000000 gapdummy.o
>  
> -gap.o:       Makefile makegap.sh vers.o
> +gap.o:       Makefile makegap.sh gapdummy.o vers.o
>       ${MAKE_GAP}
>  
>  vers.o: ${SYSTEM_DEP:Ngap.o}
> @@ -137,7 +148,7 @@ vers.o: ${SYSTEM_DEP:Ngap.o}
>  
>  clean:
>       rm -f *bsd *bsd.gdb *.[dio] [a-z]*.s assym.* \
> -         gap.link ld.script lorder makegap.sh param.c
> +         gap.link gapdummy.c ld.script lorder makegap.sh param.c
>  
>  cleandir: clean
>       rm -f Makefile *.h ioconf.c options machine ${_mach} vers.c
> 
> 

Reply via email to