mirror of
git://sourceware.org/git/glibc.git
synced 2026-09-09 11:58:23 +08:00
Compare commits
44
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4f2b767fef | ||
|
|
a882ce88c5 | ||
|
|
2ae6256336 | ||
|
|
8bd683657e | ||
|
|
69c1dfc1a7 | ||
|
|
184d66c5b9 | ||
|
|
3cca60520b | ||
|
|
8c0c0e8819 | ||
|
|
e9f35ea6af | ||
|
|
435e230ccc | ||
|
|
2b160af814 | ||
|
|
fcec7096ab | ||
|
|
9ddfa2b9ad | ||
|
|
7be2249733 | ||
|
|
4eddf93f5c | ||
|
|
f370dd3dc5 | ||
|
|
f47fcd632e | ||
|
|
3ae1021bea | ||
|
|
e2a309033d | ||
|
|
c57be1aeee | ||
|
|
8cb4ac4610 | ||
|
|
fcbeae78e4 | ||
|
|
d2f2a3fd9d | ||
|
|
d73a25eba3 | ||
|
|
722bff7a4c | ||
|
|
63072fc617 | ||
|
|
1390c85454 | ||
|
|
6e23b0ab48 | ||
|
|
680b74830a | ||
|
|
f6244abb8c | ||
|
|
b3c34b4a97 | ||
|
|
51f8ca9648 | ||
|
|
77b2540f78 | ||
|
|
af6207d539 | ||
|
|
1a1fbe1558 | ||
|
|
01d737a470 | ||
|
|
3ad68d2c0b | ||
|
|
96147940d8 | ||
|
|
5ec98a06e7 | ||
|
|
0e779ef2a9 | ||
|
|
5babac1535 | ||
|
|
fe6a22b68c | ||
|
|
74cab7c660 | ||
|
|
039ab4445d |
@@ -1,3 +1,239 @@
|
||||
2011-10-07 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* version.h (VERSION): Bump for 2.14.1 release.
|
||||
|
||||
2011-09-27 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* nss/nss_files/files-initgroups.c (_nss_files_initgroups_dyn):
|
||||
Reread the line before reparsing it.
|
||||
|
||||
2011-08-29 Jiri Olsa <jolsa@redhat.com>
|
||||
|
||||
* sysdeps/i386/dl-trampoline.S (_dl_runtime_profile): Fix cfi
|
||||
directive.
|
||||
|
||||
2011-08-24 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* elf/Makefile: Add rules to build and run unload8 test.
|
||||
* elf/unload8.c: New file.
|
||||
* elf/unload8mod1.c: New file.
|
||||
* elf/unload8mod1x.c: New file.
|
||||
* elf/unload8mod2.c: New file.
|
||||
* elf/unload8mod3.c: New file.
|
||||
|
||||
* elf/dl-close.c (_dl_close_worker): Reset private search list if
|
||||
it wasn't used.
|
||||
|
||||
2011-08-23 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/i386/i686/multiarch/strspn.S (ENTRY): Add missing
|
||||
backslash.
|
||||
|
||||
2011-08-22 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* elf/dl-deps.c (_dl_map_object_deps): Move check for missing
|
||||
dependencies back to end of function.
|
||||
|
||||
2011-08-16 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
[BZ #11724]
|
||||
* elf/dl-deps.c (_dl_map_object_deps): Only assume cycle when
|
||||
object is seen twice.
|
||||
* elf/dl-fini.c (_dl_sort_fini): Likewise.
|
||||
|
||||
* elf/Makefile (distribute): Add tst-initorder2.c.
|
||||
(tests): Add tst-initorder2.
|
||||
(modules-names): Add tst-initorder2a tst-initorder2b
|
||||
tst-initorder2c tst-initorder2d. Add rules to build them.
|
||||
($(objpfx)tst-initorder2.out): New rule.
|
||||
* elf/tst-initorder2.c: New file.
|
||||
* elf/tst-initorder2.exp: New file.
|
||||
|
||||
2011-08-20 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #13114]
|
||||
* stdio-common/Makefile (tests): Add bug24.
|
||||
* stdio-common/bug24.c: New file.
|
||||
|
||||
2011-08-19 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
[BZ #13114]
|
||||
* libio/fileops.c (_IO_new_file_fopen): Fix handling of
|
||||
non-existant file when using close-on-exec mode.
|
||||
|
||||
2011-08-20 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/x86_64/dl-trampoline.S (_dl_runtime_resolve): Fix CFI for
|
||||
the very first instruction.
|
||||
|
||||
2011-08-20 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/x86_64/dl-trampoline.h: If MORE_CODE is defined, restore
|
||||
the CFI state in the end.
|
||||
* sysdeps/x86_64/dl-trampoline.S: Define MORE_CODE before first
|
||||
inclusion of dl-trampoline.h.
|
||||
Based on a patch by Jiri Olsa <jolsa@redhat.com>.
|
||||
|
||||
2011-08-14 Roland McGrath <roland@hack.frob.com>
|
||||
|
||||
* locale/Makefile (locale-CPPFLAGS): Renamed CPPFLAGS-locale-programs.
|
||||
(locale-CPPFLAGS): New variable; put LOCALEDIR, LOCALE_ALIAS_PATH and
|
||||
-Iprograms here.
|
||||
(cppflags-iterator.mk sequence): Use locale-programs in place of nonlib.
|
||||
(localedef-modules): Add localedef.
|
||||
(locale-modules): Add locale.
|
||||
|
||||
2011-08-13 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* intl/l10nflist.c (_nl_normalize_codeset): Make it compile outside
|
||||
of libc. Make tolower call locale-independent. Optimize a bit by
|
||||
using isdigit instead of isalnum.
|
||||
* locale/Makefile (locale-CPPFLAGS): Add -DNOT_IN_libc.
|
||||
|
||||
2011-08-11 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* intl/l10nflist.c (_nl_make_l10nflist): Use locale-independent
|
||||
classification.
|
||||
|
||||
2011-07-22 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* resolv/res_init.c (__res_vinit): Properly tokenize nameserver
|
||||
line.
|
||||
|
||||
2011-07-26 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): Don't discard result of
|
||||
encoding to ACE if AI_IDN.
|
||||
|
||||
2011-07-25 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/i386/i486/bits/string.h (__strncat_g): Correctly handle
|
||||
__n bigger than INT_MAX+1.
|
||||
(__strncmp_g): Likewise.
|
||||
|
||||
2011-07-23 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix one more
|
||||
typo.
|
||||
(_dl_x86_64_save_sse): Likewise.
|
||||
|
||||
2011-07-22 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix test for
|
||||
OSXSAVE.
|
||||
(_dl_x86_64_save_sse): Likewise.
|
||||
|
||||
2011-07-21 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix last
|
||||
change.
|
||||
(_dl_x86_64_save_sse): Use correct AVX check.
|
||||
|
||||
2011-07-20 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #13007]
|
||||
* sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): More complete
|
||||
check for AVX enablement so that we don't crash with old kernels and
|
||||
new hardware.
|
||||
* elf/tst-audit4.c: Add same checks here.
|
||||
* elf/tst-audit6.c: Likewise.
|
||||
|
||||
2011-07-20 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #12852]
|
||||
* posix/glob.c (glob): Check passed in values before using them in
|
||||
expressions to avoid some overflows.
|
||||
(glob_in_dir): Likewise.
|
||||
|
||||
2011-07-20 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/x86_64/bits/link.h (La_x86_64_ymm): Force 16-byte alignment.
|
||||
|
||||
2011-07-20 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* resolv/res_query.c (__libc_res_nquerydomain): Use size_t for
|
||||
strlen results.
|
||||
|
||||
2011-07-19 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* string/strxfrm_l.c (STRXFRM): Fix alloca accounting.
|
||||
|
||||
2011-07-19 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* nscd/nscd.c (termination_handler): Don't do anything for a database
|
||||
if it has not yet been initialized.
|
||||
|
||||
2011-07-05 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
[BZ#9696]
|
||||
* stdlib/tst-strtod.c: Add testcase.
|
||||
|
||||
2011-07-07 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #12868]
|
||||
* sysdeps/unix/sysv/linux/linux_fsinfo.h: Define Lustre constants.
|
||||
* sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
|
||||
Handle Lustre.
|
||||
* sysdeps/unix/sysv/linux/pathconf.c (__statfs_link_max): Likewise.
|
||||
(__statfs_filesize_max): Likewise.
|
||||
Patch mostly by Andreas Dilger <adilger@whamcloud.com>.
|
||||
|
||||
2011-07-06 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #12922]
|
||||
* posix/getopt.c (_getopt_internal_r): When "W;" is in short options
|
||||
but no long options are defined, just return 'W'.
|
||||
|
||||
2011-06-22 Marek Polacek <mpolacek@redhat.com>
|
||||
|
||||
[BZ #9696]
|
||||
* stdlib/strtod_l.c (round_and_return): Set ERANGE instead of EDOM.
|
||||
|
||||
2011-06-30 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): Make sure RES_USE_INET6
|
||||
is always restored.
|
||||
|
||||
2011-06-28 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #12935]
|
||||
* malloc/memusage.sh: Fix quoting in message.
|
||||
* debug/xtrace.sh: Likewise.
|
||||
|
||||
2011-06-27 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* iconvdata/gb18030.c (BODY for TO_LOOP): Fix encoding of non-BMP
|
||||
two-byte characters.
|
||||
|
||||
2011-06-22 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): Fix last change.
|
||||
|
||||
2011-06-21 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #12885]
|
||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): When looking up only IPv6
|
||||
addresses using gethostbyname4_r ignore IPv4 addresses.
|
||||
|
||||
2011-06-15 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* resolv/res_send.c (__libc_res_nsend): Fix typos in last patch. We
|
||||
need to dereference resplen2.
|
||||
|
||||
2011-06-14 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/wordsize-64/dl-fxstatat64.c: New file.
|
||||
|
||||
2011-06-14 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* sysdeps/unix/sysv/linux/check_native.c: Include <string.h> for
|
||||
memset declaration.
|
||||
|
||||
2011-06-10 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): Fix logic allocating
|
||||
tmpbuf.
|
||||
|
||||
2011-06-07 David S. Miller <davem@davemloft.net>
|
||||
|
||||
* sysdeps/sparc/sparc32/dl-irel.h (elf_irela): Pass dl_hwcap to
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
GNU C Library NEWS -- history of user-visible changes. 2011-6-4
|
||||
GNU C Library NEWS -- history of user-visible changes. 2011-10-07
|
||||
Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
|
||||
See the end for copying conditions.
|
||||
|
||||
Please send GNU C library bug reports via <http://sources.redhat.com/bugzilla/>
|
||||
using `glibc' in the "product" field.
|
||||
|
||||
Version 2.14.1
|
||||
|
||||
* The following bugs are resolved with this release:
|
||||
|
||||
9696, 11724, 12841, 12849, 12852, 12868, 12885, 12922, 12935, 13007,
|
||||
13114
|
||||
|
||||
Version 2.14
|
||||
|
||||
* The following bugs are resolved with this release:
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ do_usage() {
|
||||
|
||||
# Refer to --help option.
|
||||
help_info() {
|
||||
printf >&2 $"Try \`%s --help' or `%s --usage' for more information.\n" xtrace xtrace
|
||||
printf >&2 $"Try \`%s --help' or \`%s --usage' for more information.\n" xtrace xtrace
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
+33
-6
@@ -90,6 +90,7 @@ distribute := rtld-Rules \
|
||||
unload4mod1.c unload4mod2.c unload4mod3.c unload4mod4.c \
|
||||
unload6mod1.c unload6mod2.c unload6mod3.c \
|
||||
unload7mod1.c unload7mod2.c \
|
||||
unload8mod1.c unload8mod1x.c unload8mod2.c unload8mod3.c \
|
||||
tst-audit1.c tst-audit2.c tst-audit3.c tst-audit4.c \
|
||||
tst-auditmod1.c tst-auditmod3a.c tst-auditmod3b.c \
|
||||
tst-auditmod4a.c tst-auditmod4b.c \
|
||||
@@ -120,9 +121,10 @@ distribute := rtld-Rules \
|
||||
ifuncmain7pie.c ifuncmain7static.c \
|
||||
tst-unique1.c tst-unique1mod1.c tst-unique1mod2.c \
|
||||
tst-unique2.c tst-unique2mod1.c tst-unique2mod2.c \
|
||||
tst-initordera1.c tst-initordera2.c tst-initorderb1.c \
|
||||
tst-initorderb2.c tst-initordera3.c tst-initordera4.c \
|
||||
tst-initorder.c
|
||||
tst-initordera1.c tst-initordera2.c tst-initorderb1.c \
|
||||
tst-initorderb2.c tst-initordera3.c tst-initordera4.c \
|
||||
tst-initorder.c \
|
||||
tst-initorder2.c
|
||||
|
||||
CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
|
||||
CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
|
||||
@@ -221,11 +223,11 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \
|
||||
tst-dlmodcount tst-dlopenrpath tst-deep1 \
|
||||
tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \
|
||||
unload3 unload4 unload5 unload6 unload7 tst-global1 order2 \
|
||||
unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
|
||||
tst-audit1 tst-audit2 \
|
||||
tst-stackguard1 tst-addr1 tst-thrlock \
|
||||
tst-unique1 tst-unique2 tst-unique3 tst-unique4 \
|
||||
tst-initorder
|
||||
tst-initorder tst-initorder2
|
||||
# reldep9
|
||||
test-srcs = tst-pathopt
|
||||
selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
|
||||
@@ -279,6 +281,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
unload4mod1 unload4mod2 unload4mod3 unload4mod4 \
|
||||
unload6mod1 unload6mod2 unload6mod3 \
|
||||
unload7mod1 unload7mod2 \
|
||||
unload8mod1 unload8mod1x unload8mod2 unload8mod3 \
|
||||
order2mod1 order2mod2 order2mod3 order2mod4 \
|
||||
tst-unique1mod1 tst-unique1mod2 \
|
||||
tst-unique2mod1 tst-unique2mod2 \
|
||||
@@ -286,7 +289,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
tst-unique4lib \
|
||||
tst-initordera1 tst-initorderb1 \
|
||||
tst-initordera2 tst-initorderb2 \
|
||||
tst-initordera3 tst-initordera4
|
||||
tst-initordera3 tst-initordera4 \
|
||||
tst-initorder2a tst-initorder2b tst-initorder2c tst-initorder2d
|
||||
ifeq (yes,$(have-initfini-array))
|
||||
modules-names += tst-array2dep tst-array5dep
|
||||
endif
|
||||
@@ -568,6 +572,9 @@ $(objpfx)unload6mod2.so: $(libdl)
|
||||
$(objpfx)unload6mod3.so: $(libdl)
|
||||
$(objpfx)unload7mod1.so: $(libdl)
|
||||
$(objpfx)unload7mod2.so: $(objpfx)unload7mod1.so
|
||||
$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so
|
||||
$(objpfx)unload8mod2.so: $(objpfx)unload8mod3.so
|
||||
$(objpfx)unload8mod3.so: $(libdl)
|
||||
$(objpfx)tst-initordera2.so: $(objpfx)tst-initordera1.so
|
||||
$(objpfx)tst-initorderb2.so: $(objpfx)tst-initorderb1.so $(objpfx)tst-initordera2.so
|
||||
$(objpfx)tst-initordera3.so: $(objpfx)tst-initorderb2.so $(objpfx)tst-initorderb1.so
|
||||
@@ -881,6 +888,9 @@ $(objpfx)unload7: $(libdl)
|
||||
$(objpfx)unload7.out: $(objpfx)unload7mod1.so $(objpfx)unload7mod2.so
|
||||
unload7-ENV = MALLOC_PERTURB_=85
|
||||
|
||||
$(objpfx)unload8: $(libdl)
|
||||
$(objpfx)unload8.out: $(objpfx)unload8mod1.so $(objpfx)unload8mod1x.so
|
||||
|
||||
ifdef libdl
|
||||
$(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a
|
||||
$(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so
|
||||
@@ -1156,6 +1166,23 @@ $(objpfx)tst-initorder.out: $(objpfx)tst-initorder
|
||||
$< > $@
|
||||
cmp $@ tst-initorder.exp > /dev/null
|
||||
|
||||
$(objpfx)tst-initorder2: $(objpfx)tst-initorder2a.so $(objpfx)tst-initorder2d.so $(objpfx)tst-initorder2c.so
|
||||
$(objpfx)tst-initorder2a.so: $(objpfx)tst-initorder2b.so
|
||||
$(objpfx)tst-initorder2b.so: $(objpfx)tst-initorder2c.so
|
||||
$(objpfx)tst-initorder2c.so: $(objpfx)tst-initorder2d.so
|
||||
define o-iterator-doit
|
||||
$(objpfx)tst-initorder2$o.os: tst-initorder2.c; \
|
||||
$$(compile-command.c) -DNAME=\"$o\"
|
||||
endef
|
||||
object-suffixes-left := a b c d
|
||||
include $(o-iterator)
|
||||
|
||||
$(objpfx)tst-initorder2.out: $(objpfx)tst-initorder2
|
||||
$(elf-objpfx)${rtld-installed-name} \
|
||||
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
|
||||
$< > $@
|
||||
cmp $@ tst-initorder2.exp > /dev/null
|
||||
|
||||
ifeq (yes,$(config-cflags-avx))
|
||||
AVX-CFLAGS=-mavx
|
||||
ifeq (yes,$(config-cflags-novzeroupper))
|
||||
|
||||
@@ -430,6 +430,13 @@ _dl_close_worker (struct link_map *map)
|
||||
|
||||
imap->l_scope_max = new_size;
|
||||
}
|
||||
else if (new_list != NULL)
|
||||
{
|
||||
/* We didn't change the scope array, so reset the search
|
||||
list. */
|
||||
imap->l_searchlist.r_list = NULL;
|
||||
imap->l_searchlist.r_nlist = 0;
|
||||
}
|
||||
|
||||
/* The loader is gone, so mark the object as not having one.
|
||||
Note: l_idx != IDX_STILL_USED -> object will be removed. */
|
||||
|
||||
+11
-10
@@ -491,10 +491,6 @@ _dl_map_object_deps (struct link_map *map,
|
||||
if (errno == 0 && errno_saved != 0)
|
||||
__set_errno (errno_saved);
|
||||
|
||||
if (errno_reason)
|
||||
_dl_signal_error (errno_reason == -1 ? 0 : errno_reason, objname,
|
||||
NULL, errstring);
|
||||
|
||||
struct link_map **old_l_initfini = NULL;
|
||||
if (map->l_initfini != NULL && map->l_type == lt_loaded)
|
||||
{
|
||||
@@ -626,12 +622,12 @@ Filters not supported with LD_TRACE_PRELINKING"));
|
||||
/* We can skip looking for the binary itself which is at the front
|
||||
of the search list. */
|
||||
i = 1;
|
||||
bool seen[nlist];
|
||||
memset (seen, false, nlist * sizeof (seen[0]));
|
||||
char seen[nlist];
|
||||
memset (seen, 0, nlist * sizeof (seen[0]));
|
||||
while (1)
|
||||
{
|
||||
/* Keep track of which object we looked at this round. */
|
||||
seen[i] = true;
|
||||
seen[i] += seen[i] < 2;
|
||||
struct link_map *thisp = l_initfini[i];
|
||||
|
||||
/* Find the last object in the list for which the current one is
|
||||
@@ -652,15 +648,16 @@ Filters not supported with LD_TRACE_PRELINKING"));
|
||||
(k - i) * sizeof (l_initfini[0]));
|
||||
l_initfini[k] = thisp;
|
||||
|
||||
if (seen[i + 1])
|
||||
if (seen[i + 1] > 1)
|
||||
{
|
||||
++i;
|
||||
goto next_clear;
|
||||
}
|
||||
|
||||
char this_seen = seen[i];
|
||||
memmove (&seen[i], &seen[i + 1],
|
||||
(k - i) * sizeof (seen[0]));
|
||||
seen[k] = true;
|
||||
seen[k] = this_seen;
|
||||
|
||||
goto next;
|
||||
}
|
||||
@@ -671,7 +668,7 @@ Filters not supported with LD_TRACE_PRELINKING"));
|
||||
if (++i == nlist)
|
||||
break;
|
||||
next_clear:
|
||||
memset (&seen[i], false, (nlist - i) * sizeof (seen[0]));
|
||||
memset (&seen[i], 0, (nlist - i) * sizeof (seen[0]));
|
||||
|
||||
next:;
|
||||
}
|
||||
@@ -690,4 +687,8 @@ Filters not supported with LD_TRACE_PRELINKING"));
|
||||
}
|
||||
if (old_l_initfini != NULL)
|
||||
map->l_orig_initfini = old_l_initfini;
|
||||
|
||||
if (errno_reason)
|
||||
_dl_signal_error (errno_reason == -1 ? 0 : errno_reason, objname,
|
||||
NULL, errstring);
|
||||
}
|
||||
|
||||
+8
-7
@@ -40,12 +40,12 @@ _dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps,
|
||||
/* We can skip looking for the binary itself which is at the front
|
||||
of the search list for the main namespace. */
|
||||
unsigned int i = ns == LM_ID_BASE;
|
||||
bool seen[nmaps];
|
||||
memset (seen, false, nmaps * sizeof (seen[0]));
|
||||
char seen[nmaps];
|
||||
memset (seen, 0, nmaps * sizeof (seen[0]));
|
||||
while (1)
|
||||
{
|
||||
/* Keep track of which object we looked at this round. */
|
||||
seen[i] = true;
|
||||
seen[i] += seen[i] < 2;
|
||||
struct link_map *thisp = maps[i];
|
||||
|
||||
/* Do not handle ld.so in secondary namespaces and object which
|
||||
@@ -80,14 +80,15 @@ _dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps,
|
||||
used[k] = here_used;
|
||||
}
|
||||
|
||||
if (seen[i + 1])
|
||||
if (seen[i + 1] > 1)
|
||||
{
|
||||
++i;
|
||||
goto next_clear;
|
||||
}
|
||||
|
||||
char this_seen = seen[i];
|
||||
memmove (&seen[i], &seen[i + 1], (k - i) * sizeof (seen[0]));
|
||||
seen[k] = true;
|
||||
seen[k] = this_seen;
|
||||
|
||||
goto next;
|
||||
}
|
||||
@@ -97,7 +98,7 @@ _dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps,
|
||||
unsigned int m = maps[k]->l_reldeps->act;
|
||||
struct link_map **relmaps = &maps[k]->l_reldeps->list[0];
|
||||
|
||||
/* Look through the relocation dependencies of the object. */
|
||||
/* Look through the relocation dependencies of the object. */
|
||||
while (m-- > 0)
|
||||
if (__builtin_expect (relmaps[m] == thisp, 0))
|
||||
goto move;
|
||||
@@ -110,7 +111,7 @@ _dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps,
|
||||
if (++i == nmaps)
|
||||
break;
|
||||
next_clear:
|
||||
memset (&seen[i], false, (nmaps - i) * sizeof (seen[0]));
|
||||
memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0]));
|
||||
|
||||
next:;
|
||||
}
|
||||
|
||||
+18
-4
@@ -6,16 +6,30 @@
|
||||
#include <cpuid.h>
|
||||
#include <immintrin.h>
|
||||
|
||||
|
||||
static int
|
||||
avx_enabled (void)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
||||
if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
|
||||
|| (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
|
||||
return 0;
|
||||
|
||||
/* Check the OS has AVX and SSE saving enabled. */
|
||||
asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
|
||||
|
||||
return (eax & 6) == 6;
|
||||
}
|
||||
|
||||
|
||||
extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i,
|
||||
__m256i, __m256i, __m256i, __m256i);
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
||||
/* Run AVX test only if AVX is supported. */
|
||||
if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
|
||||
&& (ecx & bit_AVX))
|
||||
if (avx_enabled ())
|
||||
{
|
||||
__m256i ymm = _mm256_setzero_si256 ();
|
||||
__m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm);
|
||||
|
||||
+18
-4
@@ -8,14 +8,28 @@
|
||||
extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i,
|
||||
__m128i, __m128i, __m128i, __m128i);
|
||||
|
||||
int
|
||||
main (void)
|
||||
|
||||
static int
|
||||
avx_enabled (void)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
||||
if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
|
||||
|| (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
|
||||
return 0;
|
||||
|
||||
/* Check the OS has AVX and SSE saving enabled. */
|
||||
asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
|
||||
|
||||
return (eax & 6) == 6;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
/* Run AVX test only if AVX is supported. */
|
||||
if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
|
||||
&& (ecx & bit_AVX))
|
||||
if (avx_enabled ())
|
||||
{
|
||||
__m128i xmm = _mm_setzero_si128 ();
|
||||
__m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm);
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef NAME
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
puts ("main");
|
||||
}
|
||||
#else
|
||||
static void __attribute__ ((constructor))
|
||||
init (void)
|
||||
{
|
||||
puts ("init: " NAME);
|
||||
}
|
||||
static void __attribute__ ((destructor))
|
||||
fini (void)
|
||||
{
|
||||
puts ("fini: " NAME);
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,9 @@
|
||||
init: d
|
||||
init: c
|
||||
init: b
|
||||
init: a
|
||||
main
|
||||
fini: a
|
||||
fini: b
|
||||
fini: c
|
||||
fini: d
|
||||
@@ -0,0 +1,33 @@
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
void *h = dlopen ("$ORIGIN/unload8mod1.so", RTLD_LAZY);
|
||||
if (h == NULL)
|
||||
{
|
||||
puts ("dlopen unload8mod1.so failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *h2 = dlopen ("$ORIGIN/unload8mod1x.so", RTLD_LAZY);
|
||||
if (h2 == NULL)
|
||||
{
|
||||
puts ("dlopen unload8mod1x.so failed");
|
||||
return 1;
|
||||
}
|
||||
dlclose (h2);
|
||||
|
||||
int (*mod1) (void) = dlsym (h, "mod1");
|
||||
if (mod1 == NULL)
|
||||
{
|
||||
puts ("dlsym failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
mod1 ();
|
||||
dlclose (h);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
extern void mod2 (void);
|
||||
|
||||
void
|
||||
mod1 (void)
|
||||
{
|
||||
mod2 ();
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
int mod1x;
|
||||
@@ -0,0 +1,7 @@
|
||||
extern void mod3 (void);
|
||||
|
||||
void
|
||||
mod2 (void)
|
||||
{
|
||||
mod3 ();
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
mod3_fini2 (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
mod3_fini (void)
|
||||
{
|
||||
mod3_fini2 ();
|
||||
}
|
||||
|
||||
void
|
||||
mod3 (void)
|
||||
{
|
||||
void *h = dlopen ("$ORIGIN/unload8mod2.so", RTLD_LAZY);
|
||||
if (h == NULL)
|
||||
{
|
||||
puts ("dlopen unload8mod2.so failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
atexit (mod3_fini);
|
||||
}
|
||||
+6
-6
@@ -18233,17 +18233,17 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
|
||||
len = 0; \
|
||||
} \
|
||||
else if (ch == 0x20087) \
|
||||
idx = 0xfe51; \
|
||||
cp = (const unsigned char *) "\xfe\x51"; \
|
||||
else if (ch == 0x20089) \
|
||||
idx = 0xfe52; \
|
||||
cp = (const unsigned char *) "\xfe\x52"; \
|
||||
else if (ch == 0x200CC) \
|
||||
idx = 0xfe53; \
|
||||
cp = (const unsigned char *) "\xfe\x53"; \
|
||||
else if (ch == 0x215d7) \
|
||||
idx = 0xfe6c; \
|
||||
cp = (const unsigned char *) "\xfe\x6c"; \
|
||||
else if (ch == 0x2298F) \
|
||||
idx = 0xfe76; \
|
||||
cp = (const unsigned char *) "\xfe\x76"; \
|
||||
else if (ch == 0x241FE) \
|
||||
idx = 0xfe91; \
|
||||
cp = (const unsigned char *) "\xfe\x91"; \
|
||||
else \
|
||||
len = 0; \
|
||||
\
|
||||
|
||||
+14
-10
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1995-2002, 2004, 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995-2002, 2004, 2005, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||
|
||||
@@ -134,7 +134,7 @@ argz_next__ (argz, argz_len, entry)
|
||||
if (entry)
|
||||
{
|
||||
if (entry < argz + argz_len)
|
||||
entry = strchr (entry, '\0') + 1;
|
||||
entry = strchr (entry, '\0') + 1;
|
||||
|
||||
return entry >= argz + argz_len ? NULL : (char *) entry;
|
||||
}
|
||||
@@ -332,13 +332,18 @@ _nl_normalize_codeset (codeset, name_len)
|
||||
char *retval;
|
||||
char *wp;
|
||||
size_t cnt;
|
||||
#ifdef NOT_IN_libc
|
||||
locale_t locale = newlocale (0, "C", NULL);
|
||||
#else
|
||||
# define locale _nl_C_locobj_ptr
|
||||
#endif
|
||||
|
||||
for (cnt = 0; cnt < name_len; ++cnt)
|
||||
if (isalnum ((unsigned char) codeset[cnt]))
|
||||
if (__isalnum_l ((unsigned char) codeset[cnt], locale))
|
||||
{
|
||||
++len;
|
||||
|
||||
if (isalpha ((unsigned char) codeset[cnt]))
|
||||
if (! __isdigit_l ((unsigned char) codeset[cnt], locale))
|
||||
only_digit = 0;
|
||||
}
|
||||
|
||||
@@ -346,15 +351,14 @@ _nl_normalize_codeset (codeset, name_len)
|
||||
|
||||
if (retval != NULL)
|
||||
{
|
||||
wp = retval;
|
||||
if (only_digit)
|
||||
wp = stpcpy (retval, "iso");
|
||||
else
|
||||
wp = retval;
|
||||
wp = stpcpy (wp, "iso");
|
||||
|
||||
for (cnt = 0; cnt < name_len; ++cnt)
|
||||
if (isalpha ((unsigned char) codeset[cnt]))
|
||||
*wp++ = tolower ((unsigned char) codeset[cnt]);
|
||||
else if (isdigit ((unsigned char) codeset[cnt]))
|
||||
if (__isalpha_l ((unsigned char) codeset[cnt], locale))
|
||||
*wp++ = __tolower_l ((unsigned char) codeset[cnt], locale);
|
||||
else if (__isdigit_l ((unsigned char) codeset[cnt], locale))
|
||||
*wp++ = codeset[cnt];
|
||||
|
||||
*wp = '\0';
|
||||
|
||||
+14
-16
@@ -345,23 +345,22 @@ _IO_new_file_fopen (fp, filename, mode, is32not64)
|
||||
result = _IO_file_open (fp, filename, omode|oflags, oprot, read_write,
|
||||
is32not64);
|
||||
|
||||
#ifndef __ASSUME_O_CLOEXEC
|
||||
if ((fp->_flags2 & _IO_FLAGS2_CLOEXEC) != 0 && __have_o_cloexec <= 0)
|
||||
{
|
||||
int fd = _IO_fileno (fp);
|
||||
if (__have_o_cloexec == 0)
|
||||
{
|
||||
int flags = __fcntl (fd, F_GETFD);
|
||||
__have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1;
|
||||
}
|
||||
if (__have_o_cloexec < 0)
|
||||
__fcntl (fd, F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
if (result != NULL)
|
||||
{
|
||||
#ifndef __ASSUME_O_CLOEXEC
|
||||
if ((fp->_flags2 & _IO_FLAGS2_CLOEXEC) != 0 && __have_o_cloexec <= 0)
|
||||
{
|
||||
int fd = _IO_fileno (fp);
|
||||
if (__have_o_cloexec == 0)
|
||||
{
|
||||
int flags = __fcntl (fd, F_GETFD);
|
||||
__have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1;
|
||||
}
|
||||
if (__have_o_cloexec < 0)
|
||||
__fcntl (fd, F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Test whether the mode string specifies the conversion. */
|
||||
cs = strstr (last_recognized + 1, ",ccs=");
|
||||
if (cs != NULL)
|
||||
@@ -432,7 +431,6 @@ _IO_new_file_fopen (fp, filename, mode, is32not64)
|
||||
result->_mode = 1;
|
||||
}
|
||||
}
|
||||
#endif /* GNU libc */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
+19
-12
@@ -1,4 +1,5 @@
|
||||
# Copyright (C) 1991,1992,1995-2003,2005,2009 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1991,1992,1995-2003,2005,2009,2011
|
||||
# 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
|
||||
@@ -59,10 +60,11 @@ vpath %.c programs ../crypt
|
||||
vpath %.h programs
|
||||
vpath %.gperf programs
|
||||
|
||||
localedef-modules := $(categories:%=ld-%) charmap linereader locfile \
|
||||
localedef-modules := localedef $(categories:%=ld-%) \
|
||||
charmap linereader locfile \
|
||||
repertoire locarchive
|
||||
localedef-aux := md5
|
||||
locale-modules := locale-spec
|
||||
locale-modules := locale locale-spec
|
||||
lib-modules := charmap-dir simple-hash xmalloc xstrdup
|
||||
|
||||
|
||||
@@ -90,22 +92,27 @@ endif
|
||||
|
||||
localepath = "$(localedir):$(i18ndir)"
|
||||
|
||||
locale-CPPFLAGS := -DLOCALE_PATH='$(localepath)' \
|
||||
-DLOCALEDIR='"$(localedir)"' \
|
||||
-DLOCALE_ALIAS_PATH='"$(msgcatdir)"' \
|
||||
-DCHARMAP_PATH='"$(i18ndir)/charmaps"' \
|
||||
-DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \
|
||||
-DLOCSRCDIR='"$(i18ndir)/locales"' -DHAVE_CONFIG_H \
|
||||
-Iprograms
|
||||
# -Iprograms doesn't really belong here, but this gets it at the head
|
||||
# of the list instead of the tail, where CPPFLAGS-$(lib) gets added.
|
||||
# We need it before the standard -I's to see programs/config.h first.
|
||||
locale-CPPFLAGS = -DLOCALEDIR='"$(localedir)"' \
|
||||
-DLOCALE_ALIAS_PATH='"$(msgcatdir)"' \
|
||||
-Iprograms
|
||||
|
||||
CPPFLAGS-locale-programs = -DLOCALE_PATH='$(localepath)' \
|
||||
-DCHARMAP_PATH='"$(i18ndir)/charmaps"' \
|
||||
-DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \
|
||||
-DLOCSRCDIR='"$(i18ndir)/locales"' \
|
||||
-DHAVE_CONFIG_H -DNOT_IN_libc
|
||||
|
||||
CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts
|
||||
CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts
|
||||
CFLAGS-charmap-dir.c = -Wno-write-strings
|
||||
|
||||
# This makes sure -DNOT_IN_libc is passed for all these modules.
|
||||
# This makes sure -DNOT_IN_libc et al are passed for all these modules.
|
||||
cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \
|
||||
$(locale-modules) $(lib-modules))
|
||||
lib := nonlib
|
||||
lib := locale-programs
|
||||
include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left))
|
||||
|
||||
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ TEXTDOMAIN=libc
|
||||
|
||||
# Print usage message.
|
||||
do_usage() {
|
||||
printf >&2 $"Try \`%s --help' or `%s --usage' for more information.\n" memusage memusage
|
||||
printf >&2 $"Try \`%s --help' or \`%s --usage' for more information.\n" memusage memusage
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,38 @@
|
||||
2011-09-15 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/pthread/list.h: Define only list_t if __need_list_t is
|
||||
defined.
|
||||
(list_add): Add atomic_write_barrier.
|
||||
* descr.h: Define __need_list_t before including <list.h>.
|
||||
* nptl-init.c: Include <list.h>
|
||||
* allocatestack.c: Likewise.
|
||||
|
||||
2011-08-31 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* allocatestack.c (setxid_mark_thread): Ensure that the exiting
|
||||
thread is woken up.
|
||||
|
||||
2011-08-08 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/x86_64/cancellation.S: Maintain aligned
|
||||
stack.
|
||||
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise.
|
||||
|
||||
2011-06-30 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* nptl-init.c (__nptl_set_robust): New function.
|
||||
(pthread_functions): Add reference.
|
||||
* npthreadP.h: Declare __nptl_set_robust.
|
||||
* sysdeps/pthread/pthread-functions.h (pthread_functions): Add
|
||||
ptr_set_robust member.
|
||||
* sysdeps/unix/sysv/linux/fork.c: Call set_robust_list syscall in
|
||||
child if threads are used.
|
||||
|
||||
2011-06-14 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* pthread_rwlock_init.c: Include <string.h> for memset declaration.
|
||||
|
||||
2011-05-11 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #386]
|
||||
|
||||
+11
-1
@@ -28,6 +28,7 @@
|
||||
#include <dl-sysdep.h>
|
||||
#include <dl-tls.h>
|
||||
#include <tls.h>
|
||||
#include <list.h>
|
||||
#include <lowlevellock.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
@@ -999,7 +1000,16 @@ setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
|
||||
|
||||
/* If the thread is exiting right now, ignore it. */
|
||||
if ((ch & EXITING_BITMASK) != 0)
|
||||
return;
|
||||
{
|
||||
/* Release the futex if there is no other setxid in
|
||||
progress. */
|
||||
if ((ch & SETXID_BITMASK) == 0)
|
||||
{
|
||||
t->setxid_futex = 1;
|
||||
lll_futex_wake (&t->setxid_futex, 1, LLL_PRIVATE);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
|
||||
ch | SETXID_BITMASK, ch));
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <sys/types.h>
|
||||
#include <hp-timing.h>
|
||||
#define __need_list_t
|
||||
#include <list.h>
|
||||
#include <lowlevellock.h>
|
||||
#include <pthreaddef.h>
|
||||
|
||||
+21
-2
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002-2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002-2007, 2008, 2009, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <atomic.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <tls.h>
|
||||
#include <list.h>
|
||||
#include <fork.h>
|
||||
#include <version.h>
|
||||
#include <shlib-compat.h>
|
||||
@@ -67,6 +68,13 @@ static const char nptl_version[] __attribute_used__ = VERSION;
|
||||
extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
|
||||
#endif
|
||||
|
||||
#ifdef SHARED
|
||||
static
|
||||
#else
|
||||
extern
|
||||
#endif
|
||||
void __nptl_set_robust (struct pthread *);
|
||||
|
||||
#ifdef SHARED
|
||||
static void nptl_freeres (void);
|
||||
|
||||
@@ -130,7 +138,8 @@ static const struct pthread_functions pthread_functions =
|
||||
.ptr__nptl_deallocate_tsd = __nptl_deallocate_tsd,
|
||||
.ptr__nptl_setxid = __nptl_setxid,
|
||||
/* For now only the stack cache needs to be freed. */
|
||||
.ptr_freeres = nptl_freeres
|
||||
.ptr_freeres = nptl_freeres,
|
||||
.ptr_set_robust = __nptl_set_robust
|
||||
};
|
||||
# define ptr_pthread_functions &pthread_functions
|
||||
#else
|
||||
@@ -147,7 +156,17 @@ nptl_freeres (void)
|
||||
__unwind_freeres ();
|
||||
__free_stacks (0);
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
#endif
|
||||
void
|
||||
__nptl_set_robust (struct pthread *self)
|
||||
{
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
INTERNAL_SYSCALL (set_robust_list, err, 2, &self->robust_head,
|
||||
sizeof (struct robust_list_head));
|
||||
}
|
||||
|
||||
|
||||
/* For asynchronous cancellation we use a signal. This is the handler. */
|
||||
|
||||
+8
-5
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002-2007, 2009, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -555,17 +555,20 @@ extern void __pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffe
|
||||
|
||||
/* Old cleanup interfaces, still used in libc.so. */
|
||||
extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
|
||||
void (*routine) (void *), void *arg);
|
||||
void (*routine) (void *), void *arg);
|
||||
extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
|
||||
int execute);
|
||||
int execute);
|
||||
extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,
|
||||
void (*routine) (void *), void *arg);
|
||||
void (*routine) (void *), void *arg);
|
||||
extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer,
|
||||
int execute);
|
||||
int execute);
|
||||
|
||||
extern void __nptl_deallocate_tsd (void) attribute_hidden;
|
||||
|
||||
extern int __nptl_setxid (struct xid_command *cmdp) attribute_hidden;
|
||||
#ifndef SHARED
|
||||
extern void __nptl_set_robust (struct pthread *self);
|
||||
#endif
|
||||
|
||||
extern void __free_stacks (size_t limit) attribute_hidden;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002, 2007, 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002,2007,2009,2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
02111-1307 USA. */
|
||||
|
||||
#include "pthreadP.h"
|
||||
#include <string.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002, 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002, 2009, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -18,27 +18,39 @@
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _LIST_H
|
||||
#define _LIST_H 1
|
||||
|
||||
#ifndef __need_list_t
|
||||
# define _LIST_H 1
|
||||
#endif
|
||||
|
||||
/* The definitions of this file are adopted from those which can be
|
||||
found in the Linux kernel headers to enable people familiar with
|
||||
the latter find their way in these sources as well. */
|
||||
|
||||
|
||||
#if defined __need_list_t || defined _LIST_H
|
||||
# ifndef __list_t_defined
|
||||
# define __list_t_defined
|
||||
/* Basic type for the double-link list. */
|
||||
typedef struct list_head
|
||||
{
|
||||
struct list_head *next;
|
||||
struct list_head *prev;
|
||||
} list_t;
|
||||
# endif
|
||||
# undef __need_list_t
|
||||
#endif
|
||||
|
||||
#ifdef _LIST_H
|
||||
|
||||
# include <atomic.h>
|
||||
|
||||
/* Define a variable with the head and tail of the list. */
|
||||
#define LIST_HEAD(name) \
|
||||
# define LIST_HEAD(name) \
|
||||
list_t name = { &(name), &(name) }
|
||||
|
||||
/* Initialize a new list head. */
|
||||
#define INIT_LIST_HEAD(ptr) \
|
||||
# define INIT_LIST_HEAD(ptr) \
|
||||
(ptr)->next = (ptr)->prev = (ptr)
|
||||
|
||||
|
||||
@@ -49,6 +61,7 @@ list_add (list_t *newp, list_t *head)
|
||||
newp->next = head->next;
|
||||
newp->prev = head;
|
||||
head->next->prev = newp;
|
||||
atomic_write_barrier ();
|
||||
head->next = newp;
|
||||
}
|
||||
|
||||
@@ -78,26 +91,28 @@ list_splice (list_t *add, list_t *head)
|
||||
|
||||
|
||||
/* Get typed element from list at a given position. */
|
||||
#define list_entry(ptr, type, member) \
|
||||
# define list_entry(ptr, type, member) \
|
||||
((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
|
||||
|
||||
|
||||
|
||||
/* Iterate forward over the elements of the list. */
|
||||
#define list_for_each(pos, head) \
|
||||
# define list_for_each(pos, head) \
|
||||
for (pos = (head)->next; pos != (head); pos = pos->next)
|
||||
|
||||
|
||||
/* Iterate forward over the elements of the list. */
|
||||
#define list_for_each_prev(pos, head) \
|
||||
# define list_for_each_prev(pos, head) \
|
||||
for (pos = (head)->prev; pos != (head); pos = pos->prev)
|
||||
|
||||
|
||||
/* Iterate backwards over the elements list. The list elements can be
|
||||
removed from the list while doing this. */
|
||||
#define list_for_each_prev_safe(pos, p, head) \
|
||||
# define list_for_each_prev_safe(pos, p, head) \
|
||||
for (pos = (head)->prev, p = pos->prev; \
|
||||
pos != (head); \
|
||||
pos = p, p = pos->prev)
|
||||
|
||||
#endif /* _LIST_H */
|
||||
|
||||
#endif /* list.h */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||
|
||||
@@ -97,6 +97,7 @@ struct pthread_functions
|
||||
void (*ptr__nptl_deallocate_tsd) (void);
|
||||
int (*ptr__nptl_setxid) (struct xid_command *);
|
||||
void (*ptr_freeres) (void);
|
||||
void (*ptr_set_robust) (struct pthread *);
|
||||
};
|
||||
|
||||
/* Variable in libc.so. */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002, 2003, 2007, 2008 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002, 2003, 2007, 2008, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <ldsodefs.h>
|
||||
#include <bits/stdio-lock.h>
|
||||
#include <atomic.h>
|
||||
#include <pthreadP.h>
|
||||
|
||||
|
||||
unsigned long int *__fork_generation_pointer;
|
||||
@@ -86,8 +87,8 @@ __libc_fork (void)
|
||||
just go away. The unloading code works in the order of the
|
||||
list.
|
||||
|
||||
While executing the registered handlers we are building a
|
||||
list of all the entries so that we can go backward later on. */
|
||||
While executing the registered handlers we are building a
|
||||
list of all the entries so that we can go backward later on. */
|
||||
while (1)
|
||||
{
|
||||
/* Execute the handler if there is one. */
|
||||
@@ -154,6 +155,24 @@ __libc_fork (void)
|
||||
GL(dl_cpuclock_offset) = now;
|
||||
#endif
|
||||
|
||||
#ifdef __NR_set_robust_list
|
||||
/* Initialize the robust mutex list which has been reset during
|
||||
the fork. We do not check for errors since if it fails here
|
||||
it failed at process start as well and noone could have used
|
||||
robust mutexes. We also do not have to set
|
||||
self->robust_head.futex_offset since we inherit the correct
|
||||
value from the parent. */
|
||||
# ifdef SHARED
|
||||
if (__builtin_expect (__libc_pthread_functions_init, 0))
|
||||
PTHFCT_CALL (ptr_set_robust, (self));
|
||||
# else
|
||||
extern __typeof (__nptl_set_robust) __nptl_set_robust
|
||||
__attribute__((weak));
|
||||
if (__builtin_expect (__nptl_set_robust != NULL, 0))
|
||||
__nptl_set_robust (self);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Reset the file list. These are recursive mutexes. */
|
||||
fresetlockfiles ();
|
||||
|
||||
@@ -170,10 +189,10 @@ __libc_fork (void)
|
||||
allp->handler->child_handler ();
|
||||
|
||||
/* Note that we do not have to wake any possible waiter.
|
||||
This is the only thread in the new process. The count
|
||||
may have been bumped up by other threads doing a fork.
|
||||
We reset it to 1, to avoid waiting for non-existing
|
||||
thread(s) to release the count. */
|
||||
This is the only thread in the new process. The count
|
||||
may have been bumped up by other threads doing a fork.
|
||||
We reset it to 1, to avoid waiting for non-existing
|
||||
thread(s) to release the count. */
|
||||
allp->handler->refcntr = 1;
|
||||
|
||||
/* XXX We could at this point look through the object pool
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2009.
|
||||
|
||||
@@ -71,7 +71,9 @@ ENTRY(__pthread_enable_asynccancel)
|
||||
|
||||
1: ret
|
||||
|
||||
3: movq $TCB_PTHREAD_CANCELED, %fs:RESULT
|
||||
3: subq $8, %rsp
|
||||
cfi_adjust_cfa_offset(8)
|
||||
movq $TCB_PTHREAD_CANCELED, %fs:RESULT
|
||||
lock
|
||||
orl $TCB_EXITING_BITMASK, %fs:CANCELHANDLING
|
||||
movq %fs:CLEANUP_JMP_BUF, %rdi
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002-2005, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -63,9 +63,9 @@ __pthread_cond_timedwait:
|
||||
cfi_adjust_cfa_offset(8)
|
||||
cfi_rel_offset(%r15, 0)
|
||||
#ifdef __ASSUME_FUTEX_CLOCK_REALTIME
|
||||
# define FRAME_SIZE 32
|
||||
# define FRAME_SIZE (32+8)
|
||||
#else
|
||||
# define FRAME_SIZE 48
|
||||
# define FRAME_SIZE (48+8)
|
||||
#endif
|
||||
subq $FRAME_SIZE, %rsp
|
||||
cfi_adjust_cfa_offset(FRAME_SIZE)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2002-2007, 2009, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -45,7 +45,7 @@ __pthread_cond_wait:
|
||||
cfi_lsda(DW_EH_PE_udata4, .LexceptSTART)
|
||||
#endif
|
||||
|
||||
#define FRAME_SIZE 32
|
||||
#define FRAME_SIZE (32+8)
|
||||
leaq -FRAME_SIZE(%rsp), %rsp
|
||||
cfi_adjust_cfa_offset(FRAME_SIZE)
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
2011-09-15 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* thread_dbP.h: Include <list.h>
|
||||
|
||||
2009-08-23 Roland McGrath <roland@redhat.com>
|
||||
|
||||
* td_ta_map_lwp2thr.c (__td_ta_lookup_th_unique): Move ta_ok check
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Private header for thread debug library
|
||||
Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004, 2007, 2011 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
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "proc_service.h"
|
||||
#include "thread_db.h"
|
||||
#include "../nptl/pthreadP.h" /* This is for *_BITMASK only. */
|
||||
#include <list.h>
|
||||
|
||||
/* Indeces for the symbol names. */
|
||||
enum
|
||||
|
||||
+1
-1
@@ -477,7 +477,7 @@ termination_handler (int signum)
|
||||
/* Synchronize memory. */
|
||||
for (int cnt = 0; cnt < lastdb; ++cnt)
|
||||
{
|
||||
if (!dbs[cnt].enabled)
|
||||
if (!dbs[cnt].enabled || dbs[cnt].head == NULL)
|
||||
continue;
|
||||
|
||||
/* Make sure nobody keeps using the database. */
|
||||
|
||||
@@ -52,8 +52,10 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
gid_t *groups = *groupsp;
|
||||
|
||||
/* We have to iterate over the entire file. */
|
||||
while (!feof_unlocked (stream))
|
||||
while (1)
|
||||
{
|
||||
fpos_t pos;
|
||||
fgetpos (stream, &pos);
|
||||
ssize_t n = getline (&line, &linelen, stream);
|
||||
if (n < 0)
|
||||
{
|
||||
@@ -64,9 +66,8 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
}
|
||||
|
||||
struct group grp;
|
||||
int res;
|
||||
while ((res = _nss_files_parse_grent (line, &grp, buffer, buflen,
|
||||
errnop)) == -1)
|
||||
int res = _nss_files_parse_grent (line, &grp, buffer, buflen, errnop);
|
||||
if (res == -1)
|
||||
{
|
||||
size_t newbuflen = 2 * buflen;
|
||||
if (buffer_use_malloc || ! __libc_use_alloca (buflen + newbuflen))
|
||||
@@ -85,6 +86,9 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
}
|
||||
else
|
||||
buffer = extend_alloca (buffer, buflen, newbuflen);
|
||||
/* Reread current line, the parser has clobbered it. */
|
||||
fsetpos (stream, &pos);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (res > 0 && grp.gr_gid != group)
|
||||
|
||||
+7
-2
@@ -871,6 +871,9 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring,
|
||||
/* Convenience. Treat POSIX -W foo same as long option --foo */
|
||||
if (temp[0] == 'W' && temp[1] == ';')
|
||||
{
|
||||
if (longopts == NULL)
|
||||
goto no_longs;
|
||||
|
||||
char *nameend;
|
||||
const struct option *p;
|
||||
const struct option *pfound = NULL;
|
||||
@@ -1086,8 +1089,10 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring,
|
||||
}
|
||||
return pfound->val;
|
||||
}
|
||||
d->__nextchar = NULL;
|
||||
return 'W'; /* Let the application handle it. */
|
||||
|
||||
no_longs:
|
||||
d->__nextchar = NULL;
|
||||
return 'W'; /* Let the application handle it. */
|
||||
}
|
||||
if (temp[1] == ':')
|
||||
{
|
||||
|
||||
+34
-8
@@ -46,6 +46,12 @@
|
||||
|
||||
#include <pwd.h>
|
||||
|
||||
#if defined HAVE_STDINT_H || defined _LIBC
|
||||
# include <stdint.h>
|
||||
#elif !defined UINTPTR_MAX
|
||||
# define UINTPTR_MAX (~((size_t) 0))
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef __set_errno
|
||||
# define __set_errno(val) errno = (val)
|
||||
@@ -436,6 +442,10 @@ glob (pattern, flags, errfunc, pglob)
|
||||
else
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (pglob->gl_offs >= ~((size_t) 0) / sizeof (char *))
|
||||
return GLOB_NOSPACE;
|
||||
|
||||
pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1)
|
||||
* sizeof (char *));
|
||||
if (pglob->gl_pathv == NULL)
|
||||
@@ -954,10 +964,8 @@ glob (pattern, flags, errfunc, pglob)
|
||||
int newcount = pglob->gl_pathc + pglob->gl_offs;
|
||||
char **new_gl_pathv;
|
||||
|
||||
new_gl_pathv
|
||||
= (char **) realloc (pglob->gl_pathv,
|
||||
(newcount + 1 + 1) * sizeof (char *));
|
||||
if (new_gl_pathv == NULL)
|
||||
if (newcount > UINTPTR_MAX - (1 + 1)
|
||||
|| newcount + 1 + 1 > ~((size_t) 0) / sizeof (char *))
|
||||
{
|
||||
nospace:
|
||||
free (pglob->gl_pathv);
|
||||
@@ -965,6 +973,12 @@ glob (pattern, flags, errfunc, pglob)
|
||||
pglob->gl_pathc = 0;
|
||||
return GLOB_NOSPACE;
|
||||
}
|
||||
|
||||
new_gl_pathv
|
||||
= (char **) realloc (pglob->gl_pathv,
|
||||
(newcount + 1 + 1) * sizeof (char *));
|
||||
if (new_gl_pathv == NULL)
|
||||
goto nospace;
|
||||
pglob->gl_pathv = new_gl_pathv;
|
||||
|
||||
if (flags & GLOB_MARK)
|
||||
@@ -1104,14 +1118,19 @@ glob (pattern, flags, errfunc, pglob)
|
||||
int newcount = pglob->gl_pathc + pglob->gl_offs;
|
||||
char **new_gl_pathv;
|
||||
|
||||
if (newcount > UINTPTR_MAX - 2
|
||||
|| newcount + 2 > ~((size_t) 0) / sizeof (char *))
|
||||
{
|
||||
nospace2:
|
||||
globfree (&dirs);
|
||||
return GLOB_NOSPACE;
|
||||
}
|
||||
|
||||
new_gl_pathv = (char **) realloc (pglob->gl_pathv,
|
||||
(newcount + 2)
|
||||
* sizeof (char *));
|
||||
if (new_gl_pathv == NULL)
|
||||
{
|
||||
globfree (&dirs);
|
||||
return GLOB_NOSPACE;
|
||||
}
|
||||
goto nospace2;
|
||||
pglob->gl_pathv = new_gl_pathv;
|
||||
|
||||
pglob->gl_pathv[newcount] = __strdup (pattern);
|
||||
@@ -1636,6 +1655,13 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
|
||||
{
|
||||
result = 0;
|
||||
|
||||
if (pglob->gl_pathc > UINTPTR_MAX - pglob->gl_offs
|
||||
|| pglob->gl_pathc + pglob->gl_offs > UINTPTR_MAX - nfound
|
||||
|| pglob->gl_pathc + pglob->gl_offs + nfound > UINTPTR_MAX - 1
|
||||
|| (pglob->gl_pathc + pglob->gl_offs + nfound + 1
|
||||
> UINTPTR_MAX / sizeof (char *)))
|
||||
goto memory_error;
|
||||
|
||||
char **new_gl_pathv;
|
||||
new_gl_pathv
|
||||
= (char **) realloc (pglob->gl_pathv,
|
||||
|
||||
+1
-1
@@ -318,7 +318,7 @@ __res_vinit(res_state statp, int preinit) {
|
||||
struct in6_addr a6;
|
||||
char *el;
|
||||
|
||||
if ((el = strchr(cp, '\n')) != NULL)
|
||||
if ((el = strpbrk(cp, " \t\n")) != NULL)
|
||||
*el = '\0';
|
||||
if ((el = strchr(cp, SCOPE_DELIMITER)) != NULL)
|
||||
*el = '\0';
|
||||
|
||||
+1
-1
@@ -543,7 +543,7 @@ __libc_res_nquerydomain(res_state statp,
|
||||
{
|
||||
char nbuf[MAXDNAME];
|
||||
const char *longname = nbuf;
|
||||
int n, d;
|
||||
size_t n, d;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
|
||||
+2
-2
@@ -549,7 +549,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
|
||||
ns, ansp, ansp2, nansp2, resplen2);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
if (n == 0 && (buf2 == NULL || resplen2 == 0))
|
||||
if (n == 0 && (buf2 == NULL || *resplen2 == 0))
|
||||
goto next_ns;
|
||||
} else {
|
||||
/* Use datagrams. */
|
||||
@@ -559,7 +559,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
|
||||
ansp2, nansp2, resplen2);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
if (n == 0 && (buf2 == NULL || resplen2 == 0))
|
||||
if (n == 0 && (buf2 == NULL || *resplen2 == 0))
|
||||
goto next_ns;
|
||||
if (v_circuit)
|
||||
// XXX Check whether both requests failed or
|
||||
|
||||
@@ -60,7 +60,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
|
||||
tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
|
||||
tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \
|
||||
bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \
|
||||
scanf16 scanf17 tst-setvbuf1 tst-grouping bug23
|
||||
scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24
|
||||
|
||||
test-srcs = tst-unbputc tst-printf
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
FILE *fp = fopen ("/foobar_does_no_exit", "re");
|
||||
if (fp != NULL)
|
||||
{
|
||||
/* A joker created this file. Ignore the test. */
|
||||
fclose (fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (errno == ENOENT)
|
||||
{
|
||||
printf ("no bug\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf ("bug : expected ENOENT, got: %m\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/* Convert string representing a number to float value, using given locale.
|
||||
Copyright (C) 1997,1998,2002,2004,2005,2006,2007,2008,2009,2010
|
||||
Copyright (C) 1997,1998,2002,2004,2005,2006,2007,2008,2009,2010,2011
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
@@ -185,7 +185,7 @@ round_and_return (mp_limb_t *retval, int exponent, int negative,
|
||||
|
||||
if (shift > MANT_DIG)
|
||||
{
|
||||
__set_errno (EDOM);
|
||||
__set_errno (ERANGE);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,1996-2001,2003,2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,1996-2001,2003,2009,2011 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
|
||||
@@ -72,6 +72,7 @@ static const struct ltest tests[] =
|
||||
{ "+InFiNiTy", HUGE_VAL, '\0', 0 },
|
||||
#endif
|
||||
{ "0x80000Ap-23", 0x80000Ap-23, '\0', 0 },
|
||||
{ "1e-324", 0, '\0', ERANGE },
|
||||
{ NULL, 0, '\0', 0 }
|
||||
};
|
||||
|
||||
|
||||
+3
-2
@@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 1995-1997,2002,2004-2006,2010 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995-1997,2002,2004-2006,2010,2011
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Ulrich Drepper <drepper@gnu.org>, 1995.
|
||||
|
||||
@@ -150,7 +151,7 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
|
||||
values. But since there is no limit on the length of the string
|
||||
we have to use `malloc' if the string is too long. We should be
|
||||
very conservative here. */
|
||||
if (! __libc_use_alloca (srclen))
|
||||
if (! __libc_use_alloca ((srclen + 1) * (sizeof (int32_t) + 1)))
|
||||
{
|
||||
idxarr = (int32_t *) malloc ((srclen + 1) * (sizeof (int32_t) + 1));
|
||||
rulearr = (unsigned char *) &idxarr[srclen];
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* PLT trampolines. i386 version.
|
||||
Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004, 2005, 2007, 2011 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
|
||||
@@ -99,7 +99,7 @@ _dl_runtime_profile:
|
||||
+4 %edx
|
||||
%esp free
|
||||
*/
|
||||
cfi_adjust_cfa_offset (12)
|
||||
cfi_adjust_cfa_offset (8)
|
||||
1: movl %ebx, (%esp)
|
||||
cfi_rel_offset (ebx, 0)
|
||||
movl %edx, %ebx # This is the frame buffer size
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Optimized, inlined string functions. i486 version.
|
||||
Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,2007
|
||||
Free Software Foundation, Inc.
|
||||
Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,2007,2011
|
||||
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
|
||||
@@ -1058,8 +1058,8 @@ __strncat_g (char *__dest, __const char __src[], size_t __n)
|
||||
"movl %4, %3\n\t"
|
||||
"decl %1\n\t"
|
||||
"1:\n\t"
|
||||
"decl %3\n\t"
|
||||
"js 2f\n\t"
|
||||
"subl $1,%3\n\t"
|
||||
"jc 2f\n\t"
|
||||
"movb (%2),%b0\n\t"
|
||||
"movsb\n\t"
|
||||
"testb %b0,%b0\n\t"
|
||||
@@ -1078,8 +1078,8 @@ __strncat_g (char *__dest, __const char __src[], size_t __n)
|
||||
"leal 1(%1),%1\n\t"
|
||||
"jne 1b\n"
|
||||
"2:\n\t"
|
||||
"decl %3\n\t"
|
||||
"js 3f\n\t"
|
||||
"subl $1,%3\n\t"
|
||||
"jc 3f\n\t"
|
||||
"movb (%2),%b0\n\t"
|
||||
"leal 1(%2),%2\n\t"
|
||||
"movb %b0,(%1)\n\t"
|
||||
@@ -1219,8 +1219,8 @@ __strncmp_g (__const char *__s1, __const char *__s2, size_t __n)
|
||||
register int __res;
|
||||
__asm__ __volatile__
|
||||
("1:\n\t"
|
||||
"decl %3\n\t"
|
||||
"js 2f\n\t"
|
||||
"subl $1,%3\n\t"
|
||||
"jc 2f\n\t"
|
||||
"movb (%1),%b0\n\t"
|
||||
"incl %1\n\t"
|
||||
"cmpb %b0,(%2)\n\t"
|
||||
|
||||
@@ -76,8 +76,8 @@ END(strspn)
|
||||
# define ENTRY(name) \
|
||||
.type __strspn_ia32, @function; \
|
||||
.globl __strspn_ia32; \
|
||||
.p2align 4
|
||||
__strspn_ia32: cfi_startproc; \
|
||||
.p2align 4; \
|
||||
__strspn_ia32: cfi_startproc; \
|
||||
CALL_MCOUNT
|
||||
# undef END
|
||||
# define END(name) \
|
||||
|
||||
@@ -432,7 +432,10 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
/* In case the output string is the same as the input string
|
||||
no new string has been allocated. */
|
||||
if (p != name)
|
||||
malloc_name = true;
|
||||
{
|
||||
name = p;
|
||||
malloc_name = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -821,13 +824,14 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
size_t tmpbuflen = 1024;
|
||||
malloc_tmpbuf = !__libc_use_alloca (alloca_used + tmpbuflen);
|
||||
assert (tmpbuf == NULL);
|
||||
if (malloc_tmpbuf)
|
||||
if (!malloc_tmpbuf)
|
||||
tmpbuf = alloca_account (tmpbuflen, alloca_used);
|
||||
else
|
||||
{
|
||||
tmpbuf = malloc (tmpbuflen);
|
||||
if (tmpbuf == NULL)
|
||||
{
|
||||
_res.options |= old_res_options & RES_USE_INET6;
|
||||
result = -EAI_MEMORY;
|
||||
goto free_and_return;
|
||||
}
|
||||
@@ -872,6 +876,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
2 * tmpbuflen);
|
||||
if (newp == NULL)
|
||||
{
|
||||
_res.options |= old_res_options & RES_USE_INET6;
|
||||
result = -EAI_MEMORY;
|
||||
goto free_and_return;
|
||||
}
|
||||
@@ -881,16 +886,44 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
}
|
||||
}
|
||||
|
||||
no_inet6_data = no_data;
|
||||
|
||||
if (status == NSS_STATUS_SUCCESS)
|
||||
{
|
||||
assert (!no_data);
|
||||
no_data = 1;
|
||||
|
||||
if ((req->ai_flags & AI_CANONNAME) != 0 && canon == NULL)
|
||||
canon = (*pat)->name;
|
||||
|
||||
while (*pat != NULL)
|
||||
pat = &((*pat)->next);
|
||||
{
|
||||
if ((*pat)->family == AF_INET
|
||||
&& req->ai_family == AF_INET6
|
||||
&& (req->ai_flags & AI_V4MAPPED) != 0)
|
||||
{
|
||||
uint32_t *pataddr = (*pat)->addr;
|
||||
(*pat)->family = AF_INET6;
|
||||
pataddr[3] = pataddr[0];
|
||||
pataddr[2] = htonl (0xffff);
|
||||
pataddr[1] = 0;
|
||||
pataddr[0] = 0;
|
||||
pat = &((*pat)->next);
|
||||
no_data = 0;
|
||||
}
|
||||
else if (req->ai_family == AF_UNSPEC
|
||||
|| (*pat)->family == req->ai_family)
|
||||
{
|
||||
pat = &((*pat)->next);
|
||||
|
||||
no_data = 0;
|
||||
if (req->ai_family == AF_INET6)
|
||||
got_ipv6 = true;
|
||||
}
|
||||
else
|
||||
*pat = ((*pat)->next);
|
||||
}
|
||||
}
|
||||
|
||||
no_inet6_data = no_data;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -963,6 +996,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
canonbuf = malloc (max_fqdn_len);
|
||||
if (canonbuf == NULL)
|
||||
{
|
||||
_res.options
|
||||
|= old_res_options & RES_USE_INET6;
|
||||
result = -EAI_MEMORY;
|
||||
goto free_and_return;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Determine whether interfaces use native transport. Linux version.
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 2007,2011 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
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <net/if.h>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1998-2006, 2010 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1998-2006, 2010, 2011 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
@@ -115,6 +115,9 @@ __statvfs_getflags (const char *name, int fstype, struct stat64 *st)
|
||||
case CGROUP_SUPER_MAGIC:
|
||||
fsname = "cgroup";
|
||||
break;
|
||||
case LUSTRE_SUPER_MAGIC:
|
||||
fsname = "lustre";
|
||||
break;
|
||||
}
|
||||
|
||||
FILE *mtab = __setmntent ("/proc/mounts", "r");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Constants from kernel header for various FSes.
|
||||
Copyright (C) 1998-2003,2005,2010 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998-2003,2005,2010,2011 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
|
||||
@@ -83,6 +83,9 @@
|
||||
/* Constant that identifies the `logfs' filesystem. */
|
||||
#define LOGFS_MAGIC_U32 0xc97e8168u
|
||||
|
||||
/* Constant that identifies the `lustre' filesystem. */
|
||||
#define LUSTRE_SUPER_MAGIC 0x0BD00BD0
|
||||
|
||||
/* Constants that identify the `minix2' filesystem. */
|
||||
#define MINIX2_SUPER_MAGIC 0x2468
|
||||
#define MINIX2_SUPER_MAGIC2 0x2478
|
||||
@@ -150,6 +153,8 @@
|
||||
/* Maximum link counts. */
|
||||
#define COH_LINK_MAX 10000
|
||||
#define EXT2_LINK_MAX 32000
|
||||
#define EXT4_LINK_MAX 65000
|
||||
#define LUSTRE_LINK_MAX EXT4_LINK_MAX
|
||||
#define MINIX2_LINK_MAX 65530
|
||||
#define MINIX_LINK_MAX 250
|
||||
#define REISERFS_LINK_MAX 64535
|
||||
|
||||
@@ -121,6 +121,9 @@ __statfs_link_max (int result, const struct statfs *fsbuf)
|
||||
case XFS_SUPER_MAGIC:
|
||||
return XFS_LINK_MAX;
|
||||
|
||||
case LUSTRE_SUPER_MAGIC:
|
||||
return LUSTRE_LINK_MAX;
|
||||
|
||||
default:
|
||||
return LINUX_LINK_MAX;
|
||||
}
|
||||
@@ -157,6 +160,7 @@ __statfs_filesize_max (int result, const struct statfs *fsbuf)
|
||||
case JFS_SUPER_MAGIC:
|
||||
case VXFS_SUPER_MAGIC:
|
||||
case CGROUP_SUPER_MAGIC:
|
||||
case LUSTRE_SUPER_MAGIC:
|
||||
return 64;
|
||||
|
||||
case MSDOS_SUPER_MAGIC:
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
/* In this implementation we do not really care whether the call fails
|
||||
because of missing kernel support since we do not even call the
|
||||
function in this case. */
|
||||
#undef __ASSUME_ATFCTS
|
||||
#define __ASSUME_ATFCTS 1
|
||||
#include "fxstatat.c"
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2004, 2005, 2009 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2004, 2005, 2009, 2011 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
|
||||
@@ -65,7 +65,8 @@ __END_DECLS
|
||||
/* Registers for entry into PLT on x86-64. */
|
||||
# if __GNUC_PREREQ (4,0)
|
||||
typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16)));
|
||||
typedef float La_x86_64_ymm __attribute__ ((__vector_size__ (32)));
|
||||
typedef float La_x86_64_ymm
|
||||
__attribute__ ((__vector_size__ (32), __aligned__ (16)));
|
||||
# else
|
||||
typedef float La_x86_64_xmm __attribute__ ((__mode__ (__V4SF__)));
|
||||
# endif
|
||||
@@ -76,7 +77,7 @@ typedef union
|
||||
La_x86_64_ymm ymm[2];
|
||||
# endif
|
||||
La_x86_64_xmm xmm[4];
|
||||
} La_x86_64_vector __attribute__ ((aligned(16)));
|
||||
} La_x86_64_vector __attribute__ ((__aligned__ (16)));
|
||||
|
||||
typedef struct La_x86_64_regs
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* PLT trampolines. x86-64 version.
|
||||
Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004, 2005, 2007, 2009, 2011 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
|
||||
@@ -27,8 +27,9 @@
|
||||
.align 16
|
||||
cfi_startproc
|
||||
_dl_runtime_resolve:
|
||||
cfi_adjust_cfa_offset(16) # Incorporate PLT
|
||||
subq $56,%rsp
|
||||
cfi_adjust_cfa_offset(72) # Incorporate PLT
|
||||
cfi_adjust_cfa_offset(56)
|
||||
movq %rax,(%rsp) # Preserve registers otherwise clobbered.
|
||||
movq %rcx, 8(%rsp)
|
||||
movq %rdx, 16(%rsp)
|
||||
@@ -139,24 +140,34 @@ L(have_avx):
|
||||
movl $1, %eax
|
||||
cpuid
|
||||
movq %r11,%rbx # Restore rbx
|
||||
movl $1, %eax
|
||||
testl $(1 << 28), %ecx
|
||||
xorl %eax, %eax
|
||||
// AVX and XSAVE supported?
|
||||
andl $((1 << 28) | (1 << 27)), %ecx
|
||||
cmpl $((1 << 28) | (1 << 27)), %ecx
|
||||
jne 2f
|
||||
negl %eax
|
||||
2: movl %eax, L(have_avx)(%rip)
|
||||
xorl %ecx, %ecx
|
||||
// Get XFEATURE_ENABLED_MASK
|
||||
xgetbv
|
||||
andl $0x6, %eax
|
||||
cmpl $0x6, %eax
|
||||
// Nonzero if SSE and AVX state saving is enabled.
|
||||
sete %al
|
||||
2: leal -1(%eax,%eax), %eax
|
||||
movl %eax, L(have_avx)(%rip)
|
||||
cmpl $0, %eax
|
||||
|
||||
1: js L(no_avx)
|
||||
|
||||
# define RESTORE_AVX
|
||||
# define MORE_CODE
|
||||
# include "dl-trampoline.h"
|
||||
|
||||
.align 16
|
||||
L(no_avx):
|
||||
# endif
|
||||
|
||||
# undef RESTORE_AVX
|
||||
# include "dl-trampoline.h"
|
||||
# undef RESTORE_AVX
|
||||
# include "dl-trampoline.h"
|
||||
|
||||
cfi_endproc
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile
|
||||
@@ -176,11 +187,20 @@ _dl_x86_64_save_sse:
|
||||
movl $1, %eax
|
||||
cpuid
|
||||
movq %r11,%rbx # Restore rbx
|
||||
movl $1, %eax
|
||||
testl $(1 << 28), %ecx
|
||||
xorl %eax, %eax
|
||||
// AVX and XSAVE supported?
|
||||
andl $((1 << 28) | (1 << 27)), %ecx
|
||||
cmpl $((1 << 28) | (1 << 27)), %ecx
|
||||
jne 2f
|
||||
negl %eax
|
||||
2: movl %eax, L(have_avx)(%rip)
|
||||
xorl %ecx, %ecx
|
||||
// Get XFEATURE_ENABLED_MASK
|
||||
xgetbv
|
||||
andl $0x6, %eax
|
||||
cmpl $0x6, %eax
|
||||
// Nonzero if SSE and AVX state saving is enabled.
|
||||
sete %al
|
||||
2: leal -1(%eax,%eax), %eax
|
||||
movl %eax, L(have_avx)(%rip)
|
||||
cmpl $0, %eax
|
||||
|
||||
1: js L(no_avx5)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Partial PLT profile trampoline to save and restore x86-64 vector
|
||||
registers.
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
Copyright (C) 2009, 2011 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
|
||||
@@ -195,14 +195,14 @@
|
||||
_dl_call_pltexit. The La_x86_64_regs is being pointed by rsp now,
|
||||
so we just need to allocate the sizeof(La_x86_64_retval) space on
|
||||
the stack, since the alignment has already been taken care of. */
|
||||
# ifdef RESTORE_AVX
|
||||
#ifdef RESTORE_AVX
|
||||
/* sizeof(La_x86_64_retval). Need extra space for 2 SSE
|
||||
registers to detect if xmm0/xmm1 registers are changed
|
||||
by audit module. */
|
||||
subq $(LRV_SIZE + XMM_SIZE*2), %rsp
|
||||
# else
|
||||
#else
|
||||
subq $LRV_SIZE, %rsp # sizeof(La_x86_64_retval)
|
||||
# endif
|
||||
#endif
|
||||
movq %rsp, %rcx # La_x86_64_retval argument to %rcx.
|
||||
|
||||
/* Fill in the La_x86_64_retval structure. */
|
||||
@@ -212,7 +212,7 @@
|
||||
movaps %xmm0, LRV_XMM0_OFFSET(%rcx)
|
||||
movaps %xmm1, LRV_XMM1_OFFSET(%rcx)
|
||||
|
||||
# ifdef RESTORE_AVX
|
||||
#ifdef RESTORE_AVX
|
||||
/* This is to support AVX audit modules. */
|
||||
vmovdqu %ymm0, LRV_VECTOR0_OFFSET(%rcx)
|
||||
vmovdqu %ymm1, LRV_VECTOR1_OFFSET(%rcx)
|
||||
@@ -221,14 +221,14 @@
|
||||
by audit module. */
|
||||
vmovdqa %xmm0, (LRV_SIZE)(%rcx)
|
||||
vmovdqa %xmm1, (LRV_SIZE + XMM_SIZE)(%rcx)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
fstpt LRV_ST0_OFFSET(%rcx)
|
||||
fstpt LRV_ST1_OFFSET(%rcx)
|
||||
|
||||
movq 24(%rbx), %rdx # La_x86_64_regs argument to %rdx.
|
||||
movq 40(%rbx), %rsi # Copy args pushed by PLT in register.
|
||||
movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index
|
||||
movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index
|
||||
call _dl_call_pltexit
|
||||
|
||||
/* Restore return registers. */
|
||||
@@ -238,7 +238,7 @@
|
||||
movaps LRV_XMM0_OFFSET(%rsp), %xmm0
|
||||
movaps LRV_XMM1_OFFSET(%rsp), %xmm1
|
||||
|
||||
# ifdef RESTORE_AVX
|
||||
#ifdef RESTORE_AVX
|
||||
/* Check if xmm0/xmm1 registers are changed by audit module. */
|
||||
vpcmpeqq (LRV_SIZE)(%rsp), %xmm0, %xmm2
|
||||
vpmovmskb %xmm2, %esi
|
||||
@@ -253,7 +253,7 @@
|
||||
vmovdqu LRV_VECTOR1_OFFSET(%rsp), %ymm1
|
||||
|
||||
1:
|
||||
# endif
|
||||
#endif
|
||||
|
||||
fldt LRV_ST1_OFFSET(%rsp)
|
||||
fldt LRV_ST0_OFFSET(%rsp)
|
||||
@@ -267,3 +267,10 @@
|
||||
# (eats the reloc index and link_map)
|
||||
cfi_adjust_cfa_offset(-48)
|
||||
retq
|
||||
|
||||
#ifdef MORE_CODE
|
||||
cfi_adjust_cfa_offset(48)
|
||||
cfi_rel_offset(%rbx, 0)
|
||||
cfi_def_cfa_register(%rbx)
|
||||
# undef MORE_CODE
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user