Re: [PATCH 1/2] powerpc/vdso64: link vdso64 with linker

From: Christophe Leroy
Date: Fri Apr 23 2021 - 13:18:43 EST




Le 23/04/2021 à 00:44, Nick Desaulniers a écrit :
On Wed, Sep 2, 2020 at 11:02 AM Christophe Leroy
<christophe.leroy@xxxxxxxxxx> wrote:



Le 02/09/2020 à 19:41, Nick Desaulniers a écrit :
On Wed, Sep 2, 2020 at 5:14 AM Michael Ellerman <mpe@xxxxxxxxxxxxxx> wrote:

Nick Desaulniers <ndesaulniers@xxxxxxxxxx> writes:
Fixes: commit f2af201002a8 ("powerpc/build: vdso linker warning for orphan sections")

I think I'll just revert that for v5.9 ?

SGTM; you'll probably still want these changes with some modifications
at some point; vdso32 did have at least one orphaned section, and will
be important for hermetic builds. Seeing crashes in supported
versions of the tools ties our hands at the moment.


Keeping the tool problem aside with binutils 2.26, do you have a way to
really link an elf32ppc object when building vdso32 for PPC64 ?

Sorry, I'm doing a bug scrub and found
https://github.com/ClangBuiltLinux/linux/issues/774 still open (and my
reply to this thread still in Drafts; never sent). With my patches
rebased:
$ file arch/powerpc/kernel/vdso32/vdso32.so
arch/powerpc/kernel/vdso32/vdso32.so: ELF 32-bit MSB shared object,
PowerPC or cisco 4500, version 1 (SYSV), dynamically linked, stripped

Are you still using 2.26?

I'm not able to repro Nathan's reported issue from
https://lore.kernel.org/lkml/20200902052123.GA2687902@ubuntu-n2-xlarge-x86/,
so I'm curious if I should resend the rebased patches as v2?

One comment on your rebased patch:

> diff --git a/arch/powerpc/include/asm/vdso.h b/arch/powerpc/include/asm/vdso.h
> index 8542e9bbeead..0bd06ec06aaa 100644
> --- a/arch/powerpc/include/asm/vdso.h
> +++ b/arch/powerpc/include/asm/vdso.h
> @@ -25,19 +25,7 @@ int vdso_getcpu_init(void);
>
> #else /* __ASSEMBLY__ */
>
> -#ifdef __VDSO64__
> -#define V_FUNCTION_BEGIN(name) \
> - .globl name; \
> - name: \
> -
> -#define V_FUNCTION_END(name) \
> - .size name,.-name;
> -
> -#define V_LOCAL_FUNC(name) (name)
> -#endif /* __VDSO64__ */
> -
> -#ifdef __VDSO32__
> -
> +#if defined(__VDSO32__) || defined (__VDSO64__)

You always have either __VDSO32__ or __VDSO64__ so this #if is pointless

> #define V_FUNCTION_BEGIN(name) \
> .globl name; \
> .type name,@function; \
> @@ -47,8 +35,7 @@ int vdso_getcpu_init(void);
> .size name,.-name;
>
> #define V_LOCAL_FUNC(name) (name)
> -
> -#endif /* __VDSO32__ */
> +#endif /* __VDSO{32|64}__ */
>
> #endif /* __ASSEMBLY__ */
>


Christophe