Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Dec 2015 19:34:35 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>
Subject:   powerpc64 11.0-CURRENT lib32/libc.so.7 _init dies (powerpc64-gcc/WITH_LIBCPLUSPLUS based): details of how
Message-ID:  <3FCCD60E-E5EB-4BB4-8C4A-767AE93C8945@dsl-only.net>

next in thread | raw e-mail | index | archive | help
If I avoid use of lib32 I can use powerpc64-gcc on a powerpc64 PowerMac =
G5 to build and then install kernel and world, including WITH_BOOT=3D. =
Rebooting and running works fine. WITH_LIB32=3D does build and install =
as well --but it does not run fine.

After the reboot compiling/linking the below source code with -m32 via =
powerpc64-gcc running the a.out has lib32/libc.so.7 die in libc.so.7's =
_init:

> # more main.c
> int main()
> {
>     return 0;
> }

> # file a.out
> a.out: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 =
(FreeBSD), dynamically linked, interpreter /libexec/ld-elf32.so.1, =
FreeBSD-style, for FreeBSD 11.0 (1100091), not stripped


> Reading symbols from a.out...(no debugging symbols found)...done.
> (gdb) start
> Temporary breakpoint 1 at 0x1800684
> Starting program: /root/c_tests/a.out=20
>=20
> Program received signal SIGSEGV, Segmentation fault.
> 0x41867ee0 in _init () from /usr/lib32/libc.so.7
> (gdb) x/20i 0x41867ecc
>    0x41867ecc <_init>:	stwu    r1,-16(r1)
>    0x41867ed0 <_init+4>:	mflr    r0
>    0x41867ed4 <_init+8>:	stw     r31,12(r1)
>    0x41867ed8 <_init+12>:	stw     r0,20(r1)
>    0x41867edc <_init+16>:	mr      r31,r1
> =3D> 0x41867ee0 <_init+20>:	lwz     r3,-11432(r30)
>    0x41867ee4 <_init+24>:	lwz     r9,0(r3)
>    0x41867ee8 <_init+28>:	cmpwi   cr7,r9,0
>    0x41867eec <_init+32>:	beq     cr7,0x41867f04 <_init+56>

. . . so r30 is as it was at the indirect call from objlist_call_init . =
. .

> (gdb) x/150i objlist_call_init
>    0x41814c74 <objlist_call_init>:	stwu    r1,-64(r1)
>    0x41814c78 <objlist_call_init+4>:	mflr    r0
>    0x41814c7c <objlist_call_init+8>:	bl      0x4183bb58
>    0x41814c80 <objlist_call_init+12>:	li      r8,0
>    0x41814c84 <objlist_call_init+16>:	stw     r30,56(r1)
>    0x41814c88 <objlist_call_init+20>:	mflr    r30
> . . .
>    0x41814d88 <objlist_call_init+276>:	bl      0x418131b0 =
<ld_utrace_log>
>    0x41814d8c <objlist_call_init+280>:	lwz     r9,4(r28)
>    0x41814d90 <objlist_call_init+284>:	lwz     r5,256(r9)
>    0x41814d94 <objlist_call_init+288>:	mtctr   r5
>    0x41814d98 <objlist_call_init+292>:	bctrl
> . . .

. . . which established r30=3D=3D0x4183bb58+4 (from the bl prior to the =
mflr above). . .

> (gdb) x/4i 0x4183bb58
>    0x4183bb58:	blrl
>    0x4183bb5c <_SDA_BASE_>:	.long 0x2b3f8
>    0x4183bb60 <_SDA_BASE_+4>:	.long 0x0
>    0x4183bb64 <_SDA_BASE_+8>:	.long 0x0
> (gdb) info registers
> r0             0x41814d9c	1098993052
> r1             0xffffd730	4294956848
> r2             0x41835508	1099126024
> r3             0x0	0
> r4             0x4183c4dc	1099154652
> r5             0x41867ecc	1099333324
> r6             0x0	0
> r7             0x1000	4096
> r8             0x0	0
> r9             0x0	0
> r10            0x4182f200	1099100672
> r11            0xffffd780	4294956928
> r12            0x41814d58	1098992984
> r13            0x0	0
> r14            0x6474e552	1685382482
> r15            0x6474e551	1685382481
> r16            0x2	2
> r17            0x4183b48c	1099150476
> r18            0x4182f000	1099100160
> r19            0x0	0
> r20            0x1	1
> r21            0x0	0
> r22            0x4183bb90	1099152272
> r23            0xffffd788	4294956936
> r24            0x4183bbb4	1099152308
> r25            0x4183bbc8	1099152328
> r26            0x4183bbcc	1099152332
> r27            0x4183bbec	1099152364
> r28            0x41830050	1099104336
> r29            0x0	0
> r30            0x4183bb5c	1099152220
> r31            0xffffd730	4294956848
> pc             0x41867ee0	0x41867ee0 <_init+20>
> msr            <unavailable>
> cr             0x28000482	671089794
> lr             0x41814d9c	0x41814d9c <objlist_call_init+296>
> ctr            0x41867ecc	1099333324
> xer            0x20000000	536870912
> (gdb) x 0x4183bb5c-11432
>    0x41838eb4:	Cannot access memory at address 0x41838eb4

