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? david
signature.asc
Description: Message signed with OpenPGP using GPGMail