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