All of lore.kernel.org
 help / color / mirror / Atom feed
* bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
@ 2017-01-03 15:25 Christian Kujau
  2017-01-03 19:20 ` Christian Kujau
                   ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: Christian Kujau @ 2017-01-03 15:25 UTC (permalink / raw)
  To: Christophe Leroy; +Cc: Michael Ellerman, linuxppc-dev

Hi,

when compiling v4.10-rc2 with CONFIG_CC_STACKPROTECTOR_STRONG=y, the 
linker fails with:

================================
+ ld -EB -m elf32ppc -Bstatic --build-id -X -o .tmp_vmlinux1 -T 
./arch/powerpc/kernel/vmlinux.lds arch/powerpc/kernel/head_32.o 
arch/powerpc/kernel/fpu.o arch/powerpc/kernel/vector.o 
arch/powerpc/kernel/prom_init.o init/built-in.o --start-group 
usr/built-in.o arch/powerpc/kernel/built-in.o arch/powerpc/mm/built-in.o 
arch/powerpc/lib/built-in.o arch/powerpc/sysdev/built-in.o 
arch/powerpc/platforms/built-in.o arch/powerpc/math-emu/built-in.o 
arch/powerpc/crypto/built-in.o arch/powerpc/net/built-in.o 
kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o 
ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o 
lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o 
firmware/built-in.o net/built-in.o virt/built-in.o --end-group
arch/powerpc/platforms/built-in.o: In function `bootx_printf':
/usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
arch/powerpc/platforms/built-in.o: In function `bootx_add_display_props':
/usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined reference to `__stack_chk_fail_local'
arch/powerpc/platforms/built-in.o: In function 
`bootx_scan_dt_build_struct':
/usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined reference to `__stack_chk_fail_local'
arch/powerpc/platforms/built-in.o: In function `bootx_init':
/usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:596: undefined reference to `__stack_chk_fail_local'
/usr/bin/ld.bfd.real: .tmp_vmlinux1: hidden symbol `__stack_chk_fail_local' isn't defined
/usr/bin/ld.bfd.real: final link failed: Bad value
================================


$ ld --version | head -1
GNU ld (GNU Binutils for Debian) 2.25

$ gcc --version | head -1
gcc-4.9.real (Debian 4.9.2-10) 4.9.2


I'm regularly compiling userspace programs with -fstack-protector w/o 
problems. I suspect it's either 6533b7c16ee5712041b4e324100550e02a9a5dda 
("powerpc: Initial stack protector (-fstack-protector) support") or 
902e06eb86cd62753974c249bd1dedae2825b430 ("powerpc/32: Change the stack 
protector canary value per task") or both but I haven't started the 
bisection yet.

Any other ideas?

Thanks,
Christian.
-- 
BOFH excuse #220:

Someone thought The Big Red Button was a light switch.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-03 15:25 bootx_init.c:88: undefined reference to `__stack_chk_fail_local' Christian Kujau
@ 2017-01-03 19:20 ` Christian Kujau
  2017-01-03 22:50 ` Benjamin Herrenschmidt
  2017-01-04  7:32 ` Christophe LEROY
  2 siblings, 0 replies; 21+ messages in thread
From: Christian Kujau @ 2017-01-03 19:20 UTC (permalink / raw)
  To: Christophe Leroy; +Cc: linuxppc-dev, Michael Ellerman

On Tue, 3 Jan 2017, Christian Kujau wrote:
> when compiling v4.10-rc2 with CONFIG_CC_STACKPROTECTOR_STRONG=y, the 
> linker fails with:

FWIW, compiling with CONFIG_CC_STACKPROTECTOR_REGULAR=y instead works 
just fine.

C.

> 
> ================================
> + ld -EB -m elf32ppc -Bstatic --build-id -X -o .tmp_vmlinux1 -T 
> ./arch/powerpc/kernel/vmlinux.lds arch/powerpc/kernel/head_32.o 
> arch/powerpc/kernel/fpu.o arch/powerpc/kernel/vector.o 
> arch/powerpc/kernel/prom_init.o init/built-in.o --start-group 
> usr/built-in.o arch/powerpc/kernel/built-in.o arch/powerpc/mm/built-in.o 
> arch/powerpc/lib/built-in.o arch/powerpc/sysdev/built-in.o 
> arch/powerpc/platforms/built-in.o arch/powerpc/math-emu/built-in.o 
> arch/powerpc/crypto/built-in.o arch/powerpc/net/built-in.o 
> kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o 
> ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o 
> lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o 
> firmware/built-in.o net/built-in.o virt/built-in.o --end-group
> arch/powerpc/platforms/built-in.o: In function `bootx_printf':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function `bootx_add_display_props':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function 
> `bootx_scan_dt_build_struct':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function `bootx_init':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:596: undefined reference to `__stack_chk_fail_local'
> /usr/bin/ld.bfd.real: .tmp_vmlinux1: hidden symbol `__stack_chk_fail_local' isn't defined
> /usr/bin/ld.bfd.real: final link failed: Bad value
> ================================
> 
> 
> $ ld --version | head -1
> GNU ld (GNU Binutils for Debian) 2.25
> 
> $ gcc --version | head -1
> gcc-4.9.real (Debian 4.9.2-10) 4.9.2
> 
> 
> I'm regularly compiling userspace programs with -fstack-protector w/o 
> problems. I suspect it's either 6533b7c16ee5712041b4e324100550e02a9a5dda 
> ("powerpc: Initial stack protector (-fstack-protector) support") or 
> 902e06eb86cd62753974c249bd1dedae2825b430 ("powerpc/32: Change the stack 
> protector canary value per task") or both but I haven't started the 
> bisection yet.
> 
> Any other ideas?
> 
> Thanks,
> Christian.
> -- 
> BOFH excuse #220:
> 
> Someone thought The Big Red Button was a light switch.
> 

-- 
BOFH excuse #413:

Cow-tippers tipped a cow onto the server.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-03 15:25 bootx_init.c:88: undefined reference to `__stack_chk_fail_local' Christian Kujau
  2017-01-03 19:20 ` Christian Kujau
@ 2017-01-03 22:50 ` Benjamin Herrenschmidt
  2017-01-03 22:57   ` Christian Kujau
  2017-01-04  8:23   ` Christophe LEROY
  2017-01-04  7:32 ` Christophe LEROY
  2 siblings, 2 replies; 21+ messages in thread
From: Benjamin Herrenschmidt @ 2017-01-03 22:50 UTC (permalink / raw)
  To: Christian Kujau, Christophe Leroy; +Cc: linuxppc-dev

On Tue, 2017-01-03 at 07:25 -0800, Christian Kujau wrote:
> Hi,
> 
> when compiling v4.10-rc2 with CONFIG_CC_STACKPROTECTOR_STRONG=y, the 
> linker fails with:

The way gcc implements the stack protector has some serious
incompatibilities with the way the Linux kernel uses r13, I wouldn't
even try until we sort that out...

Cheers,
Ben.
> 
> ================================
> + ld -EB -m elf32ppc -Bstatic --build-id -X -o .tmp_vmlinux1 -T 
> ./arch/powerpc/kernel/vmlinux.lds arch/powerpc/kernel/head_32.o 
> arch/powerpc/kernel/fpu.o arch/powerpc/kernel/vector.o 
> arch/powerpc/kernel/prom_init.o init/built-in.o --start-group 
> usr/built-in.o arch/powerpc/kernel/built-in.o arch/powerpc/mm/built-
> in.o 
> arch/powerpc/lib/built-in.o arch/powerpc/sysdev/built-in.o 
> arch/powerpc/platforms/built-in.o arch/powerpc/math-emu/built-in.o 
> arch/powerpc/crypto/built-in.o arch/powerpc/net/built-in.o 
> kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o 
> ipc/built-in.o security/built-in.o crypto/built-in.o block/built-
> in.o 
> lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o 
> firmware/built-in.o net/built-in.o virt/built-in.o --end-group
> arch/powerpc/platforms/built-in.o: In function `bootx_printf':
> /usr/local/src/linux-
> git/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined
> reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function
> `bootx_add_display_props':
> /usr/local/src/linux-
> git/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined
> reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function 
> `bootx_scan_dt_build_struct':
> /usr/local/src/linux-
> git/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined
> reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function `bootx_init':
> /usr/local/src/linux-
> git/arch/powerpc/platforms/powermac/bootx_init.c:596: undefined
> reference to `__stack_chk_fail_local'
> /usr/bin/ld.bfd.real: .tmp_vmlinux1: hidden symbol
> `__stack_chk_fail_local' isn't defined
> /usr/bin/ld.bfd.real: final link failed: Bad value
> ================================
> 
> 
> $ ld --version | head -1
> GNU ld (GNU Binutils for Debian) 2.25
> 
> $ gcc --version | head -1
> gcc-4.9.real (Debian 4.9.2-10) 4.9.2
> 
> 
> I'm regularly compiling userspace programs with -fstack-protector
> w/o 
> problems. I suspect it's either
> 6533b7c16ee5712041b4e324100550e02a9a5dda 
> ("powerpc: Initial stack protector (-fstack-protector) support") or 
> 902e06eb86cd62753974c249bd1dedae2825b430 ("powerpc/32: Change the
> stack 
> protector canary value per task") or both but I haven't started the 
> bisection yet.
> 
> Any other ideas?
> 
> Thanks,
> Christian.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-03 22:50 ` Benjamin Herrenschmidt
@ 2017-01-03 22:57   ` Christian Kujau
  2017-01-04  8:23   ` Christophe LEROY
  1 sibling, 0 replies; 21+ messages in thread
