On Tue, Dec 30, 2014 at 2:39 PM, David Abdurachmanov <david.abdurachma...@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