x86: Fix x32 syscall build

Message ID 553802B8.20502@linaro.org
State Dropped
Headers

Commit Message

Adhemerval Zanella April 22, 2015, 8:21 p.m. UTC
  Working on the vDSO refactor I noted that x86_64/x32 build is broken
due some vdso declaration in syscall.list that is shadowing the
default x86 implementation.  This patch fixes it by removing the
auto syscall generation and make x32 uses the default Linux x86
code.

Tested on x32, ok to commit?

--

	* sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (gettimeofday):
	Remove definition.
	(time): Likewise.

---
  

Comments

H.J. Lu April 22, 2015, 8:31 p.m. UTC | #1
On Wed, Apr 22, 2015 at 1:21 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> Working on the vDSO refactor I noted that x86_64/x32 build is broken
> due some vdso declaration in syscall.list that is shadowing the
> default x86 implementation.  This patch fixes it by removing the
> auto syscall generation and make x32 uses the default Linux x86
> code.
>
> Tested on x32, ok to commit?
>
> --
>
>         * sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (gettimeofday):
>         Remove definition.
>         (time): Likewise.
>
> ---
>
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
> index 2cc58af..7edb6fd 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
> @@ -1,8 +1,6 @@
>  # File name    Caller  Syscall name    # args  Strong name     Weak names
>
>  fallocate      -       fallocate       Ci:iiii fallocate       fallocate64
> -gettimeofday   -       gettimeofday:__vdso_gettimeofday@LINUX_2.6      i:pP    __gettimeofday  gettimeofday
>  posix_fadvise  -       fadvise64       Vi:iiii posix_fadvise   posix_fadvise64
>  preadv         -       preadv          Ci:ipii preadv          preadv64
>  pwritev                -       pwritev         Ci:ipii pwritev         pwritev64
> -time           -       time:__vdso_time@LINUX_2.6                      Ei:P    time

X32 builds fine for me without the above change.  Why did it fail for you?
  
Adhemerval Zanella April 22, 2015, 8:56 p.m. UTC | #2
On 22-04-2015 17:31, H.J. Lu wrote:
> On Wed, Apr 22, 2015 at 1:21 PM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> Working on the vDSO refactor I noted that x86_64/x32 build is broken
>> due some vdso declaration in syscall.list that is shadowing the
>> default x86 implementation.  This patch fixes it by removing the
>> auto syscall generation and make x32 uses the default Linux x86
>> code.
>>
>> Tested on x32, ok to commit?
>>
>> --
>>
>>         * sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (gettimeofday):
>>         Remove definition.
>>         (time): Likewise.
>>
>> ---
>>
>> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>> index 2cc58af..7edb6fd 100644
>> --- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>> @@ -1,8 +1,6 @@
>>  # File name    Caller  Syscall name    # args  Strong name     Weak names
>>
>>  fallocate      -       fallocate       Ci:iiii fallocate       fallocate64
>> -gettimeofday   -       gettimeofday:__vdso_gettimeofday@LINUX_2.6      i:pP    __gettimeofday  gettimeofday
>>  posix_fadvise  -       fadvise64       Vi:iiii posix_fadvise   posix_fadvise64
>>  preadv         -       preadv          Ci:ipii preadv          preadv64
>>  pwritev                -       pwritev         Ci:ipii pwritev         pwritev64
>> -time           -       time:__vdso_time@LINUX_2.6                      Ei:P    time
> 
> X32 builds fine for me without the above change.  Why did it fail for you?
> 

I using default toolchain on Ubuntu 14.04 and I am seeing:

(echo '#include <dl-vdso.h>'; \
	 echo 'extern void *time_ifunc (void) __asm ("time");'; \
	 echo 'void *'; \
	 echo 'time_ifunc (void)'; \
	 echo '{'; \
	 echo '  PREPARE_VERSION_KNOWN (symver, LINUX_2_6);'; \
	 echo '  return _dl_vdso_vsym ("__vdso_time", &symver);'; \
	 echo '}'; \
	 echo 'asm (".type time, %gnu_indirect_function");'; \
	 echo 'asm (".globl __GI_time
/bin/sh: 10: Syntax error: Unterminated quoted string
  
H.J. Lu April 22, 2015, 9:05 p.m. UTC | #3
On Wed, Apr 22, 2015 at 1:56 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
> On 22-04-2015 17:31, H.J. Lu wrote:
>> On Wed, Apr 22, 2015 at 1:21 PM, Adhemerval Zanella
>> <adhemerval.zanella@linaro.org> wrote:
>>> Working on the vDSO refactor I noted that x86_64/x32 build is broken
>>> due some vdso declaration in syscall.list that is shadowing the
>>> default x86 implementation.  This patch fixes it by removing the
>>> auto syscall generation and make x32 uses the default Linux x86
>>> code.
>>>
>>> Tested on x32, ok to commit?
>>>
>>> --
>>>
>>>         * sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (gettimeofday):
>>>         Remove definition.
>>>         (time): Likewise.
>>>
>>> ---
>>>
>>> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>>> index 2cc58af..7edb6fd 100644
>>> --- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>>> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>>> @@ -1,8 +1,6 @@
>>>  # File name    Caller  Syscall name    # args  Strong name     Weak names
>>>
>>>  fallocate      -       fallocate       Ci:iiii fallocate       fallocate64
>>> -gettimeofday   -       gettimeofday:__vdso_gettimeofday@LINUX_2.6      i:pP    __gettimeofday  gettimeofday
>>>  posix_fadvise  -       fadvise64       Vi:iiii posix_fadvise   posix_fadvise64
>>>  preadv         -       preadv          Ci:ipii preadv          preadv64
>>>  pwritev                -       pwritev         Ci:ipii pwritev         pwritev64
>>> -time           -       time:__vdso_time@LINUX_2.6                      Ei:P    time
>>
>> X32 builds fine for me without the above change.  Why did it fail for you?
>>
>
> I using default toolchain on Ubuntu 14.04 and I am seeing:
>
> (echo '#include <dl-vdso.h>'; \
>          echo 'extern void *time_ifunc (void) __asm ("time");'; \
>          echo 'void *'; \
>          echo 'time_ifunc (void)'; \
>          echo '{'; \
>          echo '  PREPARE_VERSION_KNOWN (symver, LINUX_2_6);'; \
>          echo '  return _dl_vdso_vsym ("__vdso_time", &symver);'; \
>          echo '}'; \
>          echo 'asm (".type time, %gnu_indirect_function");'; \
>          echo 'asm (".globl __GI_time
> /bin/sh: 10: Syntax error: Unterminated quoted string

Which shell is /bin/sh?  Can you try bash?
  
Adhemerval Zanella April 22, 2015, 10:01 p.m. UTC | #4
On 22-04-2015 18:05, H.J. Lu wrote:
> On Wed, Apr 22, 2015 at 1:56 PM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>> On 22-04-2015 17:31, H.J. Lu wrote:
>>> On Wed, Apr 22, 2015 at 1:21 PM, Adhemerval Zanella
>>> <adhemerval.zanella@linaro.org> wrote:
>>>> Working on the vDSO refactor I noted that x86_64/x32 build is broken
>>>> due some vdso declaration in syscall.list that is shadowing the
>>>> default x86 implementation.  This patch fixes it by removing the
>>>> auto syscall generation and make x32 uses the default Linux x86
>>>> code.
>>>>
>>>> Tested on x32, ok to commit?
>>>>
>>>> --
>>>>
>>>>         * sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (gettimeofday):
>>>>         Remove definition.
>>>>         (time): Likewise.
>>>>
>>>> ---
>>>>
>>>> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>>>> index 2cc58af..7edb6fd 100644
>>>> --- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>>>> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
>>>> @@ -1,8 +1,6 @@
>>>>  # File name    Caller  Syscall name    # args  Strong name     Weak names
>>>>
>>>>  fallocate      -       fallocate       Ci:iiii fallocate       fallocate64
>>>> -gettimeofday   -       gettimeofday:__vdso_gettimeofday@LINUX_2.6      i:pP    __gettimeofday  gettimeofday
>>>>  posix_fadvise  -       fadvise64       Vi:iiii posix_fadvise   posix_fadvise64
>>>>  preadv         -       preadv          Ci:ipii preadv          preadv64
>>>>  pwritev                -       pwritev         Ci:ipii pwritev         pwritev64
>>>> -time           -       time:__vdso_time@LINUX_2.6                      Ei:P    time
>>>
>>> X32 builds fine for me without the above change.  Why did it fail for you?
>>>
>>
>> I using default toolchain on Ubuntu 14.04 and I am seeing:
>>
>> (echo '#include <dl-vdso.h>'; \
>>          echo 'extern void *time_ifunc (void) __asm ("time");'; \
>>          echo 'void *'; \
>>          echo 'time_ifunc (void)'; \
>>          echo '{'; \
>>          echo '  PREPARE_VERSION_KNOWN (symver, LINUX_2_6);'; \
>>          echo '  return _dl_vdso_vsym ("__vdso_time", &symver);'; \
>>          echo '}'; \
>>          echo 'asm (".type time, %gnu_indirect_function");'; \
>>          echo 'asm (".globl __GI_time
>> /bin/sh: 10: Syntax error: Unterminated quoted string
> 
> Which shell is /bin/sh?  Can you try bash?

Indeed it seems a limitation of default /bin/sh for Ubuntu (dash).
  
Joseph Myers April 24, 2015, 6:02 p.m. UTC | #5
On Wed, 22 Apr 2015, Adhemerval Zanella wrote:

> > Which shell is /bin/sh?  Can you try bash?
> 
> Indeed it seems a limitation of default /bin/sh for Ubuntu (dash).

See bug 16704, and the patch 
<https://sourceware.org/ml/libc-alpha/2015-02/msg00396.html> which needs 
review.
  

Patch

diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
index 2cc58af..7edb6fd 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
@@ -1,8 +1,6 @@ 
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
 fallocate	-	fallocate	Ci:iiii	fallocate	fallocate64
-gettimeofday	-	gettimeofday:__vdso_gettimeofday@LINUX_2.6	i:pP	__gettimeofday	gettimeofday
 posix_fadvise	-	fadvise64	Vi:iiii	posix_fadvise	posix_fadvise64
 preadv		-	preadv		Ci:ipii	preadv		preadv64
 pwritev		-	pwritev		Ci:ipii	pwritev		pwritev64
-time		-	time:__vdso_time@LINUX_2.6			Ei:P	time