That subtraction being from "lwz     r3,-11432(r30)".

My guess would be that the r30 value and the offset in _init are not =
matched up correctly. I've not tracked down where the _init code at and =
after _init+20 comes from (i.e., _init at and after 0x41867ee0).


Context details, ignore unless you care:
(tabs and such probably not preserved)

> # freebsd-version -ku; uname -aKU
> 11.0-CURRENT
> 11.0-CURRENT
> FreeBSD FBSDG5C0 11.0-CURRENT FreeBSD 11.0-CURRENT #1 r291891M: Wed =
Dec  9 09:15:33 PST 2015     =
root@FBSDG5C0:/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/sys/GENERIC64v=
tsc-NODEBUG  powerpc 1100091 1100091

> # more ~/src.configs/src.conf.powerpc64-xtoolchain.powerpc64-host=20
> KERNCONF=3DGENERIC64vtsc-NODEBUG
> TARGET=3Dpowerpc
> TARGET_ARCH=3Dpowerpc64
> WITHOUT_CROSS_COMPILER=3D
> #
> # 1 thing that fails to build if attempted:
> WITHOUT_CLANG_EXTRAS=3D
> #
> WITH_FAST_DEPEND=3D
> WITH_LIBCPLUSPLUS=3D
> WITH_LIB32=3D
> WITH_BOOT=3D
> WITH_CLANG=3D
> WITH_CLANG_IS_CC=3D
> WITH_CLANG_FULL=3D
> WITH_LLDB=3D
> #
> WITHOUT_GCC=3D
> WITHOUT_GNUCXX=3D
> #
> NO_WERROR=3D
> MALLOC_PRODUCTION=3D
> #CFLAGS+=3D -DELF_VERBOSE
> #
> WITH_DEBUG=3D
> WITH_DEBUG_FILES=3D
> #
> CC=3D/usr/local/bin/powerpc64-portbld-freebsd11.0-gcc
> CXX=3D/usr/local/bin/powerpc64-portbld-freebsd11.0-g++
> CPP=3D/usr/local/bin/powerpc64-portbld-freebsd11.0-cpp
> CROSS_BINUTILS_PREFIX=3D/usr/local/powerpc64-freebsd/bin/
> X_COMPILER_TYPE=3Dgcc
> #
> DEPFLAGS+=3D -isystem =
/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/include/. =
-I/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/include/c++/v1/. =
-I/usr/include/c++/v1/.
> #
> CFLAGS+=3D -isystem =
/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/include/. =
-Wl,-rpath-link =
-Wl,/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/lib/. =
-Wl,-rpath-link =
-Wl,/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/lib/. =
-L/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/lib/. =
-L/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/lib/.
> #
> LDFLAGS+=3D -Wl,-rpath-link =
-Wl,/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/lib/. =
-Wl,-rpath-link =
-Wl,/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/lib/. =
-L/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/lib/. =
-L/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/lib/.
> #
> CXXFLAGS+=3D -isystem =
/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/include/. =
-I/usr/obj/xtoolchain/powerpc.powerpc64/usr/src/tmp/usr/include/c++/v1/. =
-std=3Dgnu++11
> #
> CXXFLAGS+=3D -I/usr/include/c++/v1/. -std=3Dgnu++11 -L/usr/lib/.

