> Date: Fri, 7 May 2021 00:04:57 -0400
> From: George Koehler <kern...@gmail.com>
> 
> 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

Makes sense to me.  It seems ldd always seems to require a little bit
more coercion to produce non-standard binaries.  We use linker scripts
for the various EFI bootloaders as well.

ok kettenis@

> | --- 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