diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-07-02 10:52:21 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-07-02 10:52:21 +0200 |
commit | 77008252819720c987f11b3dade670e2b3ba09b8 (patch) | |
tree | 1cb854702400de0149fb900c82b137e5603e222b /libssp/ssp | |
parent | f60d648137b2d2cda1c598996b9598d559715117 (diff) | |
download | gcc-77008252819720c987f11b3dade670e2b3ba09b8.tar.gz |
Makefile.def (target_modules): Add libssp.
* Makefile.def (target_modules): Add libssp.
* configure.in (target_libraries): Add target-libssp.
* configure: Rebuilt.
* Makefile.in: Rebuilt.
gcc/
* gcc.c (LINK_SSP_SPEC): Define.
(link_ssp_spec): New variable.
(LINK_COMMAND_SPEC): Add %(link_ssp).
(static_specs): Add link_ssp_spec.
* configure.ac (TARGET_LIBC_PROVIDES_SSP): New test.
* configure: Rebuilt.
* config.in: Rebuilt.
* config/rs6000/linux.h (TARGET_THREAD_SSP_OFFSET): Define.
* config/rs6000/linux64.h (TARGET_THREAD_SSP_OFFSET): Likewise.
* config/i386/linux.h (TARGET_THREAD_SSP_OFFSET): Likewise.
* config/i386/linux64.h (TARGET_THREAD_SSP_OFFSET): Likewise.
* config/rs6000/rs6000.md (stack_protect_set, stack_protect_test):
If TARGET_THREAD_SSP_OFFSET is defined, use -0x7010(13) resp.
-0x7008(2) instead of reading __stack_chk_guard variable.
* config/i386/i386.md (UNSPEC_SP_SET, UNSPEC_SP_TEST): Change
number.
(UNSPEC_SP_TLS_SET, UNSPEC_SP_TLS_TEST): New constants.
(stack_protect_set, stack_protect_test): Use *_tls* patterns
if TARGET_THREAD_SSP_OFFSET is defined.
(stack_tls_protect_set_si, stack_tls_protect_set_di,
stack_tls_protect_test_si, stack_tls_protect_test_di): New insns.
Revert:
2005-06-27 Richard Henderson <rth@redhat.com>
* libgcc-std.ver (GCC_4.1.0): New.
* libgcc.h (__stack_chk_guard): Declare.
(__stack_chk_fail, __stack_chk_fail_local): Declare.
* libgcc2.c (L_stack_chk, L_stack_chk_local): New.
* mklibgcc.in (lib2funcs): Add them.
From-SVN: r101531
Diffstat (limited to 'libssp/ssp')
-rw-r--r-- | libssp/ssp/ssp.h.in | 66 | ||||
-rw-r--r-- | libssp/ssp/stdio.h | 101 | ||||
-rw-r--r-- | libssp/ssp/string.h | 168 | ||||
-rw-r--r-- | libssp/ssp/unistd.h | 85 |
4 files changed, 420 insertions, 0 deletions
diff --git a/libssp/ssp/ssp.h.in b/libssp/ssp/ssp.h.in new file mode 100644 index 00000000000..2ce13e9d7b8 --- /dev/null +++ b/libssp/ssp/ssp.h.in @@ -0,0 +1,66 @@ +/* Object size checking support macros. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) + +GCC 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 General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +/* As a special exception, if you link this library with files compiled with + GCC to produce an executable, this does not cause the resulting executable + to be covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU General Public License. */ + +#ifndef _SSP_H +#define _SSP_H 1 + +#if _FORTIFY_SOURCE > 0 && __OPTIMIZE__ > 0 \ + && defined __GNUC__ \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) \ + && !defined __cplusplus +# if _FORTIFY_SOURCE == 1 +# define __SSP_FORTIFY_LEVEL 1 +# elif _FORTIFY_SOURCE > 1 +# define __SSP_FORTIFY_LEVEL 2 +# endif +#endif + +#if __SSP_FORTIFY_LEVEL > 0 +# include <stddef.h> +# define __ssp_bos(ptr) __builtin_object_size (ptr, __SSP_FORTIFY_LEVEL > 1) +# define __ssp_bos0(ptr) __builtin_object_size (ptr, 0) + +# define __SSP_REDIRECT(name, proto, alias) \ + name proto __asm__ (__SSP_ASMNAME (#alias)) +# define __SSP_ASMNAME(cname) __SSP_ASMNAME2 (__USER_LABEL_PREFIX__, cname) +# define __SSP_ASMNAME2(prefix, cname) __SSP_ASMNAME3 (prefix) cname +# define __SSP_ASMNAME3(prefix) #prefix + +# @ssp_have_usable_vsnprintf@ __SSP_HAVE_VSNPRINTF + +extern void __chk_fail (void) __attribute__((__noreturn__)); +#endif + +#endif /* _SSP_H */ diff --git a/libssp/ssp/stdio.h b/libssp/ssp/stdio.h new file mode 100644 index 00000000000..694e6ad322f --- /dev/null +++ b/libssp/ssp/stdio.h @@ -0,0 +1,101 @@ +/* Checking macros for stdio functions. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) + +GCC 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 General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +/* As a special exception, if you link this library with files compiled with + GCC to produce an executable, this does not cause the resulting executable + to be covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU General Public License. */ + +#ifndef _SSP_STDIO_H +#define _SSP_STDIO_H 1 + +#include <ssp.h> +#include_next <stdio.h> + +#if __SSP_FORTIFY_LEVEL > 0 + +#include <stdarg.h> + +#undef sprintf +#undef vsprintf +#undef snprintf +#undef vsnprintf +#undef gets +#undef fgets + +extern int __sprintf_chk (char *__restrict__ __s, int __flag, size_t __slen, + __const char *__restrict__ __format, ...); +extern int __vsprintf_chk (char *__restrict__ __s, int __flag, size_t __slen, + __const char *__restrict__ __format, + va_list __ap); + +#define sprintf(str, ...) \ + __builtin___sprintf_chk (str, 0, __ssp_bos (str), \ + __VA_ARGS__) +#define vsprintf(str, fmt, ap) \ + __builtin___vsprintf_chk (str, 0, __ssp_bos (str), fmt, ap) + +extern int __snprintf_chk (char *__restrict__ __s, size_t __n, int __flag, + size_t __slen, __const char *__restrict__ __format, + ...); +extern int __vsnprintf_chk (char *__restrict__ __s, size_t __n, int __flag, + size_t __slen, __const char *__restrict__ __format, + va_list __ap); + +#define snprintf(str, len, ...) \ + __builtin___snprintf_chk (str, len, 0, __ssp_bos (str), __VA_ARGS__) +#define vsnprintf(str, len, fmt, ap) \ + __builtin___vsnprintf_chk (str, len, 0, __ssp_bos (str), fmt, ap) + +extern char *__gets_chk (char *__str, size_t); +extern char *__SSP_REDIRECT (__gets_alias, (char *__str), gets); + +extern inline __attribute__((__always_inline__)) char * +gets (char *__str) +{ + if (__ssp_bos (__str) != (size_t) -1) + return __gets_chk (__str, __ssp_bos (__str)); + return __gets_alias (__str); +} + +extern char *__SSP_REDIRECT (__fgets_alias, + (char *__restrict__ __s, int __n, + FILE *__restrict__ __stream), fgets); + +extern inline __attribute__((__always_inline__)) char * +fgets (char *__restrict__ __s, int __n, FILE *__restrict__ __stream) +{ + if (__ssp_bos (__s) != (size_t) -1 && (size_t) __n > __ssp_bos (__s)) + __chk_fail (); + return __fgets_alias (__s, __n, __stream); +} + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STDIO_H */ diff --git a/libssp/ssp/string.h b/libssp/ssp/string.h new file mode 100644 index 00000000000..d214785a05c --- /dev/null +++ b/libssp/ssp/string.h @@ -0,0 +1,168 @@ +/* Checking macros for string functions. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) + +GCC 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 General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +/* As a special exception, if you link this library with files compiled with + GCC to produce an executable, this does not cause the resulting executable + to be covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU General Public License. */ + +#ifndef _SSP_STRING_H +#define _SSP_STRING_H 1 + +#include <ssp.h> +#include_next <string.h> + +#if __SSP_FORTIFY_LEVEL > 0 + +#undef memcpy +#undef memmove +#undef memset +#undef strcat +#undef strcpy +#undef strncat +#undef strncpy +#undef mempcpy +#undef stpcpy +#undef bcopy +#undef bzero + +#define memcpy(dest, src, len) \ + ((__ssp_bos0 (dest) != (size_t) -1) \ + ? __builtin___memcpy_chk (dest, src, len, __ssp_bos0 (dest)) \ + : __memcpy_ichk (dest, src, len)) +static inline __attribute__((__always_inline__)) void * +__memcpy_ichk (void *__restrict__ __dest, const void *__restrict__ __src, + size_t __len) +{ + return __builtin___memcpy_chk (__dest, __src, __len, __ssp_bos0 (__dest)); +} + + +#define memmove(dest, src, len) \ + ((__ssp_bos0 (dest) != (size_t) -1) \ + ? __builtin___memmove_chk (dest, src, len, __ssp_bos0 (dest)) \ + : __memmove_ichk (dest, src, len)) +static inline __attribute__((__always_inline__)) void * +__memmove_ichk (void *__dest, const void *__src, size_t __len) +{ + return __builtin___memmove_chk (__dest, __src, __len, __ssp_bos0 (__dest)); +} + + +#define mempcpy(dest, src, len) \ + ((__ssp_bos0 (dest) != (size_t) -1) \ + ? __builtin___mempcpy_chk (dest, src, len, __ssp_bos0 (dest)) \ + : __mempcpy_ichk (dest, src, len)) +static inline __attribute__((__always_inline__)) void * +__mempcpy_ichk (void *__restrict__ __dest, const void *__restrict__ __src, + size_t __len) +{ + return __builtin___mempcpy_chk (__dest, __src, __len, __ssp_bos0 (__dest)); +} + + +#define memset(dest, ch, len) \ + ((__ssp_bos0 (dest) != (size_t) -1) \ + ? __builtin___memset_chk (dest, ch, len, __ssp_bos0 (dest)) \ + : __memset_ichk (dest, ch, len)) +static inline __attribute__((__always_inline__)) void * +__memset_ichk (void *__dest, int __ch, size_t __len) +{ + return __builtin___memset_chk (__dest, __ch, __len, __ssp_bos0 (__dest)); +} + +#define bcopy(src, dest, len) ((void) \ + ((__ssp_bos0 (dest) != (size_t) -1) \ + ? __builtin___memmove_chk (dest, src, len, __ssp_bos0 (dest)) \ + : __memmove_ichk (dest, src, len))) +#define bzero(dest, len) ((void) \ + ((__ssp_bos0 (dest) != (size_t) -1) \ + ? __builtin___memset_chk (dest, '\0', len, __ssp_bos0 (dest)) \ + : __memset_ichk (dest, '\0', len))) + + +#define strcpy(dest, src) \ + ((__ssp_bos (dest) != (size_t) -1) \ + ? __builtin___strcpy_chk (dest, src, __ssp_bos (dest)) \ + : __strcpy_ichk (dest, src)) +static inline __attribute__((__always_inline__)) char * +__strcpy_ichk (char *__restrict__ __dest, const char *__restrict__ __src) +{ + return __builtin___strcpy_chk (__dest, __src, __ssp_bos (__dest)); +} + + +#define stpcpy(dest, src) \ + ((__ssp_bos (dest) != (size_t) -1) \ + ? __builtin___stpcpy_chk (dest, src, __ssp_bos (dest)) \ + : __stpcpy_ichk (dest, src)) +static inline __attribute__((__always_inline__)) char * +__stpcpy_ichk (char *__restrict__ __dest, const char *__restrict__ __src) +{ + return __builtin___stpcpy_chk (__dest, __src, __ssp_bos (__dest)); +} + + +#define strncpy(dest, src, len) \ + ((__ssp_bos (dest) != (size_t) -1) \ + ? __builtin___strncpy_chk (dest, src, len, __ssp_bos (dest)) \ + : __strncpy_ichk (dest, src, len)) +static inline __attribute__((__always_inline__)) char * +__strncpy_ichk (char *__restrict__ __dest, const char *__restrict__ __src, + size_t __len) +{ + return __builtin___strncpy_chk (__dest, __src, __len, __ssp_bos (__dest)); +} + + +#define strcat(dest, src) \ + ((__ssp_bos (dest) != (size_t) -1) \ + ? __builtin___strcat_chk (dest, src, __ssp_bos (dest)) \ + : __strcat_ichk (dest, src)) +static inline __attribute__((__always_inline__)) char * +__strcat_ichk (char *__restrict__ __dest, const char *__restrict__ __src) +{ + return __builtin___strcat_chk (__dest, __src, __ssp_bos (__dest)); +} + + +#define strncat(dest, src, len) \ + ((__ssp_bos (dest) != (size_t) -1) \ + ? __builtin___strncat_chk (dest, src, len, __ssp_bos (dest)) \ + : __strncat_ichk (dest, src, len)) +static inline __attribute__((__always_inline__)) char * +__strncat_ichk (char *__restrict__ __dest, const char *__restrict__ __src, + size_t __len) +{ + return __builtin___strncat_chk (__dest, __src, __len, __ssp_bos (__dest)); +} + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STRING_H */ diff --git a/libssp/ssp/unistd.h b/libssp/ssp/unistd.h new file mode 100644 index 00000000000..176369f78c9 --- /dev/null +++ b/libssp/ssp/unistd.h @@ -0,0 +1,85 @@ +/* Checking macros for unistd functions. + Copyright (C) 2005 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) + +GCC 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 General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +/* As a special exception, if you link this library with files compiled with + GCC to produce an executable, this does not cause the resulting executable + to be covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU General Public License. */ + +#ifndef _SSP_UNISTD_H +#define _SSP_UNISTD_H 1 + +#include <ssp.h> +#include_next <unistd.h> + +#if __SSP_FORTIFY_LEVEL > 0 + +#undef read +#undef readlink +#undef getcwd + +extern ssize_t __SSP_REDIRECT (__read_alias, (int __fd, void *__buf, + size_t __nbytes), read); + +extern inline __attribute__((__always_inline__)) ssize_t +read (int __fd, void *__buf, size_t __nbytes) +{ + if (__ssp_bos0 (__buf) != (size_t) -1 && __nbytes > __ssp_bos0 (__buf)) + __chk_fail (); + return __read_alias (__fd, __buf, __nbytes); +} + +extern int __SSP_REDIRECT (__readlink_alias, + (const char *__restrict__ __path, + char *__restrict__ __buf, size_t __len), + readlink); + +extern inline __attribute__((__always_inline__)) int +readlink (const char *__restrict__ __path, char *__restrict__ __buf, + size_t __len) +{ + if (__ssp_bos (__buf) != (size_t) -1 && __len > __ssp_bos (__buf)) + __chk_fail (); + return __readlink_alias (__path, __buf, __len); +} + +extern char *__SSP_REDIRECT (__getcwd_alias, + (char *__buf, size_t __size), getcwd); + +extern inline __attribute__((__always_inline__)) char * +getcwd (char *__buf, size_t __size) +{ + if (__ssp_bos (__buf) != (size_t) -1 && __size > __ssp_bos (__buf)) + __chk_fail (); + return __getcwd_alias (__buf, __size); +} + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_UNISTD_H */ |