Additional Comment #5 From Pierre Habouzit 2007-11-02 08:2012 Subject: Re: glibc 2.7 compilation problem on alpha due to PTR_MANGLE and PTR_DEMANGLE On Sun, Oct 28, 2007 at 09:47:59PM +0000, jciccone at gmail dot com wrote: > > ------- Additional Comments From jciccone at gmail dot com 2007-10-28 19:47 ------- > Created an attachment (id=2062) > --> (http://sourceware.org/bugzilla/attachment.cgi?id=2062&action=view) > patch that moves PTR_MANGLE for alpha > Also, in every architecture besides alpha, the #if defined NOT_IN_libc && > defined IS_IN_rtld contition has #else. alpha has a #elif defined PIC. The > attached patch changes that #elif defined PIC to a #else. The thing is, in non PIC mode, rtld.o is not in the libc.a (or hasn't the symbol that the libc uses for PTR_MANGLE which is the same), so PIC is definitely special cased. Attached is a patch that fixes the issue for Debian, and let alpha build, at the expense of disabling MANGLING in the non PIC case, but googling showed that the issue is known, and that nobody really cares about it. --- glibc-2.7.orig/sysdeps/unix/alpha/sysdep.h +++ glibc-2.7/sysdeps/unix/alpha/sysdep.h @@ -397,42 +397,4 @@ _sc_ret = _sc_0, _sc_err = _sc_19; \ } -/* Pointer mangling support. Note that tls access is slow enough that - we don't deoptimize things by placing the pointer check value there. */ - -#include - -#if defined NOT_IN_libc && defined IS_IN_rtld -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(dst, src, tmp) \ - ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \ - ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \ - xor src, tmp, dst -# define PTR_MANGLE2(dst, src, tmp) \ - xor src, tmp, dst -# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp) -# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp) -# else -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; -# define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) -# define PTR_DEMANGLE(var) PTR_MANGLE(var) -# endif -#elif defined PIC -# ifdef __ASSEMBLER__ -# define PTR_MANGLE(dst, src, tmp) \ - ldq tmp, __pointer_chk_guard; \ - xor src, tmp, dst -# define PTR_MANGLE2(dst, src, tmp) \ - xor src, tmp, dst -# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp) -# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp) -# else -extern uintptr_t __pointer_chk_guard attribute_relro; -# define PTR_MANGLE(var) \ - (var) = (void *) ((uintptr_t) (var) ^ __pointer_chk_guard) -# define PTR_DEMANGLE(var) PTR_MANGLE(var) -# endif -#endif - #endif /* ASSEMBLER */ --- glibc-2.7.orig/sysdeps/unix/sysv/linux/alpha/sysdep.h +++ glibc-2.7/sysdeps/unix/sysv/linux/alpha/sysdep.h @@ -98,4 +98,46 @@ INTERNAL_SYSCALL1(name, err_out, nr, args); \ }) +/* Pointer mangling support. Note that tls access is slow enough that + we don't deoptimize things by placing the pointer check value there. */ + +#if defined NOT_IN_libc && defined IS_IN_rtld +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(dst, src, tmp) \ + ldah tmp, __pointer_chk_guard_local($29) !gprelhigh; \ + ldq tmp, __pointer_chk_guard_local(tmp) !gprellow; \ + xor src, tmp, dst +# define PTR_MANGLE2(dst, src, tmp) \ + xor src, tmp, dst +# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp) +# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp) +# else +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; +# define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) +# define PTR_DEMANGLE(var) PTR_MANGLE(var) +# endif +#elif defined PIC +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(dst, src, tmp) \ + ldq tmp, __pointer_chk_guard; \ + xor src, tmp, dst +# define PTR_MANGLE2(dst, src, tmp) \ + xor src, tmp, dst +# define PTR_DEMANGLE(dst, tmp) PTR_MANGLE(dst, dst, tmp) +# define PTR_DEMANGLE2(dst, tmp) PTR_MANGLE2(dst, dst, tmp) +# else +extern uintptr_t __pointer_chk_guard attribute_relro; +# define PTR_MANGLE(var) \ + (var) = (void *) ((uintptr_t) (var) ^ __pointer_chk_guard) +# define PTR_DEMANGLE(var) PTR_MANGLE(var) +# endif +#else +/* Pointer mangling is not yet supported for static libc on alpha. */ +# ifndef __ASSEMBLER__ +# define PTR_MANGLE(var) (void) (var) +# define PTR_DEMANGLE(var) (void) (var) +# endif +#endif + #endif /* _LINUX_ALPHA_SYSDEP_H */