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.

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?

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