From 60c966358ed6fa6ce3ded5426f46232cbfd8e0fd Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 22 Jul 1997 00:10:33 +0000 Subject: Update. 1997-07-22 01:35 Ulrich Drepper * Makerules (+make-deps): Use $(CFLAGS) in run of $(+mkdep) so that optimizing is also selected for dependency generation. * configure.in: Add machine description for TI c[34]x. * inet/Makefile (routines): Remove ntohl and ntohs. * inet/netinet/in.h: Use optimized version of hton? and ntoh? for little endian machines. * sysdeps/alpha/ntohl.s: Removed. * sysdeps/alpha/ntohs.s: Removed. * sysdeps/generic/ntohl.c: Removed. * sysdeps/generic/ntohs.c: Removed. * sysdeps/generic/htonl.c: Add aliases for ntohl. * sysdeps/vax/htonl.s: Likewise. * sysdeps/generic/htons.c: Add aliases for ntohs. * sysdeps/vax/htons.s: Likewise. * sysdeps/vax/ntohl.s: Removed. * sysdeps/vax/ntohs.s: Removed. * sysdeps/generic/bits/htontoh.h: New file. * sysdeps/i386/htonl.S: New file. * sysdeps/i386/htons.S: New file. * sysdeps/i386/i486/htonl.S: New file. * sysdeps/i386/fpu/bits/mathinline.h: Correct and optimized compare macros. * sysdeps/mips/dl-machine.h: Remove mips64 dependent parts. * sysdeps/mips/mips64/dl-machine.h: New file. * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Don't install syscall-list.h. 1997-07-12 Andreas Jaeger * libc.map: Add missing symbol _obstack. 1997-07-14 08:22 H.J. Lu * sysdeps/mips/rtld-parms: New. * sysdeps/unix/sysv/linux/mips/lxstat.h: Moved to * sysdeps/unix/sysv/linux/mips/lxstat.c: ...this. * sysdeps/unix/sysv/linux/mips/sgidef.h: Moved to * sysdeps/unix/sysv/linux/mips/sgidefs.h: ...this. * sysdeps/generic/dl-sysdep.c (_start): Change to ENTRY_POINT. 1997-07-17 08:39 H.J. Lu * sysdeps/mips/dl-machine.h: Remove extra stuff. 1997-07-06 07:18 Geoff Keating * sysdeps/powerpc/bits/endian.h: Handle multiple endianess. * stdlib/grouping.h: Suppress gcc warning about testing unsigned char for less-than-zero. * stdio-common/printf_fp.c: Likewise. * stdio-common/vfprintf.c: Likewise. * sysdeps/powerpc/add_n.s: New file. * sysdeps/powerpc/sub_n.s: New file. * sysdeps/powerpc/lshift.s: Ported XCOFF->ELF (from GMP). * sysdeps/powerpc/mul_1.s: Ported XCOFF->ELF (from GMP). * sysdeps/powerpc/addmul_1.s: Ported XCOFF->ELF (from GMP). * sysdeps/powerpc/submul_1.s: Ported XCOFF->ELF (from GMP). * sysdeps/powerpc/rshift.s: Ported XCOFF->ELF (from GMP). * math/libm-test.c (cos_test, sin_test, sincos_test): Use precomputed pi/6 rather than having gcc calculate it, otherwise tests give inaccurate result due to inaccurate input. * math/libm.map: Add __fe_*_env constants to list of exported symbols. * sysdeps/libm-ieee754/s_isinf.c: Simplify, make faster. * sysdeps/libm-ieee754/s_isinff.c: Simplify, make faster. * sysdeps/libm-ieee754/s_atan2f.c: Correct value of pi to be correct round-to-nearest value. * sysdeps/libm-ieee754/e_log.c: Make sure exceptions are raised. * sysdeps/libm-ieee754/e_log10.c: Likewise. * sysdeps/libm-ieee754/e_log10f.c: Likewise. * sysdeps/libm-ieee754/e_logf.c: Likewise. * sysdeps/libm-ieee754/s_log1p.c: Likewise. Also use correct -Inf. * sysdeps/libm-ieee754/s_log1pf.c: Likewise. Also use correct -Inf. * sysdeps/libm-ieee754/s_log2.c: Likewise. * sysdeps/libm-ieee754/s_log2f.c: Likewise. 1997-07-15 21:54 Thorsten Kukuk * nis/nss_compat/compat-grp.c: Fix "buffer to small" problems and memory leaks. * nis/nss_compat/compat-pwd.c: Likewise. * nis/nss_compat/compat-spwd.c: Likewise. * nis/nss_nis/nis-alias.c: Likewise. * nis/nss_nis/nis-ethers.c: Likewise. * nis/nss_nis/nis-grp.c: Likewise. * nis/nss_nis/nis-hosts.c: Likewise. * nis/nss_nis/nis-network.c: Likewise. * nis/nss_nis/nis-proto.c: Likewise. * nis/nss_nis/nis-pwd.c: Likewise. * nis/nss_nis/nis-rpc.c: Likewise. * nis/nss_nis/nis-service.c: Likewise. * nis/nss_nis/nis-spwd.c: Likewise. * nis/nss_nisplus-alias.c: Likewise. * nis/nss_nisplus-ethers.c: Likewise. * nis/nss_nisplus-grp.c: Likewise. * nis/nss_nisplus-hosts.c: Likewise. * nis/nss_nisplus-netgrp.c: Likewise. * nis/nss_nisplus-network.c: Likewise. * nis/nss_nisplus-proto.c: Likewise. * nis/nss_nisplus-pwd.c: Likewise. * nis/nss_nisplus-rpc.c: Likewise. * nis/nss_nisplus-service.c: Likewise. * nis/nss_nisplus-spwd.c: Likewise. * nis/nss_nisplus-parse.c: If buffer to small, give -1 back. 1997-07-20 Andreas Schwab * sysdeps/m68k/dl-machine.h (elf_machine_rela): Mention program name in warning message. * sysdeps/powerpc/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/sparc/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/sparc64/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/i386/dl-machine.h (elf_machine_rel): Print program name first. 1997-07-20 19:33 Thorsten Kukuk * libc.map: Add _null_auth and _seterr_reply. * sunrpc/clnt_udp.c (clntudp_call): If xargs is NULL, don't encode it. --- sysdeps/alpha/ntohl.s | 2 - sysdeps/alpha/ntohs.s | 2 - sysdeps/generic/bits/htontoh.h | 23 ++ sysdeps/generic/dl-sysdep.c | 2 +- sysdeps/generic/htonl.c | 5 +- sysdeps/generic/htons.c | 5 +- sysdeps/generic/ntohl.c | 32 -- sysdeps/generic/ntohs.c | 32 -- sysdeps/i386/bits/htontoh.h | 79 +++++ sysdeps/i386/dl-machine.h | 5 +- sysdeps/i386/fpu/bits/mathinline.h | 24 +- sysdeps/i386/htonl.S | 39 +++ sysdeps/i386/htons.S | 38 +++ sysdeps/i386/i486/htonl.S | 37 ++ sysdeps/libm-ieee754/e_atan2f.c | 20 +- sysdeps/libm-ieee754/e_log.c | 4 +- sysdeps/libm-ieee754/e_log10.c | 16 +- sysdeps/libm-ieee754/e_log10f.c | 8 +- sysdeps/libm-ieee754/e_logf.c | 16 +- sysdeps/libm-ieee754/s_isinf.c | 5 +- sysdeps/libm-ieee754/s_isinff.c | 2 +- sysdeps/libm-ieee754/s_log1p.c | 2 +- sysdeps/libm-ieee754/s_log1pf.c | 14 +- sysdeps/libm-ieee754/s_log2.c | 4 +- sysdeps/libm-ieee754/s_log2f.c | 4 +- sysdeps/m68k/dl-machine.h | 4 +- sysdeps/mips/dl-machine.h | 192 +---------- sysdeps/mips/mips64/dl-machine.h | 594 +++++++++++++++++++++++++++++++++ sysdeps/mips/rtld-parms | 15 + sysdeps/powerpc/bits/endian.h | 33 +- sysdeps/powerpc/dl-machine.h | 4 +- sysdeps/sparc/dl-machine.h | 4 +- sysdeps/sparc64/dl-machine.h | 4 +- sysdeps/unix/sysv/linux/Makefile | 2 +- sysdeps/unix/sysv/linux/mips/lxstat.c | 80 +++++ sysdeps/unix/sysv/linux/mips/lxstat.h | 80 ----- sysdeps/unix/sysv/linux/mips/sgidef.h | 28 -- sysdeps/unix/sysv/linux/mips/sgidefs.h | 28 ++ sysdeps/vax/htonl.s | 5 +- sysdeps/vax/htons.s | 3 + sysdeps/vax/ntohl.s | 30 -- sysdeps/vax/ntohs.s | 30 -- 42 files changed, 1055 insertions(+), 501 deletions(-) delete mode 100644 sysdeps/alpha/ntohl.s delete mode 100644 sysdeps/alpha/ntohs.s create mode 100644 sysdeps/generic/bits/htontoh.h delete mode 100644 sysdeps/generic/ntohl.c delete mode 100644 sysdeps/generic/ntohs.c create mode 100644 sysdeps/i386/bits/htontoh.h create mode 100644 sysdeps/i386/htonl.S create mode 100644 sysdeps/i386/htons.S create mode 100644 sysdeps/i386/i486/htonl.S create mode 100644 sysdeps/mips/mips64/dl-machine.h create mode 100644 sysdeps/mips/rtld-parms create mode 100644 sysdeps/unix/sysv/linux/mips/lxstat.c delete mode 100644 sysdeps/unix/sysv/linux/mips/lxstat.h delete mode 100644 sysdeps/unix/sysv/linux/mips/sgidef.h create mode 100644 sysdeps/unix/sysv/linux/mips/sgidefs.h delete mode 100644 sysdeps/vax/ntohl.s delete mode 100644 sysdeps/vax/ntohs.s (limited to 'sysdeps') diff --git a/sysdeps/alpha/ntohl.s b/sysdeps/alpha/ntohl.s deleted file mode 100644 index 6a99a01dc4..0000000000 --- a/sysdeps/alpha/ntohl.s +++ /dev/null @@ -1,2 +0,0 @@ -/* This is a dummy to avoid including the generic version. htonl and -ntohl are identical and htonl.S defines appropriate aliases. */ diff --git a/sysdeps/alpha/ntohs.s b/sysdeps/alpha/ntohs.s deleted file mode 100644 index 69992a894c..0000000000 --- a/sysdeps/alpha/ntohs.s +++ /dev/null @@ -1,2 +0,0 @@ -/* This is a dummy to avoid including the generic version. htons and -ntohs are identical and htons.S defines appropriate aliases. */ diff --git a/sysdeps/generic/bits/htontoh.h b/sysdeps/generic/bits/htontoh.h new file mode 100644 index 0000000000..fa4efed867 --- /dev/null +++ b/sysdeps/generic/bits/htontoh.h @@ -0,0 +1,23 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _NETINET_IN_H +# error "Don't include this file directly, use " +#endif + +/* We cannot give generic optimized versions here. */ diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c index c5e85274b0..e18f0b89a4 100644 --- a/sysdeps/generic/dl-sysdep.c +++ b/sysdeps/generic/dl-sysdep.c @@ -32,7 +32,7 @@ extern char **_dl_argv; extern char **_environ; extern size_t _dl_pagesize; extern void _end; -extern void _start (void); +extern void ENTRY_POINT (void); int __libc_enable_secure; int __libc_multiple_libcs; /* Defining this here avoids the inclusion diff --git a/sysdeps/generic/htonl.c b/sysdeps/generic/htonl.c index f1e077ae1a..d460d40f89 100644 --- a/sysdeps/generic/htonl.c +++ b/sysdeps/generic/htonl.c @@ -21,7 +21,7 @@ #undef htonl u_int32_t -htonl (x) +__htonl (x) u_int32_t x; { #if BYTE_ORDER == LITTLE_ENDIAN @@ -30,3 +30,6 @@ htonl (x) return x; } +strong_alias (__htonl, __ntohl) +weak_alias (__htonl, htonl) +weak_alias (__ntohl, ntohl) diff --git a/sysdeps/generic/htons.c b/sysdeps/generic/htons.c index 3aaf28551c..a0a0e81adf 100644 --- a/sysdeps/generic/htons.c +++ b/sysdeps/generic/htons.c @@ -21,7 +21,7 @@ #undef htons u_int16_t -htons (x) +__htons (x) u_int16_t x; { #if BYTE_ORDER == LITTLE_ENDIAN @@ -30,3 +30,6 @@ htons (x) return x; } +strong_alias (__htons, __ntohs) +weak_alias (__htons, htons) +weak_alias (__ntohs, ntohs) diff --git a/sysdeps/generic/ntohl.c b/sysdeps/generic/ntohl.c deleted file mode 100644 index 0cb83c5aa4..0000000000 --- a/sysdeps/generic/ntohl.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 1993, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -#undef ntohl - -u_int32_t -ntohl (x) - u_int32_t x; -{ -#if BYTE_ORDER == LITTLE_ENDIAN - x = (x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24); -#endif - - return x; -} diff --git a/sysdeps/generic/ntohs.c b/sysdeps/generic/ntohs.c deleted file mode 100644 index f4f37eec93..0000000000 --- a/sysdeps/generic/ntohs.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 1993, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -#undef ntohs - -u_int16_t -ntohs (x) - u_int16_t x; -{ -#if BYTE_ORDER == LITTLE_ENDIAN - x = (x << 8) | (x >> 8); -#endif - - return x; -} diff --git a/sysdeps/i386/bits/htontoh.h b/sysdeps/i386/bits/htontoh.h new file mode 100644 index 0000000000..590b509875 --- /dev/null +++ b/sysdeps/i386/bits/htontoh.h @@ -0,0 +1,79 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _NETINET_IN_H +# error "Don't include this file directly, use " +#endif + +#if defined __GNUC__ && __GNUC__ >= 2 +/* We can use inline assembler instructions to optimize the code. */ + +/* To swap the bytes in a word the i486 processors and up provide the + `bswap' opcode. On i386 we have to use three instructions. */ +# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ + +extern __inline u_int32_t +__ntohl (u_int32_t netlong) +{ + register u_int32_t hostlong; + + __asm__ ("rorw $8, %w0; rorl $16, %0; rorw $8, %w0" + : "=r" (hostlong) + : "0" (netlong)); + + return hostlong; +} + +# else + +extern __inline u_int32_t +__ntohl (u_int32_t netlong) +{ + register u_int32_t hostlong; + + __asm__ ("bswap %0" : "=r" (hostlong) : "0" (netlong)); + + return hostlong; +} + +# endif + +/* For a short word we have a simple solution. */ +extern __inline u_int16_t +__ntohs (u_int16_t netshort) +{ + register u_int16_t hostshort; + + __asm__ ("rorw $8, %w0" : "=r" (hostshort) : "0" (netshort)); +} + + +/* The other direction can be handled with the same functions. */ +extern __inline u_int32_t +__htonl (u_int32_t hostlong) +{ + return __ntohl (hostlong); +} + +extern __inline u_int16_t +__htons (u_int16_t hostshort) +{ + return __ntohs (hostshort); +} + +#endif /* GNU CC */ diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index a83356fce1..0388cbe510 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -276,9 +276,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error ("Symbol `", strtab + refsym->st_name, - "' in `", - _dl_argv[0] ?: "", + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, "' has different size in shared object, " "consider re-linking\n", NULL); } diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h index 42dae92a2a..4228959d23 100644 --- a/sysdeps/i386/fpu/bits/mathinline.h +++ b/sysdeps/i386/fpu/bits/mathinline.h @@ -30,42 +30,42 @@ # define isgreater(x, y) \ ({ int result; \ __asm__ ("fucompp; fnstsw; andb $0x45, %%ah; setz %%al;" \ - "andl $0xff, %0" \ - : "=a" (result) : "t" (x), "u" (y) : "cc"); \ + "andl $0x01, %0" \ + : "=a" (result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \ result; }) # define isgreaterequal(x, y) \ ({ int result; \ __asm__ ("fucompp; fnstsw; testb $0x05, %%ah; setz %%al;" \ - "andl $0xff, %0" \ - : "=a" (result) : "t" (x), "u" (y) : "cc"); \ + "andl $0x01, %0" \ + : "=a" (result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \ result; }) # define isless(x, y) \ ({ int result; \ __asm__ ("fucompp; fnstsw; xorb $0x01, %%ah; testb $0x45, %%ah;" \ - "setz %%al; andl $0xff, %0" \ - : "=a" (result) : "t" (x), "u" (y) : "cc"); \ + "setz %%al; andl $0x01, %0" \ + : "=a" (result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \ result; }) # define islessequal(x, y) \ ({ int result; \ __asm__ ("fucompp; fnstsw; xorb $0x01, %%ah; testb $0x05, %%ah;" \ - "setz %%al; andl $0xff, %0" \ - : "=a" (result) : "t" (x), "u" (y) : "cc"); \ + "setz %%al; andl $0x01, %0" \ + : "=a" (result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \ result; }) # define islessgreater(x, y) \ ({ int result; \ __asm__ ("fucompp; fnstsw; testb $0x44, %%ah; setz %%al;" \ - "andl $0xff, %0" \ - : "=a" (result) : "t" (x), "u" (y) : "cc"); \ + "andl $0x01, %0" \ + : "=a" (result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \ result; }) # define isunordered(x, y) \ ({ int result; \ - __asm__ ("fucompp; fnstsw; sahf; setp %%al; andl $0xff, %0" \ - : "=a" (result) : "t" (x), "u" (y) : "cc"); \ + __asm__ ("fucompp; fnstsw; sahf; setp %%al; andl $0x01, %0" \ + : "=a" (result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \ result; }) #endif diff --git a/sysdeps/i386/htonl.S b/sysdeps/i386/htonl.S new file mode 100644 index 0000000000..73dd1e9bea --- /dev/null +++ b/sysdeps/i386/htonl.S @@ -0,0 +1,39 @@ +/* Change byte order in word. For Intel 80386. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include "asm-syntax.h" + +/* + INPUT PARAMETERS: + word (sp + 4) +*/ + + .text +ENTRY (__htonl) + movl 4(%esp), %eax + rorw $8, %ax + rorl $16, %eax + rorw $8, %ax + ret +END (__htonl) + +strong_alias (__htonl, __ntohl) +weak_alias (__htonl, htonl) +weak_alias (__ntohl, ntohl) diff --git a/sysdeps/i386/htons.S b/sysdeps/i386/htons.S new file mode 100644 index 0000000000..5d0f59c92b --- /dev/null +++ b/sysdeps/i386/htons.S @@ -0,0 +1,38 @@ +/* Change byte order in word. For Intel 80x86, x >= 3. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include "asm-syntax.h" + +/* + INPUT PARAMETERS: + word (sp + 4) +*/ + + .text +ENTRY (__htons) + movl 4(%esp), %eax + andl $0xffff, %eax + rorw $8, %ax + ret +END (__htons) + +strong_alias (__htons, __ntohs) +weak_alias (__htons, htons) +weak_alias (__ntohs, ntohs) diff --git a/sysdeps/i386/i486/htonl.S b/sysdeps/i386/i486/htonl.S new file mode 100644 index 0000000000..cf3a94fc76 --- /dev/null +++ b/sysdeps/i386/i486/htonl.S @@ -0,0 +1,37 @@ +/* Change byte order in word. For Intel 80x86, x >= 4. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include "asm-syntax.h" + +/* + INPUT PARAMETERS: + word (sp + 4) +*/ + + .text +ENTRY (__htonl) + movl 4(%esp), %eax + bswap %eax + ret +END (__htonl) + +strong_alias (__htonl, __ntohl) +weak_alias (__htonl, htonl) +weak_alias (__ntohl, ntohl) diff --git a/sysdeps/libm-ieee754/e_atan2f.c b/sysdeps/libm-ieee754/e_atan2f.c index 437975f79f..8b3398c0a3 100644 --- a/sysdeps/libm-ieee754/e_atan2f.c +++ b/sysdeps/libm-ieee754/e_atan2f.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -21,16 +21,16 @@ static char rcsid[] = "$NetBSD: e_atan2f.c,v 1.4 1995/05/10 20:44:53 jtc Exp $"; #include "math_private.h" #ifdef __STDC__ -static const float +static const float #else -static float +static float #endif tiny = 1.0e-30, zero = 0.0, -pi_o_4 = 7.8539818525e-01, /* 0x3f490fdb */ -pi_o_2 = 1.5707963705e+00, /* 0x3fc90fdb */ -pi = 3.1415925026e+00, /* 0x40490fda */ -pi_lo = 1.5099578832e-07; /* 0x34222168 */ +pi_o_4 = 7.8539818525e-01, /* 0x3f490fdb */ +pi_o_2 = 1.5707963705e+00, /* 0x3fc90fdb */ +pi = 3.1415927410e+00, /* 0x40490fdb */ +pi_lo = -8.7422776573e-07; /* 0xb3bbbd2e */ #ifdef __STDC__ float __ieee754_atan2f(float y, float x) @@ -38,7 +38,7 @@ pi_lo = 1.5099578832e-07; /* 0x34222168 */ float __ieee754_atan2f(y,x) float y,x; #endif -{ +{ float z; int32_t k,m,hx,hy,ix,iy; @@ -55,7 +55,7 @@ pi_lo = 1.5099578832e-07; /* 0x34222168 */ /* when y = 0 */ if(iy==0) { switch(m) { - case 0: + case 0: case 1: return y; /* atan(+-0,+anything)=+-0 */ case 2: return pi+tiny;/* atan(+0,-anything) = pi */ case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */ @@ -63,7 +63,7 @@ pi_lo = 1.5099578832e-07; /* 0x34222168 */ } /* when x = 0 */ if(ix==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; - + /* when x is INF */ if(ix==0x7f800000) { if(iy==0x7f800000) { diff --git a/sysdeps/libm-ieee754/e_log.c b/sysdeps/libm-ieee754/e_log.c index f584694686..e4e6eab6c5 100644 --- a/sysdeps/libm-ieee754/e_log.c +++ b/sysdeps/libm-ieee754/e_log.c @@ -106,8 +106,8 @@ static double zero = 0.0; k=0; if (hx < 0x00100000) { /* x < 2**-1022 */ if (((hx&0x7fffffff)|lx)==0) - return -two54/zero; /* log(+-0)=-inf */ - if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + return -two54/(x-x); /* log(+-0)=-inf */ + if (hx<0) return (x-x)/(x-x); /* log(-#) = NaN */ k -= 54; x *= two54; /* subnormal number, scale up x */ GET_HIGH_WORD(hx,x); } diff --git a/sysdeps/libm-ieee754/e_log10.c b/sysdeps/libm-ieee754/e_log10.c index 5d004ac4e2..e8a3278eaf 100644 --- a/sysdeps/libm-ieee754/e_log10.c +++ b/sysdeps/libm-ieee754/e_log10.c @@ -5,7 +5,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -16,26 +16,26 @@ static char rcsid[] = "$NetBSD: e_log10.c,v 1.9 1995/05/10 20:45:51 jtc Exp $"; /* __ieee754_log10(x) * Return the base 10 logarithm of x - * + * * Method : * Let log10_2hi = leading 40 bits of log10(2) and * log10_2lo = log10(2) - log10_2hi, * ivln10 = 1/log(10) rounded. * Then - * n = ilogb(x), + * n = ilogb(x), * if(n<0) n = n+1; * x = scalbn(x,-n); * log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x)) * * Note 1: - * To guarantee log10(10**n)=n, where 10**n is normal, the rounding + * To guarantee log10(10**n)=n, where 10**n is normal, the rounding * mode must set to Round-to-Nearest. * Note 2: * [1/log(10)] rounded to 53 bits has error .198 ulps; * log10 is monotonic at all binary break points. * * Special cases: - * log10(x) is NaN with signal if x < 0; + * log10(x) is NaN with signal if x < 0; * log10(+INF) is +INF with no signal; log10(0) is -INF with signal; * log10(NaN) is that NaN with no signal; * log10(10**N) = N for N=0,1,...,22. @@ -80,10 +80,10 @@ static double zero = 0.0; EXTRACT_WORDS(hx,lx,x); k=0; - if (hx < 0x00100000) { /* x < 2**-1022 */ + if (hx < 0x00100000) { /* x < 2**-1022 */ if (((hx&0x7fffffff)|lx)==0) - return -two54/zero; /* log(+-0)=-inf */ - if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + return -two54/(x-x); /* log(+-0)=-inf */ + if (hx<0) return (x-x)/(x-x); /* log(-#) = NaN */ k -= 54; x *= two54; /* subnormal number, scale up x */ GET_HIGH_WORD(hx,x); } diff --git a/sysdeps/libm-ieee754/e_log10f.c b/sysdeps/libm-ieee754/e_log10f.c index 2082a763bb..cea3d9156b 100644 --- a/sysdeps/libm-ieee754/e_log10f.c +++ b/sysdeps/libm-ieee754/e_log10f.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -49,10 +49,10 @@ static float zero = 0.0; GET_FLOAT_WORD(hx,x); k=0; - if (hx < 0x00800000) { /* x < 2**-126 */ + if (hx < 0x00800000) { /* x < 2**-126 */ if ((hx&0x7fffffff)==0) - return -two25/zero; /* log(+-0)=-inf */ - if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + return -two25/(x-x); /* log(+-0)=-inf */ + if (hx<0) return (x-x)/(x-x); /* log(-#) = NaN */ k -= 25; x *= two25; /* subnormal number, scale up x */ GET_FLOAT_WORD(hx,x); } diff --git a/sysdeps/libm-ieee754/e_logf.c b/sysdeps/libm-ieee754/e_logf.c index 1481fd01cb..0f1af93ba8 100644 --- a/sysdeps/libm-ieee754/e_logf.c +++ b/sysdeps/libm-ieee754/e_logf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -56,12 +56,12 @@ static float zero = 0.0; k=0; if (ix < 0x00800000) { /* x < 2**-126 */ - if ((ix&0x7fffffff)==0) - return -two25/zero; /* log(+-0)=-inf */ - if (ix<0) return (x-x)/zero; /* log(-#) = NaN */ + if ((ix&0x7fffffff)==0) + return -two25/(x-x); /* log(+-0)=-inf */ + if (ix<0) return (x-x)/(x-x); /* log(-#) = NaN */ k -= 25; x *= two25; /* subnormal number, scale up x */ GET_FLOAT_WORD(ix,x); - } + } if (ix >= 0x7f800000) return x+x; k += (ix>>23)-127; ix &= 0x007fffff; @@ -76,14 +76,14 @@ static float zero = 0.0; if(k==0) return f-R; else {dk=(float)k; return dk*ln2_hi-((R-dk*ln2_lo)-f);} } - s = f/((float)2.0+f); + s = f/((float)2.0+f); dk = (float)k; z = s*s; i = ix-(0x6147a<<3); w = z*z; j = (0x6b851<<3)-ix; - t1= w*(Lg2+w*(Lg4+w*Lg6)); - t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); + t1= w*(Lg2+w*(Lg4+w*Lg6)); + t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); i |= j; R = t2+t1; if(i>0) { diff --git a/sysdeps/libm-ieee754/s_isinf.c b/sysdeps/libm-ieee754/s_isinf.c index d3c2cb55b7..6f76ce1fba 100644 --- a/sysdeps/libm-ieee754/s_isinf.c +++ b/sysdeps/libm-ieee754/s_isinf.c @@ -23,12 +23,11 @@ static char rcsid[] = "$NetBSD: s_isinf.c,v 1.3 1995/05/11 23:20:14 jtc Exp $"; double x; #endif { - u_int32_t hx; - int32_t lx; + int32_t hx,lx; EXTRACT_WORDS(hx,lx,x); lx |= (hx & 0x7fffffff) ^ 0x7ff00000; lx |= -lx; - return ~(lx >> 31) & (1 - ((hx >> 30) & 2)); + return ~(lx >> 31) & (hx >> 30); } weak_alias (__isinf, isinf) #ifdef NO_LONG_DOUBLE diff --git a/sysdeps/libm-ieee754/s_isinff.c b/sysdeps/libm-ieee754/s_isinff.c index 9acc0df6ec..18a0b5e03b 100644 --- a/sysdeps/libm-ieee754/s_isinff.c +++ b/sysdeps/libm-ieee754/s_isinff.c @@ -27,6 +27,6 @@ static char rcsid[] = "$NetBSD: s_isinff.c,v 1.3 1995/05/11 23:20:21 jtc Exp $"; t = ix & 0x7fffffff; t ^= 0x7f800000; t |= -t; - return ~(t >> 31) & (1 - ((ix & 0x80000000) >> 30)); + return ~(t >> 31) & (ix >> 30); } weak_alias (__isinff, isinff) diff --git a/sysdeps/libm-ieee754/s_log1p.c b/sysdeps/libm-ieee754/s_log1p.c index cc380a1091..086c0dce6c 100644 --- a/sysdeps/libm-ieee754/s_log1p.c +++ b/sysdeps/libm-ieee754/s_log1p.c @@ -120,7 +120,7 @@ static double zero = 0.0; k = 1; if (hx < 0x3FDA827A) { /* x < 0.41422 */ if(ax>=0x3ff00000) { /* x <= -1.0 */ - if(x==-1.0) return -two54/zero; /* log1p(-1)=+inf */ + if(x==-1.0) return -two54/(x-x);/* log1p(-1)=+inf */ else return (x-x)/(x-x); /* log1p(x<-1)=NaN */ } if(ax<0x3e200000) { /* |x| < 2**-29 */ diff --git a/sysdeps/libm-ieee754/s_log1pf.c b/sysdeps/libm-ieee754/s_log1pf.c index ee0a83958d..5b1237b0d0 100644 --- a/sysdeps/libm-ieee754/s_log1pf.c +++ b/sysdeps/libm-ieee754/s_log1pf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -58,7 +58,7 @@ static float zero = 0.0; k = 1; if (hx < 0x3ed413d7) { /* x < 0.41422 */ if(ax>=0x3f800000) { /* x <= -1.0 */ - if(x==(float)-1.0) return -two25/zero; /* log1p(-1)=+inf */ + if(x==(float)-1.0) return -two25/(x-x); /* log1p(-1)=+inf */ else return (x-x)/(x-x); /* log1p(x<-1)=NaN */ } if(ax<0x31000000) { /* |x| < 2**-29 */ @@ -70,11 +70,11 @@ static float zero = 0.0; } if(hx>0||hx<=((int32_t)0xbe95f61f)) { k=0;f=x;hu=1;} /* -0.2929= 0x7f800000) return x+x; if(k!=0) { if(hx<0x5a000000) { - u = (float)1.0+x; + u = (float)1.0+x; GET_FLOAT_WORD(hu,u); k = (hu>>23)-127; /* correction term */ @@ -90,7 +90,7 @@ static float zero = 0.0; if(hu<0x3504f7) { SET_FLOAT_WORD(u,hu|0x3f800000);/* normalize u */ } else { - k += 1; + k += 1; SET_FLOAT_WORD(u,hu|0x3f000000); /* normalize u/2 */ hu = (0x00800000-hu)>>2; } @@ -98,13 +98,13 @@ static float zero = 0.0; } hfsq=(float)0.5*f*f; if(hu==0) { /* |f| < 2**-20 */ - if(f==zero) if(k==0) return zero; + if(f==zero) if(k==0) return zero; else {c += k*ln2_lo; return k*ln2_hi+c;} R = hfsq*((float)1.0-(float)0.66666666666666666*f); if(k==0) return f-R; else return k*ln2_hi-((R-(k*ln2_lo+c))-f); } - s = f/((float)2.0+f); + s = f/((float)2.0+f); z = s*s; R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7)))))); if(k==0) return f-(hfsq-s*(hfsq+R)); else diff --git a/sysdeps/libm-ieee754/s_log2.c b/sysdeps/libm-ieee754/s_log2.c index 46b53cfeff..93c20b3db1 100644 --- a/sysdeps/libm-ieee754/s_log2.c +++ b/sysdeps/libm-ieee754/s_log2.c @@ -93,8 +93,8 @@ static double zero = 0.0; k=0; if (hx < 0x00100000) { /* x < 2**-1022 */ if (((hx&0x7fffffff)|lx)==0) - return -two54/zero; /* log(+-0)=-inf */ - if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + return -two54/(x-x); /* log(+-0)=-inf */ + if (hx<0) return (x-x)/(x-x); /* log(-#) = NaN */ k -= 54; x *= two54; /* subnormal number, scale up x */ GET_HIGH_WORD(hx,x); } diff --git a/sysdeps/libm-ieee754/s_log2f.c b/sysdeps/libm-ieee754/s_log2f.c index 6415c37f53..da9dfb8324 100644 --- a/sysdeps/libm-ieee754/s_log2f.c +++ b/sysdeps/libm-ieee754/s_log2f.c @@ -53,8 +53,8 @@ static float zero = 0.0; k=0; if (ix < 0x00800000) { /* x < 2**-126 */ if ((ix&0x7fffffff)==0) - return -two25/zero; /* log(+-0)=-inf */ - if (ix<0) return (x-x)/zero; /* log(-#) = NaN */ + return -two25/(x-x); /* log(+-0)=-inf */ + if (ix<0) return (x-x)/(x-x); /* log(-#) = NaN */ k -= 25; x *= two25; /* subnormal number, scale up x */ GET_FLOAT_WORD(ix,x); } diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h index e50f773614..c0a17c73c2 100644 --- a/sysdeps/m68k/dl-machine.h +++ b/sysdeps/m68k/dl-machine.h @@ -234,11 +234,13 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, if (sym->st_size > refsym->st_size || (_dl_verbose && sym->st_size < refsym->st_size)) { + extern char **_dl_argv; const char *strtab; strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error ("Symbol `", strtab + refsym->st_name, + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, "' has different size in shared object, " "consider re-linking\n", NULL); } diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h index cc7198b60e..7456ae0b7a 100644 --- a/sysdeps/mips/dl-machine.h +++ b/sysdeps/mips/dl-machine.h @@ -125,32 +125,11 @@ elf_machine_got (void) } -/* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ -static inline ElfW(Addr) -elf_machine_dynamic (void) -{ - register ElfW(Addr) gp asm ("$28"); - return * (ElfW(Addr) *) (gp - 0x7ff0); -} - /* Return the run-time load address of the shared object. */ static inline ElfW(Addr) elf_machine_load_address (void) { ElfW(Addr) addr; -#ifdef __mips64 - asm (" .set noreorder\n" - " dla %0, here\n" - " bltzal $0, here\n" - " nop\n" - "here: dsubu %0, $31, %0\n" - " .set reorder\n" - : "=r" (addr) - : /* No inputs */ - : "$31"); -#else asm (" .set noreorder\n" " la %0, here\n" " bltzal $0, here\n" @@ -160,7 +139,6 @@ elf_machine_load_address (void) : "=r" (addr) : /* No inputs */ : "$31"); -#endif return addr; } @@ -364,100 +342,6 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc) t8 index for this function symbol in .dynsym to usual c arguments. */ -#ifdef __mips64 -#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ -/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \ - generated by the gnu linker. */ \ -int _dl_mips_gnu_objects = 1; \ - \ -/* This is called from assembly stubs below which the compiler can't see. */ \ -static ElfW(Addr) \ -__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \ - __attribute__ ((unused)); \ - \ -static ElfW(Addr) \ -__dl_runtime_resolve (ElfW(Word) sym_index, \ - ElfW(Word) return_address, \ - ElfW(Addr) old_gpreg, \ - ElfW(Addr) stub_pc) \ -{ \ - struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc); \ - const ElfW(Sym) *const symtab \ - = (const ElfW(Sym) *) (l->l_addr + l->l_info[DT_SYMTAB]->d_un.d_ptr); \ - const char *strtab \ - = (void *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr); \ - const ElfW(Addr) *got \ - = (const ElfW(Addr) *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); \ - const ElfW(Word) local_gotno \ - = (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; \ - const ElfW(Word) gotsym \ - = (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; \ - const ElfW(Sym) *definer; \ - ElfW(Addr) loadbase; \ - ElfW(Addr) funcaddr; \ - struct link_map **scope; \ - \ - /* Look up the symbol's run-time value. */ \ - scope = _dl_object_relocation_scope (l); \ - definer = &symtab[sym_index]; \ - \ - loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \ - scope, l->l_name, ELF_MACHINE_RELOC_NOPLT); \ - \ - *_dl_global_scope_end = NULL; \ - \ - /* Apply the relocation with that value. */ \ - funcaddr = loadbase + definer->st_value; \ - *(got + local_gotno + sym_index - gotsym) = funcaddr; \ - \ - return funcaddr; \ -} \ - \ -asm ("\n \ - .text\n \ - .align 3\n \ - .globl _dl_runtime_resolve\n \ - .type _dl_runtime_resolve,@function\n \ - .ent _dl_runtime_resolve\n \ -_dl_runtime_resolve:\n \ - .set noreorder\n \ - # Save old GP to $3.\n \ - move $3,$28\n \ - # Modify t9 ($25) so as to point .cpload instruction.\n \ - daddu $25,2*8\n \ - # Compute GP.\n \ - .cpload $25\n \ - .set reorder\n \ - # Save slot call pc.\n \ - move $2, $31\n \ - # Save arguments and sp value in stack.\n \ - dsubu $29, 10*8\n \ - .cprestore 8*8\n \ - sd $15, 9*8($29)\n \ - sd $4, 3*8($29)\n \ - sd $5, 4*8($29)\n \ - sd $6, 5*8($29)\n \ - sd $7, 6*8($29)\n \ - sd $16, 7*8($29)\n \ - move $16, $29\n \ - move $4, $24\n \ - move $5, $15\n \ - move $6, $3\n \ - move $7, $2\n \ - jal __dl_runtime_resolve\n \ - move $29, $16\n \ - ld $31, 9*8($29)\n \ - ld $4, 3*8($29)\n \ - ld $5, 4*8($29)\n \ - ld $6, 5*8($29)\n \ - ld $7, 6*8($29)\n \ - ld $16, 7*8($29)\n \ - daddu $29, 10*8\n \ - move $25, $2\n \ - jr $25\n \ - .end _dl_runtime_resolve\n \ -"); -#else #define ELF_MACHINE_RUNTIME_TRAMPOLINE \ /* The flag _dl_mips_gnu_objects is set if all dynamic objects are \ generated by the gnu linker. */ \ @@ -550,7 +434,6 @@ _dl_runtime_resolve:\n \ jr $25\n \ .end _dl_runtime_resolve\n \ "); -#endif /* Mask identifying addresses reserved for the user program, where the dynamic linker should not map anything. */ @@ -573,78 +456,6 @@ _dl_runtime_resolve:\n \ 2) That under Linux the entry is named __start and not just plain _start. */ -#ifdef __mips64 -#define RTLD_START asm ("\ - .text\n\ - .align 3\n"\ -_RTLD_PROLOGUE (ENTRY_POINT)\ -" .globl _dl_start_user\n\ - .set noreorder\n\ - bltzal $0, 0f\n\ - nop\n\ -0: .cpload $31\n\ - .set reorder\n\ - # i386 ABI book says that the first entry of GOT holds\n\ - # the address of the dynamic structure. Though MIPS ABI\n\ - # doesn't say nothing about this, I emulate this here.\n\ - dla $4, _DYNAMIC\n\ - sd $4, -0x7ff0($28)\n\ - move $4, $29\n\ - jal _dl_start\n\ - # Get the value of label '_dl_start_user' in t9 ($25).\n\ - dla $25, _dl_start_user\n\ -_dl_start_user:\n\ - .set noreorder\n\ - .cpload $25\n\ - .set reorder\n\ - move $16, $28\n\ - # Save the user entry point address in saved register.\n\ - move $17, $2\n\ - # See if we were run as a command with the executable file\n\ - # name as an extra leading argument.\n\ - ld $2, _dl_skip_args\n\ - beq $2, $0, 1f\n\ - # Load the original argument count.\n\ - ld $4, 0($29)\n\ - # Subtract _dl_skip_args from it.\n\ - dsubu $4, $2\n\ - # Adjust the stack pointer to skip _dl_skip_args words.\n\ - dsll $2,2\n\ - daddu $29, $2\n\ - # Save back the modified argument count.\n\ - sd $4, 0($29)\n\ - # Get _dl_default_scope[2] as argument in _dl_init_next call below.\n\ -1: dla $2, _dl_default_scope\n\ - ld $4, 2*8($2)\n\ - # Call _dl_init_next to return the address of an initializer\n\ - # function to run.\n\ - jal _dl_init_next\n\ - move $28, $16\n\ - # Check for zero return, when out of initializers.\n\ - beq $2, $0, 2f\n\ - # Call the shared object initializer function.\n\ - move $25, $2\n\ - ld $4, 0($29)\n\ - ld $5, 1*8($29)\n\ - ld $6, 2*8($29)\n\ - ld $7, 3*8($29)\n\ - jalr $25\n\ - move $28, $16\n\ - # Loop to call _dl_init_next for the next initializer.\n\ - b 1b\n\ - # Pass our finalizer function to the user in ra.\n\ -2: dla $31, _dl_fini\n\ - # Jump to the user entry point.\n\ - move $25, $17\n\ - ld $4, 0($29)\n\ - ld $5, 1*8($29)\n\ - ld $6, 2*8$29)\n\ - ld $7, 3*8($29)\n\ - jr $25\n"\ -_RTLD_EPILOGUE(ENTRY_POINT) \ -); - -#else #define RTLD_START asm ("\ .text\n"\ _RTLD_PROLOGUE(ENTRY_POINT)\ @@ -718,8 +529,7 @@ _dl_start_user:\n\ lw $7, 12($29)\n\ jr $25\n"\ _RTLD_EPILOGUE(ENTRY_POINT)\ -"); -#endif +); /* The MIPS never uses Elfxx_Rela relocations. */ #define ELF_MACHINE_NO_RELA 1 diff --git a/sysdeps/mips/mips64/dl-machine.h b/sysdeps/mips/mips64/dl-machine.h new file mode 100644 index 0000000000..3277b109d9 --- /dev/null +++ b/sysdeps/mips/mips64/dl-machine.h @@ -0,0 +1,594 @@ +/* Machine-dependent ELF dynamic relocation inline functions. MIPS version. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef dl_machine_h +#define dl_machine_h + +#define ELF_MACHINE_NAME "MIPS" + +#include +#include + +#ifndef ENTRY_POINT +#error ENTRY_POINT needs to be defined for MIPS. +#endif + +#ifndef _RTLD_PROLOGUE +#ifdef __STDC__ +#define _RTLD_PROLOGUE(entry) "\n\t.globl " #entry \ + "\n\t.ent " #entry \ + "\n\t" #entry ":\n\t" +#else +#define _RTLD_PROLOGUE(entry) "\n\t.globl entry\n\t.ent entry\n\t entry:\n\t" +#endif +#endif + +#ifndef _RTLD_EPILOGUE +#ifdef __STDC__ +#define _RTLD_EPILOGUE(entry) "\t.end " #entry "\n" +#else +#define _RTLD_EPILOGUE(entry) "\t.end entry\n" +#endif +#endif + +/* I have no idea what I am doing. */ +#define ELF_MACHINE_RELOC_NOPLT -1 +#define elf_machine_lookup_noplt_p(type) (1) +#define elf_machine_lookup_noexec_p(type) (0) + +/* Translate a processor specific dynamic tag to the index + in l_info array. */ +#define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM) + +#if 0 +/* We may need 64k alignment. */ +#define ELF_MACHINE_ALIGN_MASK 0xffff +#endif + +/* + * MIPS libraries are usually linked to a non-zero base address. We + * subtrace the base address from the address where we map the object + * to. This results in more efficient address space usage. + */ +#if 0 +#define MAP_BASE_ADDR(l) ((l)->l_info[DT_MIPS(BASE_ADDRESS)] ? \ + (l)->l_info[DT_MIPS(BASE_ADDRESS)]->d_un.d_ptr : 0) +#else +#define MAP_BASE_ADDR(l) 0x5ffe0000 +#endif + +/* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in + with the run-time address of the r_debug structure */ +#define ELF_MACHINE_DEBUG_SETUP(l,r) \ +do { if ((l)->l_info[DT_MIPS (RLD_MAP)]) \ + *(ElfW(Addr) *)((l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) = \ + (ElfW(Addr)) (r); \ + } while (0) + +/* Return nonzero iff E_MACHINE is compatible with the running host. */ +static inline int __attribute__ ((unused)) +elf_machine_matches_host (ElfW(Half) e_machine) +{ + switch (e_machine) + { + case EM_MIPS: + case EM_MIPS_RS4_BE: + return 1; + default: + return 0; + } +} + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the ++ first element of the GOT. This must be inlined in a function which ++ uses global data. */ ++static inline ElfW(Addr) ++elf_machine_dynamic (void) ++{ ++ register ElfW(Addr) gp asm ("$28"); ++ return * (ElfW(Addr) *) (gp - 0x7ff0); ++} ++ +static inline ElfW(Addr) * +elf_mips_got_from_gpreg (ElfW(Addr) gpreg) +{ + /* FIXME: the offset of gp from GOT may be system-dependent. */ + return (ElfW(Addr) *) (gpreg - 0x7ff0); +} + +/* Return the run-time address of the _GLOBAL_OFFSET_TABLE_. + Must be inlined in a function which uses global data. */ +static inline ElfW(Addr) * +elf_machine_got (void) +{ + ElfW(Addr) gp; + + __asm__ __volatile__("move %0, $28\n\t" : "=r" (gp)); + return elf_mips_got_from_gpreg (gp); +} + + +/* Return the run-time load address of the shared object. */ +static inline ElfW(Addr) +elf_machine_load_address (void) +{ + ElfW(Addr) addr; + asm (" .set noreorder\n" + " dla %0, here\n" + " bltzal $0, here\n" + " nop\n" + "here: dsubu %0, $31, %0\n" + " .set reorder\n" + : "=r" (addr) + : /* No inputs */ + : "$31"); + return addr; +} + +/* The MSB of got[1] of a gnu object is set to identify gnu objects. */ +#define ELF_MIPS_GNU_GOT1_MASK 0x80000000 + +/* Relocate GOT. */ +static inline void +elf_machine_got_rel (struct link_map *map, int lazy) +{ + ElfW(Addr) *got; + ElfW(Sym) *sym; + int i, n; + struct link_map **scope; + const char *strtab + = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); + +#define RESOLVE_GOTSYM(sym) \ + ({ \ + const ElfW(Sym) *ref = sym; \ + ElfW(Addr) sym_loadaddr; \ + sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, scope, \ + map->l_name, ELF_MACHINE_RELOC_NOPLT);\ + (ref)? sym_loadaddr + ref->st_value: 0; \ + }) + + got = (ElfW(Addr) *) ((void *) map->l_addr + + map->l_info[DT_PLTGOT]->d_un.d_ptr); + + /* got[0] is reserved. got[1] is also reserved for the dynamic object + generated by gnu ld. Skip these reserved entries from relocation. */ + i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2: 1; + n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; + /* Add the run-time display to all local got entries. */ + while (i < n) + got[i++] += map->l_addr; + + /* Set scope. */ + scope = _dl_object_relocation_scope (map); + + /* Handle global got entries. */ + got += n; + sym = (ElfW(Sym) *) ((void *) map->l_addr + + map->l_info[DT_SYMTAB]->d_un.d_ptr); + sym += map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; + i = (map->l_info[DT_MIPS (SYMTABNO)]->d_un.d_val + - map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val); + + while (i--) + { + if (sym->st_shndx == SHN_UNDEF) + { + if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC) + { + if (sym->st_value && lazy) + *got = sym->st_value + map->l_addr; + else + *got = RESOLVE_GOTSYM (sym); + } + else /* if (*got == 0 || *got == QS) */ + *got = RESOLVE_GOTSYM (sym); + } + else if (sym->st_shndx == SHN_COMMON) + *got = RESOLVE_GOTSYM (sym); + else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC + && *got != sym->st_value + && lazy) + *got += map->l_addr; + else if (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION) + { + if (sym->st_other == 0) + *got += map->l_addr; + } + else + *got = RESOLVE_GOTSYM (sym); + + got++; + sym++; + } + +#undef RESOLVE_GOTSYM + *_dl_global_scope_end = NULL; + + return; +} + +/* Set up the loaded object described by L so its stub function + will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int +elf_machine_runtime_setup (struct link_map *l, int lazy) +{ + ElfW(Addr) *got; + extern void _dl_runtime_resolve (ElfW(Word)); + extern int _dl_mips_gnu_objects; + +#ifdef RTLD_BOOTSTRAP + { + return lazy; + } +#endif + if (lazy) + { + /* The GOT entries for functions have not yet been filled in. + Their initial contents will arrange when called to put an + offset into the .dynsym section in t8, the return address + in t7 and then jump to _GLOBAL_OFFSET_TABLE[0]. */ + got = (ElfW(Addr) *) ((void *) l->l_addr + + l->l_info[DT_PLTGOT]->d_un.d_ptr); + + /* This function will get called to fix up the GOT entry indicated by + the register t8, and then jump to the resolved address. */ + got[0] = (ElfW(Addr)) &_dl_runtime_resolve; + + /* Store l to _GLOBAL_OFFSET_TABLE[1] for gnu object. The MSB + of got[1] of a gnu object is set to identify gnu objects. + Where we can store l for non gnu objects? XXX */ + if ((got[1] & ELF_MIPS_GNU_GOT1_MASK) != 0) + got[1] = (ElfW(Addr)) ((unsigned) l | ELF_MIPS_GNU_GOT1_MASK); + else + _dl_mips_gnu_objects = 0; + } + + /* Relocate global offset table. */ + elf_machine_got_rel (l, lazy); + + return lazy; +} + +/* Get link_map for this object. */ +static inline struct link_map * +elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc) +{ + extern int _dl_mips_gnu_objects; + + /* got[1] is reserved to keep its link map address for the shared + object generated by gnu linker. If all are such object, we can + find link map from current GPREG simply. If not so, get link map + for callers object containing STUB_PC. */ + + if (_dl_mips_gnu_objects) + { + ElfW(Addr) *got = elf_mips_got_from_gpreg (gpreg); + ElfW(Word) g1; + + g1 = ((ElfW(Word) *) got)[1]; + + if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0) + return (struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK); + } + + { + struct link_map *l = _dl_loaded; + struct link_map *ret = 0; + ElfW(Addr) candidate = 0; + + while (l) + { + ElfW(Addr) base = 0; + const ElfW(Phdr) *p = l->l_phdr; + ElfW(Half) this, nent = l->l_phnum; + + /* Get the base. */ + for (this = 0; this < nent; this++) + if (p[this].p_type == PT_LOAD) + { + base = p[this].p_vaddr + l->l_addr; + break; + } + if (! base) + { + l = l->l_next; + continue; + } + + /* Find closest link base addr. */ + if ((base < stub_pc) && (candidate < base)) + { + candidate = base; + ret = l; + } + l = l->l_next; + } + if (candidate && ret && (candidate < stub_pc)) + return ret; + else if (!candidate) + return _dl_loaded; + } + + _dl_signal_error (0, NULL, "cannot find runtime link map"); + return NULL; +} + +/* Mips has no PLT but define elf_machine_relplt to be elf_machine_rel. */ +#define elf_machine_relplt elf_machine_rel + +/* Define mips specific runtime resolver. The function __dl_runtime_resolve + is called from assembler function _dl_runtime_resolve which converts + special argument registers t7 ($15) and t8 ($24): + t7 address to return to the caller of the function + t8 index for this function symbol in .dynsym + to usual c arguments. */ + +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ +/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \ + generated by the gnu linker. */ \ +int _dl_mips_gnu_objects = 1; \ + \ +/* This is called from assembly stubs below which the compiler can't see. */ \ +static ElfW(Addr) \ +__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \ + __attribute__ ((unused)); \ + \ +static ElfW(Addr) \ +__dl_runtime_resolve (ElfW(Word) sym_index, \ + ElfW(Word) return_address, \ + ElfW(Addr) old_gpreg, \ + ElfW(Addr) stub_pc) \ +{ \ + struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc); \ + const ElfW(Sym) *const symtab \ + = (const ElfW(Sym) *) (l->l_addr + l->l_info[DT_SYMTAB]->d_un.d_ptr); \ + const char *strtab \ + = (void *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr); \ + const ElfW(Addr) *got \ + = (const ElfW(Addr) *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); \ + const ElfW(Word) local_gotno \ + = (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; \ + const ElfW(Word) gotsym \ + = (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; \ + const ElfW(Sym) *definer; \ + ElfW(Addr) loadbase; \ + ElfW(Addr) funcaddr; \ + struct link_map **scope; \ + \ + /* Look up the symbol's run-time value. */ \ + scope = _dl_object_relocation_scope (l); \ + definer = &symtab[sym_index]; \ + \ + loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \ + scope, l->l_name, ELF_MACHINE_RELOC_NOPLT); \ + \ + *_dl_global_scope_end = NULL; \ + \ + /* Apply the relocation with that value. */ \ + funcaddr = loadbase + definer->st_value; \ + *(got + local_gotno + sym_index - gotsym) = funcaddr; \ + \ + return funcaddr; \ +} \ + \ +asm ("\n \ + .text\n \ + .align 3\n \ + .globl _dl_runtime_resolve\n \ + .type _dl_runtime_resolve,@function\n \ + .ent _dl_runtime_resolve\n \ +_dl_runtime_resolve:\n \ + .set noreorder\n \ + # Save old GP to $3.\n \ + move $3,$28\n \ + # Modify t9 ($25) so as to point .cpload instruction.\n \ + daddu $25,2*8\n \ + # Compute GP.\n \ + .cpload $25\n \ + .set reorder\n \ + # Save slot call pc.\n \ + move $2, $31\n \ + # Save arguments and sp value in stack.\n \ + dsubu $29, 10*8\n \ + .cprestore 8*8\n \ + sd $15, 9*8($29)\n \ + sd $4, 3*8($29)\n \ + sd $5, 4*8($29)\n \ + sd $6, 5*8($29)\n \ + sd $7, 6*8($29)\n \ + sd $16, 7*8($29)\n \ + move $16, $29\n \ + move $4, $24\n \ + move $5, $15\n \ + move $6, $3\n \ + move $7, $2\n \ + jal __dl_runtime_resolve\n \ + move $29, $16\n \ + ld $31, 9*8($29)\n \ + ld $4, 3*8($29)\n \ + ld $5, 4*8($29)\n \ + ld $6, 5*8($29)\n \ + ld $7, 6*8($29)\n \ + ld $16, 7*8($29)\n \ + daddu $29, 10*8\n \ + move $25, $2\n \ + jr $25\n \ + .end _dl_runtime_resolve\n \ +"); + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL + + + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. + Note how we have to be careful about two things: + + 1) That we allocate a minimal stack of 24 bytes for + every function call, the MIPS ABI states that even + if all arguments are passed in registers the procedure + called can use the 16 byte area pointed to by $sp + when it is called to store away the arguments passed + to it. + + 2) That under Linux the entry is named __start + and not just plain _start. */ + +#define RTLD_START asm ("\ + .text\n\ + .align 3\n"\ +_RTLD_PROLOGUE (ENTRY_POINT)\ +" .globl _dl_start_user\n\ + .set noreorder\n\ + bltzal $0, 0f\n\ + nop\n\ +0: .cpload $31\n\ + .set reorder\n\ + # i386 ABI book says that the first entry of GOT holds\n\ + # the address of the dynamic structure. Though MIPS ABI\n\ + # doesn't say nothing about this, I emulate this here.\n\ + dla $4, _DYNAMIC\n\ + sd $4, -0x7ff0($28)\n\ + move $4, $29\n\ + jal _dl_start\n\ + # Get the value of label '_dl_start_user' in t9 ($25).\n\ + dla $25, _dl_start_user\n\ +_dl_start_user:\n\ + .set noreorder\n\ + .cpload $25\n\ + .set reorder\n\ + move $16, $28\n\ + # Save the user entry point address in saved register.\n\ + move $17, $2\n\ + # See if we were run as a command with the executable file\n\ + # name as an extra leading argument.\n\ + ld $2, _dl_skip_args\n\ + beq $2, $0, 1f\n\ + # Load the original argument count.\n\ + ld $4, 0($29)\n\ + # Subtract _dl_skip_args from it.\n\ + dsubu $4, $2\n\ + # Adjust the stack pointer to skip _dl_skip_args words.\n\ + dsll $2,2\n\ + daddu $29, $2\n\ + # Save back the modified argument count.\n\ + sd $4, 0($29)\n\ + # Get _dl_default_scope[2] as argument in _dl_init_next call below.\n\ +1: dla $2, _dl_default_scope\n\ + ld $4, 2*8($2)\n\ + # Call _dl_init_next to return the address of an initializer\n\ + # function to run.\n\ + jal _dl_init_next\n\ + move $28, $16\n\ + # Check for zero return, when out of initializers.\n\ + beq $2, $0, 2f\n\ + # Call the shared object initializer function.\n\ + move $25, $2\n\ + ld $4, 0($29)\n\ + ld $5, 1*8($29)\n\ + ld $6, 2*8($29)\n\ + ld $7, 3*8($29)\n\ + jalr $25\n\ + move $28, $16\n\ + # Loop to call _dl_init_next for the next initializer.\n\ + b 1b\n\ + # Pass our finalizer function to the user in ra.\n\ +2: dla $31, _dl_fini\n\ + # Jump to the user entry point.\n\ + move $25, $17\n\ + ld $4, 0($29)\n\ + ld $5, 1*8($29)\n\ + ld $6, 2*8$29)\n\ + ld $7, 3*8($29)\n\ + jr $25\n"\ +_RTLD_EPILOGUE(ENTRY_POINT) \ +); + + +/* The MIPS never uses Elfxx_Rela relocations. */ +#define ELF_MACHINE_NO_RELA 1 + +#endif /* !dl_machine_h */ + +#ifdef RESOLVE + +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +static inline void +elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, + const ElfW(Sym) *sym, const struct r_found_version *version) +{ + ElfW(Addr) *const reloc_addr = (void *) (map->l_addr + reloc->r_offset); + ElfW(Addr) loadbase; + ElfW(Addr) undo __attribute__ ((unused)); + + switch (ELFW(R_TYPE) (reloc->r_info)) + { + case R_MIPS_REL32: + { + ElfW(Addr) undo = 0; + + if (ELFW(ST_BIND) (sym->st_info) == STB_LOCAL + && (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION + || ELFW(ST_TYPE) (sym->st_info) == STT_NOTYPE)) + { + *reloc_addr += map->l_addr; + break; + } +#ifndef RTLD_BOOTSTRAP + /* This is defined in rtld.c, but nowhere in the static libc.a; + make the reference weak so static programs can still link. This + declaration cannot be done when compiling rtld.c (i.e. #ifdef + RTLD_BOOTSTRAP) because rtld.c contains the common defn for + _dl_rtld_map, which is incompatible with a weak decl in the same + file. */ + weak_extern (_dl_rtld_map); + if (map == &_dl_rtld_map) + /* Undo the relocation done here during bootstrapping. Now we will + relocate it anew, possibly using a binding found in the user + program or a loaded library rather than the dynamic linker's + built-in definitions used while loading those libraries. */ + undo = map->l_addr + sym->st_value; +#endif + loadbase = RESOLVE (&sym, version, 0); + *reloc_addr += (sym ? (loadbase + sym->st_value) : 0) - undo; + } + break; + case R_MIPS_NONE: /* Alright, Wilbur. */ + break; + default: + assert (! "unexpected dynamic reloc type"); + break; + } +} + +static inline void +elf_machine_lazy_rel (struct link_map *map, const ElfW(Rel) *reloc) +{ + /* Do nothing. */ +} + +#endif /* RESOLVE */ diff --git a/sysdeps/mips/rtld-parms b/sysdeps/mips/rtld-parms new file mode 100644 index 0000000000..72f09e7341 --- /dev/null +++ b/sysdeps/mips/rtld-parms @@ -0,0 +1,15 @@ +ifndef rtld-wordsize +rtld-wordsize = 32 +endif +ifndef rtld-oformat +rtld-oformat = elf$(rtld-wordsize)-bigmips +endif +ifndef rtld-arch +rtld-arch = mips +endif +ifndef rtld-entry +rtld-entry = __start +endif +ifndef rtld-base +rtld-base = 0x0fb60000 + SIZEOF_HEADERS +endif diff --git a/sysdeps/powerpc/bits/endian.h b/sysdeps/powerpc/bits/endian.h index e0e90cfd7a..d3ff74f12f 100644 --- a/sysdeps/powerpc/bits/endian.h +++ b/sysdeps/powerpc/bits/endian.h @@ -1,3 +1,32 @@ -/* PowerPC is big-endian. */ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. -#define __BYTE_ORDER __BIG_ENDIAN + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* PowerPC can be little or big endian. Hopefully gcc will know... */ + +#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN +# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN +# error Please fix sysdeps/powerpc/bits/endian.h (compiling bi-endian?). +# endif +# define __BYTE_ORDER __BIG_ENDIAN +#else +# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN +# define __BYTE_ORDER __LITTLE_ENDIAN +# else +# error Please fix sysdeps/powerpc/bits/endian.h. +# endif +#endif diff --git a/sysdeps/powerpc/dl-machine.h b/sysdeps/powerpc/dl-machine.h index 6ddbea584b..12bcf43e4d 100644 --- a/sysdeps/powerpc/dl-machine.h +++ b/sysdeps/powerpc/dl-machine.h @@ -598,11 +598,13 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, if (sym->st_size > refsym->st_size || (_dl_verbose && sym->st_size < refsym->st_size)) { + extern char **_dl_argv; const char *strtab; strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error ("Symbol `", strtab + refsym->st_name, + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, "' has different size in shared object, " "consider re-linking\n", NULL); } diff --git a/sysdeps/sparc/dl-machine.h b/sysdeps/sparc/dl-machine.h index 20def2c5b7..1d193ae91c 100644 --- a/sysdeps/sparc/dl-machine.h +++ b/sysdeps/sparc/dl-machine.h @@ -133,11 +133,13 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, if (sym->st_size > refsym->st_size || (_dl_verbose && sym->st_size < refsym->st_size)) { + extern char **_dl_argv; const char *strtab; strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error ("Symbol `", strtab + refsym->st_name, + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, "' has different size in shared object, " "consider re-linking\n", NULL); } diff --git a/sysdeps/sparc64/dl-machine.h b/sysdeps/sparc64/dl-machine.h index 21c3d6b9bd..ad216b79dc 100644 --- a/sysdeps/sparc64/dl-machine.h +++ b/sysdeps/sparc64/dl-machine.h @@ -110,11 +110,13 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, if (sym->st_size > refsym->st_size || (_dl_verbose && sym->st_size < refsym->st_size)) { + extern char **_dl_argv; const char *strtab; strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error ("Symbol `", strtab + refsym->st_name, + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, "' has different size in shared object, " "consider re-linking\n", NULL); } diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 2004a48b42..1c5da4b9bf 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -9,7 +9,7 @@ sysdep_routines += sysctl clone llseek sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h sys/mtio.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ - sys/user.h syscall-list.h sys/sysmacros.h sys/procfs.h \ + sys/user.h sys/sysmacros.h sys/procfs.h \ sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h \ sys/quota.h diff --git a/sysdeps/unix/sysv/linux/mips/lxstat.c b/sysdeps/unix/sysv/linux/mips/lxstat.c new file mode 100644 index 0000000000..7907b2f2d2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/lxstat.c @@ -0,0 +1,80 @@ +/* lxstat using old-style Unix lstat system call. + Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +extern int __syscall_lstat (const char *, struct kernel_stat *); + +/* Get information about the file NAME in BUF. */ +int +__lxstat (int vers, const char *name, struct stat *buf) +{ + struct kernel_stat kbuf; + int result; + + switch (vers) + { + case _STAT_VER_LINUX_OLD: + /* Nothing to do. The struct is in the form the kernel expects + it to be. */ + result = __syscall_lstat (name, (struct kernel_stat *) buf); + break; + + case _STAT_VER_LINUX: + /* Do the system call. */ + result = __syscall_lstat (name, &kbuf); + + /* Convert to current kernel version of `struct stat'. */ + buf->st_dev = kbuf.st_dev; + buf->st_pad1[0] = 0; buf->st_pad1[1] = 0; buf->st_pad1[2] = 0; + buf->st_ino = kbuf.st_ino; + buf->st_mode = kbuf.st_mode; + buf->st_nlink = kbuf.st_nlink; + buf->st_uid = kbuf.st_uid; + buf->st_gid = kbuf.st_gid; + buf->st_rdev = kbuf.st_rdev; + buf->st_pad2[0] = 0; buf->st_pad2[1] = 0; + buf->st_pad3 = 0; + buf->st_size = kbuf.st_size; + buf->st_blksize = kbuf.st_blksize; + buf->st_blocks = kbuf.st_blocks; + + buf->st_atime = kbuf.st_atime; buf->__reserved0 = 0; + buf->st_mtime = kbuf.st_mtime; buf->__reserved1 = 0; + buf->st_ctime = kbuf.st_ctime; buf->__reserved2 = 0; + + buf->st_pad4[0] = 0; buf->st_pad4[1] = 0; + buf->st_pad4[2] = 0; buf->st_pad4[3] = 0; + buf->st_pad4[4] = 0; buf->st_pad4[5] = 0; + buf->st_pad4[6] = 0; buf->st_pad4[7] = 0; + break; + + default: + __set_errno (EINVAL); + result = -1; + break; + } + + return result; +} +weak_alias (__lxstat, _lxstat) diff --git a/sysdeps/unix/sysv/linux/mips/lxstat.h b/sysdeps/unix/sysv/linux/mips/lxstat.h deleted file mode 100644 index 7907b2f2d2..0000000000 --- a/sysdeps/unix/sysv/linux/mips/lxstat.h +++ /dev/null @@ -1,80 +0,0 @@ -/* lxstat using old-style Unix lstat system call. - Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include - -#include - -extern int __syscall_lstat (const char *, struct kernel_stat *); - -/* Get information about the file NAME in BUF. */ -int -__lxstat (int vers, const char *name, struct stat *buf) -{ - struct kernel_stat kbuf; - int result; - - switch (vers) - { - case _STAT_VER_LINUX_OLD: - /* Nothing to do. The struct is in the form the kernel expects - it to be. */ - result = __syscall_lstat (name, (struct kernel_stat *) buf); - break; - - case _STAT_VER_LINUX: - /* Do the system call. */ - result = __syscall_lstat (name, &kbuf); - - /* Convert to current kernel version of `struct stat'. */ - buf->st_dev = kbuf.st_dev; - buf->st_pad1[0] = 0; buf->st_pad1[1] = 0; buf->st_pad1[2] = 0; - buf->st_ino = kbuf.st_ino; - buf->st_mode = kbuf.st_mode; - buf->st_nlink = kbuf.st_nlink; - buf->st_uid = kbuf.st_uid; - buf->st_gid = kbuf.st_gid; - buf->st_rdev = kbuf.st_rdev; - buf->st_pad2[0] = 0; buf->st_pad2[1] = 0; - buf->st_pad3 = 0; - buf->st_size = kbuf.st_size; - buf->st_blksize = kbuf.st_blksize; - buf->st_blocks = kbuf.st_blocks; - - buf->st_atime = kbuf.st_atime; buf->__reserved0 = 0; - buf->st_mtime = kbuf.st_mtime; buf->__reserved1 = 0; - buf->st_ctime = kbuf.st_ctime; buf->__reserved2 = 0; - - buf->st_pad4[0] = 0; buf->st_pad4[1] = 0; - buf->st_pad4[2] = 0; buf->st_pad4[3] = 0; - buf->st_pad4[4] = 0; buf->st_pad4[5] = 0; - buf->st_pad4[6] = 0; buf->st_pad4[7] = 0; - break; - - default: - __set_errno (EINVAL); - result = -1; - break; - } - - return result; -} -weak_alias (__lxstat, _lxstat) diff --git a/sysdeps/unix/sysv/linux/mips/sgidef.h b/sysdeps/unix/sysv/linux/mips/sgidef.h deleted file mode 100644 index a36ece0175..0000000000 --- a/sysdeps/unix/sysv/linux/mips/sgidef.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ralf Baechle . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SGIDEFS_H -#define _SGIDEFS_H 1 - -/* - * The real definitions come from the Linux kernel sources - */ -#include - -#endif /* sgidefs.h */ diff --git a/sysdeps/unix/sysv/linux/mips/sgidefs.h b/sysdeps/unix/sysv/linux/mips/sgidefs.h new file mode 100644 index 0000000000..a36ece0175 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/sgidefs.h @@ -0,0 +1,28 @@ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SGIDEFS_H +#define _SGIDEFS_H 1 + +/* + * The real definitions come from the Linux kernel sources + */ +#include + +#endif /* sgidefs.h */ diff --git a/sysdeps/vax/htonl.s b/sysdeps/vax/htonl.s index af5b96c22f..93e13ea9a1 100644 --- a/sysdeps/vax/htonl.s +++ b/sysdeps/vax/htonl.s @@ -23,8 +23,11 @@ #include "DEFS.h" -ENTRY(htonl, 0) +ENTRY(__htonl, 0) rotl $-8,4(ap),r0 insv r0,$16,$8,r0 movb 7(ap),r0 ret +strong_alias (__htonl, __ntohl) +weak_alias (__htonl, htonl) +weak_alias (__ntohl, ntohl) diff --git a/sysdeps/vax/htons.s b/sysdeps/vax/htons.s index c500e84506..16964c2861 100644 --- a/sysdeps/vax/htons.s +++ b/sysdeps/vax/htons.s @@ -28,3 +28,6 @@ ENTRY(htons, 0) movb 5(ap),r0 movzwl r0,r0 ret +strong_alias (__htons, __ntohs) +weak_alias (__htons, htons) +weak_alias (__ntohs, ntohs) diff --git a/sysdeps/vax/ntohl.s b/sysdeps/vax/ntohl.s deleted file mode 100644 index 0fcaa2f8e4..0000000000 --- a/sysdeps/vax/ntohl.s +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)ntohl.s 5.5 (Berkeley) 6/27/88" -#endif /* LIBC_SCCS and not lint */ - -/* hostorder = ntohl(netorder) */ - -#include "DEFS.h" - -ENTRY(ntohl, 0) - rotl $-8,4(ap),r0 - insv r0,$16,$8,r0 - movb 7(ap),r0 - ret diff --git a/sysdeps/vax/ntohs.s b/sysdeps/vax/ntohs.s deleted file mode 100644 index 626a37bf09..0000000000 --- a/sysdeps/vax/ntohs.s +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)ntohs.s 5.5 (Berkeley) 6/27/88" -#endif /* LIBC_SCCS and not lint */ - -/* hostorder = ntohs(netorder) */ - -#include "DEFS.h" - -ENTRY(ntohs, 0) - rotl $8,4(ap),r0 - movb 5(ap),r0 - movzwl r0,r0 - ret -- cgit v1.2.3-65-gdbad