This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libsanitizer merge from upstream r221802


On Tue, Dec 30, 2014 at 2:39 PM, David Abdurachmanov
<david.abdurachmanov@gmail.com> wrote:
>
> On Dec 29, 2014, at 7:46 PM, Jakub Jelinek wrote:
>
>> On Mon, Dec 29, 2014 at 07:36:42PM +0100, David Abdurachmanov wrote:
>>> I believe this is breaking bootstrap on aarch64-linux-gnu with kernels <=3.15,
>>> 3.16 and above are fine.
>>>
>>> __kernel_old_{gid,uid}_t were changed in 3.16 from unsigned int to unsigned
>>> short. <=3.15 kernel will trigger static asserts in libsanitizer while
>>> compiling GCC.
>>>
>>> I created PR: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64435 (includes all
>>> the details).
>>>
>>> Attaching a patch with resolved issues on F19 + 3.12 kernel (also bootstrapped
>>> in QEMU with F21 rootfs + 3.17 kernel) on aarch64-linux-gnu.
>>
>> That looks very much wrong, ABI can't depend on what kernel headers you are
>> compiling against.
>> So, better would be just to ifdef out the check and always use 16-bit
>> __kernel_old_*_t on aarch64.  Are the
>> getresuid16/getresgid16/getgroups16/setgroups16 syscalls wired at all on
>> aarch64?  If not, then supposedly the sanitizer_common_syscalls.inc stuff
>> for these syscalls should be ifdefed out on aarch64 (or any other arch that
>> doesn't have those syscalls).
>
> I am not an expert here.
>
> # uname -r -m
> 3.17.0-301.fc21.aarch64 aarch64
>
> # cat /proc/kallsyms | sed -n 's/.* sys_//p' | grep 16
> chown16
> fchown16
> getegid16
> geteuid16
> getgid16
> getgroups16
> getresgid16
> getresuid16
> getuid16
> lchown16
> setfsgid16
> setfsuid16
> setgid16
> setgroups16
> setregid16
> setresgid16
> setresuid16
> setreuid16
> setuid16
>
> The following are syscall implementations available in my current kernel with
> "16" suffix.
>
> From include/uapi/asm-generic/unistd.h
>
> 435 #define __NR_getresuid 148
> 436 __SYSCALL(__NR_getresuid, sys_getresuid)
>
> From arch/arm64/include/asm/unistd32.h
>
> 354 #define __NR_getresuid 165
> 355 __SYSCALL(__NR_getresuid, sys_getresuid16)
>
> Isn't this needed for 32-bit (compat) application support on 64-bit system?
>
> https://lkml.org/lkml/2012/7/6/570
> https://lkml.org/lkml/2012/7/6/545
>
> If we have 64-bit kernel and 64-bit application is executed sys_getresuid is
> used for getresuid syscall, otherwise if 32-bit application is executed --
> sys_getresuid16 is used. Thus 64-bit application will never call
> sys_getresuid16 implemenation. Then
> getresuid16/getresgid16/getgroups16/setgroups16/etc only needs to in 32-bit
> binary of libsanitizer. Same should apply for x86_64/i*86.
>
> Is that correct?

Kinda.  It only applies for aarch32 and not for AARCH64:ILP32.
AARCH64:ILP32 uses the standard system calls here too.

Thanks,
Andrew Pinski

>
> david


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]