Skip to content

Commit

Permalink
Remove IN_LIB
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Siddhesh Poyarekar committed Nov 24, 2014
1 parent 279bc5b commit a10178b
Show file tree
Hide file tree
Showing 8 changed files with 20 additions and 19 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion elf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion elf/rtld-Rules
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion extra-lib.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions include/errno.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand All @@ -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))

Expand Down
5 changes: 5 additions & 0 deletions include/libc-symbols.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions include/netdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

#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
# else
# 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)
Expand Down
12 changes: 0 additions & 12 deletions include/stap-probe.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down

0 comments on commit a10178b

Please sign in to comment.