summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2014-11-20 12:03:11 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-11-24 11:41:42 +0530
commita10178bda190a62e7e3f56773f55f23cf06848a7 (patch)
treeaec76d63ed6098f2ec59bd6a057a537ec8cd38e8
parent279bc5b3c384c09746fbadb2b68c6db9e833c064 (diff)
Remove IN_LIB
Replace with IS_IN and IS_IN_LIB macros instead. This change results in a change in generated code, because it fixes a subtle bug. The bug was introduced when systemtap probes were added to lowlevellock.h, which resulted in stap-probe.h being included in a number of places. stap-probe.h always defines IN_LIB, which breaks a check in errno.h and netdb.h since they rely on that macro to decide whether to implement an internal version of a declaration or an external one. The components that see a code change due to this are: iconv_prog libmemusage.so libpcprofile.so libSegFault.so libutil.so.1 locale localedef nscd All other built components (i.e. libc, libpthread, etc.) remain unchanged by this on x86_64. * elf/Makefile (CPPFLAGS-.os): Remove IN_LIB. * elf/rtld-Rules (rtld-CPPFLAGS): Likewise. * extra-lib.mk (CPPFLAGS-$(lib)): Likewise. * include/libc-symbols.h (IS_IN_LIB): New macro. * include/errno.h: Use IS_IN_LIB instead of IN_LIB. * include/netdb.h: Likewise. * include/stap-probe.h: Remove all uses of IN_LIB.
-rw-r--r--ChangeLog8
-rw-r--r--elf/Makefile2
-rw-r--r--elf/rtld-Rules2
-rw-r--r--extra-lib.mk2
-rw-r--r--include/errno.h4
-rw-r--r--include/libc-symbols.h5
-rw-r--r--include/netdb.h4
-rw-r--r--include/stap-probe.h12
8 files changed, 20 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 43759c8ad7..de672cf04b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2014-11-24 Siddhesh Poyarekar <siddhesh@redhat.com>
+ * elf/Makefile (CPPFLAGS-.os): Remove IN_LIB.
+ * elf/rtld-Rules (rtld-CPPFLAGS): Likewise.
+ * extra-lib.mk (CPPFLAGS-$(lib)): Likewise.
+ * include/libc-symbols.h (IS_IN_LIB): New macro.
+ * include/errno.h: Use IS_IN_LIB instead of IN_LIB.
+ * include/netdb.h: Likewise.
+ * include/stap-probe.h: Remove all uses of IN_LIB.
+
* Makeconfig (module-cppflags-real): Define MODULE_NAME
instead of IN_MODULE.
* include/libc-symbols.h (IN_MODULE): Define using
diff --git a/elf/Makefile b/elf/Makefile
index f013c22d67..1cf4c3a401 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -443,7 +443,7 @@ CFLAGS-cache.c = $(SYSCONF-FLAGS)
CFLAGS-rtld.c = $(SYSCONF-FLAGS)
CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\
- -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld)
+ -DNOT_IN_libc=1 -DIS_IN_rtld=1)
cpp-srcs-left := $(all-rtld-routines:=.os)
lib := rtld
diff --git a/elf/rtld-Rules b/elf/rtld-Rules
index f2cc4a1b8d..4d22436da2 100644
--- a/elf/rtld-Rules
+++ b/elf/rtld-Rules
@@ -144,6 +144,6 @@ lib := rtld
include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left))
# This here is the whole point of all the shenanigans.
-rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld
+rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1
endif
diff --git a/extra-lib.mk b/extra-lib.mk
index fd8812cb21..c719bd9b91 100644
--- a/extra-lib.mk
+++ b/extra-lib.mk
@@ -106,4 +106,4 @@ ifneq (,$(cpp-srcs-left))
include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left))
endif
-CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1 -DIN_LIB=$(lib)
+CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1
diff --git a/include/errno.h b/include/errno.h
index dbf2a61e0d..8e60288f50 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -22,7 +22,7 @@
# define errno rtld_errno
extern int rtld_errno attribute_hidden;
-# elif !defined NOT_IN_libc || defined IN_LIB
+# elif !defined NOT_IN_libc || IS_IN_LIB
# include <tls.h>
@@ -34,7 +34,7 @@ extern int rtld_errno attribute_hidden;
# endif
extern __thread int errno attribute_tls_model_ie;
-# endif /* !NOT_IN_libc || IN_LIB */
+# endif /* !NOT_IN_libc || IS_IN_LIB */
# define __set_errno(val) (errno = (val))
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 5cbf47308d..52350d3b60 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -23,6 +23,11 @@
#define IN_MODULE PASTE_NAME (MODULE_, MODULE_NAME)
#define IS_IN(lib) (IN_MODULE == MODULE_##lib)
+/* Returns true if the current module is a versioned library. Versioned
+ library names culled from shlib-versions files are assigned a MODULE_*
+ value lower than MODULE_LIBS_BEGIN. */
+#define IS_IN_LIB (IN_MODULE > MODULE_LIBS_BEGIN)
+
#define PASTE_NAME(a,b) PASTE_NAME1 (a,b)
#define PASTE_NAME1(a,b) a##b
diff --git a/include/netdb.h b/include/netdb.h
index a7960ebdf7..eccdbe6462 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -4,7 +4,7 @@
#ifndef _ISOMAC
/* Macros for accessing h_errno from inside libc. */
-# if !defined NOT_IN_libc || defined IN_LIB
+# if !defined NOT_IN_libc || IS_IN_LIB
# undef h_errno
# ifndef NOT_IN_libc
# define h_errno __libc_h_errno
@@ -12,7 +12,7 @@
# define h_errno h_errno /* For #ifndef h_errno tests. */
# endif
extern __thread int h_errno attribute_tls_model_ie;
-# endif /* !NOT_IN_libc || IN_LIB */
+# endif /* !NOT_IN_libc || IS_IN_LIB */
# define __set_h_errno(x) (h_errno = (x))
libc_hidden_proto (hstrerror)
diff --git a/include/stap-probe.h b/include/stap-probe.h
index 150fc1ec26..6532b376b3 100644
--- a/include/stap-probe.h
+++ b/include/stap-probe.h
@@ -40,18 +40,6 @@
architecture specific and can be found in the gdb and SystemTap
source code. */
-# ifndef NOT_IN_libc
-# define IN_LIB libc
-# elif !defined IN_LIB
-/* This is intentionally defined with extra unquoted commas in it so
- that macro substitution will bomb out when it is used. We don't
- just use #error here, so that this header can be included by
- other headers that use LIBC_PROBE inside their own macros. We
- only want such headers to fail to compile if those macros are
- actually used in a context where IN_LIB has not been defined. */
-# define IN_LIB ,,,missing -DIN_LIB=... -- not extra-lib.mk?,,,
-# endif
-
# define LIBC_PROBE(name, n, ...) \
LIBC_PROBE_1 (MODULE_NAME, name, n, ## __VA_ARGS__)