From: Christian Kujau @ 2017-01-03 22:57 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Christophe Leroy, linuxppc-dev, Michael Ellerman

On Wed, 4 Jan 2017, Benjamin Herrenschmidt wrote:
> On Tue, 2017-01-03 at 07:25 -0800, Christian Kujau wrote:
> > Hi,
> > 
> > when compiling v4.10-rc2 with CONFIG_CC_STACKPROTECTOR_STRONG=y, the 
> > linker fails with:
> 
> The way gcc implements the stack protector has some serious
> incompatibilities with the way the Linux kernel uses r13, I wouldn't
> even try until we sort that out...

Yeah, I noticed. While _compilation_ succeeded with 
CONFIG_CC_STACKPROTECTOR_REGULAR=y, the kernel panicked during boot with:

Kernel panic - not syning: stack-protector: Kernel stack is corrupted in: c0103894
CPU: 0 PID: 586 Comm: systemd Tainted: G  W 4.10.0-rc2 #3
Call Trace:
[ee949ca0] [c067d6cc] panic+0x114/0x268 (unreliable)
[ee949d00] [c002be80] print_tainted+0x0/0xcc
[ee949d10] [c0103894] path_openat+0x1014/0x1050
[ee949df0] [c01048dc] do_filp_open+0xac/0xfc
[ee949ea0] [c00f994c] do_open_execat+0x64/0x1bc
[ee949ee0] [c00fb0f8] do_execveat_common+0x24c/0x774
[ee949f30] [c00fb650] do_execve+0x30/0x40
[ee949f40] [c0010db0] ret_from_syscall+0x0/0x38
--- interrupt: c01 at 0x20403618
    LR = 0x204037ac


(written down manually, hopefully w/o typos).

I'll disable the stack protector on this powerpc (G4) machine for now.

Thanks,
Christian.

> 
> Cheers,
> Ben.
> > 
> > ================================
> > + ld -EB -m elf32ppc -Bstatic --build-id -X -o .tmp_vmlinux1 -T 
> > ./arch/powerpc/kernel/vmlinux.lds arch/powerpc/kernel/head_32.o 
> > arch/powerpc/kernel/fpu.o arch/powerpc/kernel/vector.o 
> > arch/powerpc/kernel/prom_init.o init/built-in.o --start-group 
> > usr/built-in.o arch/powerpc/kernel/built-in.o arch/powerpc/mm/built-
> > in.o 
> > arch/powerpc/lib/built-in.o arch/powerpc/sysdev/built-in.o 
> > arch/powerpc/platforms/built-in.o arch/powerpc/math-emu/built-in.o 
> > arch/powerpc/crypto/built-in.o arch/powerpc/net/built-in.o 
> > kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o 
> > ipc/built-in.o security/built-in.o crypto/built-in.o block/built-
> > in.o 
> > lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o 
> > firmware/built-in.o net/built-in.o virt/built-in.o --end-group
> > arch/powerpc/platforms/built-in.o: In function `bootx_printf':
> > /usr/local/src/linux-
> > git/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined
> > reference to `__stack_chk_fail_local'
> > arch/powerpc/platforms/built-in.o: In function
> > `bootx_add_display_props':
> > /usr/local/src/linux-
> > git/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined
> > reference to `__stack_chk_fail_local'
> > arch/powerpc/platforms/built-in.o: In function 
> > `bootx_scan_dt_build_struct':
> > /usr/local/src/linux-
> > git/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined
> > reference to `__stack_chk_fail_local'
> > arch/powerpc/platforms/built-in.o: In function `bootx_init':
> > /usr/local/src/linux-
> > git/arch/powerpc/platforms/powermac/bootx_init.c:596: undefined
> > reference to `__stack_chk_fail_local'
> > /usr/bin/ld.bfd.real: .tmp_vmlinux1: hidden symbol
> > `__stack_chk_fail_local' isn't defined
> > /usr/bin/ld.bfd.real: final link failed: Bad value
> > ================================
> > 
> > 
> > $ ld --version | head -1
> > GNU ld (GNU Binutils for Debian) 2.25
> > 
> > $ gcc --version | head -1
> > gcc-4.9.real (Debian 4.9.2-10) 4.9.2
> > 
> > 
> > I'm regularly compiling userspace programs with -fstack-protector
> > w/o 
> > problems. I suspect it's either
> > 6533b7c16ee5712041b4e324100550e02a9a5dda 
> > ("powerpc: Initial stack protector (-fstack-protector) support") or 
> > 902e06eb86cd62753974c249bd1dedae2825b430 ("powerpc/32: Change the
> > stack 
> > protector canary value per task") or both but I haven't started the 
> > bisection yet.
> > 
> > Any other ideas?
> > 
> > Thanks,
> > Christian.
> 
> 

-- 
BOFH excuse #111:

The salesman drove over the CPU board.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-03 15:25 bootx_init.c:88: undefined reference to `__stack_chk_fail_local' Christian Kujau
  2017-01-03 19:20 ` Christian Kujau
  2017-01-03 22:50 ` Benjamin Herrenschmidt