> # svnlite diff /usr/src/
> Index: /usr/src/sys/boot/ofw/Makefile.inc
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- /usr/src/sys/boot/ofw/Makefile.inc	(revision 291891)
> +++ /usr/src/sys/boot/ofw/Makefile.inc	(working copy)
> @@ -2,7 +2,7 @@
> =20
>  .if ${MACHINE_ARCH} =3D=3D "powerpc64"
>  CFLAGS+=3D	-m32 -mcpu=3Dpowerpc
> -LDFLAGS+=3D	-m elf32ppc_fbsd
> +LDFLAGS+=3D	-Wl,-m -Wl,elf32ppc_fbsd
>  .endif
> =20
>  .include "../Makefile.inc"
> Index: /usr/src/sys/boot/powerpc/Makefile.inc
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- /usr/src/sys/boot/powerpc/Makefile.inc	(revision 291891)
> +++ /usr/src/sys/boot/powerpc/Makefile.inc	(working copy)
> @@ -2,6 +2,7 @@
> =20
>  .if ${MACHINE_ARCH} =3D=3D "powerpc64"
>  CFLAGS+=3D	-m32 -mcpu=3Dpowerpc
> +LDFLAGS+=3D	-Wl,-m -Wl,elf32ppc_fbsd
>  .endif
> =20
>  .include "../Makefile.inc"
> Index: /usr/src/sys/boot/uboot/Makefile.inc
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- /usr/src/sys/boot/uboot/Makefile.inc	(revision 291891)
> +++ /usr/src/sys/boot/uboot/Makefile.inc	(working copy)
> @@ -2,7 +2,7 @@
> =20
>  .if ${MACHINE_ARCH} =3D=3D "powerpc64"
>  CFLAGS+=3D	-m32 -mcpu=3Dpowerpc
> -LDFLAGS+=3D	-m elf32ppc_fbsd
> +LDFLAGS+=3D	-Wl,-m -Wl,elf32ppc_fbsd
>  .endif
> =20
>  .include "../Makefile.inc"
> Index: /usr/src/sys/powerpc/ofw/ofw_machdep.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- /usr/src/sys/powerpc/ofw/ofw_machdep.c	(revision 291891)
> +++ /usr/src/sys/powerpc/ofw/ofw_machdep.c	(working copy)
> @@ -110,6 +110,23 @@
>  	 * Assume that interrupt are disabled at this point, or
>  	 * SPRG1-3 could be trashed
>  	 */
> +#if defined(AIM) && defined(__powerpc64__)
> +/* HACK: PowerMac G5 specific code to avoid demonstrated hangs in
> + *       the early boot time frame.
> + *       This would need a live test for PowerMac vs. not in order
> + *       to remove HACK status.
> + */
> +	if (1)
> +		__asm __volatile("mfsprg0 %0\n\t"
> +				 "mtsprg1 %1\n\t"
> +				 "mtsprg2 %2\n\t"
> +				 "mtsprg3 %3\n\t"
> +				 : "=3D&r"(ofw_sprg0_save)
> +				 : "r"(ofmsr[2]),
> +				 "r"(ofmsr[3]),
> +				 "r"(ofmsr[4]));
> +	else
> +#endif
>  	__asm __volatile("mfsprg0 %0\n\t"
>  			 "mtsprg0 %1\n\t"
>  	    		 "mtsprg1 %2\n\t"

> # svnlite diff /usr/ports/
> Index: =
/usr/ports/devel/powerpc64-gcc/files/patch-gcc-freebsd-powerpc64
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- /usr/ports/devel/powerpc64-gcc/files/patch-gcc-freebsd-powerpc64	=
(revision 403711)
> +++ /usr/ports/devel/powerpc64-gcc/files/patch-gcc-freebsd-powerpc64	=
(working copy)
> @@ -1,5 +1,5 @@
> ---- gcc/config/rs6000/freebsd64.h	2015-11-28 09:06:13.019999000 =
-0800
> -+++ gcc/config/rs6000/freebsd64.h	2015-11-28 09:16:10.459373000 =
-0800
> +--- gcc/config/rs6000/freebsd64.h.orig	2015-01-05 =
04:33:28.000000000 -0800
> ++++ gcc/config/rs6000/freebsd64.h	2015-12-09 00:14:28.520684000 =
-0800
>  @@ -65,6 +65,13 @@
>   #define INVALID_64BIT "-m%s not supported in this configuration"
>   #define INVALID_32BIT INVALID_64BIT
> @@ -27,3 +27,12 @@
>   	  if (rs6000_isa_flags & OPTION_MASK_EABI)		\
>   	    {							\
>   	      rs6000_isa_flags &=3D ~OPTION_MASK_EABI;		\
> +@@ -304,7 +317,7 @@
> +=20
> + /* rs6000.h gets this wrong for FreeBSD.  We use the GCC defaults =
instead.  */
> + #undef WCHAR_TYPE
> +-#define	WCHAR_TYPE      (TARGET_64BIT ? "int" : "long int")
> ++#define	WCHAR_TYPE      "int"
> + #undef  WCHAR_TYPE_SIZE
> + #define WCHAR_TYPE_SIZE 32
> +=20

powerpc64-gcc's misclassification of the base type for L". . ." notation =
does need to be patched. Otherwise building lib32 fails for type errors. =
That is what the above is for.

Having a powerpc64 self-host powerpc64-gcc has a work around of copying =
6 files to the right names/places near the end of the powerpc64-gcc =
build and continuing it from that state. (I've not made a patch to deal =
with powerpc64-gcc not really being a cross-compiler context for this.)

> # ls -l /usr/lib/libstdc+*
> lrwxr-xr-x  1 root  wheel  8 Dec  5 05:41 /usr/lib/libstdc++.a -> =
libc++.a
> lrwxr-xr-x  1 root  wheel  9 Dec  5 05:41 /usr/lib/libstdc++.so -> =
libc++.so

> # ls -l /usr/bin/g[c+][c+]
> lrwxr-xr-x  1 root  wheel  48 Dec  5 05:38 /usr/bin/g++ -> =
/usr/local/bin/powerpc64-portbld-freebsd11.0-g++
> lrwxr-xr-x  1 root  wheel  48 Dec  5 05:38 /usr/bin/gcc -> =
/usr/local/bin/powerpc64-portbld-freebsd11.0-gcc

These symbolic links deal with some environment-forced/automatic =
references to what would otherwise be to missing files.

=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3FCCD60E-E5EB-4BB4-8C4A-767AE93C8945>