Hello tech list,

I want macppc to switch from ld.bfd to ld.lld, but there is a problem
when lld links ofwboot or the kernel.  I propose to fix it by adding
ld.script for both.  These scripts also work with ld.bfd, so I want to
commit my diff at the end of this mail, ok?

lld sets the symbol "etext" to a nonsense value like 0x10000034.  In
ofwboot, wrong "etext" causes freeze, failure to boot kernel.  (Wrong
"etext" in kernel doesn't cause an obvious problem.)  Other lld arches
use an ld.script to set a correct "etext" in kernel.

I copied the ld.script from powerpc64's kernel and made these changes
for macppc's kernel:
 - change "_start" to "start" to match macppc/locore0.S
 - remove PT_DYNAMIC and sections (don't exist in macppc kernel)
 - put .text at 0x00100114 to match Makefile
 - remove symbols like "_erodata" (not used by macppc kernel)
 - add ".rodata.*" and such, so sections and segments look correct

| --- arch/powerpc64/conf/ld.script     Sat Jul 18 09:16:32 2020
| +++ arch/macppc/conf/ld.script        Sat Apr 24 11:52:34 2021
| @@ -16,18 +16,17 @@
|   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|   */
|  
| -ENTRY(_start)
| +ENTRY(start)
|  
|  PHDRS
|  {
|       text PT_LOAD;
| -     dynamic PT_DYNAMIC;
|       openbsd_randomize PT_OPENBSD_RANDOMIZE;
|  }
|  
|  SECTIONS
|  {
| -     . = 0x00100000;
| +     . = 0x00100114;
|       .text :
|       {
|               *(.text)
| @@ -35,49 +34,35 @@
|       PROVIDE (etext = .);
|       PROVIDE (_etext = .);
|  
| -     . = ALIGN(4096);
| -     .rela.dyn : { *(.rela.dyn) }
| -
| -     .dynamic :
| +     .rodata :
|       {
| -             *(.dynamic)
| -     } :dynamic :text
| +             *(.rodata .rodata.*)
| +     } :text
|  
| -     .rodata :
| +     .data.rel.ro :
|       {
| -             *(.rodata)
|               *(.data.rel.ro)
|       } :text
|  
|       .openbsd.randomdata :
|       {
| -             *(.openbsd.randomdata)
| +             *(.openbsd.randomdata .openbsd.randomdata.*)
|       } :openbsd_randomize :text
| -     PROVIDE (_erodata = .);
|  
| -     . = ALIGN(4096);
|       .data :
|       {
|               *(.data)
|       } :text
|  
| -     . = ALIGN(4096);
| -     .got : { *(.got) }
| -     .toc : { *(.toc) }
| +     .sbss :
| +     {
| +             *(.sbss)
| +     }
|  
| -     PROVIDE (__bss_start = .);
|       .bss :
|       {
|               *(.bss)
|       }
|       PROVIDE (end = .);
|       PROVIDE (_end = .);
| -
| -     /DISCARD/ :
| -     {
| -             *(.dynsym)
| -             *(.dynstr)
| -             *(.gnu.hash)
| -             *(.hash)
| -     }
|  }

Then I made these changes for ofwboot:
 - use "_start" and 0x00020000 to match Makefile
 - remove randomdata (doesn't exist in ofwboot)

| --- arch/macppc/conf/ld.script        Sat Apr 24 11:52:34 2021
| +++ arch/macppc/stand/ofwboot/ld.script       Sat Apr 24 11:52:34 2021
| @@ -16,17 +16,17 @@
|   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|   */
|  
| -ENTRY(start)
| +ENTRY(_start)
|  
|  PHDRS
|  {
|       text PT_LOAD;
| -     openbsd_randomize PT_OPENBSD_RANDOMIZE;
|  }
|  
|  SECTIONS
|  {
| -     . = 0x00100114;
| +     /* Must match RELOC in Makefile */
| +     . = 0x00020000;
|       .text :
|       {
|               *(.text)
| @@ -43,11 +43,6 @@
|       {
|               *(.data.rel.ro)
|       } :text
| -
| -     .openbsd.randomdata :
| -     {
| -             *(.openbsd.randomdata .openbsd.randomdata.*)
| -     } :openbsd_randomize :text
|  
|       .data :
|       {

Index: arch/macppc/conf/Makefile.macppc
===================================================================
RCS file: /cvs/src/sys/arch/macppc/conf/Makefile.macppc,v
retrieving revision 1.101
diff -u -p -r1.101 Makefile.macppc
--- arch/macppc/conf/Makefile.macppc    28 Jan 2021 17:39:03 -0000      1.101
+++ arch/macppc/conf/Makefile.macppc    6 May 2021 20:01:08 -0000
@@ -51,7 +51,7 @@ DEBUG?=               -g
 COPTIMIZE?=    -O2
 CFLAGS=                ${DEBUG} ${CWARNFLAGS} ${CMACHFLAGS} ${COPTIMIZE} 
${COPTS} ${PIPE}
 AFLAGS=                -D_LOCORE ${CMACHFLAGS}
-LINKFLAGS=     -N -Ttext 100114 -e start --warn-common -nopie
+LINKFLAGS=     -N -T ld.script --warn-common -nopie
 
 .if ${MACHINE} == "powerpc64"
 CFLAGS+=       -m32
Index: arch/macppc/conf/ld.script
===================================================================
RCS file: /cvs/src/sys/arch/macppc/conf/ld.script,v
retrieving revision 1.1
diff -u -p -r1.1 ld.script
--- arch/macppc/conf/ld.script  13 Jun 2017 01:42:52 -0000      1.1
+++ arch/macppc/conf/ld.script  6 May 2021 20:01:08 -0000
@@ -0,0 +1,68 @@
+/*     $OpenBSD: ld.script,v 1.4 2020/07/18 13:16:32 kettenis Exp $    */
+
+/*
+ * Copyright (c) 2013 Mark Kettenis <kette...@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+ENTRY(start)
+
+PHDRS
+{
+       text PT_LOAD;
+       openbsd_randomize PT_OPENBSD_RANDOMIZE;
+}
+
+SECTIONS
+{
+       . = 0x00100114;
+       .text :
+       {
+               *(.text)
+       } :text
+       PROVIDE (etext = .);
+       PROVIDE (_etext = .);
+
+       .rodata :
+       {
+               *(.rodata .rodata.*)
+       } :text
+
+       .data.rel.ro :
+       {
+               *(.data.rel.ro)
+       } :text
+
+       .openbsd.randomdata :
+       {
+               *(.openbsd.randomdata .openbsd.randomdata.*)
+       } :openbsd_randomize :text
+
+       .data :
+       {
+               *(.data)
+       } :text
+
+       .sbss :
+       {
+               *(.sbss)
+       }
+
+       .bss :
+       {
+               *(.bss)
+       }
+       PROVIDE (end = .);
+       PROVIDE (_end = .);
+}
Index: arch/macppc/stand/ofwboot/Makefile
===================================================================
RCS file: /cvs/src/sys/arch/macppc/stand/ofwboot/Makefile,v
retrieving revision 1.20
diff -u -p -r1.20 Makefile
--- arch/macppc/stand/ofwboot/Makefile  16 Mar 2020 07:02:10 -0000      1.20
+++ arch/macppc/stand/ofwboot/Makefile  6 May 2021 20:01:08 -0000
@@ -31,18 +31,17 @@ SRCS+=              moddi3.c
 
 NEWVERSWHAT=   "OpenFirmware Boot"
 
-# For now...
+# Must match . in ld.script
 RELOC=         20000
 
-ENTRY=         _start
-
 CPPFLAGS+=     -I. -I${.CURDIR}/../../.. -I${.CURDIR}/../../../..
 CPPFLAGS+=     -DRELOC=0x${RELOC} -DCONSPEED=57600
 
 LIBS!=          cd $(.CURDIR)/$(R); $(MAKE) libdep
 
-${PROG}: ${OBJS} ${LIBSA} ${LIBZ}
-       ${LD} -nopie -znorelro -N -X -Ttext ${RELOC} -e ${ENTRY} -o ${PROG} \
+${PROG}: ${OBJS} ${LIBSA} ${LIBZ} ld.script
+       pwd
+       ${LD} -nopie -znorelro -N -X -T ${.CURDIR}/ld.script -o ${PROG} \
            ${OBJS} ${LIBS}
 
 .include <bsd.prog.mk>
Index: arch/macppc/stand/ofwboot/ld.script
===================================================================
RCS file: arch/macppc/stand/ofwboot/ld.script
diff -N arch/macppc/stand/ofwboot/ld.script
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ arch/macppc/stand/ofwboot/ld.script 6 May 2021 20:01:08 -0000
@@ -0,0 +1,63 @@
+/*     $OpenBSD: ld.script,v 1.4 2020/07/18 13:16:32 kettenis Exp $    */
+
+/*
+ * Copyright (c) 2013 Mark Kettenis <kette...@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+ENTRY(_start)
+
+PHDRS
+{
+       text PT_LOAD;
+}
+
+SECTIONS
+{
+       /* Must match RELOC in Makefile */
+       . = 0x00020000;
+       .text :
+       {
+               *(.text)
+       } :text
+       PROVIDE (etext = .);
+       PROVIDE (_etext = .);
+
+       .rodata :
+       {
+               *(.rodata .rodata.*)
+       } :text
+
+       .data.rel.ro :
+       {
+               *(.data.rel.ro)
+       } :text
+
+       .data :
+       {
+               *(.data)
+       } :text
+
+       .sbss :
+       {
+               *(.sbss)
+       }
+
+       .bss :
+       {
+               *(.bss)
+       }
+       PROVIDE (end = .);
+       PROVIDE (_end = .);
+}

Reply via email to