@ 2017-01-04  7:32 ` Christophe LEROY
  2017-01-04 15:22   ` Christian Kujau
  2017-01-04 18:33   ` Christian Kujau
  2 siblings, 2 replies; 21+ messages in thread
From: Christophe LEROY @ 2017-01-04  7:32 UTC (permalink / raw)
  To: Christian Kujau; +Cc: Michael Ellerman, linuxppc-dev



Le 03/01/2017 à 16:25, Christian Kujau a écrit :
> Hi,
>
> when compiling v4.10-rc2 with CONFIG_CC_STACKPROTECTOR_STRONG=y, the
> linker fails with:
>
> ================================
> + ld -EB -m elf32ppc -Bstatic --build-id -X -o .tmp_vmlinux1 -T
> ./arch/powerpc/kernel/vmlinux.lds arch/powerpc/kernel/head_32.o
> arch/powerpc/kernel/fpu.o arch/powerpc/kernel/vector.o
> arch/powerpc/kernel/prom_init.o init/built-in.o --start-group
> usr/built-in.o arch/powerpc/kernel/built-in.o arch/powerpc/mm/built-in.o
> arch/powerpc/lib/built-in.o arch/powerpc/sysdev/built-in.o
> arch/powerpc/platforms/built-in.o arch/powerpc/math-emu/built-in.o
> arch/powerpc/crypto/built-in.o arch/powerpc/net/built-in.o
> kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o
> ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o
> lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o
> firmware/built-in.o net/built-in.o virt/built-in.o --end-group
> arch/powerpc/platforms/built-in.o: In function `bootx_printf':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function `bootx_add_display_props':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function
> `bootx_scan_dt_build_struct':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined reference to `__stack_chk_fail_local'
> arch/powerpc/platforms/built-in.o: In function `bootx_init':
> /usr/local/src/linux-git/arch/powerpc/platforms/powermac/bootx_init.c:596: undefined reference to `__stack_chk_fail_local'
> /usr/bin/ld.bfd.real: .tmp_vmlinux1: hidden symbol `__stack_chk_fail_local' isn't defined
> /usr/bin/ld.bfd.real: final link failed: Bad value
> ================================
>
>
> $ ld --version | head -1
> GNU ld (GNU Binutils for Debian) 2.25
>
> $ gcc --version | head -1
> gcc-4.9.real (Debian 4.9.2-10) 4.9.2
>
>
> I'm regularly compiling userspace programs with -fstack-protector w/o
> problems. I suspect it's either 6533b7c16ee5712041b4e324100550e02a9a5dda
> ("powerpc: Initial stack protector (-fstack-protector) support") or
> 902e06eb86cd62753974c249bd1dedae2825b430 ("powerpc/32: Change the stack
> protector canary value per task") or both but I haven't started the
> bisection yet.
>
> Any other ideas?
>
> Thanks,
> Christian.
>

Using GCC 5.4.0, I don't have that issue. bootx_init.o only contains 
reference to __stack_chk_fail

Looking a bit over internet, some people have reported having 
encountered that issue due to old object files not properly cleaned.

Have you tried a 'make clean' or 'distclean' ?

Christophe

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-03 22:50 ` Benjamin Herrenschmidt
  2017-01-03 22:57   ` Christian Kujau
@ 2017-01-04  8:23   ` Christophe LEROY
  2017-01-04  8:40     ` Segher Boessenkool
  1 sibling, 1 reply; 21+ messages in thread
From: Christophe LEROY @ 2017-01-04  8:23 UTC (permalink / raw)
  To: benh, Christian Kujau; +Cc: linuxppc-dev



Le 03/01/2017 à 23:50, Benjamin Herrenschmidt a écrit :
> On Tue, 2017-01-03 at 07:25 -0800, Christian Kujau wrote:
>> Hi,
>>
>> when compiling v4.10-rc2 with CONFIG_CC_STACKPROTECTOR_STRONG=y, the
>> linker fails with:
>
> The way gcc implements the stack protector has some serious
> incompatibilities with the way the Linux kernel uses r13, I wouldn't
> even try until we sort that out...

Yes indeed, it looks like recent versions of GCC don't use anymore the 
global __stack_chk_guard variable but a hard coded offset relative to r2 
or r13:

On 32 bits, it uses -7008(r2)
On 64 bits, it uses -7010(r13)

On 32 bits, r2 points to current struct, which contains the stack_canary 
value for the task. I have tried to alter get_current() in order to 
define it as an offset to r2 so that current->stack_canary is at 
-7008(r2), but I end up with circular cross references in header files 
and still have task_struct undefined when get_current() needs it to 
calculate offset of stack_canary within the structure.

When CONFIG_CC_STACKPROTECTOR is active, would it be feasible to get the 
pointer to current from the stack using the thread_info instead of using 
r2 reg ? That way we could keep r2 to point to current->stack_canary + 
0x7008

Christophe

>
> Cheers,
> Ben.
>>
>> ================================
>> + ld -EB -m elf32ppc -Bstatic --build-id -X -o .tmp_vmlinux1 -T
>> ./arch/powerpc/kernel/vmlinux.lds arch/powerpc/kernel/head_32.o
>> arch/powerpc/kernel/fpu.o arch/powerpc/kernel/vector.o
>> arch/powerpc/kernel/prom_init.o init/built-in.o --start-group
>> usr/built-in.o arch/powerpc/kernel/built-in.o arch/powerpc/mm/built-
>> in.o
>> arch/powerpc/lib/built-in.o arch/powerpc/sysdev/built-in.o
>> arch/powerpc/platforms/built-in.o arch/powerpc/math-emu/built-in.o
>> arch/powerpc/crypto/built-in.o arch/powerpc/net/built-in.o
>> kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o
>> ipc/built-in.o security/built-in.o crypto/built-in.o block/built-
>> in.o
>> lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o
>> firmware/built-in.o net/built-in.o virt/built-in.o --end-group
>> arch/powerpc/platforms/built-in.o: In function `bootx_printf':
>> /usr/local/src/linux-
>> git/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined
>> reference to `__stack_chk_fail_local'
>> arch/powerpc/platforms/built-in.o: In function
>> `bootx_add_display_props':
>> /usr/local/src/linux-
>> git/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined
>> reference to `__stack_chk_fail_local'
>> arch/powerpc/platforms/built-in.o: In function
>> `bootx_scan_dt_build_struct':
>> /usr/local/src/linux-
>> git/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined
>> reference to `__stack_chk_fail_local'
>> arch/powerpc/platforms/built-in.o: In function `bootx_init':
>> /usr/local/src/linux-
>> git/arch/powerpc/platforms/powermac/bootx_init.c:596: undefined
>> reference to `__stack_chk_fail_local'
>> /usr/bin/ld.bfd.real: .tmp_vmlinux1: hidden symbol
>> `__stack_chk_fail_local' isn't defined
>> /usr/bin/ld.bfd.real: final link failed: Bad value
>> ================================
>>
>>
>> $ ld --version | head -1
>> GNU ld (GNU Binutils for Debian) 2.25
>>
>> $ gcc --version | head -1
>> gcc-4.9.real (Debian 4.9.2-10) 4.9.2
>>
>>
>> I'm regularly compiling userspace programs with -fstack-protector
>> w/o
>> problems. I suspect it's either
>> 6533b7c16ee5712041b4e324100550e02a9a5dda
>> ("powerpc: Initial stack protector (-fstack-protector) support") or
>> 902e06eb86cd62753974c249bd1dedae2825b430 ("powerpc/32: Change the
>> stack
>> protector canary value per task") or both but I haven't started the
>> bisection yet.
>>
>> Any other ideas?
>>
>> Thanks,
>> Christian.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-04  8:23   ` Christophe LEROY
@ 2017-01-04  8:40     ` Segher Boessenkool
  0 siblings, 0 replies; 21+ messages in thread
From: Segher Boessenkool @ 2017-01-04  8:40 UTC (permalink / raw)
  To: Christophe LEROY; +Cc: benh, Christian Kujau, linuxppc-dev

On Wed, Jan 04, 2017 at 09:23:47AM +0100, Christophe LEROY wrote:
> >The way gcc implements the stack protector has some serious
> >incompatibilities with the way the Linux kernel uses r13, I wouldn't
> >even try until we sort that out...
> 
> Yes indeed, it looks like recent versions of GCC don't use anymore the 
> global __stack_chk_guard variable but a hard coded offset relative to r2 
> or r13:
> 
> On 32 bits, it uses -7008(r2)
> On 64 bits, it uses -7010(r13)

This is https://gcc.gnu.org/PR78875 .  It should have been this way since
forever; if it really wasn't, it is unclear why not.

Either way, we (i.e. GCC) will add some compiler option to make this work
for the kernel.  It will be part of 7 and we'll probably backport it to
6.4 and 5.5 .

For bootx_init.c, this probably should be compiled with -fno-stack-protector
just like all the other boot time stuff.


Segher

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-04  7:32 ` Christophe LEROY
@ 2017-01-04 15:22   ` Christian Kujau
  2017-01-04 18:33   ` Christian Kujau
  1 sibling, 0 replies; 21+ messages in thread
From: Christian Kujau @ 2017-01-04 15:22 UTC (permalink / raw)
  To: Christophe LEROY; +Cc: Michael Ellerman, linuxppc-dev

On Wed, 4 Jan 2017, Christophe LEROY wrote:
> Looking a bit over internet, some people have reported having encountered that
> issue due to old object files not properly cleaned.
> Have you tried a 'make clean' or 'distclean' ?

I'm compiling with O=$DIR and I've deleted the entire $DIR before 
compilation. So no, old object files is not the issue here.

Christian.
-- 
BOFH excuse #105:

UPS interrupted the server's power

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-04  7:32 ` Christophe LEROY
  2017-01-04 15:22   ` Christian Kujau
@ 2017-01-04 18:33   ` Christian Kujau
  2017-01-10  2:11     ` Christian Kujau
  1 sibling, 1 reply; 21+ messages in thread
From: Christian Kujau @ 2017-01-04 18:33 UTC (permalink / raw)
  To: Christophe LEROY
  Cc: Michael Ellerman, linuxppc-dev, Segher Boessenkool,
	Benjamin Herrenschmidt

On Wed, 4 Jan 2017, Christophe LEROY wrote:
> Using GCC 5.4.0, I don't have that issue. bootx_init.o only contains reference
> to __stack_chk_fail

FWIW, building with a GCC 5.2 crosscompiler succeeds (with 
CONFIG_CC_STACKPROTECTOR_STRONG=y), but I don't know if it will boot 
though, see my other mail in this thread:

  https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-January/152623.html

So, would the following be sufficient? It compiles, but I haven't had a 
chance to boot yet.


diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile
index 1eb7b45..c7dcab9 100644
--- a/arch/powerpc/platforms/powermac/Makefile
+++ b/arch/powerpc/platforms/powermac/Makefile
@@ -1,4 +1,4 @@
-CFLAGS_bootx_init.o  		+= -fPIC
+CFLAGS_bootx_init.o  		+= -fPIC -fno-stack-protector
 
 ifdef CONFIG_FUNCTION_TRACER
 # Do not trace early boot code


Thanks,
Christian.
-- 
BOFH excuse #156:

Zombie processes haunting the computer

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-04 18:33   ` Christian Kujau
@ 2017-01-10  2:11     ` Christian Kujau
  2017-01-10  4:32       ` Benjamin Herrenschmidt
  2017-01-10  6:26       ` Christophe LEROY
  0 siblings, 2 replies; 21+ messages in thread
From: Christian Kujau @ 2017-01-10  2:11 UTC (permalink / raw)
  To: Christophe LEROY; +Cc: Benjamin Herrenschmidt, linuxppc-dev

On Wed, 4 Jan 2017, Christian Kujau wrote:
> So, would the following be sufficient? It compiles, but I haven't had a 
> chance to boot yet.
> 

So, with -fno-stack-protector my GCC 4.9.2 compiles with 
CC_STACKPROTECTOR_STRONG=y but panics during boot:


Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: c069278c
CPU: 0 PIP: 591 Comm: systemd Tainted: G       W      4.10.0-rc3-dirty
Call Trace:
[ee965bb0] [c0693f5c] panic+0x120/0x274 (unreliable)
[ee965c10] [c002c568] print_tainted+0x0/0xcc
[ee965c20] [c069278c] schedule_timeout+0x25c/0x280
[ee965c80] [c068cc30] io_schedule_timeout+0x90/0xf4
[ee965ca0] [c00ac870] wait_on_page_bit_killable+0x1Oc/0x170
[ee965cf0] [c00ad240] __lock_page_or_retry+0xd4/0x12c
[ee965d10] [c00ad708] filemap_fault+0x470/0x5b0
[ee965d60] [c00d07c8] __do_fault+0x2c/0x90
[ee965e40] [c00d4104] handle_mm__fault+0x7c0/0x9cc
[ee965e00] [c0015a6c] do_page_fault+0x2ec,0x5b4
[ee965e40] [c0011660] handle_page_fault+0xc/0x80
--- interrupt: 301 at do_page_fault+0x394/0x5b4
    LR = do_page_fault+0x378,0x5b4
[ee965f00] [c0015c04] do_page_fault+0x484/0x5b4 (unreliable)
[ee965f40] [c0011660] handle_page_fault+0xc/0x80
--- interrupt: 401 at 0x2074d000
    LR = 0x207cff0


Maybe ppc32 is not supposed to be built with CC_STACKPROTECTOR ?

Thanks,
Christian.

> 
> diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile
> index 1eb7b45..c7dcab9 100644
> --- a/arch/powerpc/platforms/powermac/Makefile
> +++ b/arch/powerpc/platforms/powermac/Makefile
> @@ -1,4 +1,4 @@
> -CFLAGS_bootx_init.o  		+= -fPIC
> +CFLAGS_bootx_init.o  		+= -fPIC -fno-stack-protector
>  
>  ifdef CONFIG_FUNCTION_TRACER
>  # Do not trace early boot code
> 
> 
> Thanks,
> Christian.
> -- 
> BOFH excuse #156:
> 
> Zombie processes haunting the computer
> 

-- 
BOFH excuse #450:

Terrorists crashed an airplane into the server room, have to remove /bin/laden. (rm -rf /bin/laden)

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-10  2:11     ` Christian Kujau
@ 2017-01-10  4:32       ` Benjamin Herrenschmidt
  2017-01-10  6:12         ` Christophe LEROY
  2017-01-10 18:46         ` Christian Kujau
  2017-01-10  6:26       ` Christophe LEROY
  1 sibling, 2 replies; 21+ messages in thread
From: Benjamin Herrenschmidt @ 2017-01-10  4:32 UTC (permalink / raw)
  To: Christian Kujau, Christophe LEROY; +Cc: linuxppc-dev

On Mon, 2017-01-09 at 18:11 -0800, Christian Kujau wrote:
> So, with -fno-stack-protector my GCC 4.9.2 compiles with 
> CC_STACKPROTECTOR_STRONG=y but panics during boot:

How can it make any sense to have -fno-stack-protector and
CC_STACKPROTECTOR_STRONG=y at the same time ?

Ben.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-10  4:32       ` Benjamin Herrenschmidt
@ 2017-01-10  6:12         ` Christophe LEROY
  2017-01-10 18:46         ` Christian Kujau
  1 sibling, 0 replies; 21+ messages in thread
From: Christophe LEROY @ 2017-01-10  6:12 UTC (permalink / raw)
  To: benh, Christian Kujau; +Cc: linuxppc-dev



Le 10/01/2017 à 05:32, Benjamin Herrenschmidt a écrit :
> On Mon, 2017-01-09 at 18:11 -0800, Christian Kujau wrote:
>> So, with -fno-stack-protector my GCC 4.9.2 compiles with
>> CC_STACKPROTECTOR_STRONG=y but panics during boot:
>
> How can it make any sense to have -fno-stack-protector and
> CC_STACKPROTECTOR_STRONG=y at the same time ?
>

As far as I understand, Christian means no stack protector on file 
bootx_init.o, see below

Christophe

diff --git a/arch/powerpc/platforms/powermac/Makefile 
b/arch/powerpc/platforms/powermac/Makefile
index 1eb7b45..c7dcab9 100644
--- a/arch/powerpc/platforms/powermac/Makefile
+++ b/arch/powerpc/platforms/powermac/Makefile
@@ -1,4 +1,4 @@
-CFLAGS_bootx_init.o  		+= -fPIC
+CFLAGS_bootx_init.o  		+= -fPIC -fno-stack-protector

  ifdef CONFIG_FUNCTION_TRACER
  # Do not trace early boot code

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-10  2:11     ` Christian Kujau
  2017-01-10  4:32       ` Benjamin Herrenschmidt
@ 2017-01-10  6:26       ` Christophe LEROY
  2017-01-11 22:54         ` Segher Boessenkool
  1 sibling, 1 reply; 21+ messages in thread
From: Christophe LEROY @ 2017-01-10  6:26 UTC (permalink / raw)
  To: Christian Kujau; +Cc: Benjamin Herrenschmidt, linuxppc-dev



Le 10/01/2017 à 03:11, Christian Kujau a écrit :
> On Wed, 4 Jan 2017, Christian Kujau wrote:
>> So, would the following be sufficient? It compiles, but I haven't had a
>> chance to boot yet.
>>
>
> So, with -fno-stack-protector my GCC 4.9.2 compiles with
> CC_STACKPROTECTOR_STRONG=y but panics during boot:
>
>
>
> Maybe ppc32 is not supposed to be built with CC_STACKPROTECTOR ?

Indeed, the latest versions of GCC don't use anymore the global variable 
__stack_chk_guard as canary value, but a value stored at -0x7008(r2). 
This is not compatible with the current implementation of  the kernel 
with uses r2 as a pointeur to current task struct.
So until we fix it, I don't think CC_STACKPROTECTOR is usable on PPC 
with modern versions of GCC.

Christophe

>
> Thanks,
> Christian.
>
>>
>> diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile
>> index 1eb7b45..c7dcab9 100644
>> --- a/arch/powerpc/platforms/powermac/Makefile
>> +++ b/arch/powerpc/platforms/powermac/Makefile
>> @@ -1,4 +1,4 @@
>> -CFLAGS_bootx_init.o  		+= -fPIC
>> +CFLAGS_bootx_init.o  		+= -fPIC -fno-stack-protector
>>
>>  ifdef CONFIG_FUNCTION_TRACER
>>  # Do not trace early boot code
>>
>>
>> Thanks,
>> Christian.
>> --
>> BOFH excuse #156:
>>
>> Zombie processes haunting the computer
>>
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-10  4:32       ` Benjamin Herrenschmidt
  2017-01-10  6:12         ` Christophe LEROY
@ 2017-01-10 18:46         ` Christian Kujau
  1 sibling, 0 replies; 21+ messages in thread
From: Christian Kujau @ 2017-01-10 18:46 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Christophe LEROY, linuxppc-dev

On Mon, 9 Jan 2017, Benjamin Herrenschmidt wrote:
> On Mon, 2017-01-09 at 18:11 -0800, Christian Kujau wrote:
> > So, with -fno-stack-protector my GCC 4.9.2 compiles with 
> > CC_STACKPROTECTOR_STRONG=y but panics during boot:
> 
> How can it make any sense to have -fno-stack-protector and
> CC_STACKPROTECTOR_STRONG=y at the same time ?

I've set -fno-stack-protector only for bootx_init.c, as laid out in the 
diff I posted. This way the kernel at least compiled.

Thanks,
Christian.
-- 
BOFH excuse #423:

It's not RFC-822 compliant.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-10  6:26       ` Christophe LEROY
@ 2017-01-11 22:54         ` Segher Boessenkool
  2017-01-12  7:52           ` Christophe LEROY
  0 siblings, 1 reply; 21+ messages in thread
From: Segher Boessenkool @ 2017-01-11 22:54 UTC (permalink / raw)
  To: Christophe LEROY; +Cc: Christian Kujau, Benjamin Herrenschmidt, linuxppc-dev

On Tue, Jan 10, 2017 at 07:26:15AM +0100, Christophe LEROY wrote:
> >Maybe ppc32 is not supposed to be built with CC_STACKPROTECTOR ?
> 
> Indeed, the latest versions of GCC don't use anymore the global variable 
> __stack_chk_guard as canary value, but a value stored at -0x7008(r2). 
> This is not compatible with the current implementation of  the kernel 
> with uses r2 as a pointeur to current task struct.
> So until we fix it, I don't think CC_STACKPROTECTOR is usable on PPC 
> with modern versions of GCC.

I still wonder what changed.  Nothing relevant has changed for ten years
or whatever as far as I see; unless it is just the -fstack-protector-strong
that makes it fail now.  Curious.


Segher

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-11 22:54         ` Segher Boessenkool
@ 2017-01-12  7:52           ` Christophe LEROY
  2017-01-12 14:42             ` Christophe LEROY
  0 siblings, 1 reply; 21+ messages in thread
From: Christophe LEROY @ 2017-01-12  7:52 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: Christian Kujau, Benjamin Herrenschmidt, linuxppc-dev



Le 11/01/2017 à 23:54, Segher Boessenkool a écrit :
> On Tue, Jan 10, 2017 at 07:26:15AM +0100, Christophe LEROY wrote:
>>> Maybe ppc32 is not supposed to be built with CC_STACKPROTECTOR ?
>>
>> Indeed, the latest versions of GCC don't use anymore the global variable
>> __stack_chk_guard as canary value, but a value stored at -0x7008(r2).
>> This is not compatible with the current implementation of  the kernel
>> with uses r2 as a pointeur to current task struct.
>> So until we fix it, I don't think CC_STACKPROTECTOR is usable on PPC
>> with modern versions of GCC.
>
> I still wonder what changed.  Nothing relevant has changed for ten years
> or whatever as far as I see; unless it is just the -fstack-protector-strong
> that makes it fail now.  Curious.
>

Yes, looks like it was changed from global to TLS in 2005 on powerpc. 
Indeed when I implemented STACKPROTECTOR in Kernel on ppc I 
copied/pasted it from ARM which is (still?) using the global 
__stack_chk_guard, and at first it worked quite well on my powerpc.

x86 has the following option on GCC. Couldn't we have it on powerpc too ?

-mstack-protector-guard=guard
Generate  stack  protection  code  using  canary  at
guard.   Supported  locations are ‘ global ’ for global canary or ‘ tls
’ for per-thread canary in the TLS block (the  default). This  option 
has  effect  only  when  ‘-fstack-protector’  or ‘-fstack-protector-all’ 
is specified.

Christophe

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-12  7:52           ` Christophe LEROY
@ 2017-01-12 14:42             ` Christophe LEROY
  2017-01-12 15:20               ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 21+ messages in thread
From: Christophe LEROY @ 2017-01-12 14:42 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: Christian Kujau, Benjamin Herrenschmidt, linuxppc-dev

Le 12/01/2017 à 08:52, Christophe LEROY a écrit :
>
>
> Le 11/01/2017 à 23:54, Segher Boessenkool a écrit :
>> On Tue, Jan 10, 2017 at 07:26:15AM +0100, Christophe LEROY wrote:
>>>> Maybe ppc32 is not supposed to be built with CC_STACKPROTECTOR ?
>>>
>>> Indeed, the latest versions of GCC don't use anymore the global variable
>>> __stack_chk_guard as canary value, but a value stored at -0x7008(r2).
>>> This is not compatible with the current implementation of  the kernel
>>> with uses r2 as a pointeur to current task struct.
>>> So until we fix it, I don't think CC_STACKPROTECTOR is usable on PPC
>>> with modern versions of GCC.
>>
>> I still wonder what changed.  Nothing relevant has changed for ten years
>> or whatever as far as I see; unless it is just the
>> -fstack-protector-strong
>> that makes it fail now.  Curious.
>>
>
> Yes, looks like it was changed from global to TLS in 2005 on powerpc.
> Indeed when I implemented STACKPROTECTOR in Kernel on ppc I
> copied/pasted it from ARM which is (still?) using the global
> __stack_chk_guard, and at first it worked quite well on my powerpc.
>
> x86 has the following option on GCC. Couldn't we have it on powerpc too ?
>
> -mstack-protector-guard=guard
> Generate  stack  protection  code  using  canary  at
> guard.   Supported  locations are ‘ global ’ for global canary or ‘ tls
> ’ for per-thread canary in the TLS block (the  default). This  option
> has  effect  only  when  ‘-fstack-protector’  or ‘-fstack-protector-all’
> is specified.
>

Finally, it looks like it is not so easy.

I have three instances of GCC:
* 4.4.4, home built
* 4.6.3, from https://www.kernel.org/pub/tools/crosstool/
* 4.8.3, home built

The 4.6.3 uses __stack_chk_guard, while the 4.4.4 and 4.8.3 use -28680(r2)

Is it dependent on the way GCC is built ? Then do we have a way to know, 
when we compile, which method GCC will use ?

See details below for each of the 3 GCC versions.

Christophe

Using built-in specs.
Target: ppc-linux
Configured with: /root/cldk/gcc-4.4.4/configure --target=ppc-linux 
--with-headers=yes --with-cpu=860 --prefix=/opt/cldk 
--bindir=/opt/cldk/bin --sbindir=/opt/cldk/sbin 
--libexecdir=/opt/cldk/libexec --datadir=/opt/cldk/share 
--sysconfdir=/opt/cldk/etc --libdir=/opt/cldk/lib 
--includedir=/opt/cldk/usr/include --oldincludedir=/opt/cldk/usr/include 
--infodir=/opt/cldk/share/info --mandir=/opt/cldk/share/man 
--enable-languages=c,c++
Thread model: posix
gcc version 4.4.4 (GCC)

0000007c <name_to_dev_t>:
   7c:	7c 08 02 a6 	mflr    r0
   80:	94 21 ff a0 	stwu    r1,-96(r1)
   84:	3c 80 00 00 	lis     r4,0
			86: R_PPC_ADDR16_HA	.rodata.str1.4+0x1bc
   88:	93 c1 00 58 	stw     r30,88(r1)
   8c:	93 e1 00 5c 	stw     r31,92(r1)
   90:	90 01 00 64 	stw     r0,100(r1)
   94:	93 81 00 50 	stw     r28,80(r1)
   98:	93 a1 00 54 	stw     r29,84(r1)
   9c:	38 84 01 bc 	addi    r4,r4,444
			9e: R_PPC_ADDR16_LO	.rodata.str1.4+0x1bc
   a0:	38 a0 00 09 	li      r5,9
   a4:	80 02 8f f8 	lwz     r0,-28680(r2)
   a8:	90 01 00 4c 	stw     r0,76(r1)

[...]

   fc:	80 01 00 4c 	lwz     r0,76(r1)
  100:	81 22 8f f8 	lwz     r9,-28680(r2)
  104:	7c 00 4a 79 	xor.    r0,r0,r9
  108:	39 20 00 00 	li      r9,0
  10c:	7f a3 eb 78 	mr      r3,r29
  110:	40 82 03 88 	bne-    498 <name_to_dev_t+0x41c>

[...]

  498:	48 00 00 01 	bl      498 <name_to_dev_t+0x41c>
			498: R_PPC_REL24	__stack_chk_fail


Using built-in specs.
COLLECT_GCC=powerpc64-linux-gcc
COLLECT_LTO_WRAPPER=/opt/gcc-4.6.3-nolibc/powerpc64-linux/bin/../libexec/gcc/powerpc64-linux/4.6.3/lto-wrapper
Target: powerpc64-linux
Configured with: /home/tony/buildall/src/gcc/configure 
--target=powerpc64-linux --host=i686-linux-gnu --build=i686-linux-gnu 
--enable-targets=all 
--prefix=/opt/cross/gcc-4.6.3-nolibc/powerpc64-linux/ 
--enable-languages=c --with-newlib --without-headers 
--enable-sjlj-exceptions --with-system-libunwind --disable-nls 
--disable-threads --disable-shared --disable-libmudflap --disable-libssp 
--disable-libgomp --disable-decimal-float --enable-checking=release 
--with-mpfr=/home/tony/buildall/src/sys-i686 
--with-gmp=/home/tony/buildall/src/sys-i686 --disable-bootstrap 
--disable-libquadmath
Thread model: single
gcc version 4.6.3 (GCC)

000000c0 <name_to_dev_t>:
   c0:	94 21 ff a0 	stwu    r1,-96(r1)
   c4:	7c 08 02 a6 	mflr    r0
   c8:	3c 80 00 00 	lis     r4,0
			ca: R_PPC_ADDR16_HA	.rodata.str1.4+0x50
   cc:	38 a0 00 09 	li      r5,9
   d0:	38 84 00 50 	addi    r4,r4,80
			d2: R_PPC_ADDR16_LO	.rodata.str1.4+0x50
   d4:	bf 81 00 50 	stmw    r28,80(r1)
   d8:	3f e0 00 00 	lis     r31,0
			da: R_PPC_ADDR16_HA	__stack_chk_guard
   dc:	7c 7e 1b 78 	mr      r30,r3
   e0:	90 01 00 64 	stw     r0,100(r1)
   e4:	3b ff 00 00 	addi    r31,r31,0
			e6: R_PPC_ADDR16_LO	__stack_chk_guard
   e8:	80 1f 00 00 	lwz     r0,0(r31)
   ec:	90 01 00 4c 	stw     r0,76(r1)

[...]

  13c:	81 21 00 4c 	lwz     r9,76(r1)
  140:	80 1f 00 00 	lwz     r0,0(r31)
  144:	7d 29 02 79 	xor.    r9,r9,r0
  148:	38 00 00 00 	li      r0,0
  14c:	7f 83 e3 78 	mr      r3,r28
  150:	40 82 03 68 	bne-    4b8 <name_to_dev_t+0x3f8>

[...]

  4b8:	48 00 00 01 	bl      4b8 <name_to_dev_t+0x3f8>
			4b8: R_PPC_REL24	__stack_chk_fail


Using built-in specs.
COLLECT_GCC=ppc-linux-gcc
COLLECT_LTO_WRAPPER=/opt/cldk/libexec/gcc/ppc-linux/4.8.3/lto-wrapper
Target: ppc-linux
Configured with: /root/cldk/gcc-4.8.3/configure --target=ppc-linux 
--with-headers=yes --with-cpu=860 --prefix=/opt/cldk 
--bindir=/opt/cldk/bin --sbindir=/opt/cldk/sbin 
--libexecdir=/opt/cldk/libexec --datadir=/opt/cldk/share 
--sysconfdir=/opt/cldk/etc --libdir=/opt/cldk/lib 
--includedir=/opt/cldk/usr/include --oldincludedir=/opt/cldk/usr/include 
--infodir=/opt/cldk/share/info --mandir=/opt/cldk/share/man 
--enable-languages=c,c++
Thread model: posix
gcc version 4.8.3 (GCC)

000000b0 <name_to_dev_t>:
   b0:	7c 08 02 a6 	mflr    r0
   b4:	94 21 ff a0 	stwu    r1,-96(r1)
   b8:	3c 80 00 00 	lis     r4,0
			ba: R_PPC_ADDR16_HA	.rodata.str1.4+0x50
   bc:	bf a1 00 54 	stmw    r29,84(r1)
   c0:	90 01 00 64 	stw     r0,100(r1)
   c4:	38 84 00 00 	addi    r4,r4,0
			c6: R_PPC_ADDR16_LO	.rodata.str1.4+0x50
   c8:	38 a0 00 09 	li      r5,9
   cc:	7c 7f 1b 78 	mr      r31,r3
   d0:	81 22 8f f8 	lwz     r9,-28680(r2)
   d4:	91 21 00 4c 	stw     r9,76(r1)

[...]

  124:	81 41 00 4c 	lwz     r10,76(r1)
  128:	81 22 8f f8 	lwz     r9,-28680(r2)
  12c:	7d 4a 4a 79 	xor.    r10,r10,r9
  130:	39 20 00 00 	li      r9,0
  134:	40 82 03 70 	bne     4a4 <name_to_dev_t+0x3f4>

[...]

  4a4:	48 00 00 01 	bl      4a4 <name_to_dev_t+0x3f4>
			4a4: R_PPC_REL24	__stack_chk_fail

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-12 14:42             ` Christophe LEROY
@ 2017-01-12 15:20               ` Benjamin Herrenschmidt
  2017-01-12 18:07                 ` Segher Boessenkool
  0 siblings, 1 reply; 21+ messages in thread
From: Benjamin Herrenschmidt @ 2017-01-12 15:20 UTC (permalink / raw)
  To: Christophe LEROY, Segher Boessenkool; +Cc: Christian Kujau, linuxppc-dev

On Thu, 2017-01-12 at 15:42 +0100, Christophe LEROY wrote:
> The 4.6.3 uses __stack_chk_guard, while the 4.4.4 and 4.8.3 use
> -28680(r2)
> 
> Is it dependent on the way GCC is built ? Then do we have a way to
> know, 
> when we compile, which method GCC will use ?
> 
> See details below for each of the 3 GCC versions.

I think it depends if you built it along with glibc (so it can produce
userspace binaries) or not.

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-12 15:20               ` Benjamin Herrenschmidt
@ 2017-01-12 18:07                 ` Segher Boessenkool
  2017-01-13 12:15                   ` Christophe LEROY
  0 siblings, 1 reply; 21+ messages in thread
From: Segher Boessenkool @ 2017-01-12 18:07 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Christophe LEROY, Christian Kujau, linuxppc-dev

On Thu, Jan 12, 2017 at 09:20:47AM -0600, Benjamin Herrenschmidt wrote:
> On Thu, 2017-01-12 at 15:42 +0100, Christophe LEROY wrote:
> > The 4.6.3 uses __stack_chk_guard, while the 4.4.4 and 4.8.3 use
> > -28680(r2)
> > 
> > Is it dependent on the way GCC is built ? Then do we have a way to
> > know, 
> > when we compile, which method GCC will use ?
> > 
> > See details below for each of the 3 GCC versions.
> 
> I think it depends if you built it along with glibc (so it can produce
> userspace binaries) or not.

Right.  Tony's compilers are built using a (modified version of) buildall,
and buildall goes out of its way to build without libc whatsoever, even
if the configuration (powerpc64-linux, for example) expects one.

Which leads to TARGET_LIBC_PROVIDES_SSP being undefined (it would normally
be true for glibc >= 2.4), and that is all.  Mystery solved.  Thanks!


Segher

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-12 18:07                 ` Segher Boessenkool
@ 2017-01-13 12:15                   ` Christophe LEROY
  2017-01-13 12:23                     ` David Laight
  0 siblings, 1 reply; 21+ messages in thread
From: Christophe LEROY @ 2017-01-13 12:15 UTC (permalink / raw)
  To: Segher Boessenkool, Benjamin Herrenschmidt; +Cc: Christian Kujau, linuxppc-dev



Le 12/01/2017 à 19:07, Segher Boessenkool a écrit :
> On Thu, Jan 12, 2017 at 09:20:47AM -0600, Benjamin Herrenschmidt wrote:
>> On Thu, 2017-01-12 at 15:42 +0100, Christophe LEROY wrote:
>>> The 4.6.3 uses __stack_chk_guard, while the 4.4.4 and 4.8.3 use
>>> -28680(r2)
>>>
>>> Is it dependent on the way GCC is built ? Then do we have a way to
>>> know,
>>> when we compile, which method GCC will use ?
>>>
>>> See details below for each of the 3 GCC versions.
>>
>> I think it depends if you built it along with glibc (so it can produce
>> userspace binaries) or not.
>
> Right.  Tony's compilers are built using a (modified version of) buildall,
> and buildall goes out of its way to build without libc whatsoever, even
> if the configuration (powerpc64-linux, for example) expects one.
>
> Which leads to TARGET_LIBC_PROVIDES_SSP being undefined (it would normally
> be true for glibc >= 2.4), and that is all.  Mystery solved.  Thanks!
>

Is there a way to know during compilation how the compiler will behave, 
in order to select the correct method ?

I have drafted a new approach in the kernel that uses -0x7008(r2) 
instead of the global __stack_chk_guard, but how can I select the proper 
approach during kernel compilation in line with the selected GCC ?

Christophe

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: bootx_init.c:88: undefined reference to `__stack_chk_fail_local'
  2017-01-13 12:15                   ` Christophe LEROY
@ 2017-01-13 12:23                     ` David Laight
  0 siblings, 0 replies; 21+ messages in thread
From: David Laight @ 2017-01-13 12:23 UTC (permalink / raw)
  To: 'Christophe LEROY', Segher Boessenkool, Benjamin Herrenschmidt
  Cc: Christian Kujau, linuxppc-dev

From: Christophe LEROY
> Sent: 13 January 2017 12:15
...
> > Which leads to TARGET_LIBC_PROVIDES_SSP being undefined (it would norma=
lly
> > be true for glibc >=3D 2.4), and that is all.  Mystery solved.  Thanks!
> >
>=20
> Is there a way to know during compilation how the compiler will behave,
> in order to select the correct method ?
>=20
> I have drafted a new approach in the kernel that uses -0x7008(r2)
> instead of the global __stack_chk_guard, but how can I select the proper
> approach during kernel compilation in line with the selected GCC ?

Worse, how can you ensure that loadable modules are compiled with the
same option as the rest of the kernel.

	David

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2017-01-13 12:23 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-03 15:25 bootx_init.c:88: undefined reference to `__stack_chk_fail_local' Christian Kujau
2017-01-03 19:20 ` Christian Kujau
2017-01-03 22:50 ` Benjamin Herrenschmidt
2017-01-03 22:57   ` Christian Kujau
2017-01-04  8:23   ` Christophe LEROY
2017-01-04  8:40     ` Segher Boessenkool
2017-01-04  7:32 ` Christophe LEROY
2017-01-04 15:22   ` Christian Kujau
2017-01-04 18:33   ` Christian Kujau
2017-01-10  2:11     ` Christian Kujau
2017-01-10  4:32       ` Benjamin Herrenschmidt
2017-01-10  6:12         ` Christophe LEROY
2017-01-10 18:46         ` Christian Kujau
2017-01-10  6:26       ` Christophe LEROY
2017-01-11 22:54         ` Segher Boessenkool
2017-01-12  7:52           ` Christophe LEROY
2017-01-12 14:42             ` Christophe LEROY
2017-01-12 15:20               ` Benjamin Herrenschmidt
2017-01-12 18:07                 ` Segher Boessenkool
2017-01-13 12:15                   ` Christophe LEROY
2017-01-13 12:23                     ` David Laight

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.