Message ID | 5554E36E.3000801@linaro.org |
---|---|
State | New |
Headers | show |
On Thu, May 14, 2015 at 11:03 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > > On 13-05-2015 16:34, H.J. Lu wrote: >> On Wed, May 13, 2015 at 12:30 PM, Adhemerval Zanella >> <adhemerval.zanella@linaro.org> wrote: >>> Hi >>> >>> On 13-05-2015 13:20, H.J. Lu wrote: >>>> commit c14874927b499ddfdbb03745bb32bfc778b8595f >>>> Author: Roland McGrath <roland@hack.frob.com> >>>> Date: Tue May 22 16:00:50 2012 -0700 >>>> >>>> syscalls.list support for vDSO IFUNCs, use it for x32 gettimeofday and time. >>>> >>>> added >>>> >>>> \$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\ >>>> \$(..)sysdeps/unix/make-syscalls.sh\ >>>> \$(make-target-directory) >>>> >>>> to sysdeps/unix/make-syscalls.sh which generates >>>> >>>> #### CALL=gettimeofday NUMBER=(0x40000000 + 96) ARGS=i:pP SOURCE=- >>>> ifeq (,$(filter gettimeofday,$(unix-syscalls))) >>>> unix-syscalls += gettimeofday >>>> $(foreach p,$(sysd-rules-targets),$(foreach >>>> o,$(object-suffixes-noshared),$(objpfx)$(patsubst >>>> %,$p,gettimeofday)$o)): \ >>>> $(..)sysdeps/unix/make-syscalls.sh >>>> $(make-target-directory) >>>> (echo '#define SYSCALL_NAME gettimeofday'; \ >>>> echo '#define SYSCALL_NARGS 2'; \ >>>> echo '#define SYSCALL_SYMBOL __gettimeofday'; \ >>>> echo '#include <syscall-template.S>'; \ >>>> echo 'weak_alias (__gettimeofday, gettimeofday)'; \ >>>> echo 'libc_hidden_weak (gettimeofday)'; \ >>>> ) | $(compile-syscall) $(foreach p,$(patsubst >>>> %gettimeofday,%,$(basename $(@F))),$($(p)CPPFLAGS)) >>>> $(foreach p,$(sysd-rules-targets),$(objpfx)$(patsubst %,$p,gettimeofday).os): \ >>>> $(..)sysdeps/unix/make-syscalls.sh $(make-target-directory) >>>> ^^^^^^^^^ Missing newline >>>> (echo '#include <dl-vdso.h>'; \ >>>> echo 'extern void *__gettimeofday_ifunc (void) __asm >>>> ("__gettimeofday");'; \ >>>> echo 'void *'; \ >>>> echo '__gettimeofday_ifunc (void)'; \ >>>> echo '{'; \ >>>> echo ' PREPARE_VERSION_KNOWN (symver, LINUX_2_6);'; \ >>>> echo ' return _dl_vdso_vsym ("__vdso_gettimeofday", &symver);'; \ >>>> echo '}'; \ >>>> echo 'asm (".type __gettimeofday, %gnu_indirect_function");'; \ >>>> echo 'asm (".globl __GI___gettimeofday\n"'; \ >>>> echo ' "__GI___gettimeofday = __gettimeofday");'; \ >>>> echo 'weak_alias (__gettimeofday, gettimeofday)'; \ >>>> echo 'libc_hidden_weak (gettimeofday)'; \ >>>> ) | $(compile-stdin.c) $(foreach p,$(patsubst >>>> %gettimeofday,%,$(basename $(@F))),$($(p)CPPFLAGS)) >>>> endif >>>> >>>> This only affected x32. I checked in this patch after tested on >>>> x32. >>>> >>>> Adhemerval, can you check if your problem with dash in >>>> >>>> https://sourceware.org/ml/libc-alpha/2015-04/msg00277.html >>>> >>>> is fixed by this? >>>> >>>> Thanks. >>> >>> I have been testing another more complete fix pointed out by Joseph [1] >>> and it fixes the x32 build with dash issue I was seeing. Shouldn't we >>> push this one? >>> >>> [1] https://sourceware.org/ml/libc-alpha/2015-02/msg00396.html >> >> Well, this part is the same as the one I checked in: >> >> \$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\ >> - \$(..)sysdeps/unix/make-syscalls.sh\ >> + \$(..)sysdeps/unix/make-syscalls.sh >> >> At minimum, that patch should be rebased. >> > > What about: > > diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh > index 910a22c..12f664e 100644 > --- a/sysdeps/unix/make-syscalls.sh > +++ b/sysdeps/unix/make-syscalls.sh > @@ -272,28 +272,33 @@ while read file srcfile caller syscall args strong weak; do > vdso_symbol="${vdso_syscall%@*}" > vdso_symver="${vdso_syscall#*@}" > vdso_symver=`echo "$vdso_symver" | sed 's/\./_/g'` > - echo "\ > + cat <<EOF > + > \$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\ > \$(..)sysdeps/unix/make-syscalls.sh > \$(make-target-directory) > (echo '#include <dl-vdso.h>'; \\ > - echo 'extern void *${strong}_ifunc (void) __asm (\"${strong}\");'; \\ > + echo 'extern void *${strong}_ifunc (void) __asm ("${strong}");'; \\ > echo 'void *'; \\ > echo '${strong}_ifunc (void)'; \\ > echo '{'; \\ > echo ' PREPARE_VERSION_KNOWN (symver, ${vdso_symver});'; \\ > - echo ' return _dl_vdso_vsym (\"${vdso_symbol}\", &symver);'; \\ > + echo ' return _dl_vdso_vsym ("${vdso_symbol}", &symver);'; \\ > echo '}'; \\ > - echo 'asm (\".type ${strong}, %gnu_indirect_function\");'; \\" > + echo 'asm (".type ${strong}, %gnu_indirect_function");'; \\ > +EOF > # This is doing "libc_hidden_def (${strong})", but the compiler > # doesn't know that we've defined ${strong} in the same file, so > # we can't do it the normal way. > - echo "\ > - echo 'asm (\".globl __GI_${strong}\\n\"'; \\ > - echo ' \"__GI_${strong} = ${strong}\");'; \\" > + cat <<EOF > + echo 'asm (".globl __GI_${strong}");'; \\ > + echo 'asm ("__GI_${strong} = ${strong}");'; \\ > +EOF > emit_weak_aliases > - echo ' ) | $(compile-stdin.c) '"\ > -\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS))" > + cat <<EOF > + ) | \$(compile-stdin.c) \ > +\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS)) > +EOF > fi > > if test $shared_only = t; then > > I checked builds for x86_64, i386, x32, and aarch64 for both dash and bash. This only affects x32. Please show the output of diff -up between 1. The old x32 sysd-syscalls under bash and the new x32 sysd-syscalls under bash. 2. The new x32 sysd-syscalls under bash and the new x32 sysd-syscalls under dash.
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh index 910a22c..12f664e 100644 --- a/sysdeps/unix/make-syscalls.sh +++ b/sysdeps/unix/make-syscalls.sh @@ -272,28 +272,33 @@ while read file srcfile caller syscall args strong weak; do vdso_symbol="${vdso_syscall%@*}" vdso_symver="${vdso_syscall#*@}" vdso_symver=`echo "$vdso_symver" | sed 's/\./_/g'` - echo "\ + cat <<EOF + \$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\ \$(..)sysdeps/unix/make-syscalls.sh \$(make-target-directory) (echo '#include <dl-vdso.h>'; \\ - echo 'extern void *${strong}_ifunc (void) __asm (\"${strong}\");'; \\ + echo 'extern void *${strong}_ifunc (void) __asm ("${strong}");'; \\ echo 'void *'; \\ echo '${strong}_ifunc (void)'; \\ echo '{'; \\ echo ' PREPARE_VERSION_KNOWN (symver, ${vdso_symver});'; \\ - echo ' return _dl_vdso_vsym (\"${vdso_symbol}\", &symver);'; \\ + echo ' return _dl_vdso_vsym ("${vdso_symbol}", &symver);'; \\ echo '}'; \\ - echo 'asm (\".type ${strong}, %gnu_indirect_function\");'; \\" + echo 'asm (".type ${strong}, %gnu_indirect_function");'; \\ +EOF # This is doing "libc_hidden_def (${strong})", but the compiler # doesn't know that we've defined ${strong} in the same file, so # we can't do it the normal way. - echo "\ - echo 'asm (\".globl __GI_${strong}\\n\"'; \\ - echo ' \"__GI_${strong} = ${strong}\");'; \\" + cat <<EOF + echo 'asm (".globl __GI_${strong}");'; \\ + echo 'asm ("__GI_${strong} = ${strong}");'; \\ +EOF emit_weak_aliases - echo ' ) | $(compile-stdin.c) '"\ -\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS))" + cat <<EOF + ) | \$(compile-stdin.c) \ +\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS)) +EOF fi if test $shared_only = t; then